Skip to content

[finding] SelectOptionSchema was left out of the #7887 editability ruling — and it is the one shape where "boundary" is not the obvious answer #8201

Description

@os-zhuang

Filed unassigned by the domain:spec-surface seat (#6298) from PR #8199's dev report. Recording only — routing suggestion at the bottom, no label claimed beyond finding.

What

visible-when-alias-guidance.test.ts §3 (added by #7884) pins three shapes as declaring no disabled-ish key: SelectOptionSchema (data/field.zod.ts), FormSectionSchema (ui/view.zod.ts), PageComponentSchema (ui/page.zod.ts).

The maintainer ruling of 2026-08-12 on #7887 covered two of them — sections and page components gate visibility only; editability lives on fields. PR #8199 implemented that and deliberately left SelectOptionSchema bare, since the ruling does not name it.

So the third shape is now the odd one out: two of the three answer disabled with a boundary prescription, and it still answers with a bare unknown-key error.

Why it is not simply "apply the same ruling"

The ruling's reasoning does not obviously transfer, which is why this is filed as a question rather than a follow-up chore:

  • A disabled select option is a real UI concept. An option that is shown but unselectable is a thing pickers do — unlike a read-only form section, which has no rendering meaning of its own. So "no editability semantics to enforce" — the load-bearing premise of the [finding] disabled has no vocabulary at all on FormSectionSchema / PageComponentSchema — no readonly/disabled/disabledWhen key to point an author at #7887 ruling — is not clearly true here.
  • This surface already carries per-option state. Per-option visibleWhen binds current_user (ADR-0068), i.e. options already have their own predicate machinery. The section/component argument ("editability belongs to the field inside") has no equivalent: an option has nothing inside it.
  • Conversely the ADR-0049 argument still applies with full force: if nothing in the renderer honours a per-option disabled flag today, declaring one ships a declared-but-unenforced key.

So it is a genuine boundary-vs-gap question of the same kind #7887 was, and it wants the same treatment: a decision, then whichever prose or slot follows from it.

What would settle it

Whether any consumer (the console's picker, the metadata-form renderer, or any objectui select widget) has a notion of a non-selectable option today. If one does, this is a gap; if none does, it is a boundary and the fix is the same one-paragraph prose + prescription that #8199 just landed for the two siblings — pointing authors at whatever the real answer is (filtering the option out via visibleWhen, most likely).

Routing suggestion

domain:spec for the decision (adding a key would widen the accepted set); the follow-on prose is domain:spec-surface and small — the #8199 pattern is directly reusable, including the guidance-set placement reasoning. Low urgency: zero measured author pull, and the existing §3 pins already fail loudly the moment any disabled-ish key is added to this shape.

Backlinks: #7887 (the ruling), PR #8199 (the two-shape implementation), #7884 (the §3 pins), ADR-0068 (per-option current_user binding).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions