Filed by the domain:ui PM seat from the contract review of PR #7691 (comment 5550050556), which raised it as a non-blocking recommendation explicitly conditioned on PR #7683 landing. #7683 merged 2026-09-05T03:08:45Z (51eb51558), so the condition is met and this is now actionable.
Measured on origin/main 6eebc54b6
ComboboxOption is absent from the @object-ui/types root barrel while its siblings are present:
| name |
hits on packages/types/src/index.ts |
ComboboxOption |
0 |
SelectOption (control) |
2 |
RadioOption (control) |
1 |
ComboboxSchema (control) |
1 |
The instrument is lit — the same word-boundary grep reads non-zero for all three controls, so the zero is a reading.
The type is declared at packages/types/src/form.ts:1354. The root barrel re-exports from ./form.js as an explicit named list (closing at index.ts:179), so this is not a wildcard that happens to miss it — the name was simply left out of the list.
Why it matters now rather than before
PR #7691 made @object-ui/types the authority for ComboboxOption: @object-ui/components stopped declaring its own copy and now re-exports the types one. The review measured that the components-face option is now literally NonNullable<ComboboxSchema['options']>[number].
But the authority is reachable only through the @object-ui/types/form subpath. import { ComboboxOption } from '@object-ui/types' reads TS2305 — the review measured that on both its trees, and it is still true on main. The subpath was chosen deliberately in #7691 (the root barrel was held by #7683 at the time, and a barrel line would have been both a fence breach and a second published-surface addition), and the review judged that sound on its own merits — the subpath is a house pattern (@object-ui/types/zod, @object-ui/types/internal/retired-field-keys).
So this card is not a defect in #7691. It is the follow-up #7691 could not take: put the authority on the barrel consumers reach for first, next to the siblings that are already there.
Shape
Add ComboboxOption to the existing named re-export list from ./form.js in packages/types/src/index.ts. ⛔ Do not convert the list to a wildcard, and ⛔ do not move the declaration.
⚠️ Clause-②: yes — this widens the published surface of @object-ui/types by a name on its root entry. It needs the draft + needs:contract-review + contract review path, and a minor changeset stating the addition. It is additive only: nothing is removed, retyped or narrowed, and the subpath spelling keeps working.
Read-coupling to check before starting
objectui#7687 (Combobox never reads options[].disabled) is open and queued against the same type. This card does not touch behaviour and does not decide #7687 — but whoever takes either one should read the other first.
Also from the #7691 review, for whoever fixes #7687 rather than this card: content/docs/components/form/combobox.mdx:28-31 documents ComboboxOption as { value; label } in a plaintext fence no gate reads, so it is stale against the types face and no CI check will catch it. It was already stale before #7691.
Generated by Claude Code
Filed by the
domain:uiPM seat from the contract review of PR #7691 (comment 5550050556), which raised it as a non-blocking recommendation explicitly conditioned on PR #7683 landing. #7683 merged 2026-09-05T03:08:45Z (51eb51558), so the condition is met and this is now actionable.Measured on
origin/main6eebc54b6ComboboxOptionis absent from the@object-ui/typesroot barrel while its siblings are present:packages/types/src/index.tsComboboxOptionSelectOption(control)RadioOption(control)ComboboxSchema(control)The instrument is lit — the same word-boundary grep reads non-zero for all three controls, so the zero is a reading.
The type is declared at
packages/types/src/form.ts:1354. The root barrel re-exports from./form.jsas an explicit named list (closing atindex.ts:179), so this is not a wildcard that happens to miss it — the name was simply left out of the list.Why it matters now rather than before
PR #7691 made
@object-ui/typesthe authority forComboboxOption:@object-ui/componentsstopped declaring its own copy and now re-exports the types one. The review measured that the components-face option is now literallyNonNullable<ComboboxSchema['options']>[number].But the authority is reachable only through the
@object-ui/types/formsubpath.import { ComboboxOption } from '@object-ui/types'reads TS2305 — the review measured that on both its trees, and it is still true onmain. The subpath was chosen deliberately in #7691 (the root barrel was held by #7683 at the time, and a barrel line would have been both a fence breach and a second published-surface addition), and the review judged that sound on its own merits — the subpath is a house pattern (@object-ui/types/zod,@object-ui/types/internal/retired-field-keys).So this card is not a defect in #7691. It is the follow-up #7691 could not take: put the authority on the barrel consumers reach for first, next to the siblings that are already there.
Shape
Add
ComboboxOptionto the existing named re-export list from./form.jsinpackages/types/src/index.ts. ⛔ Do not convert the list to a wildcard, and ⛔ do not move the declaration.Clause-②: yes— this widens the published surface of@object-ui/typesby a name on its root entry. It needs the draft +needs:contract-review+ contract review path, and aminorchangeset stating the addition. It is additive only: nothing is removed, retyped or narrowed, and the subpath spelling keeps working.Read-coupling to check before starting
objectui#7687 (
Comboboxnever readsoptions[].disabled) is open and queued against the same type. This card does not touch behaviour and does not decide #7687 — but whoever takes either one should read the other first.Also from the #7691 review, for whoever fixes #7687 rather than this card:
content/docs/components/form/combobox.mdx:28-31documentsComboboxOptionas{ value; label }in aplaintextfence no gate reads, so it is stale against the types face and no CI check will catch it. It was already stale before #7691.Generated by Claude Code