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
Reported by the
#7615dev seat as an out-of-scope residual, and filed by the PM seat so it survives that card'sFixesclose. ⛔ 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
ObjectFieldInspectorused to decide "is this API name still auto-generated?" by pattern-matchingentry.nameagainst the placeholder shapes (field_N/TYPE/TYPE_N) — and its own first rename destroyed that shape, which is why typingHealth Scoreone key at a time left the API name ath.#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 postureCreateViewDialog'snameTouchedanduseCreateDerive'stouchedset already use.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:
Outside that window the behaviour is correct, and this is measured, not assumed:
field_9, which no string pattern-match can distinguish fromnextFieldName()output)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 thedomain:uidispatch lane takes on its own.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