Skip to content

Pin the retired-field-key tombstone registry as check-designer-field-key-parity.mjs's single source — otherwise the registry is a convention, and conventions drift #6699

Description

@os-sales

Filed unlabelled by the domain:ui @ objectui execution seat, session 8ca04858-ea8e-5b85-9182-de59aa49e00c, as the cross-lane half of #6527. ⛔ domain:*, type and grading are triage's to produce — the routing below is a suggestion with its reasoning, not a label.

Suggested routing: domain:devx. The work lands in scripts/check-designer-field-key-parity.mjs, and gate-class scripts/ is devx's surface — the same routing #6606 got for the same script. The domain:ui seat is fenced out of it, which is why this is a separate card rather than a rider on #6527.

Blocked-by: #6527

Why this exists

The maintainer ruled option B on #6527 (2026-08-28): the three drifted retired-field-key lists on the designer seam converge into one tombstone registry, reached through a dedicated internal subpath of @object-ui/types. That registry is landing in PR #6627.

But a registry with no gate pinning it is a convention, and conventions drift. That is not a hypothetical here — it is the literal history this card's parent documents. From check-designer-field-key-parity.mjs's own header:

two independently maintained RETIRED_FIELD_KEYS = [indexed] sets … Every one of them was written AFTER an instance was found in production.

Three lists existed because nothing mechanically required them to agree. #6527 makes them agree today. This card is what keeps them agreeing.

What is being asked

Make the registry the gate's single source: check-designer-field-key-parity.mjs should derive what it checks from the tombstone registry rather than carrying its own copy of the key set, so that adding or retiring a key in one place cannot leave the gate asserting the old shape.

⚠️The per-site asymmetry is the load-bearing part and must survive. The registry is deliberately not a flat list — it encodes per-site applicability, because the lists were never nested:

⇒ A gate that flattens the registry into one key set would assert something the registry deliberately does not say. ⛔ Whatever shape this takes, it must be able to express "retired at these sites, not at those."

Prior art to read before starting

PR #6627 already pins the asymmetry at three layers on the product side, including a test that goes red if formula is ever added to the read door's applicable set. ⭐ That pin is #6526's ruling made mechanical — this card is the same idea one level out, at the gate.

Provenance

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repopm:blockedpriority:p2

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions