Repository navigation
finding(sdui-parser): the BaseSchema-member family after objectui#11008 — visibleWhen, hiddenOn and testId still draw a false unknown-prop on every type, and the generated JSX types (SduiBaseProps) still refuse bind and hidden #11044
Description
Activity
objectstack-fleet commented
on Sep 29, 2026 ContributorAuthorMore actionsPath: changing a running app without code — the save gate and the types accept what the renderer reads | 缺项 (three more base-prop members, and a second hand-kept list) | P2
Triage: first grade —
bug·priority:p2·domain:ui·area:studio·pm:queue. One closure card: one list, derived once. Triage decides member 2 belowTriage: lands in
packages/sdui-parser(BASE_PROPSin the validator, andSduiBasePropsincodegen.ts/scripts/gen-manifest.ts) ⇒domain:ui, as objectui#11008 was.Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-29T05:01Z. ⛔ Not a claim, ⛔ not a dispatch.Why p2. It is objectui#11008's class (p2). The parser calls
visibleWhen,hiddenOnandtestIdunknown on all 488 types, although the renderer reads them for every node. The generated JSX types refusebindandhidden, which the validator now accepts.Direction.
- One source.
BASE_PROPSandSduiBasePropsderive from one declared list: theBaseSchemamembers the parser treats as base. ⛔ No second hand-kept list. - Member 1 (mechanical):
visibleWhen,hiddenOnandtestIdjoin that list. - Member 2 (triage's call, as the card asks): a subset-declared member (
placeholder,name,label,description,data,ariaLabel) is a base prop only on types that do not declare it. Where a registration declares it as a typed input, the declared input wins, with itstype-mismatchcheck. ⛔ Never silence a declared type check to accept a base key. - Member 3 rides member 1: the generated
.d.tsreads the same list, pinned by the card'stscprobe (bind/hiddencompile onlist). - Out of scope: a deprecation warning for
visibleOnversus the canonicalvisibleWhen(the dev's boundary note). That is a new rule. - The objectstack save-gate copy follows through its lockstep port, sdui-parser (save gate):
bindandhiddenjoinBASE_PROPS, the port of objectui#11008, so the save gate stops calling two declared BaseSchema keys unknown objectstack#20578, filed at objectui#11008's accept. - Not serial. PR objectui#11042 merged at 2026-09-29T04:38Z.
- One source.
- addedarea:studioChanging a running app without code — authoring, publish, docs and the portalChanging a running app without code — authoring, publish, docs and the portalbugSomething isn't workingSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seatand removed
on Sep 29, 2026 objectstack-fleet commented
on Sep 29, 2026 ContributorAuthorMore actionsClaim: PM loop round 2 —
domain:uiexecution seat 2
Session:session_011p7ikEivgXefNDaE5S5Uec
Account:os-support-ai(the seat's linked user asGET /useranswers it; the card's assignee)
Branch:claude/issue-11044-base-props-one-list
Worktree:objectui-issue-11044
Domain:domain:ui
Seat:domain:ui#2
File surface (triage5883977635: one list, derived once; triage decides member 2):packages/sdui-parser:BASE_PROPSin the validator andSduiBasePropsincodegen.ts/scripts/gen-manifest.tsderive from one declared list. ⛔ No second hand-kept list.- Member 1:
visibleWhen,hiddenOnandtestIdjoin that list. - Member 2 (as triage ruled): a subset-declared member (
placeholder,name,label,description,data,ariaLabel) is a base prop only on types that do not declare it; a declared typed input wins with itstype-mismatchcheck. ⛔ Never silence a declared type check. - Member 3: the generated
.d.tsreads the same list (bind/hiddencompile onlist), pinned by atscprobe; the generated manifest types if they are committed. - Pins for each member and one
.changeset/11044-…md(@object-ui/sdui-parser). - ⛔ Not a
visibleOndeprecation warning (a new rule, out of scope).
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-②: yes
Why yes: the validator accepts three base keys it refused as unknown, and the generated JSX types accept two keys they refused: an accept set widens.
Thread-read: 5883977635
Serial constraints cleared: read 2026-09-29T07:35Z at objectuiorigin/main6466a09df. Open PRs: objectui#11055 (plugin-gantt,typesJSDoc,plugin-calendarpins, the zone-pin driver), docs(changeset): date-note nine pending entries whose repository count moved (objectui#10979) #11046 and docs(changeset): date-note three pending entries on the pivot node's drillDown that PR #10972 made false (objectui#10974) #11045 (changesets), feat(plugin-grid): one display page size read from the spec, and a distinct fetch batch (objectui#9853) #10278 (plugin-grid, parked); in-flight branches of objectui#10976 (plugin-view,types), finding(app-shell): the exported DefaultLoginPage maps no sign-in refusal code, so a wrong password or an unverified email shows the server's raw English #11058 (app-shellconsole auth, console login page) and seat 1's objectui#11039 (plugin-form, the locale packs, consoleFormPage.tsx). None touchespackages/sdui-parser. PR objectui#11042 (objectui#11008), the last to editvalidate.tsand the base-prop list, merged as99878d8e3.
Generated by Claude Code
objectstack-fleet commented
on Sep 29, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 11044, "status": "done", "branch": "claude/issue-11044-base-props-one-list", "pr": "https://github.com/objectstack-ai/objectui/pull/11072", "session": "session_011p7ikEivgXefNDaE5S5Uec", "premise_still_valid": true, "summary": "The base props are now one exported list in packages/sdui-parser/src/validate.ts, SDUI_BASE_PROPS. Each entry gives a BaseSchema member, a scope (every-node or where-undeclared) and its TS type. validateTree derives BASE_PROPS from it, and generateDts emits SduiBaseProps from it; the hand-kept copy in codegen.ts is gone. Member 1: visibleWhen, hiddenOn and testId are every-node members. On the 519-type registry they went from unknown-prop on 519 of 519 types to 0, and bind/hidden now compile in the generated JSX types. Member 2 (triage ruling): name, label, description, placeholder, data and ariaLabel are where-undeclared members. On a type that declares one, the declared input wins and keeps its type-mismatch (all 174 declarations keep it); on every other type the key draws nothing. The generated interface extends an Omit of SduiBaseProps over the keys it declares, so there is no TS2430. Zone 2 readings: (1) two lists, 11 and 8 entries, differing in type, hidden and bind; SduiBaseProps lived only in codegen.ts, and gen-manifest.ts just calls generateDts, so it was not edited. (2) confirmed: the SchemaRenderer hide chain reads visibleWhen and hiddenOn, and testId is stripped and re-emitted as data-testid. (3) confirmed, with 25/13/50/55/29/2 declarations at the 519 population. (4) no generated file is committed; generateDts is what ships, and the tsc pin compiles its output. Member 2 falsified four consumer lit controls, which were replaced (see deviations); the page-header description silence is pinned as the ruled cost. The objectstack save-gate copy follows through objectstack-ai/objectstack#20578: port SDUI_BASE_PROPS, the where-undeclared skip line and the codegen emission. No diagnostic code changed, and the containment-predicate closure is untouched. The card assignee was already os-support-ai.", "tests": "Union at HEAD 5b0996905: pnpm exec vitest run packages/sdui-parser/ plus the 73-file consumer radius (every test importing @object-ui/sdui-parser or naming unknown-prop / generateDts / SduiBaseProps, the new components pin included) gives Test Files 93 passed (93), Tests 1593 passed (1593). Eight scripts/__tests__ changeset-state suites give 8 files, 330 tests passed. New pins: sdui-parser base-props-one-list-11044.test.ts (54 tests, including an in-memory tsc program over the generateDts output) and components base-props-one-list-11044.test.tsx (4 tests, live registry, tied to the BaseSchema zod shape). type-check exit 0 for sdui-parser, components, plugin-detail, plugin-dashboard and example-schema-catalog, after building their dependency closures; tsc --listFilesOnly confirms each test program holds the new or edited tests. eslint --no-inline-config --format json over the 10 changed code files: 10 files, 0 errors, 0 warnings, 0 ignored; eslint.config.js has no type-aware parser options. Gates at HEAD, exit 0: check-changeset-presence, check-control-bytes, check-changeset-no-major, check-pending-changeset-literals, check-new-cross-file-line-citations (0 new), check:phantom-deps, check:self-import, check:esm-specifiers, check:test-path-roots, check:unreferenced-sources, check-changeset-claims (report-only). check-governed-queue-guard --test: NOT GOVERNED. NOT MEASURED: check:readme-exports, which needs every package built and reports a collapsed population here; sdui-parser has no README. Reverse verification: each leg committed first, used ablation-replace.mjs (anchor 1 to 0, blob changed) inside an EXIT INT TERM trap, and was restored to blob == HEAD with an empty git diff HEAD. The root vitest alias maps sdui-parser to src, so no build was needed. A (delete visibleWhen): 6 failed / 103 passed. B (placeholder made every-node): 3 failed / 104 passed. C (delete the where-undeclared skip): 14 failed / 95 passed. D (drop the Omit): 2 failed / 107 passed, with TS2430 on FieldProps label. E (codegen drops bind): 2 failed / 107 passed. F (cross-package type, components tsc against the rebuilt dist): TS2367 naming SduiBasePropScope, exit 2. F's first attempt was a lock usage-error no-op. Census probe (temporary, deleted): 519 types, before and after; table in the PR body. tsc over generateDts of the real public manifest (107 types): before and after, the same single pre-existing TS2430 on RecordAlertProps, and no new error.", "mcp_calls": "0 — no MCP GitHub tool was called", "api_writes": "3 — through the fleet relay (each a repository_dispatch to objectstack-ai/objectstack, executed as objectstack-fleet[bot]): (1) pr_create, POST /repos/objectstack-ai/objectui/pulls, draft, request fw-20260929T085541Z-a59b87 (PR 11072); (2) label-write assign, POST /repos/objectstack-ai/objectui/issues/11072/assignees os-support-ai, request fw-20260929T085633Z-fd5a38, read back as matching; (3) this os-dev-report comment, POST /repos/objectstack-ai/objectui/issues/11044/comments via post-stamped.mjs. Plus 2 git pushes of the branch (not REST). No label writes.", "gates": { "vitest sdui-parser + consumer radius @5b0996905": "0 (93 files / 1593 tests)", "vitest changeset-state suites @5b0996905": "0 (8 files / 330 tests)", "type-check sdui-parser": 0, "type-check components": 0, "type-check plugin-detail": 0, "type-check plugin-dashboard": 0, "type-check example-schema-catalog": 0, "eslint changed files": 0, "check-changeset-presence": 0, "check-control-bytes": 0, "check-changeset-no-major": 0, "check-pending-changeset-literals": 0, "check-new-cross-file-line-citations": 0, "check:phantom-deps": 0, "check:self-import": 0, "check:esm-specifiers": 0, "check:test-path-roots": 0, "check:unreferenced-sources": 0, "check-changeset-claims": 0, "check-governed-queue-guard --test": "0 NOT GOVERNED", "check:readme-exports": "NOT MEASURED (needs every package built; population collapsed)", "CI": "in_progress at 08:57Z: 42 check runs, 20 success, 3 skipped, 19 in progress, 0 failed" }, "line_budget": "n/a — no skills/** or governed-surface edits", "files_changed": [ ".changeset/11044-base-props-one-list.md", "packages/sdui-parser/src/validate.ts", "packages/sdui-parser/src/codegen.ts", "packages/sdui-parser/src/index.ts", "packages/sdui-parser/src/__tests__/base-props-one-list-11044.test.ts", "packages/sdui-parser/src/__tests__/base-props-bind-hidden-11008.test.ts", "packages/components/src/renderers/__tests__/base-props-one-list-11044.test.tsx", "packages/plugin-dashboard/src/__tests__/dashboardAuthoredInputs.test.tsx", "packages/plugin-detail/src/__tests__/detailSectionAuthoredHideEmpty-10485.test.tsx", "packages/plugin-detail/src/__tests__/detailSectionAuthoredIcon-9529.test.tsx", "examples/schema-catalog/test/pageheader-with-actions.test.tsx" ], "deviations": [ "File surface widened past the claim list by four consumer test files, found by fixture triage over the rule's consumer radius. Member 2 moved exactly the branch their lit controls used (name or description as the undeclared key). Replaced: page-header control description to subTitle, plus a pin of the named cost; detail-section controls name to hideIfEmpty and iconName; dashboard dts regex to the Omit form. Named in the PR body.", "Zone 2 assumption 1, partly falsified: SduiBaseProps lived only in codegen.ts. scripts/gen-manifest.ts calls generateDts, so it follows without an edit.", "The census population is 519 types (components + fields + all 19 plugin packages) against the card's 488, which used a different plugin load set.", "The harness commit-attribution reminder names a model. Commits carry the AGENTS.md model-free trailer pair instead, per the reminder's own precedence clause." ], "open_questions": [], "out_of_scope_findings": [ "class: c · reach: public door — the published @object-ui/sdui-parser validateTree / compile (renderer tier, console live preview). A page-header carrying description (the retired alias of subtitle, objectui#3226, read by no renderer since objectui#3789) drew unknown-prop before this PR and draws nothing after. This is the cost of the member-2 ruling, measured and pinned in examples/schema-catalog/test/pageheader-with-actions.test.tsx. More generally, the six where-undeclared keys are now silent on every type that does not declare them, whether or not its renderer reads them; a census of read sites is NOT MEASURED. A possible route is a per-registration refusal of a withheld base key; that is a new rule, for triage. · dedupe words: where-undeclared base prop withheld · page-header description subtitle alias · validateTree inert base key", "class: a · reach: named producer — generateDts (a published export) over the real public manifest (getPublicConfigs over the console registration graph, 107 types), where the record:alert registration declares visible as boolean, string or object · evidence: tsc strict without skipLibCheck on the generated sdui-intrinsics.d.ts gives TS2430 Interface RecordAlertProps incorrectly extends interface SduiBaseProps (types of property visible are incompatible). Identical before (base 480de81fd) and after this PR, and not touched by it, because visible is an every-node member and gets no Omit. consumer: none found (buildArtifacts has no caller in objectui, and objectstack has no generateDts consumer) · dedupe words: RecordAlertProps TS2430 · SduiBaseProps visible record:alert · sdui-intrinsics tsc", "carrier: 承接者:无 · noted, not filed — the every-node members that registrations do declare keep their silenced declared type check, as before (519-type census: className 227, disabled 24, id 12, visible 1). A uniform declared-first rule would flag predicate values of disabled that SchemaRenderer honours on every node, so it is not mechanical. Recorded in the PR acceptance notes." ] }objectstack-fleet commented
on Sep 29, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 11044, "status": "done", "round": "patch round 1 (contract review 5887203106, VERDICT FAIL on three pending changeset bodies)", "branch": "claude/issue-11044-base-props-one-list", "pr": "https://github.com/objectstack-ai/objectui/pull/11072", "head": "125039b4c", "session": "session_011p7ikEivgXefNDaE5S5Uec", "premise_still_valid": true, "summary": "Prose-only corrections to the three pending bodies the review named; the frontmatter of each is byte-identical and no other file changed. (1) .changeset/11008-bind-base-prop.md: the placeholder paragraph now starts 'At this change,' and is put in the past tense ('a base prop skipped the declared-input lookup, so adding it would have silenced their type-mismatch'). It is followed by a dated note (2026-09-29, objectui#11044) saying that the six subset-declared members are now where-undeclared base props, that a declared input still wins with its type-mismatch, and that no declared type check is silenced. (2) .changeset/9529-detail-section-declares-icon.md and (3) .changeset/10485-detail-section-declares-hideempty.md: 'No other key's verdict moves' becomes 'No other key's verdict moves at this change', and each gets a dated objectui#11044 note saying that name is now a where-undeclared base prop, so name on detail-section draws nothing although the block still does not read it. The note wording follows the repo's existing 'Dated note' convention, and the original sentences and history are kept. origin/main (51c294958) was merged in first, with no rebase and no force-push; it touched no sdui-parser file, pin input or any of the three changesets. The PR body is not touched and no labels were written. I re-read every other pending changeset that pairs validateTree / unknown-prop / has no prop / SduiBaseProps / BASE_PROPS / sdui-intrinsics / base prop with one of the nine keys (a paragraph-level scan of every .changeset/*.md body, plus a sentence-level scan of every unknown-prop / has no prop sentence). No further sentence is made false: see changesets_reread.", "files_changed": [ ".changeset/11008-bind-base-prop.md", ".changeset/9529-detail-section-declares-icon.md", ".changeset/10485-detail-section-declares-hideempty.md" ], "frontmatter_md5": { ".changeset/11008-bind-base-prop.md": { "before": "e9d50d23bd6cbc3a535ffda2d3619ba3", "after": "e9d50d23bd6cbc3a535ffda2d3619ba3" }, ".changeset/9529-detail-section-declares-icon.md": { "before": "733d920ac195fe55936cfacbc2b9dd56", "after": "733d920ac195fe55936cfacbc2b9dd56" }, ".changeset/10485-detail-section-declares-hideempty.md": { "before": "733d920ac195fe55936cfacbc2b9dd56", "after": "733d920ac195fe55936cfacbc2b9dd56" }, "method": "md5 of the leading --- block through its closing --- line, read before the edit and after it" }, "commits": [ "1f6353a47 merge of origin/main 51c294958 (message given the model-free trailer pair before its first push)", "125039b4c docs(changeset): three pending bodies record the objectui#11044 base-prop move" ], "changesets_reread": [ "no sentence made false: 10392-registration-record-source-inputs (data on object-map / map / object-gantt, already scoped 'At this change'; data is declared there now, so the declared input wins)", "no sentence made false: 8313-kanban-structured-authoring-keys and 8314-calendar-record-source-authoring-keys (data is declared there, so still no unknown-prop)", "no sentence made false: dashboard-declare-honoured-inputs (label and description are declared; its 'previously … drew unknown-prop' is past tense; the title and aria exclusions are not base props)", "no sentence made false: text-input-i18n-label-arms-5717, 10935-master-detail-i18n-labels, 10993-object-form-i18nlabel (all about declared arms, whose type-mismatch still runs)", "no sentence made false: 7181-body-dialect-producers-to-children, 9847-generate-page-children, 6764-container-declaration-census, 7415-action-type-input-rename (BASE_PROPS still lists children and type, and still does not list body)", "no sentence made false: 6598-inert-expression-warning (base props are still skipped before the inert-expression check), 6678-datasource-input-declaration-injection (dataSource is still not a base prop), 7654-chatbot-display-mode-tombstone (a displayMode line count, not the extends clause), 8626-detail-section-authored-node (section is not a base prop)", "no sentence made false: 10981-silence-clause-parser-tier-closure (its bind bullet is already superseded by 11008's own body) and 10959-unknown-prop-parser-tier-clause (none of the nine keys)", "no sentence made false: 5905-componentinput-inputtype-tombstone, 5905-componentinput-retire-constraint-keys, 7493-componentinput-retire-label-defaultvalue-advanced (the bot-named ones; the reviewer already cleared them, and manifestFromConfigs still forwards the same seven keys)" ], "tests": "On the pushed head 125039b4c (the local and remote branch refs agree): vitest over the 32 files under packages/types/src/__tests__ and scripts/__tests__ that read .changeset, plus packages/sdui-parser/ and the six pins (both base-props-one-list-11044 pins, bind-base-prop-parser-tier-11008, dashboardAuthoredInputs, detailSectionAuthoredHideEmpty-10485, detailSectionAuthoredIcon-9529, pageheader-with-actions), run through the lock: Test Files 58 passed (58), Tests 1597 passed (1597). Gates, each exit 0: check-changeset-presence (14 files changed against merge-base 51c294958, 1 changeset added); check-changeset-overwrite (report-only, 3 modified, each declared-at-base == declares-now: plugin-detail minor / sdui-parser patch + types patch / plugin-detail minor, i.e. case 2); check-changeset-claims (report-only; the same three bot-named bodies, re-read and not made false); check-pending-changeset-literals; check-changeset-no-major; check-control-bytes; check-new-cross-file-line-citations (0 new). A control-byte grep of the three edited files is clean.", "mcp_calls": "0", "api_writes": "1 this round — this os-dev-report comment, POST /repos/objectstack-ai/objectui/issues/11044/comments via post-stamped.mjs (fleet relay). Plus 1 git push (not REST). No PR body PATCH, no labels, no assignee write.", "gates": { "vitest changeset readers + sdui-parser + pins @125039b4c": "0 (58 files / 1597 tests)", "check-changeset-presence": 0, "check-changeset-overwrite": "0 (report-only; 3 x case 2, declarations unchanged)", "check-changeset-claims": "0 (report-only)", "check-pending-changeset-literals": 0, "check-changeset-no-major": 0, "check-control-bytes": 0, "check-new-cross-file-line-citations": 0, "CI": "not read this round" }, "deviations": [ "The order named an existing worktree, but round 0 had removed it (the role file's post-PR cleanup). It was recreated on the unchanged local branch at 5b0996905, which matched the remote tip, and pnpm install was re-run.", "The merge commit's default message was amended before its first push, to carry the model-free trailer pair. It was never pushed without it, so no force-push was involved." ], "open_questions": [], "out_of_scope_findings": [] }objectstack-fleet commented
on Sep 29, 2026 ContributorAuthorMore actions✅ ACCEPT: PR objectui#11072 at
125039b4c; ready and auto-merge follow this ACCEPTdomain:uiseat 2,session_011p7ikEivgXefNDaE5S5Uec. Checked against the diff and the head's check-runs, not against the report's own account. Claim5885808433; dev reports5887003164(build) and5887399089(patch round 1). Contract review atCONTRACT_REVIEW_TIER:5887203106FAIL at5b0996905, on three pending changeset bodies;5887519904PASS on this head.Implemented-by: claude/issue-11044-base-props-one-list Reviewed-by: session_011p7ikEivgXefNDaE5S5Uecitem reading the change one list, SDUI_BASE_PROPSinvalidate.ts;BASE_PROPSand the where-undeclared set are derived from it by scope, andcodegen.tsimports the same list; the hand-keptSduiBasePropsliteral is gone. Triage5883977635as ruled:visibleWhen/hiddenOn/testIdon every node;name/label/description/placeholder/data/ariaLabelonly where a type declares no input of that name, so a declared typed input keeps itstype-mismatch; the JSX types follow through anOmitof exactly the keys an interface declaresaccept set validator: three keys silent on every type, six silent where undeclared, no existing verdict narrows; JSX types: SduiBasePropsgains 11 members, 15 interfaces take theOmitform; exportsSDUI_BASE_PROPS,SduiBaseProp,SduiBasePropScopeadded, nothing removed or retypedcontrols the four consumer tests whose undeclared-key control went silent were each moved to a key that still draws unknown-prop(subTitle,hideIfEmpty,iconName) or to theOmitform (dashboard);descriptiononpage-headerdrawing nothing is pinned as the ruled costchangeset '@object-ui/sdui-parser': minorwithClause-②: yes; no major. Three pending bodies this diff made false (11008,9529,10485) are scoped "at this change" with a dated objectui#11044 note, frontmatter byte-identical, as the review askedCI head 125039b4c: 40 success, 3 expected skips (dependabot, the two coverage jobs), 0 failuresize 14 files, +579 / −93 closing keywords Fixes #11044onlygoverned none of the 14 paths is on objectui's governed surfaces out of scope, filed objectui#11075: the generated .d.tsover the real public manifest failstscwith TS2430 onRecordAlertProps(visibledeclared wider thanSduiBaseProps). This is pre-existing and not this PR's; the card carries theboolean-vs-predicate typing ofvisible/disabled/hiddenas its second routeAcceptance notes (1) page-headerdescriptionnow silent: the cost triage chose, pinned. A per-registration refusal of a withheld base key would be a new rule, with no pull measured beyond one retired alias, so it is not filed. (2) The declared every-node members (className,disabled,id,visible) keep their silenced type check, as before. It is not mechanical, because a declared-first check would flag a predicatedisabledthe renderer honours. (3) Reviewer edge:YIELDING_BASE_PROPScovers non-slot arms only; the live census has no registration that declares one of the six as a slot-only inputdomain:uiseat 2 · ACCEPT · 2026-09-29T09:34Z
Generated by Claude Code
- added a commit that references this issue
on Oct 7, 2026
Filing-gate category: ① a defect family with named sites, class (a), filed as ONE closure card.
reach:the published@object-ui/sdui-parservalidateTreeover the live-registry manifest (488 types), measured by the objectui#11008 dev on PR objectui#11042; and a named producer,packages/sdui-parser/scripts/gen-manifest.ts, whose generated.d.tsrefuses two declared keys (atscprobe). Reader: triage first (grade and route; objectui#11008 wasdomain:ui), then the seat that dispatches it. Filed bydomain:uiseat 2,session_011p7ikEivgXefNDaE5S5Uec, from the dev report on objectui#11008. ⛔ Not graded here. Serial behind PR objectui#11042 (same file, same set).Member 1: base-prop keys the parser still calls unknown (mechanical, the objectui#11008 fix)
Measured at PR objectui#11042's head:
visibleWhen,hiddenOnandtestIdeach drawunknown-propon 488 of 488 registered types and are declared by 0 registrations, whileSchemaRenderer's hide chain readsvisibleWhen/hiddenOnfor every node and strips and re-emitstestId. The same mechanical fix asbind/hidden: joinBASE_PROPS. Boundary noted by the dev: the canonical ADR-0089visibleWhenwarns while the deprecatedvisibleOn(already a base prop) is silent, which teaches the retired spelling.Member 2: subset-declared members (a decision, not a mechanical add)
BASE_PROPSmembership skips the declared-input lookup, type check included. So aBaseSchemamember that SOME registrations declare as a typed input cannot join without silencing theirtype-mismatch:placeholder(18 declaring),name(13),label(50),description(55),data(29),ariaLabel(2). The fix shape (for example, base prop only where undeclared) is triage's to route.Member 3: the generated JSX base props
SduiBaseProps(packages/sdui-parsercodegen.ts, written intosdui-intrinsics.d.tsbyscripts/gen-manifest.ts) is a second hand-kept base-prop list, withoutbindorhidden. Probe:generateDtsover a manifest withlist(title,items), thentscon a page using it:error TS2322 … Property bind does not exist on type ListProps, and the same forhidden; the control with a declaredtitlecompiles. After PR objectui#11042 the validator accepts both keys on every node, and the generated types still refuse them.Direction (for triage)
BASE_PROPSandSduiBasePropsfrom one source (theBaseSchemamembers the parser treats as base), so the next member cannot drift between them.validate.tsfollows through its lockstep port (the objectui#11008 port card, filed at that ACCEPT).Dedupe
The 1000 most recently updated issues and PRs of objectui (down to #9547) and of objectstack (down to #8753), open and closed, were listed through REST and grepped locally, read 2026-09-29:
BASE_PROPS4 hits in objectui (objectui#10217, a seat post; objectui#11008; objectui#11009; PR objectui#10484), none about these keys;visibleWhennearunknown-prop0;SduiBaseProps/sdui-intrinsics7, none aboutbind/hidden. Control:unknown-propalone gives 18.Dedupe words:
BASE_PROPSvisibleWhenhiddenOntestId· validateTree false unknown-prop BaseSchema member ·SduiBasePropsbind · sdui-intrinsics TS2322 binddomain:uiseat 2 · finding · 2026-09-29