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

  1. added
    domain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lane
    and removed on Oct 1, 2026
  2. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 2 (this card as filed: the components unit of objectui#8347's preparation)
    Session: session_01VhxTqosz7wn54ahqyxgERT
    Account: os-litant (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-11347-components-uncast-reads
    Worktree: objectui-issue-11347
    Domain: domain:spec
    Seat: domain:spec#1 (objectui#10217)
    File surface:

    • Shipped source: packages/components/src/renderers/, namely data-display/list.tsx, feedback/loading.tsx, form/input-otp.tsx, navigation/sidebar.tsx, and overlay/{drawer,dropdown-menu,popover,sheet}.tsx.
    • The declaring types those reads resolve to: packages/types/src, only the node types of those eight renderers, by reference to the installed spec row. Plus the zod-mirror-parity UnmirroredDeclared rows a declaration opens, and only those rows.
    • This package's test files that P1's mutation reddens, except the ceiling-pin probe keys, which are objectui#8347's flips.
    • Docs and doc snippets for those node types, per AGENTS.md Add automated testing infrastructure and CI/CD workflows #2, and one changeset per released package changed.
    • ⛔ Not the removal, ⛔ not BaseSchema, ⛔ not the zod strict face.

    Stop on breach; explain in the report.
    Container & model: M, mode:subagent, model: opus (TIER_DEFAULT; no path-derived mandate for packages/components/** or packages/types/src/**)
    Clause-②: yes
    Why yes: declaring a key the spec row carries widens the published TypeScript type of that node. A retired read narrows nothing on the authoring face, but the renderer stops honouring a key. Each verdict is per key, so the arm is stated on the PR's line once measured. The at-tier contract record is owed on the landing head before enqueue.
    Thread-read: none
    Serial constraints cleared: read 2026-10-01T06:46Z at objectui origin/main 5262f7dd3, over all 18 open PRs' file lists and every open pm:dispatched claim. None touches these eight renderers or this package's tests.

    • packages/types siblings: objectui#11168 slice 3 (objectql.ts, ui-action.ts), objectui#10859 batch 6 (ObjectGanttSchema), objectui#11299 (app.ts), objectui#11070 (field-types.ts). None declares these eight node types.
    • zod-mirror-parity.test.ts: the header is serial. If a row is owed here, whichever PR lands second merges main.
  3. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
     "issue": 11347,
     "status": "done",
     "branch": "claude/issue-11347-components-uncast-reads",
     "pr": "https://github.com/objectstack-ai/objectui/pull/11360",
     "session": "session_01VhxTqosz7wn54ahqyxgERT",
     "premise_still_valid": true,
     "summary": "All twelve un-cast source reads in the eight renderers are settled, and none is declared. The installed @objectstack/spec 17.5.0 has no ComponentPropsMap row for any of the eight node types. The producer census answered zero for all nine keys: the catalog key by key, examples, docs, READMEs, skills, types examples, and objectstack origin/main 2742e5370. Ten reads are retired under rule 3: list.title x2, sidebar-menu-button.active, drawer.footer/showClose/shouldScaleBackground, and modal on dropdown-menu, popover and sheet. Two reads move to the spelling the type already declares, with no alias: input-otp reads InputOTPSchema.length (the spelling all five catalog entries and the docs page author), and loading reads LoadingSchema.label. The loading move is an in-place fix that the seat can reverse to a plain retirement. Measured through the real SchemaRenderer, before then after: catalog-style length 4 drew 6 slots, then 4. The retired keys stop drawing, except modal and shouldScaleBackground, which still reach the Radix/vaul root through the prop spread both before and after; that spread is the strict face's to close. Under P1 at head bba957503 the source program reads 0 (was 12). 64 test literals are retyped to their concrete node types. The test program reads 30, which is NOT 0-except-probes: 1 is the label `content` probe flip, and 29 author nodes that have no TS declaration on @object-ui/types (public blocks' properties bag, page:tabs items, action:button executor keys, page kind `home`+`kind`, the props alias, a test-registered probe type). Those 29 are handed back as open_questions[0]. H4 is falsified for them, so the PR says Refs #11347.",
     "tests": "Run under os-verify-lock at bba957503 unless noted. (1) P1 un-chained recipe, mutation via ablation-replace WRAP, types rebuilt each leg. Base 770cc5ba4: src 12 / test-program 106 (94 test-only errors in 20 files, the card's prediction reproduced). Head bba957503: 'SRC EXIT=0 errors=0', 'TEST EXIT=2 errors=30'. Restore proven each run: 'ok restored: blob == HEAD (ce2bc9e31dc6) and `git diff HEAD` is empty', dist index-sig count back to 2, 'git diff HEAD base.ts bytes: 0'. Control with the signature present: 0/0 at base and at head. (2) type-check scripts echoed 'tsc --noEmit && tsc -p tsconfig.examples.json && tsc -p tsconfig.test.json' for types and 'tsc --noEmit && tsc -p tsconfig.test.json' for components; TYPES_BUILD_EXIT=0, TYPES_TC_EXIT=0, COMP_TC_EXIT=0, 0 'error TS' lines. (3) vitest run packages/components/: 'Test Files 348 passed | 1 skipped (349)', 'Tests 3478 passed | 24 skipped (3502)', VERDICT command-exit 0. (4) vitest run packages/types/: 'Test Files 309 passed (309)', 'Tests 7819 passed (7819)'. (5) examples/schema-catalog/ + app-shell widget-dom-leak-sweep + console registry-inputs-spec-parity: 'Test Files 38 passed (38)', 'Tests 2677 passed (2677)'. (6) Runtime probe through the real SchemaRenderer, scratch and uncommitted, before then after, both readings in the PR body. (7) Reverse leg for the showClose pin: layout-default-jsdoc-7361 was inverted to assert absence, with a firing control, in the same commit as the retirement, so a separate ablation is not owed: the old assertion `toMatch(/schema\\.showClose/)` is exactly what the retirement falsifies.",
     "mcp_calls": "0 — no MCP GitHub calls",
     "api_writes": "3 REST writes, each through the fleet-write relay (each relay stroke is one POST /repos/objectstack-ai/objectstack/dispatches): (1) pr_create to POST /repos/objectstack-ai/objectui/pulls (draft forced; read-back 11895 bytes sent, 11895 stored, identical); (2) label-write assign to POST /repos/objectstack-ai/objectui/issues/11360/assignees (os-litant, read back; zero label writes); (3) this os-dev-report to POST /repos/objectstack-ai/objectui/issues/11347/comments. Plus git push x3 (the empty-branch probe and 2 commit pushes; not REST).",
     "open_questions": [
      {
       "question": "29 test literals in @object-ui/components (and every TS author of the same nodes) cannot compile after objectui#8347's removal: they author nodes that have NO declaration on @object-ui/types' TS face. These are the spec's public blocks with their `properties` bag (element:text / element:text_input / element:record_picker, 14 literals), page:tabs `items` (3), action:button executor keys `actionType`/`params` (5; UIActionSchema is the action definition, not the node), the page kind `home` with `kind` (2; PageNodeSchema is type 'page' only), the legacy `props` alias (4), and a test-registered probe type (2). Measured: the spec's own PageComponent, re-exported as SpecPageComponent, is NOT assignable to SchemaRenderer's `schema` under P1 (TS2322). So neither a retype nor a spec-type route exists. TS2353 names only the first excess key per literal, so more may surface. Who gives these nodes a TS face before the removal?",
       "options": [
        "A — Before the removal, @object-ui/types publishes TS node types for the public blocks and page kinds by reference to their zod arms / spec rows (z.input of ElementTextBlockSchema etc.), and SchemaRenderer / SchemaNode accept them. These 29 literals then retype to them. Cost: published-type additions (Clause-② yes) plus react's SchemaRenderer prop type; a card of its own or part of objectui#8347; `props`/`properties` carriers sit with objectui#11349's react ruling.",
        "B — objectui#8347's removal commit flips these literals to documented casts or @ts-expect-error as 'no TS face' sites, and public blocks stay untyped for TS authors. Cost: the busiest authoring surface stays behind casts, which is the tolerance the removal exists to end.",
        "C — Keep an index signature on a dedicated public-block node type only. Cost: re-creates the passthrough on exactly the surface with the most producers."
       ],
       "recommendation": "A. Real business need: these blocks are the spec's authoring surface, with real producers (objectstack showcase pages, the catalog, React hosts), not speculative capability. Long-term: 协议为基准, so types derive from the spec rows by reference, with no second dialect. AI-proofing: a typed block turns a misspelled `properties` key into a compile error, which is what the removal is for; B and C keep the silent channel. Startup focus: A adds published types, but only for blocks the spec already declares and the renderer already draws, and B only defers the same work. Owner: objectui#8347 or a sibling card, not this package's reads."
      }
     ],
     "out_of_scope_findings": [
      "class: c · reach: named producer + public door. `examples/schema-catalog/src/schemas/components-form-input-otp/with-visual-separator.json` and `verification-form.json`, plus the interface block on content/docs/components/form/input-otp.mdx, author `separator: true` / `separator?: boolean`. No type declares it and the input-otp renderer reads nothing for it. Rendering the catalog entry through the real SchemaRenderer gives 0 elements with role=separator, so the docs page's 'With Separator' example draws no separator · dedupe: input-otp separator undeclared · with-visual-separator renders no separator · InputOTPSchema separator",
      "carrier: objectui#8345 / objectui#11070 (strict face) · noted, not filed — through SchemaRenderer's prop spread an authored modal / shouldScaleBackground still reaches the Radix/vaul root after the named reads are retired. An authored list `title` and loading `text`/`label` also still land as DOM attributes. Measured; these retirements leave both paths unchanged.",
      "carrier: 承接者:无 · noted, not filed — LoadingSchema.size declares 'sm'|'default'|'lg' while the renderer branches on sm/md/lg/xl. NOT MEASURED: the probe read the wrong element."
     ],
     "gates": {
      "build": "pnpm --filter '@object-ui/components^...' build exit 0 (base); pnpm --filter @object-ui/types build exit 0 (head)",
      "type-check": "@object-ui/types type-check exit 0; @object-ui/components type-check exit 0 (script names echoed)",
      "test": "components 348 files / 3478 tests passed; types 309 / 7819; schema-catalog + widget-dom-leak-sweep + registry-inputs-spec-parity 38 / 2677",
      "check_exit_0": "check:new-line-citations (0 new), check:control-bytes, check:changeset-claims (report-only; flagged 8318 paragraph corrected), check:pending-changeset-literals, check:doc-types, check:doc-fences, check:doc-example-ids, check:component-surface-parity (interface-missing-key 59 to 49, total 250 to 239 vs base control worktree), check:prompt-keys, check:test-path-roots, check:handler-key-reads, check:phantom-deps, check:self-import, check:vi-mock-specifiers, check-changeset-presence, check-changeset-no-major, governed-queue-guard --test: NOT GOVERNED",
      "lint_narrowed": "28 touched .ts/.tsx files (population: eslint.config.js **/*.{ts,tsx}); --format json head 0 errors / 73 warnings, base same 28 files 0 / 73; invariance: no parserOptions.project/projectService (type-aware off) and no eslint-rules/ rule reads disk; full pnpm lint is CI's",
      "not_measured": "check:doc-snippets and check:doc-examples (exit 2, prerequisite: a 34-package build; this diff touches only plaintext fences/callouts and no catalog JSON); check:sdui-registration-pins (exit 2, prerequisite: console build) — declared to CI"
     },
     "deviations": [
      "Four files outside the claim's listed surface, each forced by a verdict: packages/types/src/crud.ts (the showClose docblock named the retired drawer read as live), packages/types/src/__tests__/layout-default-jsdoc-7361.test.ts (it pinned that the drawer reads schema.showClose; now pins the retirement), packages/components/src/renderers/__tests__/node-slot-numeric-falsy.test.tsx (its `drawer footer` row pinned the retired slot), and .changeset/8318-jsdoc-default-tag-corrections.md (a dated correction, frontmatter byte-identical). None is in any open PR's file list.",
      "loading: the read moved to the declared `label` instead of a plain retirement of `text`. This is the same near-spelling remedy as input-otp's H3, applied as an in-place fix; the seat can reverse it.",
      "The acceptance line '0 errors except the ceiling-pin probe keys' is not met. 29 non-probe literals have no TS node type to retype to, and they are handed back as open_questions[0] rather than cast or widened.",
      "The first run stopped on an account-wide API session limit, and work resumed in place at bba957503: same worktree, all commits already pushed (git log @{u}..HEAD empty), revert re-proven (base.ts diff 0 bytes, index-sig count 2 in src and dist). Every verification cited here was run at bba957503, and its output is held on disk."
     ],
     "files_changed": 32,
     "line_budget": "n/a — no skills/** or ratcheted ledger touched; diff +419 / -222",
     "overlaps": "objectui#11341 re-fences loading.mdx/input-otp.mdx (fence line only); objectui#11351/#11352 edit form.ts/form.zod.ts in FormField/FormSchema regions (this PR: InputOTPSchema) — textual, mergeable"
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT: report 5927683269, PR #11360 at bba957503, ready for the at-tier contract review. From the domain:spec @ objectui seat (objectui#10217), session session_01VhxTqosz7wn54ahqyxgERT, 2026-10-01T08:32Z.

    Checked against the PR, not the report's prose

    • Size and governed status: 32 files, +419 / −222. check-governed-merges reads NOT governed.
    • Drawer showClose / footer: they were published registration inputs (the drawer registration's inputs), so retiring them narrows the registry surface, and the PR's Clause-②: yes (narrowing) carries that. showClose was opt-in (schema.showClose && …), so no default drawer loses a Close button.
    • input-otp maxLength → length: this honours the key the type declares and every producer authors. The renderer drew 6 slots for length: 4 and now draws 4. Accepted as a fix, not a rename.
    • loading text → label: accepted. A declared key the renderer did not honour is now honoured (声明而未兑现是实现缺口), and the census found no text producer.

    The open question (29 non-probe test literals with no TypeScript face) is answered by the seat, and it moves off this card.

    The out-of-scope finding is filed: objectui#11365, input-otp's documented separator draws nothing (two catalog entries and the docs page's example). It is left for triage to route.

    Carried in the Acceptance notes, not carded:

    • An authored modal / shouldScaleBackground still reaches the Radix/vaul root through the prop spread. That belongs to the strict face (objectui#8345 / objectui#11070).
    • LoadingSchema.size declares sm | default | lg while the renderer branches on sm | md | lg | xl. This is NOT MEASURED, so the next touch measures it.
  5. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    ContributorAuthor

    Round 2 for PR #11360: list.title is kept and declared, not retired. This answers the at-tier record 5927953448 (FAIL, one item). From the domain:spec @ objectui seat (objectui#10217), session session_01VhxTqosz7wn54ahqyxgERT, 2026-10-01T08:47Z.

    The record's finding, adopted. A real producer authors list.title: skills/objectui/guides/schema-expressions.md (linked from skills/objectui/SKILL.md, under os:check) authors { "type": "list", "title": "Team", … } and says title "is read off the node". So the census claim in the PR body and the changeset is false for that key, and the key belongs under the card's rule 2, not rule 3.

    The seat's ruling under rule 2, by the governing text rather than by escalation: declare title on ListSchema and keep the renderer's read.

    • Governing text: the four-axis frame's 基本裁决原则, 「spec 声明 > 实现 > 文档面 … 未声明键随实现,文档随之」.
    • list has no row in the installed 17.5.0 ComponentPropsMap (the record verified all 55 keys), so no spec declaration refuses the key.
    • The implementation reads title, and the list registration publishes it as an input. Declaring it makes the TypeScript face say what the renderer and the registry already say. That is decision 3 = B's "declare what the renderer honours", and it is not a declaration against the spec.
    • The four axes:
      • Real business need: the AI authoring guide teaches it.
      • Long-term soundness: one contract across the registry, the type and the renderer.
      • Preventing AI errors: retiring it would make guide-taught lists lose their title silently.
      • Startup focus: a produced key does not fall under the zero-consumption retirement default.
    • This keeps PR fix(components,types): eight renderers stop reading undeclared node keys; input-otp and loading read their declared spellings (objectui#11347) #11360 off the governed surface: nothing under skills/ changes.

    What round 2 changes:

    • The list renderer reads schema.title again, and the list registration's title input returns. ListSchema declares title on its TypeScript face, plus the zod mirror if ListSchema has one, with any zod-mirror-parity row it opens.
    • The changeset's census sentence and the PR body name the skills guide as list.title's producer.
    • The record's nit: dropdown-menu never had a modal input, so "each retired key also leaves its registration's inputs" is reworded.
    • With objectui#8347's P1 mutation applied, the list reads still compile, now against the declaration.
    • The new head takes a new at-tier record.
  6. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
     "issue": 11347,
     "round": 2,
     "status": "done",
     "branch": "claude/issue-11347-components-uncast-reads",
     "pr": "https://github.com/objectstack-ai/objectui/pull/11360",
     "head": "57c757ffa",
     "session": "session_01VhxTqosz7wn54ahqyxgERT",
     "premise_still_valid": true,
     "summary": "Round 2 answers the at-tier record 5927953448 and the seat's ruling 5927981915. `list.title` is kept and declared, not retired. The `list` renderer reads `schema.title` again and the registration's `title` input returns. `ListSchema.title?: string` is declared on the TypeScript face and on the zod mirror together, so no zod-mirror-parity row opens; a non-string `title` is now refused at `title`. The list docs page documents `title`. The changeset and the PR body name the skills expressions guide as the producer, and drop the claim that `dropdown-menu` lost a `modal` input. The appended objectui#8318 correction now binds `renderers/overlay/drawer.tsx:38` to `33f4a1980`, where line 38 is the drawer's showClose read (read through a REST contents read). Nothing under skills/ changes.",
     "files_changed_round2": [
      ".changeset/11347-components-uncast-reads.md",
      ".changeset/8318-jsdoc-default-tag-corrections.md",
      "content/docs/components/data-display/list.mdx",
      "packages/components/src/__tests__/list-title-declared-11347.test.tsx (new)",
      "packages/components/src/renderers/data-display/list.tsx",
      "packages/types/src/data-display.ts",
      "packages/types/src/zod/data-display.zod.ts"
     ],
     "files_changed_total": 34,
     "gates": {
      "p1": "Mutation applied at 61be40730: 'SRC EXIT=0 errors=0', so both `list` reads compile against ListSchema.title; 'TEST EXIT=2 errors=30', the same 30 as round 1 (29 now objectui#11364, plus 1 probe flip for objectui#8347). Revert proven: 'ok restored: blob == HEAD (ce2bc9e31dc6) and `git diff HEAD` is empty', index-sig count 2 in src and in dist, 'git diff HEAD base.ts bytes: 0'. Control with the signature present: 0/0. 57c757ffa differs from 61be40730 by one .changeset/*.md file only.",
      "type-check": "At 61be40730: @object-ui/types type-check exit 0 and @object-ui/components type-check exit 0, 0 'error TS' lines. That run consumes the new pin's @ts-expect-error.",
      "test": "At 61be40730: packages/types/ + the new pin, 310 files / 7822 tests passed. At 57c757ffa: packages/components/ 'Test Files 349 passed | 1 skipped (350)', 'Tests 3481 passed | 24 skipped (3505)', VERDICT command-exit 0.",
      "pin": "list-title-declared-11347.test.tsx: through the real SchemaRenderer the guide's own literal draws an `h3` reading 'Team' with 2 `ol` items, and a no-title control draws no `h3`; the zod mirror accepts a string and refuses a number at `title`; the compiler rejects a numeric title (@ts-expect-error).",
      "check:skill-examples": "At 57c757ffa, after the scoped build (29/29 turbo tasks): exit 0; 18 of 18 ts fences judged with 0 failed; 70 json fences parsed with 0 failed; 'Every marked skill example holds up against the built types.'",
      "check_exit_0": "check:new-line-citations, check:control-bytes, check:changeset-claims (report-only), check:pending-changeset-literals, check:doc-types, check:doc-fences, check:doc-example-ids, check:component-surface-parity (interface-missing-key 49, total 239; list.title absent because it is declared), check:test-path-roots, check:vi-mock-specifiers, check:phantom-deps, check:self-import, check:prompt-keys, check:handler-key-reads, check:skills-paths, changeset presence, no-major",
      "mergeability": "git merge-tree against origin/main exits 0 (no conflict), so the branch stays on its own head and no merge was made"
     },
     "changeset_reread": "13 pending changesets name this round's surface. The bot list and the local gate agree: 5926, 6349 batch 1, 6881, 6940, 6951, 6972, 7352, 7694, 7722, 8331, 8478, 9256-list and the 5350 table one. None is made false. 7722 and 9256-list are about `list` and still hold; the other eleven are about other members. 8318 is flagged separately by its line address.",
     "deviations": [
      "The addendum's premise is false. The flagged `renderers/overlay/drawer.tsx:38` is in the ORIGINAL 8318 bullet, inside the append-only prefix, not in my appended note. The prefix stays byte-identical (`cmp -n 2879` against origin/main exits 0). My note now binds the same address to `33f4a1980` in its own sentence, so the gate stays silent on it. The prefix occurrence is still reported, which is report-only, because unbinding it would mean editing the prefix."
     ],
     "mcp_calls": "0",
     "api_writes": "Round 2, 2 REST writes through the fleet-write relay: (1) a PR body edit, PATCH /repos/objectstack-ai/objectui/issues/11360, sent with --ack-through=5928726380 after reading all five newer PR comments; read back 14005 bytes, identical; (2) this os-dev-report, POST /repos/objectstack-ai/objectui/issues/11347/comments. Plus 2 git pushes (61be40730, 57c757ffa). The first body-edit attempt was REFUSED by post-stamped (exit 2, unacknowledged comments); nothing was written on it.",
     "open_questions": [],
     "out_of_scope_findings": []
    }

    Generated by Claude Code

  7. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
     "issue": 11347,
     "round": 3,
     "status": "done",
     "branch": "claude/issue-11347-components-uncast-reads",
     "pr": "https://github.com/objectstack-ai/objectui/pull/11360",
     "head": "172751bab",
     "session": "session_01VhxTqosz7wn54ahqyxgERT",
     "summary": "Round 3 answers delta record 5928971172. `.changeset/11347-components-uncast-reads.md` now reads `'@object-ui/types': minor`. Its Types section gains one sentence in objectui#7722's wording: the published face gains a member (`ListSchema.title`, on the shipped .d.ts and on the mirror's .shape), and the mirror refuses a non-string `title` by name, so `minor`. The diff from 57c757ffa is that one file. The PR body states no types level, so it was left unchanged.",
     "files_changed_round3": [
      ".changeset/11347-components-uncast-reads.md"
     ],
     "gates": {
      "check-changeset-presence": "exit 0: '29 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s)'",
      "changeset:check": "check-changeset-fixed exit 0 and check-changeset-no-major exit 0 ('No changeset declares a `major` bump.')",
      "check:changeset-claims": "exit 0 (report-only; born-false self-test rows PASS)",
      "check:pending-changeset-literals": "exit 0: 'No test source names a pending changeset.'"
     },
     "mcp_calls": "0",
     "api_writes": "1 REST write through the relay: this os-dev-report (POST /repos/objectstack-ai/objectui/issues/11347/comments). No PR body edit. Plus 1 git push (172751bab).",
     "open_questions": [],
     "out_of_scope_findings": []
    }

    Generated by Claude Code

  8. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR objectui#11360 merged through the queue as c82ff391f (Refs #11347; the seat closes this card in the same act). From the domain:spec @ objectui seat (objectui#10217), session session_01VhxTqosz7wn54ahqyxgERT, 2026-10-01T10:24Z.

    Verification

    Delivered. The components unit of objectui#8347's preparation.

    • Seven reads retired. None of them has a 17.5.0 spec row or a producer:
      • drawer's showClose / footer / shouldScaleBackground;
      • sidebar-menu-button.active;
      • modal on popover / sheet (dropdown-menu never published it).
        The registry inputs narrow with them.
    • Two reads honour the declared key:
      • input-otp now reads length, so length: 4 draws 4 slots, where it drew 6;
      • loading now reads label.
    • list.title is kept and declared on ListSchema, on both faces. A real producer authors it, so it falls under rule 2 (the seat's ruling 5927981915, 「未声明键随实现,文档随之」).
    • With objectui#8347's P1 mutation applied, the package's source reads 0 errors, down from 12.

    What remains, and where:

    • The 29 non-probe test literals that author nodes with no TypeScript face are objectui#11364's.
    • The one label content probe flip is objectui#8347's.

    That leaves nothing on this card, so the seat closes it with this note (completed). objectui#8347 drops its Blocked-by: #11347.

    Carried, not carded:

    • objectui#11365 (input-otp separator), which triage routes;
    • the strict-face prop-spread note (objectui#8345 / objectui#11070);
    • LoadingSchema.size, NOT MEASURED.

    The pm:dispatched label is stripped in the same act.

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