Skip to content

finding(app-shell): Studio's "lock the API name on first save" has no real save signal — the draft auto-save is deliberately not counted, leaving one same-mount window open #7824

Description

@claude

Reported by the #7615 dev seat as an out-of-scope residual, and filed by the PM seat so it survives that card's Fixes close. ⛔ Deliberately not closed inside objectui#7615 (PR objectui#7819): closing it is Clause-② work and that card is Clause-② no.

What objectui#7615 fixed, and the one gap it could not

ObjectFieldInspector used to decide "is this API name still auto-generated?" by pattern-matching entry.name against the placeholder shapes (field_N / TYPE / TYPE_N) — and its own first rename destroyed that shape, which is why typing Health Score one key at a time left the API name at h.

#7819 replaced that with a recorded owner ('label' while the derivation owns the name, 'author' the moment anyone types in the API name box), which is the posture CreateViewDialog's nameTouched and useCreateDerive's touched set already use.

⚠️ But the ruling's second boundary — lock it on first save — is still enforced by the placeholder-shape check, because that is the only save signal this inspector can see.

The residual, stated precisely

The record deliberately does not end at the 1.5 s draft auto-save (useDraftAutoSave) — and that choice is forced, not sloppy: if the auto-save counted as "saved", per-keystroke sync would be impossible by construction (the first auto-save would fire mid-typing and freeze the name).

⇒ The window that stays open is narrow and exactly one shape:

the same mounted inspector session in which the field was created, where a label edit after an auto-save still moves the API name.

Outside that window the behaviour is correct, and this is measured, not assumed:

state behaviour
new field, author has not touched the API name syncs on every label change ✅ (this is the fix)
author has typed in the API name box locked ✅ — including when what they typed is shaped like a placeholder (a hand-typed field_9, which no string pattern-match can distinguish from nextFieldName() output)
a published or reloaded field locked ✅ — fresh mount, no record, non-placeholder name
new field, same mount, after an auto-save ⬅ still syncs — this card

Why it needs a decision rather than a patch

Closing it requires the host to tell the inspector "this field is persisted" — a new prop on MetadataInspectorProps. That is a widening of a published props surface ⇒ Clause-② yes, and therefore not something the domain:ui dispatch lane takes on its own.

⚠️ It is also not obviously worth the prop. The residual only bites an author who, inside one uninterrupted inspector session, lets the draft auto-save fire and then keeps editing the label — and in that case the name following the label is arguably still the behaviour they want. ⇒ The real question is whether the window is a defect at all, and that is a ruling, not an implementation.

Related: objectui#7615 (the fix and the three pinned boundaries) · PR objectui#7819 · objectui#2260 (the original "API name follows the label until first save" ruling)


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    Contributor

    Closed not_planned — UI closure batch 4 item 1 · maintainer 「同意」 (chat, director seat summon #29, session_01EcrTi7s5oDYPHS4Pi7h31d) 2026-09-24T07:35Z

    The residual window is narrow and costs nothing downstream: in the same mounted inspector session that created the field, a label edit after the 1.5 s draft auto-save still moves the API name. The field is not yet published at that point, so nothing references the name. Closing the window needs a new host-to-inspector "saved" signal, a published signature change, and no author has reported the behaviour. Zero measured pull ⇒ not a card. Reopening is free.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpackage: app-shellpriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions