The deferred half of objectui#6519. Three retired-field-key lists live on the designer seam, each scoped to one writer's own history, and they have drifted:
| site | strips |
|---|
app-shell/src/views/metadata-admin/previews/object-fields-io.ts | indexed, referenceTo, isSystem (objectui#6519) |
plugin-designer/src/MetadataFieldsPage.tsxcarryOver | indexed, referenceTo, isSystem, formula |
app-shell/src/services/MetadataService.tscarryOver (objectui#6488) | indexed, referenceTo, formula, isSystem, sortOrder |
scripts/check-designer-field-key-parity.mjs's own header names this shape as the thing that existed before the gate: "two independently maintained RETIRED_FIELD_KEYS = [indexed] sets ... Every one of them was written AFTER an instance was found in production."
The part that is NOT mechanical
The lists are deliberately not nested, and objectui#6519 measured why — so a naive union would be a regression:
formula is stripped by the two WRITE-side lists but must not be stripped by the READ door: ObjectFieldInspector seeds its linting CEL editor from def.expression ?? def.formula and the first edit migrates it, which objectui#6043 deliberately preserved. Adding it to the read door turns that pin red (objectui#6526 carries the measurement and the open decision).sortOrder appears only in MetadataService's list. objectui#6045's own commit states no writer on this tree ever populated a field-level one ("the key never reached the wire"), so its presence there is defensive rather than measured.
So the unification worth doing is a shared TOMBSTONE REGISTRY — one place naming each retired key, the card that retired it, and per-site applicability — not one array spread across three call sites. Whether sortOrder belongs anywhere is part of the same question.
Blocked-by: #6489 — this spans plugin-designer/src/MetadataFieldsPage.tsx, which #6489 owns in flight; objectui#6519 scoped itself to object-fields-io.ts to avoid the collision.
Generated by Claude Code
Generated by Claude Code
The deferred half of objectui#6519. Three retired-field-key lists live on the designer seam, each scoped to one writer's own history, and they have drifted:
app-shell/src/views/metadata-admin/previews/object-fields-io.tsindexed,referenceTo,isSystem(objectui#6519)plugin-designer/src/MetadataFieldsPage.tsxcarryOverindexed,referenceTo,isSystem,formulaapp-shell/src/services/MetadataService.tscarryOver(objectui#6488)indexed,referenceTo,formula,isSystem,sortOrderscripts/check-designer-field-key-parity.mjs's own header names this shape as the thing that existed before the gate: "two independently maintainedRETIRED_FIELD_KEYS = [indexed]sets ... Every one of them was written AFTER an instance was found in production."The part that is NOT mechanical
The lists are deliberately not nested, and objectui#6519 measured why — so a naive union would be a regression:
formulais stripped by the two WRITE-side lists but must not be stripped by the READ door:ObjectFieldInspectorseeds its linting CEL editor fromdef.expression ?? def.formulaand the first edit migrates it, which objectui#6043 deliberately preserved. Adding it to the read door turns that pin red (objectui#6526 carries the measurement and the open decision).sortOrderappears only inMetadataService's list. objectui#6045's own commit states no writer on this tree ever populated a field-level one ("the key never reached the wire"), so its presence there is defensive rather than measured.So the unification worth doing is a shared TOMBSTONE REGISTRY — one place naming each retired key, the card that retired it, and per-site applicability — not one array spread across three call sites. Whether
sortOrderbelongs anywhere is part of the same question.Blocked-by: #6489 — this spans
plugin-designer/src/MetadataFieldsPage.tsx, which #6489 owns in flight; objectui#6519 scoped itself toobject-fields-io.tsto avoid the collision.Generated by Claude Code
Generated by Claude Code