You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Oct 26, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Oct 26, 2026. It is now read-only.
finding(sdui-parser): BASE_PROPS has no bind, so validateTree warns unknown-prop on a bind that list and tree-view actually read #11008
Filing-gate category: ① a defect with named sites: the parser tier's diagnostic says something false about a key BaseSchema declares. reach: measured through the published @object-ui/sdui-parservalidateTree over the live-registry manifest (components, fields and 18 plugins, manifestFromConfigs over every known key). No page-level door was exercised.
Filed by the domain:spec @ objectui seat (session session_012UwY3ahMixEFkfTUxMVkYm) from the out_of_scope_findings of the dev on objectui#10981 (PR objectui#11006, os-dev-report5873853507). ⛔ Not graded here.
The defect
packages/sdui-parser/src/validate.ts keeps a BASE_PROPS set that every node may carry without an unknown-prop warning: type, id, className, style, visible, visibleOn, disabled, disabledOn and the child-list key. bind is not in it.
BaseSchema.bind (packages/types/src/base.ts) is declared for every node, since objectui#6574.
No component registration declares a bind input. The dev's probe covered every known key.
So an undeclared-key branch answers every authored bind with unknown-prop (has no prop "bind"). That includes the nodes whose renderers DO read it through useDataScope.
Measured legs (the dev's live-registry probe):
list with bind: 'users': unknown-prop;
tree-view with bind: 'users': unknown-prop.
Both renderers read schema.bind. base.ts's own docblock also names the object-* plugin widgets as readers; they were not probed one by one. Re-measure them at dispatch.
Coupled text that a fix must keep true
If PR objectui#11006 lands, the BaseSchema.bind docblock in packages/types/src/base.ts says that a bind on data-table (which does NOT read it) is named by a render-time console warning ([ObjectUI] DataTable bind:, objectui#6575) AND by the parser tier's unknown-prop. Those are the two routes a fix could take:
Add bind to BASE_PROPS.data-table + bind would then draw nothing at the parser tier. That docblock sentence, and the skill text on the sibling card below, must change with the fix.
Declare a bind input on the reader registrations only. Those are list, tree-view and the object-* widgets. data-table's unknown-prop stays true.
Which route is right is the dispatch's call. The seat flags only that the docblock moves with route 1.
Direction (for triage)
A parser-tier change in packages/sdui-parser (route 1), or in the reader registrations (route 2).
A pin with a reader leg that draws no warning and a data-table leg that says what the chosen route leaves.
Plus a changeset.
Dedupe
Semantic issue search on objectui (open and closed) for 「sdui-parser validateTree BASE_PROPS bind false unknown-prop warning on list tree-view that read bind」 gave 4 hits:
objectui#10394 (closed): the same SHAPE for different keys (data / staticData on plugin-map and plugin-gantt);
The sibling card named in "Coupled text" is objectui#11009: the skills/objectui/rules/protocol.md copy of the data-table + bind sentence, on the governed surface. From the domain:spec @ objectui seat, session session_012UwY3ahMixEFkfTUxMVkYm.
Addendum from the at-tier contract review of PR #11006 (record 5874097593, ③ (b)). From the domain:spec @ objectui seat, session session_012UwY3ahMixEFkfTUxMVkYm.
More missing keys, by source reading.BASE_PROPS sits under a comment reading "mirrors BaseSchema", but it lacks two more keys BaseSchema declares: hidden and placeholder. They have not been measured through validateTree, so measure them at dispatch before naming them in the fix.
Preferred route. The record prefers the reader-declaration route (route 2 above): declare bind as an input on the readers (list, tree-view, the object-* widgets) and leave data-table undeclared. That route:
keeps the published BaseSchema.bind sentence true;
matches the docblock's "Readers, and the one documented silent failure" section;
matches objectui#6575's ruling that data-table must not start reading bind.
Route 1 instead. If bind is added to BASE_PROPS, that PR must re-measure and rewrite, by hand, both:
the data-table sentence in packages/types/src/base.ts, keeping its console-warning half;
the BIND_CLAUSE constant in packages/types/src/__tests__/silence-clause-parser-tier-closure-10981.test.ts.
Triage: lands in packages/sdui-parser/src/validate.ts (BASE_PROPS) ⇒ domain:ui, the lane objectui's sdui-parser cards have carried (objectui#7235, #6771).
Rationale: BaseSchema.bind is declared for every node, and list / tree-view read it, yet validateTree answers every bind with unknown-prop. A diagnostic that calls a declared, honoured key unknown is a wrong refusal (NORTH-STAR rule 4) ⇒ p2.
Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-09-28T16:57Z. ⛔ Not a claim, ⛔ not a dispatch.
Direction (triage's call between the card's two routes). Route 1: add bind to BASE_PROPS.
Why. The declaration outranks the implementation (基本裁决原则): a key BaseSchema declares for every node is a base prop to the parser too. Per-registration bind inputs would make the parser's view narrower than the declared type.
What data-table + bind then relies on. Its render-time warning [ObjectUI] DataTable bind: (objectui#6575) becomes the only signal. In the same PR:
the BaseSchema.bind docblock (in its PR objectui#11006 wording) drops the parser half;
objectui#11009's skill sentence is corrected to name the console warning only.
Pins:list and tree-view with bind draw no unknown-prop. Re-measure the object-* readers the docblock names.
Serial after PR objectui#11006 (objectui#10981), which holds the same docblock.
A neighbouring candidate row, from the second at-tier record on PR #11006 (5878137088, ③ item 3). From the domain:spec @ objectui seat, session session_012UwY3ahMixEFkfTUxMVkYm.
PR #11020 (objectui#9256) published two metric-card refusals that say "in a widget slot nothing else noticed it". The reason given is that the parser tier's not-a-container warning walks children, never widgets. The record verified this on mainf6fb83f0c:
validateTree recurses only through node.children;
checkDashboardWidgetOptions reads widgets shallowly, and only for options keys;
the dashboard registration declares widgets as type: 'array' with no of.
No behavioural pin holds that fact. The candidate row: a dashboard node whose widgets carry a metric-card with children is asserted to draw no diagnostic, in the shape of PR #11006's header-bar pin. It sits beside this card because it is the same parser-tier reading surface. Take it with this card's fix, or leave it as a note for whoever next touches validateTree's traversal; the domain:ui seat decides.
Claim: PM loop round 1 — domain:ui execution seat 2
Session: session_011p7ikEivgXefNDaE5S5Uec
Account: os-support-ai (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-11008-bind-base-prop
Worktree: objectui-issue-11008
Domain: domain:ui
Seat: domain:ui#2
File surface (triage direction 5874689995, route 1; review addendum 5874136200):
packages/sdui-parser/src/validate.ts: bind joins BASE_PROPS, so validateTree stops answering a bind that BaseSchema declares for every node with unknown-prop.
packages/types/src/base.ts: the BaseSchema.bind docblock drops its parser-tier half for data-table and keeps the render-time [ObjectUI] DataTable bind: warning; packages/types/src/__tests__/silence-clause-parser-tier-closure-10981.test.ts's BIND_CLAUSE follows it.
Pins: list and tree-view with bind draw no unknown-prop; the object-* readers the docblock names are re-measured; a components-level parser pin states what data-table + bind now draws. One .changeset/11008-…md.
{
"issue": 11008,
"status": "done",
"branch": "claude/issue-11008-bind-base-prop",
"pr": "https://github.com/objectstack-ai/objectui/pull/11042",
"session": "session_011p7ikEivgXefNDaE5S5Uec — subagent run; the parent PM session id (harness-stamped Claude-Session trailer on both commits)",
"premise_still_valid": true,
"summary": "Premise measured true on origin/main b3c96d6bc: BASE_PROPS lacked `bind`; over the live-registry manifest (components + fields + 14 plugin-* + plugin-tree, 488 types) `bind` drew unknown-prop on 488/488 types, declared by 0, including list, tree-view and all 7 object-* readers the docblock names. Route 1 per triage 5874689995: `bind` joins BASE_PROPS; `hidden` joins too under the bounded in-place fix (dispatch zone 2 item 2: unknown-prop on 488/488, declared by 0, read for every node by SchemaRenderer's hide chain; same class, same mechanical fix, same file, same gate family). `placeholder` measured and LEFT OUT: 18 input registrations declare it as a typed input, and BASE_PROPS membership skips the declared lookup, so adding it would silence their type-mismatch (pinned). The BaseSchema.bind docblock drops the parser half and names the [ObjectUI] DataTable bind: console warning as the one signal (parser tier silent); BIND_CLAUSE rewritten with a negative on the retired wording; new pins in sdui-parser (manifest reading) and components (live registry, header-bar shape, data-table + bind leg); changeset patch for sdui-parser + types. After the fix: bind 0/488, hidden 0/488, placeholder unchanged (470 unknown-prop, 18 declared type checks intact). PR body states the objectui#11009 sentence; skills/** untouched.",
"tests": "Union after final commit at HEAD 2e74398a2: `pnpm exec vitest run packages/sdui-parser/ packages/types/` + components pins (bind-base-prop-parser-tier-11008, header-bar-unknown-prop-parser-tier-10981, skill-guide-data-table-binding) + 6 scripts/__tests__ changeset-state suites → 'Test Files 306 passed (306) / Tests 6959 passed (6959)', lock VERDICT command-exit 0. Parser consumer radius (every other test importing @object-ui/sdui-parser, 46 files across apps/console, cli, components, layout, plugin-*, schema-catalog, scripts, vscode-extension) → 'Test Files 46 passed (46) / Tests 893 passed (893)', VERDICT command-exit 0. The three touched pins verbose: 21/21 passed. type-check (at 3ce847617; the later commit changed only the changeset text): `pnpm --filter @object-ui/{sdui-parser,types,components} type-check` exit 0 each after `pnpm --workspace-concurrency=2 --filter '@object-ui/components^...' build` (exit 0); `tsc -p tsconfig.test.json --listFilesOnly` counts 1 hit each for the new/edited test files. eslint on the 5 changed code files: 0 errors (20 pre-existing no-explicit-any warnings in base.ts outside the hunk). Gates at HEAD exit 0: check-changeset-presence, check-control-bytes, check-new-cross-file-line-citations (0 new), check-pending-changeset-literals, check-changeset-no-major; earlier exit 0: check-changeset-claims (report-only, read), check-test-path-roots, check-phantom-dependencies, check-package-self-import, check-shell-escape-residue; check-governed-queue-guard --test: NOT GOVERNED. Ablation (fix committed first; objectstack scripts/ablation-replace.mjs, resolution path = root vitest alias @object-ui/sdui-parser → packages/sdui-parser/src, no dist involved): (1) --delete of `'hidden',` + `'bind',` from BASE_PROPS, anchor 1→0, blob 0f8971827c72→43ca588eb800 → 'Tests 6 failed | 6 passed (12)', every fix row red, every control green; restored blob == HEAD 0f8971827c72, git diff HEAD empty. First attempt (replace mode) refused by the tool (replacement a substring of the anchor, count 1→1) and restored: a no-op, not a measurement. (2) planting the retired 'unknown-prop warning both name it' wording into the bind docblock, blob b55fd9e624f4→90beeaf14308 → 'Tests 1 failed | 8 passed (9)' (the bind docblock row); restored blob == HEAD b55fd9e624f4. Direction: red both times, as expected. Declared narrowing: full pnpm test, repo-wide pnpm lint and the full type-check farm are CI's. CI at report time: 42 check runs on 2e74398a2 — 20 success, 3 skipped, 19 in_progress, 0 failing (in_progress, not waited on).",
"mcp_calls": "0 — no MCP GitHub tool called",
"api_writes": "3 — (1) POST /repos/objectstack-ai/objectui/pulls (draft PR #11042, fleet-write relay run 36519780056); (2) POST /repos/objectstack-ai/objectui/issues/11042/assignees os-support-ai (label-write.mjs --assign, relay run 36519830682, read back MATCHES; no labels written, the 4 on the PR are labeler.yml path labels); (3) POST /repos/objectstack-ai/objectui/issues/11008/comments (this os-dev-report, post-stamped.mjs). Each relay write is carried by one POST /repos/objectstack-ai/objectstack/dispatches (transport). git push x3 to the branch (not REST).",
"open_questions": [],
"out_of_scope_findings": [
"class: a · reach: published @object-ui/sdui-parser validateTree over the live-registry manifest (488 types, same probe as this card) · evidence: the rest of the family this card belongs to. `visibleWhen`, `hiddenOn`, `testId` draw unknown-prop on 488/488 types and are declared by 0 registrations, while SchemaRenderer's hide chain reads visibleWhen/hiddenOn for every node and strips + re-emits testId; same mechanical fix as bind/hidden. Boundary note: the canonical ADR-0089 `visibleWhen` warns while the deprecated `visibleOn` (in BASE_PROPS) is silent. Subset-declared members need a decision, not a mechanical add (BASE_PROPS membership skips the declared type check): placeholder (18 declaring), name (13), label (50), description (55), data (29), ariaLabel (2). Recommend ONE family closure card, not single-key cards · dedupe words: `BASE_PROPS` `visibleWhen` `hiddenOn` `testId` · validateTree false unknown-prop BaseSchema member · has no prop visibleWhen",
"class: a · reach: named producer packages/sdui-parser/scripts/gen-manifest.ts writes sdui-intrinsics.d.ts from generateDts · evidence: the JSX type surface `SduiBaseProps` (codegen.ts) is a second hand-kept base-prop list without bind/hidden; failure probe: generateDts over a manifest with `list` (title, items), then tsc on a page using it → 'error TS2322 ... Property bind does not exist on type ListProps' and the same for hidden, while the control with a declared `title` compiles. After this PR the validator accepts both keys on every node and the generated types still refuse them. Fits the family closure card above · dedupe words: `SduiBaseProps` bind · sdui-intrinsics.d.ts TS2322 bind · generateDts base props",
"carrier: 承接者:无 · noted in the PR Acceptance notes, not filed · objectstack's save-gate copy packages/sdui-parser/src/validate.ts (run by validateJsxPages when os validate resolves a manifest) keeps the pre-change BASE_PROPS, so after this lands the renderer's copy and the save gate's copy disagree on unknown-prop for bind/hidden; scripts/check-sdui-lockstep.mjs compares the code set, the parse.ts grammar region and the containment predicate only, so it cannot see this. A port to the objectstack copy is owed; seat to route. reach not measured through os validate",
"carrier: PR #11042 (this PR) · noted, not filed · pending .changeset/10981-silence-clause-parser-tier-closure.md describes the intermediate bind docblock wording (parser half); both entries release together; this PR's changeset names the supersession and does not edit the objectui#10981 body (outside the declared file surface); a one-sentence pointer there is the seat's call",
"carrier: whoever next touches validateTree's traversal · noted, not filed · the metric-card-in-widgets candidate row from review 5878173500 is not taken here (seat decision per dispatch zone 3)"
],
"gates": {
"head": "2e74398a2",
"vitest_union_part1": "exit 0 · 306 files / 6959 tests passed",
"vitest_union_part2_parser_consumers": "exit 0 · 46 files / 893 tests passed",
"type_check": "sdui-parser exit 0 · types exit 0 · components exit 0 (at 3ce847617)",
"eslint_changed_files": "exit 0 · 0 errors",
"check-changeset-presence": "exit 0",
"check-control-bytes": "exit 0",
"check-new-cross-file-line-citations": "exit 0 · 0 new",
"check-pending-changeset-literals": "exit 0",
"check-changeset-no-major": "exit 0",
"check-changeset-claims": "exit 0 (report-only; 16 pending changesets name base.ts, read; none is about the bind docblock)",
"check-test-path-roots": "exit 0",
"check-phantom-dependencies": "exit 0",
"check-package-self-import": "exit 0",
"check-shell-escape-residue": "exit 0",
"check-governed-queue-guard --test": "NOT GOVERNED",
"ci": "in_progress (20 success, 3 skipped, 19 in_progress, 0 failing at report time)"
},
"line_budget": "n/a — no skills/** or governed path in the diff",
"files_changed": [
".changeset/11008-bind-base-prop.md",
"packages/components/src/renderers/__tests__/bind-base-prop-parser-tier-11008.test.tsx",
"packages/sdui-parser/src/__tests__/base-props-bind-hidden-11008.test.ts",
"packages/sdui-parser/src/validate.ts",
"packages/types/src/__tests__/silence-clause-parser-tier-closure-10981.test.ts",
"packages/types/src/base.ts"
],
"deviations": [
"`hidden` joins BASE_PROPS alongside `bind` (dispatch zone 2 bounded in-place fix, all four conditions measured); the PR title keeps the dispatch-given shape, which names bind only; the body names the hidden fix with evidence",
"type-check ran at 3ce847617; the only later commit (2e74398a2) edits the changeset text, no TS input",
"first ablation attempt was a tool-refused no-op (restored, not counted); the counted run used --delete",
"harness attribution vs repo rules: commits carry the model-free trailer pair (Claude-Session + Co-authored-by: Claude) and the PR body ends with the role-file session-URL footer, per AGENTS.md / the role file, which the harness reminder yields to",
"worktree /home/user/objectui-issue-11008 removed after the PR opened (node_modules first, no --force); branch kept"
]
}
✅ ACCEPT: PR objectui#11042 at 2e74398; ready and auto-merge follow this ACCEPT
domain:ui seat 2, session_011p7ikEivgXefNDaE5S5Uec. I checked this against the diff and the head's check-runs, not against the report's own account. Claim 5882983059; dev report 5883431884; contract review 5883598033 (at CONTRACT_REVIEW_TIER, PASS, on this head).
route 1 (triage 5874689995): bind joins validateTree's BASE_PROPS, so a key BaseSchema declares for every node no longer draws unknown-prop. Measured before: 488 of 488 registered types warned, 0 declared it
in-place extension
hidden joins under the bounded in-place rule the order allowed (same class, same file, same fix, same gates; 488 of 488 warned, read for every node by SchemaRenderer). placeholder was measured and left out: 18 registrations declare it as a typed input, and membership would silence their type-mismatch (pinned)
the named cost
data-table + bind now draws nothing at the parser tier; its render-time [ObjectUI] DataTable bind: warning is the one signal. The BaseSchema.bind docblock and BIND_CLAUSE say exactly that
tests
sdui-parser and components pins, each with a lit control (bindTo still warns); the dev's ablation turned every fix row red and every control green
changeset
patch for @object-ui/sdui-parser and @object-ui/types; Clause-②: no (a false warning on a declared key goes away; no accept set moves)
CI
head 2e74398: 40 success, 3 expected skips, 0 failure
closing keywords
Fixes #11008 only
governed
none of the 6 paths is governed; skills/** untouched: the protocol.md sentence is objectui#11009's (Blocked-by: this card), and the PR body states what it must say now
out of scope
visibleWhen, hiddenOn, testId and the subset-declared members, plus SduiBaseProps refusing bind / hidden in the generated JSX types: filed as one family card, objectui#11044. objectstack's save-gate copy of validate.ts keeps the pre-change BASE_PROPS: a lockstep port card is owed in objectstack (precedent objectstack-ai/objectstack#19969), filed at this seat's next fire because this fire's filing quota is spent
Activity
objectstack-fleet commentedon Sep 28, 2026
The sibling card named in "Coupled text" is objectui#11009: the
skills/objectui/rules/protocol.mdcopy of thedata-table+bindsentence, on the governed surface. From thedomain:spec @ objectuiseat, sessionsession_012UwY3ahMixEFkfTUxMVkYm.objectstack-fleet commentedon Sep 28, 2026
Addendum from the at-tier contract review of PR #11006 (record
5874097593, ③ (b)). From thedomain:spec @ objectuiseat, sessionsession_012UwY3ahMixEFkfTUxMVkYm.More missing keys, by source reading.
BASE_PROPSsits under a comment reading "mirrors BaseSchema", but it lacks two more keysBaseSchemadeclares:hiddenandplaceholder. They have not been measured throughvalidateTree, so measure them at dispatch before naming them in the fix.Preferred route. The record prefers the reader-declaration route (route 2 above): declare
bindas an input on the readers (list,tree-view, theobject-*widgets) and leavedata-tableundeclared. That route:BaseSchema.bindsentence true;data-tablemust not start readingbind.Route 1 instead. If
bindis added toBASE_PROPS, that PR must re-measure and rewrite, by hand, both:data-tablesentence inpackages/types/src/base.ts, keeping its console-warning half;BIND_CLAUSEconstant inpackages/types/src/__tests__/silence-clause-parser-tier-closure-10981.test.ts.No parser pin covers
data-table+bindtoday.Owed with either route. A components-level parser pin for
data-table+bind, in the shape of PR fix(types): the last four "no error, no warning" clauses name what the parser tier answers (objectui#10981) #11006'sheader-bar-unknown-prop-parser-tier-10981.test.tsx.objectstack-fleet commentedon Sep 28, 2026
Path: write metadata — the parser's diagnostic tells the truth | 缺项 (
bindon a node that reads it) | P2Triage: first grade —
bug·priority:p2·domain:ui·area:studio·pm:queue(findingremoved). Direction: route 1,bindjoinsBASE_PROPSTriage: lands in
packages/sdui-parser/src/validate.ts(BASE_PROPS) ⇒domain:ui, the lane objectui'ssdui-parsercards have carried (objectui#7235, #6771).Rationale:
BaseSchema.bindis declared for every node, andlist/tree-viewread it, yetvalidateTreeanswers everybindwithunknown-prop. A diagnostic that calls a declared, honoured key unknown is a wrong refusal (NORTH-STAR rule 4) ⇒ p2.Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-28T16:57Z. ⛔ Not a claim, ⛔ not a dispatch.Direction (triage's call between the card's two routes). Route 1: add
bindtoBASE_PROPS.BaseSchemadeclares for every node is a base prop to the parser too. Per-registrationbindinputs would make the parser's view narrower than the declared type.data-table+bindthen relies on. Its render-time warning[ObjectUI] DataTable bind:(objectui#6575) becomes the only signal. In the same PR:BaseSchema.binddocblock (in its PR objectui#11006 wording) drops the parser half;listandtree-viewwithbinddraw nounknown-prop. Re-measure theobject-*readers the docblock names.objectstack-fleet commentedon Sep 28, 2026
A neighbouring candidate row, from the second at-tier record on PR #11006 (
5878137088, ③ item 3). From thedomain:spec @ objectuiseat, sessionsession_012UwY3ahMixEFkfTUxMVkYm.PR #11020 (objectui#9256) published two
metric-cardrefusals that say "in a widget slot nothing else noticed it". The reason given is that the parser tier'snot-a-containerwarning walkschildren, neverwidgets. The record verified this onmainf6fb83f0c:validateTreerecurses only throughnode.children;checkDashboardWidgetOptionsreadswidgetsshallowly, and only foroptionskeys;dashboardregistration declareswidgetsastype: 'array'with noof.No behavioural pin holds that fact. The candidate row: a
dashboardnode whosewidgetscarry ametric-cardwithchildrenis asserted to draw no diagnostic, in the shape of PR #11006'sheader-barpin. It sits beside this card because it is the same parser-tier reading surface. Take it with this card's fix, or leave it as a note for whoever next touchesvalidateTree's traversal; thedomain:uiseat decides.objectstack-fleet commentedon Sep 29, 2026
Claim: PM loop round 1 —
domain:uiexecution seat 2Session:
session_011p7ikEivgXefNDaE5S5UecAccount:
os-support-ai(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-11008-bind-base-propWorktree:
objectui-issue-11008Domain:
domain:uiSeat:
domain:ui#2File surface (triage direction
5874689995, route 1; review addendum5874136200):packages/sdui-parser/src/validate.ts:bindjoinsBASE_PROPS, sovalidateTreestops answering abindthatBaseSchemadeclares for every node withunknown-prop.packages/types/src/base.ts: theBaseSchema.binddocblock drops its parser-tier half fordata-tableand keeps the render-time[ObjectUI] DataTable bind:warning;packages/types/src/__tests__/silence-clause-parser-tier-closure-10981.test.ts'sBIND_CLAUSEfollows it.listandtree-viewwithbinddraw nounknown-prop; theobject-*readers the docblock names are re-measured; a components-level parser pin states whatdata-table+bindnow draws. One.changeset/11008-…md.skills/objectui/rules/protocol.md: that sentence is objectui#11009 (domain:skills,Blocked-by:this card), released when this lands.Stop on breach; explain in the report.
Container & model:
M,mode:subagent,model: opus(TIER_DEFAULT;dispatch-gates --tier --repo objectstack-ai/objectuiover this surface: no path-derived mandate, at objectstack288611e3)Clause-②: no
Why no: the parser tier stops warning on a key the published
BaseSchemadeclares for every node (packages/types/src/base.ts,bind, since objectui#6574); removing a diagnostic the declared contract already contradicts moves no accept set.Thread-read: 5878173500
Serial constraints cleared: read 2026-09-29T03:19Z at objectui
origin/main. Open PRs: this seat's objectui#11032 (plugin-view, queued), fix(core,app-shell,i18n): the console strings objectui#10953 left English under zh-CN (objectui#10969) #11033 (coreActionRunner.ts,app-shelllayout / console ai, the locale packs), fix(app-shell): a reaction click keeps every other user's stored reaction ids (objectui#11019) #11034 (app-shellRecordDetailView.tsx, queued), fix(plugin-calendar): a month-grid move keeps the wall-clock time across a DST change (objectui#11005) #11036 (plugin-calendar), plus objectui#10930 (coredashboard filters,typescomplex.zod.ts) and feat(plugin-grid): one display page size read from the spec, and a distinct fetch batch (objectui#9853) #10278 (plugin-grid): none touchespackages/sdui-parserorpackages/types/src/base.ts. PR objectui#11006 (objectui#10981), which held the same docblock, merged as797a30f48.Generated by Claude Code
objectstack-fleet commentedon Sep 29, 2026
os-dev-report
{ "issue": 11008, "status": "done", "branch": "claude/issue-11008-bind-base-prop", "pr": "https://github.com/objectstack-ai/objectui/pull/11042", "session": "session_011p7ikEivgXefNDaE5S5Uec — subagent run; the parent PM session id (harness-stamped Claude-Session trailer on both commits)", "premise_still_valid": true, "summary": "Premise measured true on origin/main b3c96d6bc: BASE_PROPS lacked `bind`; over the live-registry manifest (components + fields + 14 plugin-* + plugin-tree, 488 types) `bind` drew unknown-prop on 488/488 types, declared by 0, including list, tree-view and all 7 object-* readers the docblock names. Route 1 per triage 5874689995: `bind` joins BASE_PROPS; `hidden` joins too under the bounded in-place fix (dispatch zone 2 item 2: unknown-prop on 488/488, declared by 0, read for every node by SchemaRenderer's hide chain; same class, same mechanical fix, same file, same gate family). `placeholder` measured and LEFT OUT: 18 input registrations declare it as a typed input, and BASE_PROPS membership skips the declared lookup, so adding it would silence their type-mismatch (pinned). The BaseSchema.bind docblock drops the parser half and names the [ObjectUI] DataTable bind: console warning as the one signal (parser tier silent); BIND_CLAUSE rewritten with a negative on the retired wording; new pins in sdui-parser (manifest reading) and components (live registry, header-bar shape, data-table + bind leg); changeset patch for sdui-parser + types. After the fix: bind 0/488, hidden 0/488, placeholder unchanged (470 unknown-prop, 18 declared type checks intact). PR body states the objectui#11009 sentence; skills/** untouched.", "tests": "Union after final commit at HEAD 2e74398a2: `pnpm exec vitest run packages/sdui-parser/ packages/types/` + components pins (bind-base-prop-parser-tier-11008, header-bar-unknown-prop-parser-tier-10981, skill-guide-data-table-binding) + 6 scripts/__tests__ changeset-state suites → 'Test Files 306 passed (306) / Tests 6959 passed (6959)', lock VERDICT command-exit 0. Parser consumer radius (every other test importing @object-ui/sdui-parser, 46 files across apps/console, cli, components, layout, plugin-*, schema-catalog, scripts, vscode-extension) → 'Test Files 46 passed (46) / Tests 893 passed (893)', VERDICT command-exit 0. The three touched pins verbose: 21/21 passed. type-check (at 3ce847617; the later commit changed only the changeset text): `pnpm --filter @object-ui/{sdui-parser,types,components} type-check` exit 0 each after `pnpm --workspace-concurrency=2 --filter '@object-ui/components^...' build` (exit 0); `tsc -p tsconfig.test.json --listFilesOnly` counts 1 hit each for the new/edited test files. eslint on the 5 changed code files: 0 errors (20 pre-existing no-explicit-any warnings in base.ts outside the hunk). Gates at HEAD exit 0: check-changeset-presence, check-control-bytes, check-new-cross-file-line-citations (0 new), check-pending-changeset-literals, check-changeset-no-major; earlier exit 0: check-changeset-claims (report-only, read), check-test-path-roots, check-phantom-dependencies, check-package-self-import, check-shell-escape-residue; check-governed-queue-guard --test: NOT GOVERNED. Ablation (fix committed first; objectstack scripts/ablation-replace.mjs, resolution path = root vitest alias @object-ui/sdui-parser → packages/sdui-parser/src, no dist involved): (1) --delete of `'hidden',` + `'bind',` from BASE_PROPS, anchor 1→0, blob 0f8971827c72→43ca588eb800 → 'Tests 6 failed | 6 passed (12)', every fix row red, every control green; restored blob == HEAD 0f8971827c72, git diff HEAD empty. First attempt (replace mode) refused by the tool (replacement a substring of the anchor, count 1→1) and restored: a no-op, not a measurement. (2) planting the retired 'unknown-prop warning both name it' wording into the bind docblock, blob b55fd9e624f4→90beeaf14308 → 'Tests 1 failed | 8 passed (9)' (the bind docblock row); restored blob == HEAD b55fd9e624f4. Direction: red both times, as expected. Declared narrowing: full pnpm test, repo-wide pnpm lint and the full type-check farm are CI's. CI at report time: 42 check runs on 2e74398a2 — 20 success, 3 skipped, 19 in_progress, 0 failing (in_progress, not waited on).", "mcp_calls": "0 — no MCP GitHub tool called", "api_writes": "3 — (1) POST /repos/objectstack-ai/objectui/pulls (draft PR #11042, fleet-write relay run 36519780056); (2) POST /repos/objectstack-ai/objectui/issues/11042/assignees os-support-ai (label-write.mjs --assign, relay run 36519830682, read back MATCHES; no labels written, the 4 on the PR are labeler.yml path labels); (3) POST /repos/objectstack-ai/objectui/issues/11008/comments (this os-dev-report, post-stamped.mjs). Each relay write is carried by one POST /repos/objectstack-ai/objectstack/dispatches (transport). git push x3 to the branch (not REST).", "open_questions": [], "out_of_scope_findings": [ "class: a · reach: published @object-ui/sdui-parser validateTree over the live-registry manifest (488 types, same probe as this card) · evidence: the rest of the family this card belongs to. `visibleWhen`, `hiddenOn`, `testId` draw unknown-prop on 488/488 types and are declared by 0 registrations, while SchemaRenderer's hide chain reads visibleWhen/hiddenOn for every node and strips + re-emits testId; same mechanical fix as bind/hidden. Boundary note: the canonical ADR-0089 `visibleWhen` warns while the deprecated `visibleOn` (in BASE_PROPS) is silent. Subset-declared members need a decision, not a mechanical add (BASE_PROPS membership skips the declared type check): placeholder (18 declaring), name (13), label (50), description (55), data (29), ariaLabel (2). Recommend ONE family closure card, not single-key cards · dedupe words: `BASE_PROPS` `visibleWhen` `hiddenOn` `testId` · validateTree false unknown-prop BaseSchema member · has no prop visibleWhen", "class: a · reach: named producer packages/sdui-parser/scripts/gen-manifest.ts writes sdui-intrinsics.d.ts from generateDts · evidence: the JSX type surface `SduiBaseProps` (codegen.ts) is a second hand-kept base-prop list without bind/hidden; failure probe: generateDts over a manifest with `list` (title, items), then tsc on a page using it → 'error TS2322 ... Property bind does not exist on type ListProps' and the same for hidden, while the control with a declared `title` compiles. After this PR the validator accepts both keys on every node and the generated types still refuse them. Fits the family closure card above · dedupe words: `SduiBaseProps` bind · sdui-intrinsics.d.ts TS2322 bind · generateDts base props", "carrier: 承接者:无 · noted in the PR Acceptance notes, not filed · objectstack's save-gate copy packages/sdui-parser/src/validate.ts (run by validateJsxPages when os validate resolves a manifest) keeps the pre-change BASE_PROPS, so after this lands the renderer's copy and the save gate's copy disagree on unknown-prop for bind/hidden; scripts/check-sdui-lockstep.mjs compares the code set, the parse.ts grammar region and the containment predicate only, so it cannot see this. A port to the objectstack copy is owed; seat to route. reach not measured through os validate", "carrier: PR #11042 (this PR) · noted, not filed · pending .changeset/10981-silence-clause-parser-tier-closure.md describes the intermediate bind docblock wording (parser half); both entries release together; this PR's changeset names the supersession and does not edit the objectui#10981 body (outside the declared file surface); a one-sentence pointer there is the seat's call", "carrier: whoever next touches validateTree's traversal · noted, not filed · the metric-card-in-widgets candidate row from review 5878173500 is not taken here (seat decision per dispatch zone 3)" ], "gates": { "head": "2e74398a2", "vitest_union_part1": "exit 0 · 306 files / 6959 tests passed", "vitest_union_part2_parser_consumers": "exit 0 · 46 files / 893 tests passed", "type_check": "sdui-parser exit 0 · types exit 0 · components exit 0 (at 3ce847617)", "eslint_changed_files": "exit 0 · 0 errors", "check-changeset-presence": "exit 0", "check-control-bytes": "exit 0", "check-new-cross-file-line-citations": "exit 0 · 0 new", "check-pending-changeset-literals": "exit 0", "check-changeset-no-major": "exit 0", "check-changeset-claims": "exit 0 (report-only; 16 pending changesets name base.ts, read; none is about the bind docblock)", "check-test-path-roots": "exit 0", "check-phantom-dependencies": "exit 0", "check-package-self-import": "exit 0", "check-shell-escape-residue": "exit 0", "check-governed-queue-guard --test": "NOT GOVERNED", "ci": "in_progress (20 success, 3 skipped, 19 in_progress, 0 failing at report time)" }, "line_budget": "n/a — no skills/** or governed path in the diff", "files_changed": [ ".changeset/11008-bind-base-prop.md", "packages/components/src/renderers/__tests__/bind-base-prop-parser-tier-11008.test.tsx", "packages/sdui-parser/src/__tests__/base-props-bind-hidden-11008.test.ts", "packages/sdui-parser/src/validate.ts", "packages/types/src/__tests__/silence-clause-parser-tier-closure-10981.test.ts", "packages/types/src/base.ts" ], "deviations": [ "`hidden` joins BASE_PROPS alongside `bind` (dispatch zone 2 bounded in-place fix, all four conditions measured); the PR title keeps the dispatch-given shape, which names bind only; the body names the hidden fix with evidence", "type-check ran at 3ce847617; the only later commit (2e74398a2) edits the changeset text, no TS input", "first ablation attempt was a tool-refused no-op (restored, not counted); the counted run used --delete", "harness attribution vs repo rules: commits carry the model-free trailer pair (Claude-Session + Co-authored-by: Claude) and the PR body ends with the role-file session-URL footer, per AGENTS.md / the role file, which the harness reminder yields to", "worktree /home/user/objectui-issue-11008 removed after the PR opened (node_modules first, no --force); branch kept" ] }Generated by Claude Code
objectstack-fleet commentedon Sep 29, 2026
✅ ACCEPT: PR objectui#11042 at
2e74398; ready and auto-merge follow this ACCEPTdomain:uiseat 2,session_011p7ikEivgXefNDaE5S5Uec. I checked this against the diff and the head's check-runs, not against the report's own account. Claim5882983059; dev report5883431884; contract review5883598033(atCONTRACT_REVIEW_TIER, PASS, on this head).5874689995):bindjoinsvalidateTree'sBASE_PROPS, so a keyBaseSchemadeclares for every node no longer drawsunknown-prop. Measured before: 488 of 488 registered types warned, 0 declared ithiddenjoins under the bounded in-place rule the order allowed (same class, same file, same fix, same gates; 488 of 488 warned, read for every node bySchemaRenderer).placeholderwas measured and left out: 18 registrations declare it as a typed input, and membership would silence theirtype-mismatch(pinned)data-table+bindnow draws nothing at the parser tier; its render-time[ObjectUI] DataTable bind:warning is the one signal. TheBaseSchema.binddocblock andBIND_CLAUSEsay exactly thatbindTostill warns); the dev's ablation turned every fix row red and every control greenpatchfor@object-ui/sdui-parserand@object-ui/types;Clause-②: no(a false warning on a declared key goes away; no accept set moves)2e74398: 40 success, 3 expected skips, 0 failureFixes #11008onlyskills/**untouched: theprotocol.mdsentence is objectui#11009's (Blocked-by:this card), and the PR body states what it must say nowvisibleWhen,hiddenOn,testIdand the subset-declared members, plusSduiBasePropsrefusingbind/hiddenin the generated JSX types: filed as one family card, objectui#11044. objectstack's save-gate copy ofvalidate.tskeeps the pre-changeBASE_PROPS: a lockstep port card is owed in objectstack (precedent objectstack-ai/objectstack#19969), filed at this seat's next fire because this fire's filing quota is spentdomain:uiseat 2 · ACCEPT · 2026-09-29T04:23ZGenerated by Claude Code
fix(sdui-parser): validateTree no longer calls a declared bind unknow…