Skip to content

spec(components): twelve un-cast reads of undeclared keys block objectui#8347's index-signature removal (list, loading, input-otp, sidebar, drawer, dropdown-menu, popover, sheet) #11347

Description

@objectstack-fleet

Filing-gate category: ① — named landing points: the un-cast reads that objectui#8347's premise P1 enumerated, ordered by the objectui#7927 ruling's step 1. A derived child of in-flight objectui#8347, filed with the parent's domain:spec and priority:p2.
Reader: the domain:spec @ objectui seat (objectui#10217) dispatches it, and an os-dev executes it.
Parent: objectui#8347. That card stays pm:blocked until this card and its siblings land.

Why this card exists

The objectui#7927 ruling (5565351677, director seat, decision batch #68; the maintainer's 「同意」) orders the removal:

  • Step 1, verbatim: 「Census first, delete never before: every read that rides the passthrough is enumerated and either declared on its schema or retired」.
  • Unit: objectui#8327's sequencing ruling 5587717012 (Q2 = A) sets one card per reader package.

objectui#8347's P1 measured the un-cast population that the cast-aware objectui#8327 census could not see (report 5926022178):

  • Totals: 303 errors across 17 packages once BaseSchema's [key: string]: any is deleted alone.
  • Control: 0 errors at the same base with the signature present.
  • This package: @object-ui/components carries 12 errors in shipped source and 94 in tests.

The population (origin/main 5262f7dd3; files and keys, no line addresses)

Shipped source: 12 un-cast reads, 8 renderers, 9 keys. None of these keys was adjudicated by objectui#8648. That card covered four keys read off UIActionSchema, and none of them is here.

renderer (node type) keys read off schema, undeclared on its type
renderers/data-display/list.tsx (list) title ×2
renderers/feedback/loading.tsx (loading) text ×2
renderers/form/input-otp.tsx (input-otp) maxLength (TS2551: the type declares a near spelling)
renderers/navigation/sidebar.tsx (sidebar) active (the read is typed at BaseSchema itself)
renderers/overlay/drawer.tsx (drawer) shouldScaleBackground, footer, showClose
renderers/overlay/dropdown-menu.tsx, popover.tsx, sheet.tsx modal (one each)

Tests: 94 errors in 20 files.

  • Most are object literals typed BaseSchema that author a key the concrete node type declares, so the fix is a retype to the concrete schema.
  • The keys that recur most: properties ×14, content ×13, actions ×8, location ×8, required ×7, options ×6, actionType ×5, maxVisible ×4, and props ×4.
  • Deliberately misspelled or bogus probe keys (the "an UNKNOWN key still compiles" ceiling pins) are NOT this card's. They flip to @ts-expect-error in objectui#8347's removal commit.

Re-derive it: apply objectui#8347's P1 mutation in a worktree (delete the six-line docblock and signature on BaseSchema only), rebuild @object-ui/types, and run this package's type-check programs un-chained (tsc --noEmit, then tsc -p tsconfig.test.json). Capture the exit codes before any pipe.

What each key owes (the per-key rule; measure each key, ⛔ none is decided here)

The objectui#8648–#8655 family's rule, with 协议为基准:

  1. The installed @objectstack/spec row for that node type declares the key. Declare it on the TypeScript type by reference to the spec.
    • The zod mirror is objectui#6152's face. If the declaration opens a zod-mirror-parity UnmirroredDeclared row, the PR books it there; it does not widen the mirror on its own.
  2. The spec does not declare it, and a real producer authors it (catalog, examples, docs, a server-shipped document). That is a contract fork: report it with the four-axis frame. ⛔ Never declare against the spec.
  3. The spec does not declare it, and nothing authors it. Retire the read, and the producer-side remedy follows AGENTS.md #0.1.
  4. It is a host-supplied value, not authored metadata. Move it to a typed React prop or the host channel, as objectui#9342 did for onCardMove. ⛔ Never declare it on the authoring face.
  5. An existing ruling says never-declare (objectui#5091, objectui#5097). Keep a deliberate, documented cast.

maxLength on input-otp is the near-miss class (TS2551): measure whether the declared spelling or the read spelling is the spec's before choosing which one moves.

Acceptance (executable)

  • With the signature present: the package's type-check and tests are green, and main stays green. Every edit here compiles WITH the signature, so this card lands independently.
  • With objectui#8347's P1 mutation applied locally: this package's programs report 0 errors, except the ceiling-pin probe keys, which the PR body lists by file as objectui#8347's flips.
  • Docs: the docs and doc snippets for these node types agree with each verdict (AGENTS.md Add automated testing infrastructure and CI/CD workflows #2).

Out of scope ⛔

  • The removal itself, the compile-fail pin, and the AGENTS.md §5 #0.1 amendment. They are objectui#8347's, and that card lands last.
  • dataSource reaching components through SchemaRenderer's prop spread (objectui#11070), and the zod strict face (objectui#8345, objectui#11070).

Dedupe

Grepped locally over every objectui issue updated since 2026-09-01: 2,209 issues, open and closed, with bodies, read 2026-10-01T06:35Z.

Dedupe words: BaseSchema index signature removal components un-cast read · drawer showClose shouldScaleBackground undeclared · overlay modal undeclared popover sheet dropdown-menu · input-otp maxLength near spelling

Activity

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

Metadata

Metadata

Assignees

Labels

domain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lanepriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions