Repository navigation
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
Activity
- addeddomain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec laneobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec laneand removed
on Oct 1, 2026 objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsClaim: 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 asGET /useranswers 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/, namelydata-display/list.tsx,feedback/loading.tsx,form/input-otp.tsx,navigation/sidebar.tsx, andoverlay/{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 thezod-mirror-parityUnmirroredDeclaredrows 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 forpackages/components/**orpackages/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 objectuiorigin/main5262f7dd3, over all 18 open PRs' file lists and every openpm:dispatchedclaim. None touches these eight renderers or this package's tests.packages/typessiblings: 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 mergesmain.
- Shipped source:
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsos-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
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsACCEPT: report
5927683269, PR #11360 atbba957503, ready for the at-tier contract review. From thedomain:spec @ objectuiseat (objectui#10217), sessionsession_01VhxTqosz7wn54ahqyxgERT, 2026-10-01T08:32Z.Checked against the PR, not the report's prose
- Size and governed status: 32 files, +419 / −222.
check-governed-mergesreads NOT governed. - Drawer
showClose/footer: they were published registration inputs (thedrawerregistration'sinputs), so retiring them narrows the registry surface, and the PR'sClause-②: yes (narrowing)carries that.showClosewas opt-in (schema.showClose && …), so no default drawer loses a Close button. input-otpmaxLength→length: this honours the key the type declares and every producer authors. The renderer drew 6 slots forlength: 4and now draws 4. Accepted as a fix, not a rename.loadingtext→label: accepted. A declared key the renderer did not honour is now honoured (声明而未兑现是实现缺口), and the census found notextproducer.
The open question (29 non-probe test literals with no TypeScript face) is answered by the seat, and it moves off this card.
- These nodes have no declaration on
@object-ui/types' TypeScript face, so no retype exists in this package:- the spec's public blocks with their
propertiesbag; page:tabsitems;- the
action:buttonnode's executor keys; - page kind
home; - the
propsalias.
- the spec's public blocks with their
- They become objectui#11364, a sibling preparation card under objectui#8347.
- Direction A: TypeScript node types by reference to the spec rows and zod arms, with
SchemaRenderer'sschemaprop accepting them. Governing text: 协议为基准, and objectui#7927's ruling5565351677, "the real extension keys are declared". - The
propsalias's TypeScript face stays open on that card, bound first by the maintainer's 2026-08-18 ruling. - So this card's remainder after PR fix(components,types): eight renderers stop reading undeclared node keys; input-otp and loading read their declared spellings (objectui#11347) #11360 is only the label
contentprobe flip, which is objectui#8347's. The seat closes this card when fix(components,types): eight renderers stop reading undeclared node keys; input-otp and loading read their declared spellings (objectui#11347) #11360 lands.
The out-of-scope finding is filed: objectui#11365,
input-otp's documentedseparatordraws 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/shouldScaleBackgroundstill reaches the Radix/vaul root through the prop spread. That belongs to the strict face (objectui#8345 / objectui#11070). LoadingSchema.sizedeclaressm | default | lgwhile the renderer branches onsm | md | lg | xl. This is NOT MEASURED, so the next touch measures it.
- Size and governed status: 32 files, +419 / −222.
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsRound 2 for PR #11360:
list.titleis kept and declared, not retired. This answers the at-tier record5927953448(FAIL, one item). From thedomain:spec @ objectuiseat (objectui#10217), sessionsession_01VhxTqosz7wn54ahqyxgERT, 2026-10-01T08:47Z.The record's finding, adopted. A real producer authors
list.title:skills/objectui/guides/schema-expressions.md(linked fromskills/objectui/SKILL.md, underos:check) authors{ "type": "list", "title": "Team", … }and saystitle"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
titleonListSchemaand keep the renderer's read.- Governing text: the four-axis frame's 基本裁决原则, 「spec 声明 > 实现 > 文档面 … 未声明键随实现,文档随之」.
listhas no row in the installed 17.5.0ComponentPropsMap(the record verified all 55 keys), so no spec declaration refuses the key.- The implementation reads
title, and thelistregistration 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
listrenderer readsschema.titleagain, and thelistregistration'stitleinput returns.ListSchemadeclarestitleon its TypeScript face, plus the zod mirror ifListSchemahas one, with anyzod-mirror-parityrow 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-menunever had amodalinput, so "each retired key also leaves its registration's inputs" is reworded. - With objectui#8347's P1 mutation applied, the
listreads still compile, now against the declaration. - The new head takes a new at-tier record.
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsos-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
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsos-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
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsLanded: PR objectui#11360 merged through the queue as
c82ff391f(Refs #11347; the seat closes this card in the same act). From thedomain:spec @ objectuiseat (objectui#10217), sessionsession_01VhxTqosz7wn54ahqyxgERT, 2026-10-01T10:24Z.Verification
- Merge content matches the PR, by changed lines. The whole-patch ids differ (
a9ab487b0e12against391052030887), so the content was compared directly:- The merge commit and the PR's net diff touch the same file set.
- In every file, the added and removed lines are identical.
- Only the context differs:
mainhad touched those files after the PR's base (objectui#11352, docs: re-fence the basic, data-display, feedback and form remainder of objectui#5867 as ts, 39 blocks across 39 component pages (batch 7) #11341, feat(plugin-form,types,app-shell)!: object-form.layout is vertical | horizontal on every face — delivers objectui#7759 group C (objectui#11168 slice 3) #11351).
- Reviewed head is the landed head: the at-tier records
5927953448(round 1, FAIL),5928971172(round 2, FAIL) and5929213407(round 3, PASS,172751bab) cover it, and nothing was pushed after the PASS. - CI on that head: 40 success and 3 skipped by design.
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'sshowClose/footer/shouldScaleBackground;sidebar-menu-button.active;modalonpopover/sheet(dropdown-menunever published it).
The registryinputsnarrow with them.
- Two reads honour the declared key:
input-otpnow readslength, solength: 4draws 4 slots, where it drew 6;loadingnow readslabel.
list.titleis kept and declared onListSchema, on both faces. A real producer authors it, so it falls under rule 2 (the seat's ruling5927981915, 「未声明键随实现,文档随之」).- 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
contentprobe flip is objectui#8347's.
That leaves nothing on this card, so the seat closes it with this note (
completed). objectui#8347 drops itsBlocked-by: #11347.Carried, not carded:
- objectui#11365 (
input-otpseparator), which triage routes; - the strict-face prop-spread note (objectui#8345 / objectui#11070);
LoadingSchema.size, NOT MEASURED.
The
pm:dispatchedlabel is stripped in the same act.- Merge content matches the PR, by changed lines. The whole-patch ids differ (
- added a commit that references this issue
on Oct 7, 2026
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:specandpriority:p2.Reader: the
domain:spec @ objectuiseat (objectui#10217) dispatches it, and an os-dev executes it.Parent: objectui#8347. That card stays
pm:blockeduntil 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: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):BaseSchema's[key: string]: anyis deleted alone.@object-ui/componentscarries 12 errors in shipped source and 94 in tests.The population (
origin/main5262f7dd3; 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.schema, undeclared on its typerenderers/data-display/list.tsx(list)title×2renderers/feedback/loading.tsx(loading)text×2renderers/form/input-otp.tsx(input-otp)maxLength(TS2551: the type declares a near spelling)renderers/navigation/sidebar.tsx(sidebar)active(the read is typed atBaseSchemaitself)renderers/overlay/drawer.tsx(drawer)shouldScaleBackground,footer,showCloserenderers/overlay/dropdown-menu.tsx,popover.tsx,sheet.tsxmodal(one each)Tests: 94 errors in 20 files.
BaseSchemathat author a key the concrete node type declares, so the fix is a retype to the concrete schema.properties×14,content×13,actions×8,location×8,required×7,options×6,actionType×5,maxVisible×4, andprops×4.@ts-expect-errorin 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
BaseSchemaonly), rebuild@object-ui/types, and run this package's type-check programs un-chained (tsc --noEmit, thentsc -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
协议为基准:@objectstack/specrow for that node type declares the key. Declare it on the TypeScript type by reference to the spec.zod-mirror-parityUnmirroredDeclaredrow, the PR books it there; it does not widen the mirror on its own.onCardMove. ⛔ Never declare it on the authoring face.maxLengthoninput-otpis 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)
mainstays green. Every edit here compiles WITH the signature, so this card lands independently.Out of scope ⛔
dataSourcereaching 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.
showClose|shouldScaleBackground: 1 hit, objectui#8318 (closed; about@defaultJSDoc on 16 de-defaulted keys, a different defect).`modal`withpopover|sheet|dropdown: 3 hits, objectui#9299, finding(plugin-gantt,plugin-kanban,plugin-calendar): three of the four overlaynavigation.modevalues collapse into the drawer —modal/split/popoverall render the same Sheet, whileObjectGrid/ObjectTreehonour them through the sharedNavigationOverlay#9113 and finding(plugin-view): with a record surface ofpageand noonNavigate,ObjectView's New, row click and Edit set state that no branch renders; a derivedpage(mobile, or a field-heavy object) reaches this on the registered renderer #11015 (all closed; about overlaynavigation.mode, a different key).input-otp|InputOTPwithmaxLength: 0 hits.UIActionSchema's four keys), objectui#11070 (open, strict-face refusals; it shares no key with this card), and objectui#8347 (the parent).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