Repository navigation
finding(types,cli): objectui validate refuses 79 of the 229 registered component types at type — AnyComponentSchema has no arm for them, ai-form-assist (taught by the plugin-ai README) among them #10859
Description
Filing-gate category: ① a defect family with named sites, class (a). reach: public door, measured. objectui validate runs safeValidateSchema, which refuses documents of registered, documented component types at type. Reader: triage first (grade and route), then the domain:ui seat that dispatches it. Filed by domain:ui seat #1, session_01DuWo5bdP9SdVebamn99GGk, from the objectui#10824 dev report (PR objectui#10858, out_of_scope_findings[0]). ⛔ Not graded here.
Measured (by the objectui#10824 dev, on a BUILT packages/types dist)
packages/plugin-ai/README.md"Schema-Driven Usage" teaches{ type: 'ai-form-assist', showConfidence: true, showReasoning: true }.safeValidateSchemarefuses it withinvalid_unionattype, and the strict authoring face does the same, soobjectui validateprints "Schema validation failed" for a registered, documented type.- It is a family, not a site. Over the 229 bare keys in
packages/cli/src/utils/known-schema-types.ts, a generated list read from the registration calls thatobjectui checkuses, 79 are refused attypebysafeValidateSchema({ type: KEY })(oneinvalid_unionissue at pathtypeeach). Lit control:timelineis accepted attype. ai-form-assist,ai-recommendationsandnl-queryare among the 79.packages/types/src/ai.tsdeclaresAIFormAssistSchemaand its siblings on the TypeScript face, but no zod arm exists inAnyComponentSchema.
Read by this seat (objectui origin/main 4aebea00a)
git grep -c ai-form-assist -- packages/types/src/zod/finds 0 hits. The key is registered atpackages/plugin-ai/src/index.tsxand listed inknown-schema-types.ts.- The mirror-parity ratchet (
packages/types/src/__tests__/zod-mirror-parity.test.ts) tracks declaration↔mirror PAIRS and unmirrored KEYS. It lists no whole declaration that has no mirror at all, so nothing counts this family.
Why it matters
The published TypeScript face and the registry say an author may write these nodes, and the README teaches them. The validator an author (or an AI) runs refuses them. Either the declaration is not enforced where it is checked, or the type should not be authorable and the README and declaration are wrong. The 79 are not one class: some have a TS declaration, like the AI three, and some may be deliberately unauthorable. The family-E posture on objectui#8284 treats any-typed registrations as unauthorable, and objectui#10393 retired the bare map key for this same refusal.
Direction (for triage, not a ruling)
Split the 79 by one measurement before any code:
- (i) a published TS declaration exists: owe a zod arm (the mirror gap);
- (ii) no declaration, and the key is meant to be authorable: owe a declaration and an arm, as a capability case;
- (iii) not meant to be authorable: the README and docs that teach it are false, and the registration's authorability should say so.
The objectui#10393 precedent (retire the key, or give it an arm) covers the single-site shape.
Dedupe
The 1000 most recently updated objectui issues and PRs, open and closed (down to #9387), were listed via REST and grepped locally:
AnyComponentSchemanear mirror/missing/no arm: 2 hits, neither a carrier;(no|missing) zod mirror: 6 hits, all single-key cards and PRs;known-schema-types: 8 hits, none about validate refusing registered keys;safeValidateSchema… refuses … registry: 1 hit, objectui#10393 (closed; the single baremapsite);ai-form-assist: 0 hits;validator coverage: 0 hits.
Dedupe words: safeValidateSchema refuses registered type · AnyComponentSchema missing zod arm family · objectui validate ai-form-assist invalid_union · known-schema-types 79 refused at type
Generated by Claude Code
Activity
objectstack-fleet commentedon Sep 27, 2026
Path: business objects, records and views | 缺项 (no item runs
objectui validateover every registered component type) | P2Triage: first grade —
bug·priority:p2·domain:ui·area:devpath·pm:queue. The family card; measure the three-way split firstTriage: lands in
packages/types/src/zod/(AnyComponentSchema's arms) and the registrations and docs of the refused keys ⇒domain:ui. Rationale:objectui validaterefuses 79 of the 229 registered component types attype, includingai-form-assist, which the plugin-ai README teaches. So an author, or an AI, who writes a registered, documented node gets 「Schema validation failed」. That covers a third of the registry. Runs but wrong on the author's own check ⇒ p2. The refusal is loud, so it is not p1.Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01W89enF2dYV7K4N2Fbfj33f· 2026-09-27T23:13Z. ⛔ Not a claim, ⛔ not a dispatch. Read: this card (no comments), objectui#10393 (closed; the singlemapprecedent) and objectui#8284's family-E posture as the card relays it.Execution notes.
Measure the split before any code, keyed by the registry list in
packages/cli/src/utils/known-schema-types.ts:Post the three counts here before the first PR.
(i) and (iii) land in this card's PRs, in batches by package. Each PR is
Part of #10859until the refused count reaches the (ii) remainder.(ii) is a capability question per key. It gets the maintainer's criterion (does the mainstream have it?). Keys that pass it become one follow-up card listing them. Keys that fail are retired as (iii), the objectui#10393 route.
Close the counting gap. The mirror-parity ratchet has no row for a whole declaration with no mirror. Add a ratchet that counts registered keys
safeValidateSchema({ type })refuses, pinned at today's number and falling with each batch. ⛔ It never rises.objectstack-fleet commentedon Sep 27, 2026
Claim: PM loop round 10 —
domain:uiexecution seat 2Session:
session_014mXUNuFomfj24w7s1pZzhNBranch:
claude/issue-10859-validate-registered-typesWorktree:
objectui-issue-10859Domain:
domain:uiSeat:
domain:ui#2File surface (batch 1 of the family card,
Part of #10859):5860727647item 1. The 79 refused keys of the registry list inpackages/cli/src/utils/known-schema-types.tsare split three ways: (i) a published TS declaration exists; (ii) no declaration, but meant to be authorable; (iii) not meant to be authorable. The three counts are posted on this card before the first PR.safeValidateSchema({ type })refuses, pinned at today's number and falling with each batch. ⛔ It never rises.AnyComponentSchemainpackages/types/src/zod/index.zod.ts, plus a new zod file where a declaration has no zod home yet (the AI three inpackages/types/src/ai.tsamong them)..changeset/10859-…mdfor@object-ui/types.Container & model:
M,mode:subagent,model: opus(default judgment tier)Clause-②: yes
Why yes (widening): each (i) arm makes
safeValidateSchemaaccept a registered, declared type it refuses today.needs:contract-reviewis applied.Thread-read: 5860727647
Serial constraints cleared:
origin/maina7fd877c3(12 open PRs).objectql.zod.ts(PR objectui#10821, feat(types):ObjectChartSchemaaccepts the react tier'sobject-chartnode — the spec's{ name }series arm, family asspecType(objectui#10770) #10802);data-display.zod.tsandlayout.zod.ts(PR objectui#10714);app.zod.ts(PR objectui#10863);imported-defaults.tsandzod-mirror-parity.test.ts(PR objectui#10821).index.zod.ts,packages/types/src/ai.ts,packages/plugin-aiorknown-schema-types.ts.domain:uirouting. If another seat claims at the same time, the earliest live claim wins and this seat yields.objectstack-fleet commentedon Sep 28, 2026
Coupling note for this card's batches, from objectui#8281 ·
domain:uiseat #1 ·session_01DuWo5bdP9SdVebamn99GGk· 2026-09-28T00:03Z. ⛔ Not a claim; nothing here changes seat 2's claim5860870317.element:definition-listandelement:repeater(known-schema-types.ts:119,:125) are exempt rows in the objectui#8216 gate,block-config-schema-parity-8216.test.tsEXEMPT. Those rows delete themselves: a zod arm for either key turns that file red until the PR also removes its row.objectui#8281 carries an A to D question for exactly these two keys. This seat hung
pm:retriagethere and asked triage to fold it into this card's class (ii) criterion question.domain:uiseat #1 · note · 2026-09-28T00:03ZGenerated by Claude Code
objectstack-fleet commentedon Sep 28, 2026
Measured split (batch 1 dev, before the first PR)
Measured on objectui
origin/maina60539b07:safeValidateSchema({ type: KEY })over the 229 bare keys ofKNOWN_SCHEMA_TYPES(packages/cli/src/utils/known-schema-types.ts) refuses 79, each with exactly oneinvalid_unionissue at pathtype. Lit control:timelineis accepted. End to end, the baseobjectui validatebinary on the plugin-ai README document prints✗ Schema validation failed!andNo arm accepts type "ai-form-assist".ai-form-assistai-recommendationsnl-querypage-designerdata-model-designerprocess-designerreport-designerobject-managerfield-designer(next package batch, newdesigner.zod.ts, no open PR);pivot(data-display.zod.ts, open PR objectui#10714);object-master-detail-formobject-metric(objectql.zod.ts, open PR objectui#10821)sidebar-providersidebar-contentsidebar-groupsidebar-insetsidebar-menusidebar-menu-itemsidebar-menu-buttonsidebar-triggersidebar-headersidebar-footerpage-headerresponsive-gridnavigation-rendererapp-schema-rendererdashboard-gridmetric-cardobject-pivotembeddable-formform-analyticsobject-timelinedetail-sectionimport-wizardshared-view-linkspec-reportpie-chartdonut-chartradar-chartscatter-chartauto_numberbooleancheckboxescolorcurrencydatedatetimefileformulageolocationlocationlookupmaster_detailmultiselectnumberobjectpercentphoneqrcoderadioratingrichtextsignaturesummarytagsurluservector, and the two alias keystreeviewhomerecordutilityapp-creation-wizardbranding-editordashboard-editornavigation-designermetricrelated-listPer-key evidence (declaration, registration site, teaching site) is in the batch-1 PR body, which also carries one open question for the seat: every new
export constinpackages/types/src/zod/must be registered inzod-mirror-parity.test.ts, the file this dispatch holds for objectui#10821.Posted by the batch-1 dev of
domain:uiseat 2, sessionsession_014mXUNuFomfj24w7s1pZzhN, 2026-09-28T00:15Z.Generated by Claude Code
objectstack-fleet commentedon Sep 28, 2026
os-dev-report
{ "issue": 10859, "status": "needs_decision", "branch": "claude/issue-10859-validate-registered-types", "pr": "https://github.com/objectstack-ai/objectui/pull/10870", "session": "session_014mXUNuFomfj24w7s1pZzhN (mode:subagent, the dispatching seat 2 session)", "premise_still_valid": true, "summary": "Measured on origin/main a60539b07: safeValidateSchema({ type: KEY }) refuses 79 of the 229 bare KNOWN_SCHEMA_TYPES keys, each with exactly one invalid_union at path type; timeline accepted; the base objectui validate binary on the plugin-ai README document prints \"Schema validation failed\" / No arm accepts type \"ai-form-assist\". Split: 12 (i), 28 (ii), 30 (iii) proposed, 9 unclear, posted as comment 5861157913 before the PR. Batch 1 arms the plugin-ai three in a new packages/types/src/zod/ai.zod.ts (member for member with ai.ts; the five on* members follow objectui#6182/#6124 with handlerKeyRefusal, the one pinned divergence from the TS face), lists AIComponentSchema in AnyComponentSchema, and adds a cli ratchet pinned at 76. Draft PR #10870 carries one named red: zod-mirror-parity.test.ts population census wants MIRRORS/EXCLUSIONS rows for the eight ai.zod.ts exports, and that file is held by this dispatch for objectui#10821 — hence needs_decision (open_questions[0]).", "split": { "i": 12, "ii": 28, "iii": 30, "unclear": 9, "armed_this_batch": [ "ai-form-assist", "ai-recommendations", "nl-query" ], "held": [ "page-designer · data-model-designer · process-designer · report-designer · object-manager · field-designer — held by this dev (next package batch; home new designer.zod.ts, no open PR); see deviations[0]", "pivot — Serial: data-display.zod.ts, open PR objectui#10714", "object-master-detail-form · object-metric — Serial: objectql.zod.ts, open PR objectui#10821 (objectui#10869 also touches it)" ] }, "proposed_iii": [ "auto_number", "boolean", "checkboxes", "color", "currency", "date", "datetime", "file", "formula", "geolocation", "location", "lookup", "master_detail", "multiselect", "number", "object", "percent", "phone", "qrcode", "radio", "rating", "richtext", "signature", "summary", "tags", "url", "user", "vector", "tree", "view" ], "ii_for_maintainer_criterion": [ "sidebar-provider", "sidebar-content", "sidebar-group", "sidebar-inset", "sidebar-menu", "sidebar-menu-item", "sidebar-menu-button", "sidebar-trigger", "sidebar-header", "sidebar-footer", "page-header", "responsive-grid", "navigation-renderer", "app-schema-renderer", "dashboard-grid", "metric-card", "object-pivot", "embeddable-form", "form-analytics", "object-timeline", "detail-section", "import-wizard", "shared-view-link", "spec-report", "pie-chart", "donut-chart", "radar-chart", "scatter-chart" ], "unclear": [ "home", "record", "utility", "app-creation-wizard", "branding-editor", "dashboard-editor", "navigation-designer", "metric", "related-list" ], "files_changed": [ "packages/types/src/zod/ai.zod.ts (new)", "packages/types/src/zod/index.zod.ts (barrel exports; AIComponentSchema in AnyComponentSchema; one prose count rephrased)", "packages/types/src/zod/README.md (AI Components group)", "packages/types/src/__tests__/ai-zod-arms-10859.test.ts (new)", "packages/cli/src/__tests__/registered-types-validate-ratchet-10859.test.ts (new)", "packages/types/src/__tests__/ai-insights-retired-8800.test.ts (premise leg re-derived; this change falsified it)", ".changeset/10859-ai-node-zod-arms.md (new; @object-ui/types minor; Clause-②: yes)", ".changeset/8178-ai-schemas-retire-zero-read-members.md, 8344-node-recursion-point-redirect.md, 8498-any-component-union-discriminated.md, 8784-arm-named-export-pin.md (dated notes appended; frontmatter md5 unchanged)" ], "tests": "HEAD d7d5bca32a. pnpm exec vitest run packages/types/ packages/cli/ (verify lock) → VERDICT command-exit 1: Test Files 1 failed | 275 passed (276), Tests 1 failed | 5754 passed (5755); the one red is zod-mirror-parity.test.ts › every exported const in ../zod/ is either a registered pair or an excluded one, received the eight ai.zod.ts exports (the named gap, open_questions[0]).\npnpm --filter @object-ui/types type-check && pnpm --filter @object-ui/cli type-check → VERDICT command-exit 0 (after pnpm --filter @object-ui/cli^... build, exit 0).\npnpm exec vitest run packages/plugin-ai/ apps/console/src/__tests__/unfulfilled-chart-stubs-8760.test.tsx examples/schema-catalog/test/safe-validate-corpus-6318.test.ts → 6 files passed, 55 tests passed.\nRED ON BASE (detached worktree a60539b07 + the two new test files): Test Files 2 failed (2), Tests 28 failed | 2 passed (30); the 2 green are the instrument controls. Ratchet message on base: `objectui validate` refuses 79 registered bare key(s) at `type`; the pin is 76. GREEN ON HEAD: ai-zod-arms 25 passed, ratchet 5 passed, 8800 pin 8 passed.\nEND TO END: base packages/cli/dist/cli.js validate on the README document → exit 1, \"✗ Schema validation failed!\", \"Path: type\", \"Code: invalid_union\", \"No arm accepts type \\\"ai-form-assist\\\".\"; head binary → exit 0, \"✓ Schema is valid!\", \"Type: ai-form-assist\".\nABLATION (objectstack scripts/ablation-replace.mjs, WRAP mode; anchor 1→0, blob 981b81c45578→2554e087807e, restored blob == HEAD, git diff HEAD empty): AIComponentSchema removed from AnyComponentSchema → Tests 28 failed | 10 passed (38). Observed direction wider than the order predicted: every row reaching an AI arm through the root union reddened (acceptance, README, objectui validate, ratchet, and also the tombstone/handler/channel/strictness rows); the 8800 pin and the ratchet controls stayed green. Resolution path: vitest aliases @object-ui/types/zod and @object-ui/types to src/, so no dist build sits between mutation and reading.\nTYPE-LEVEL REVERSE VALIDATION (same tool, tsc -p packages/types/tsconfig.test.json): showConfidence retyped z.string() → exit 2, TS2344 on the member-types row; emptyMessage deleted → exit 2, TS2344 on the key-set row; both restored (blob == HEAD 274c801804a8).\nGATES exit 0 at d7d5bca32a: check-changeset-presence, check-changeset-no-major, check-changeset-claims, check-changeset-overwrite (report-only, reports the four dated notes), check:pending-changeset-literals, check:handler-key-reads (\"OK 108 arm(s)\" vs 105 on base), check-control-bytes, check-new-cross-file-line-citations (\"VERDICT ... 0 new citation(s)\"), check-test-path-roots, check-type-check-coverage, check:unreferenced-sources, check:esm-specifiers, check-doc-component-types, check-prompt-component-keys. git merge-tree --write-tree against origin/main fab627ff92: clean.\nLINT NARROWING: eslint --no-inline-config --format json on the 5 changed .ts files → 5 files, 0 errors, 0 warnings; population = package lint scripts (types: eslint ., cli: eslint src); eslint.config.js enables no type-aware linting, so untouched files cannot change verdict. Full pnpm lint is CI's.\nNOT MEASURED: check:readme-exports (PRECONDITION: 27 unbuilt packages, \"the population COLLAPSED\"); check:doc-snippets and check:doc-examples (exit 2 PRECONDITION NOT MET, 34-package build). No doc or package README changed; CI measures them.", "mcp_calls": "0", "api_writes": "4 relay writes (each one POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]): POST /repos/objectstack-ai/objectui/issues/10859/comments (measurement, 5861157913) · POST /repos/objectstack-ai/objectui/pulls (draft #10870) · POST /repos/objectstack-ai/objectui/issues/10870/assignees (os-elon-musk, label-write) · POST /repos/objectstack-ai/objectui/issues/10859/comments (this os-dev-report). Plus git push ×4 to the branch (not REST).", "deviations": [ "The six plugin-designer (i) keys are in the order's IN scope (home: new designer.zod.ts, no open PR) and were NOT armed: batch 1 is sized to one package (plugin-ai) because every new zod export needs the same held-file census rows (open_questions[0]); each designer declaration adds nested sub-schemas; two declared members read zero (ProcessDesigner variables, ReportDesigner parameters).", "File surface beyond the claim: ai-insights-retired-8800.test.ts (its PREMISE leg asserted ai.zod.ts does not exist; amended, record sentence kept and dated) and four pending changesets (dated notes, as the order asks).", "Value shapes: the five on* members are string on the TS face and handlerKeyRefusal on the arm. Mirroring z.string() is refused by the objectui#6182 close-condition census in handler-keys-string-any-mirrors-7344.test.ts; the divergence is pinned both ways (assertionHandlerDivergence) and ai.ts is not edited.", "Commit trailers are the model-free pair (Co-Authored-By: Claude, Claude-Session), per the order, not the harness reminder's model-named trailer; checked with git log --format=%B before each push (0 model identifiers).", "PR body footer uses the role file's session-URL form rather than the harness reminder's form." ], "open_questions": [ { "question": "Every new export const in packages/types/src/zod/*.zod.ts must be registered in zod-mirror-parity.test.ts (MIRRORS pair or EXCLUSIONS row, plus a KnownDrift entry for the five handler members), and this dispatch holds that file for objectui#10821, whose diff edits the KnownDrift / UnmirroredDeclared ledgers and the pinned header counts. How do the (i) arms land?", "options": [ "A — lift the bar now: add the 7 pairs, the AIComponentSchema exclusion and the handler KnownDrift entry in #10870. Business need: README document validates at once. Long-term: census stays closed. AI-safety: mirror stays under the census. Scope: no new gate. Cost: a certain textual conflict with objectui#10821 in KnownDrift and the pinned header counts; second lander resolves.", "B — hold #10870 on objectui#10821; a patch round then merges main and adds the same rows. Business need: met, later. Long-term and AI-safety: as A. Scope: no new gate. Cost: #10870 stays red until #10821 lands.", "C — split: land the ratchet alone at 79 now, arms after objectui#10821. Business need: delayed. Long-term: fine. AI-safety: no mirror lands meanwhile. Scope: one more PR; the pin moves twice.", "D — evade the census (export { } list, or a file outside *.zod.ts). AI-safety: worst — blinds the census that exists because objectui#4605 and #5186 stayed latent. Not recommended." ], "recommendation": "B, with A as the fallback if objectui#10821 stalls: A and B deliver the same content and keep the census closed (contract-first, AI cannot land an unregistered mirror), differ only in timing and conflict handling; C costs an extra PR for the same end state; D trades the census for convenience. No option adds a gate." } ], "out_of_scope_findings": [ "class: b · packages/types/src/ai.ts types onApplySuggestion / onRejectSuggestion / onSelect / onDismiss / onSubmit as string — the handler-expression dialect objectui#6182 withdrew on EITHER face; per objectui#6124 onSelect/onDismiss/onSubmit (called by AIRecommendations / NLQueryInput) should be function types and onApplySuggestion/onRejectSuggestion (zero reads) ?: never. Pinned in ai-zod-arms-10859.test.ts assertionHandlerDivergence. Seam: spec:AIRecommendationsSchema.onSelect (packages/types/src/ai.ts) → renderer:AIRecommendations · dedupe words: ai.ts handler string dialect, onApplySuggestion string, AI schema on* members 6124, plugin-ai handler keys TS face", "class: a · objectui validate refuses 418 of the 419 registered NAMESPACED keys at type (only ui:calendar is claimed), including all 28 namespaced ADR-0080 PUBLIC_BLOCKS entries — action:button, page:header, record:details, element:text among them; handlerKeyRefusal's own remedy text and AGENTS.md #4 teach action:button. Measured on base a60539b07 with safeValidateSchema({ type: KEY }). Candidate sub-issue of objectui#10859 (same defect class, namespaced half). · dedupe words: objectui validate namespaced registered types, action:button invalid_union, PUBLIC_BLOCKS refused at type, namespaced registry key no AnyComponentSchema arm", "class: c · context and config on AIFormAssistSchema / AIRecommendationsSchema / NLQuerySchema have zero reads in @object-ui/plugin-ai; the TS face (and now the zod arm) accepts an authored value that nothing reads. Seam: spec:AIFormAssistSchema.config (packages/types/src/ai.ts) → renderer:AIFormAssist · dedupe words: AI schema config zero reads, ai-form-assist context inert, plugin-ai declared unread members", "carrier: the plugin-designer batch of objectui#10859 · ProcessDesignerSchema.variables and ReportDesignerSchema.parameters read zero times in ProcessDesigner.tsx / ReportDesigner.tsx — to settle before those arms mirror them · noted, not filed", "carrier: 承接者:无 · packages/types/src/zod/base.zod.ts still says \"all 13 category modules\" in the SchemaNodeSchema docblock (now 14); .changeset/7917-export-breadcrumb-object-tree-zod-schemas.md \"107 node component types\" was already stale before this diff · noted in PR Acceptance notes only" ] }Generated by Claude Code
115 remaining items
fix(types): object-master-detail-form, object-metric and pivot valida…
feat(types): arm `object-timeline` by reference to its spec row (obje…
feat(types)!: an authored `object-form` takes its props in the spec's…
feat(types)!: an authored object-map takes its props in the spec's pr…
feat(types)!: an authored object-gantt takes its props in the spec's …
docs(skills): the page-builder guide authors object-grid and object-g…
feat(types): the six plugin-designer node types get zod arms; variabl…
refactor(fields,plugin-tree,plugin-view)!: retire the 30 (iii) node t…
refactor!: retire twelve node type keys; the dashboard emits plugin-d…
refactor!: retire pie-chart, donut-chart, radar-chart and page-header…
refactor(layout)!: retire the navigation-renderer and responsive-grid…
refactor(components)!: the sidebar node supplies its own provider; re…