27 row properties on two repeater carriers in packages/spec/src/ui/dashboard.zod.ts still render column headers from raw property keys in the Studio property panel.
The fence on this file has DROPPED. It was held by #17474, which landed — measured on origin/main 76ddab772f: git grep -c 'only widget type' -- packages/spec/src/ui/dashboard.zod.ts reads 1. So this is dispatchable now, not blocked.
Carriers and counts, derived through the platform's own predicate (z.toJSONSchema over getMetadataTypeSchema), not by regexing source:
dashboard : widgets 17 row properties
dashboard : globalFilters 10 row properties
⚠️ Six retiredKey() tombstones are excluded from these counts (5 on dashboard.widgets). They are separately reported as #17502 — ⛔ do not title a tombstone.
Part of #17232. The mechanism that makes this measurable is packages/spec/src/kernel/repeater-item-titles.test.ts — an exact, shrink-only ledger: a carrier absent from the ledger must be fully titled (a new untitled repeater reds on arrival), and a carrier present in it must still be untitled (a paid debt must be DELETED from the ledger). So the work here is: add .meta({ title }) to each row property, then remove this carrier's ledger entry. ⛔ Do not weaken the ledger to make it pass.
Titles are hard-coded English by design, not a gap. packages/spec/src/system/translation.zod.ts states it: a row property is rendered from items.properties[k].title, and resolveMetadataFormSchemaTitles overlays the locale bundle on top of that node. The English default has to live on the schema.
⚠️ Anchor by CONTENT, not line number — this area is moving daily.
⚠️ Known trap, found by the pin itself: a .meta({ title }) on a schema that zod hoists into $defs is emitted as a sibling of the $ref — {"title":"…","$ref":"#/$defs/__schema0"}. Read the property node first, as Studio does; deref'ing first reports genuinely-titled properties as untitled.
⛔ Ungraded — triage sets type and priority. Filed by the domain:spec execution seat 2026-09-10T18:04Z.
Generated by Claude Code
27 row properties on two repeater carriers in
packages/spec/src/ui/dashboard.zod.tsstill render column headers from raw property keys in the Studio property panel.The fence on this file has DROPPED. It was held by #17474, which landed — measured on
origin/main76ddab772f:git grep -c 'only widget type' -- packages/spec/src/ui/dashboard.zod.tsreads 1. So this is dispatchable now, not blocked.Carriers and counts, derived through the platform's own predicate (
z.toJSONSchemaovergetMetadataTypeSchema), not by regexing source:retiredKey()tombstones are excluded from these counts (5 ondashboard.widgets). They are separately reported as #17502 — ⛔ do not title a tombstone.Part of #17232. The mechanism that makes this measurable is
packages/spec/src/kernel/repeater-item-titles.test.ts— an exact, shrink-only ledger: a carrier absent from the ledger must be fully titled (a new untitled repeater reds on arrival), and a carrier present in it must still be untitled (a paid debt must be DELETED from the ledger). So the work here is: add.meta({ title })to each row property, then remove this carrier's ledger entry. ⛔ Do not weaken the ledger to make it pass.Titles are hard-coded English by design, not a gap.
packages/spec/src/system/translation.zod.tsstates it: a row property is rendered fromitems.properties[k].title, andresolveMetadataFormSchemaTitlesoverlays the locale bundle on top of that node. The English default has to live on the schema..meta({ title })on a schema that zod hoists into$defsis emitted as a sibling of the$ref—{"title":"…","$ref":"#/$defs/__schema0"}. Read the property node first, as Studio does; deref'ing first reports genuinely-titled properties as untitled.⛔ Ungraded — triage sets type and priority. Filed by the
domain:specexecution seat 2026-09-10T18:04Z.Generated by Claude Code