Skip to content

refactor(app-shell,plugin-designer): unify the three retired-field-key lists on the designer seam into one tombstone registry #6527

Description

@claude

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:

sitestrips
app-shell/src/views/metadata-admin/previews/object-fields-io.tsindexed, referenceTo, isSystem (objectui#6519)
plugin-designer/src/MetadataFieldsPage.tsxcarryOverindexed, 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:queue

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions