Found while implementing the objectui#6140 / objectui#6153 spec half (PR #13669). Filed unassigned, not fixed there — it is outside that ruling's scope (the ruling declared rows and options[].description only).
The disagreement
packages/spec/src/data/object.form.ts, the fields repeater's options sub-form, offers five inputs per option:
So the authoring form teaches a key the publish door rejects — the author finds out at the 422. This is the same class the #11410 / #12868 work retired elsewhere (a form offering a choice publish refuses), one key over.
Why it is not obviously "just delete the row"
The non-declaration of icon on SelectOptionSchema is deliberate and recorded: the #5016 per-key measurement (documented in packages/spec/src/ui/action.zod.ts, the action-param option docblock) left icon / disabled out with option C — "None has a reader an action param's option list can reach". But that measurement was about the ACTION-param path; objectui's SelectOptionMetadata interface does declare icon (per the same docblock: label / value / color / icon / disabled / visibleWhen), so whether a FIELD option's icon has a live objectui reader today deserves its own measurement before choosing between:
- remove the
icon row from object.form.ts (declared = offered converges downward), or
- declare
icon on SelectOptionSchema (needs a measured reader plus a ruling — an accepted-set expansion, Clause-② class).
PR #13669's pin file (field-rows-option-description.test.ts) pins icon as still-refused, so whichever way this resolves, that pin moves with it deliberately rather than silently.
Refs: PR #13669 · objectui#6140 / objectui#6153 (the family ruling this fell out of) · #5016 (the action-path per-key measurement) · #12868 (the form-face option narrowing precedent).
Generated by Claude Code
Found while implementing the objectui#6140 / objectui#6153 spec half (PR #13669). Filed unassigned, not fixed there — it is outside that ruling's scope (the ruling declared
rowsandoptions[].descriptiononly).The disagreement
packages/spec/src/data/object.form.ts, the fields repeater'soptionssub-form, offers five inputs per option:label,value,color— declared onSelectOptionSchema, fine.description— was offered-but-refused; DECLARED by PR feat(spec): declare rows (multiline editors) and options[].description as authorable field-metadata keys (objectui#6140 / objectui#6153, spec half) #13669 under the objectui#6153 inherited ruling, so this half is now honest.icon(helpText "Lucide icon name") — still offered, and still refused:SelectOptionSchema(packages/spec/src/data/field.zod.ts) does not declareicon, and the shape is strict, so a value typed into that form input is anunrecognized_keysrefusal at publish.So the authoring form teaches a key the publish door rejects — the author finds out at the 422. This is the same class the #11410 / #12868 work retired elsewhere (a form offering a choice publish refuses), one key over.
Why it is not obviously "just delete the row"
The non-declaration of
icononSelectOptionSchemais deliberate and recorded: the #5016 per-key measurement (documented inpackages/spec/src/ui/action.zod.ts, the action-param option docblock) lefticon/disabledout with option C — "None has a reader an action param's option list can reach". But that measurement was about the ACTION-param path; objectui'sSelectOptionMetadatainterface does declareicon(per the same docblock: label / value / color / icon / disabled / visibleWhen), so whether a FIELD option'siconhas a live objectui reader today deserves its own measurement before choosing between:iconrow fromobject.form.ts(declared = offered converges downward), oricononSelectOptionSchema(needs a measured reader plus a ruling — an accepted-set expansion, Clause-② class).PR #13669's pin file (
field-rows-option-description.test.ts) pinsiconas still-refused, so whichever way this resolves, that pin moves with it deliberately rather than silently.Refs: PR #13669 · objectui#6140 / objectui#6153 (the family ruling this fell out of) · #5016 (the action-path per-key measurement) · #12868 (the form-face option narrowing precedent).
Generated by Claude Code