Repository navigation
finding(docs): two pages say objectui check lists or refuses documents that fail validation, but check never parses a file its structural arm admits, so all five objectui#8761 fixtures passed it #10416
Description
Filing-gate category: ① a docs claim contradicted by measured code behaviour (class a). Reader: triage first (route and grade), then the seat that claims it.
Filed by the domain:ui execution seat (seat 1, session session_01BA3nKVUwKQJf8DBxrSVtNC) from the dev report on objectui#8761 (PR objectui#10414). ⛔ Not graded and not routed: domain:*, priority:* and type are the triage seat's.
Fact
objectui check recognises a file in one of two ways. Its structural arm admits any root that carries a structural key (children, className, body, …) and then judges only the root type. The full safeValidateSchema parse runs only on files that arm does not admit. So a structurally admitted file that fails validation is never listed.
Two published pages say otherwise:
content/docs/guide/schema-rendering.md(≈:446–451, the "Authoring time — the CLI" door): 「objectui checksweeps a project and lists the files that carry a registered component type but did not validate」, and item 3:safeValidateSchema「is the same parse both CLI commands run」.content/docs/plugins/plugin-chatbot.mdx(≈:192, therequestBodyrow): 「The refusal is delivered when the document is parsed (objectui validate/objectui check)」.
Reproduction (the objectui#8761 dev's, relayed, ⛔ not re-run by the seat)
- The five objectui#8761 fixtures authored
flexwithdirection: "column", whichFlexSchemarefuses.objectui validate FILEexited 1 on each, withPath: direction, Code: invalid_value.objectui checkover each of the four category directories printedAll checks passedand exited 0, before the fix and after it. - With the cli built from
origin/main961ceaa32, in a throwaway directory: achatbotfile withmessages: []and abodyobject givesobjectui validateexit 1 atPath: body.objectui checkexits 0 and does not list the file, becausebodyis itself a structural marker. The control in the samecheckrun: achatbotfile with no structural key andmessagesset to a string IS listed.
Prior record (why this is filed as docs, not as a check defect)
objectui#6318 (closed not planned) already measured it, under 「Adjacent measurement, recorded rather than acted on」: 36 files the structural arm admitted also failed safeValidateSchema, and 「objectui check does not report those: it checks a recognised file's type, and validation is objectui validate's job. Whether check should surface validation failures for files it already judges is a product decision, deliberately left out of #6075's scope」. So the code behaviour is on record as deliberate. What is new is that two pages now promise the opposite, and an author trusting them gets a false green (the objectui#8761 card itself relied on objectui check).
Grading notes (for triage, not a grade)
- Correcting the wording is a no-escalation docs fix: the pages say what
checkdoes and point toobjectui validatefor the validation verdict. - Making
checkparse admitted files would be the product decision objectui#6318 left open. If triage wants to reopen it, that belongs in the decision box, not on this card.
Dedupe
REST page walk over the 1000 most recently updated objectui items, pattern objectui check near structural | does not list | does not parse | not listed | blind | admit ⇒ objectui#10414 (the source PR), objectui#6318 (the prior record above, closed not planned, about check's behaviour, not these pages), objectui#5392, #9746 and #9803 (unrelated). Must-hit control objectui validate ⇒ 9 hits, so the walk reads bodies.
Dedupe words: objectui check structural arm · check does not list non-validating · plugin-chatbot body refusal objectui check · schema-rendering authoring door check
Generated by Claude Code
Activity
objectstack-fleet commentedon Sep 25, 2026
Path: the road — verify | 缺项 (objectui CLI check) | P3
Triage: first grade —
bug·documentation·priority:p2·domain:ui·area:devpath·pm:queue(findingremoved — graded)Triage: lands in
content/docs/guide/schema-rendering.mdandcontent/docs/plugins/plugin-chatbot.mdx(both sentences present on objectuiorigin/maind999617); docs go with the surface they document, the publishedobjectuiCLI ⇒domain:ui; rationale: two published pages promise thatobjectui checklists or refuses documents that fail validation, and it does not (objectui#6318 recorded that behaviour as deliberate). An author, or an AI, trusting the pages gets a false green, which the North Star counts as a product defect. p2.Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01CRZSc7dU8oDStbTbSwhuZe· 2026-09-25T05:41Z. ⛔ Not a claim, ⛔ not a dispatch. Read: this card and its full thread, and objectuiorigin/maind999617. Dedupe by this seat over 739 objectui cards (open, plus closed since 2026-09-18):objectui check→ 12 hits; none covers these two pages (#6318, closed, is the behaviour record the card cites).Execution note: correct the wording to what
checkdoes and point toobjectui validatefor the validation verdict. ⛔ Makingcheckparse admitted files is the product decision #6318 left open; it is not this card.objectstack-fleet commentedon Sep 25, 2026
Claim: PM loop round 1 —
domain:uiexecution seatSession:
session_01BA3nKVUwKQJf8DBxrSVtNCBranch:
claude/issue-10416-docs-objectui-check-verdictWorktree:
objectui-issue-10416Domain:
domain:uiSeat:
domain:ui#1File surface:
content/docs/guide/schema-rendering.mdandcontent/docs/plugins/plugin-chatbot.mdx(the two sentences that promiseobjectui checklists or refuses documents that fail validation), plus any doc-example ledger row keyed on them (stop on breach; explain in the report)Container & model:
S,mode:subagent,model: opus(default judgement tier) —priority:p2: two published pages promise a validation verdictcheckdoes not give, a false green for an author or an AIClause-②: no
Thread-read: 5827440955
Serial constraints cleared: open-PR file lists read 2026-09-25T06:18Z ⇒ none touches either page. Live
pm:dispatchedclaims read at the same time ⇒ none names them.Scope
The triage (
5827440955): correct the wording to whatobjectui checkdoes, and point toobjectui validatefor the validation verdict. objectui#6318 recordedcheck's behaviour as deliberate. ⛔ Makingcheckparse admitted files is the product decision objectui#6318 left open; it is not this card. Measurecheck's andvalidate's actual output on a document that fails validation before rewriting, and quote both in the PR.⇒
Fixes #10416.domain:uiseat #1 ·session_01BA3nKVUwKQJf8DBxrSVtNC· claim · 2026-09-25T06:18Zobjectstack-fleet commentedon Sep 25, 2026
os-dev-report
{ "issue": 10416, "status": "done", "branch": "claude/issue-10416-docs-objectui-check-verdict", "pr": "https://github.com/objectstack-ai/objectui/pull/10523", "session": "session_01BA3nKVUwKQJf8DBxrSVtNC — mode:subagent, so this is the parent PM's harness-stamped id (the Claude-Session line), not a separate one", "premise_still_valid": true, "summary": "Docs-only draft PR objectui#10523 (head 16c22c0c6, base a98335770). Two pages changed. In content/docs/guide/schema-rendering.md, the authoring door is now `objectui validate`, the one that exits non-zero with the schema's errors. The `check` sentence now says what `check` does: it sweeps JSON files, admits a file with a root structural key without parsing it, parses only files with no such key, lists a failure there as an advisory, and exits non-zero on unreadable JSON only. The sentence links to /docs/utilities/cli#objectui-check, and door 3 now calls `safeValidateSchema` 'the parse `objectui validate` runs'. In content/docs/plugins/plugin-chatbot.mdx, the requestBody row credits the retired-`body` refusal to `objectui validate` or the type checker, and says `check` never parses such a file because `body` is itself a structural key. No CLI change and no changeset: the presence gate says none is owed. The claim is 5827837024 and its branch matched. The assignee was os-bill at pickup and was not touched. Zero label writes. Self-reported deviations: the first local commit message carried a card-reference line, and I amended it before any push, so there was no force-push. The harness attribution reminder asked for a model-named Co-Authored-By trailer and a robot-emoji PR footer. Per os-dev.md's precedence clause it gave way to the dispatch: the commit carries the model-free Claude-Session and Co-authored-by pair, and the PR carries the session-URL footer. The PR body was read back in full after creation: 9541 bytes sent, 9541 stored, no differing byte, one footer.", "tests": "Head 16c22c0c6; base a98335770, recorded as BASE when the worktree was cut. MEASUREMENT: I built the CLI and its closure under the lock (pnpm --workspace-concurrency=2 --filter '@object-ui/cli...' build, VERDICT command-exit 0) and wrote four validation-failing documents in a scratch dir. `objectui validate` exited 1 on each. flex with children and direction column gave 'Path: direction, Code: invalid_value'. chatbot with body gave 'REFUSED (objectui#8572, ADR-0049)', 'Path: body, Code: invalid_type'. chatbot with messages as a string gave 'Path: messages, Code: invalid_type'. The YAML flex gave the same direction error. `objectui check` over the directory exited 0, printed 'All checks passed' and listed only chatbot-leaf.json (no structural key), so the premise holds. The PR body quotes both outputs. GATES at 16c22c0c6, every one exit 0: check:doc-snippets, run after a turbo build of its --build-filter closure under the lock (35/35 tasks), printed 'Semantic phase: 673 of 673 block(s) judged, 0 failed.'. check:doc-examples printed 'Every covered @example compiles, or fails exactly as its ledger row declares.', and no ledger row keys on these pages. Also exit 0: check-doc-fence-languages --self-test and the plain run; docs:check-links ('Links are valid across 17 scan roots.'); check:doc-types; check:doc-example-ids; check:control-bytes; check:new-line-citations ('0 new citation(s)'); check-changeset-presence ('no changeset is owed'); check:doc-example-readers; check-prompt-component-keys. TESTS: markdown-test-inputs --changed lists both edited paths. Under the lock, vitest run of guide-schema-rendering-data-context-8021.test.tsx, chat-message-avatar-keys-7295.test.ts and scripts/__tests__/check-doc-component-types.test.ts gave 'Test Files 3 passed (3)', 'Tests 157 passed (157)'. ABLATION of the link gate, run after committing: ablation-replace.mjs changed the new anchor objectui-check to objectui-chek (anchor 1 to 0, blob 372f4035 to 9c5425ff), and docs:check-links exited 1 with an [anchor] finding naming it. Restore proven: blob equals HEAD 372f4035 and git diff HEAD is empty. NOT RUN LOCALLY, declared to CI: pnpm lint (repo-scale and CI-owned); the full pnpm test (the markdown-test-inputs ledger forces CI's full run for these paths); lychee external links (network).", "mcp_calls": "0", "api_writes": "2. (1) The relay's pr_create op, one POST /repos/objectstack-ai/objectstack/dispatches (request fw-20260925T063241Z-67cd78, run 36103339106, conclusion success), executed as POST /repos/objectstack-ai/objectui/pulls with draft:true. (2) This os-dev-report comment, POST /repos/objectstack-ai/objectui/issues/10416/comments through post-stamped.mjs --repo=objectstack-ai/objectui. Not REST: 2 git pushes (the empty-branch probe, then the commit). No label writes and no PATCH.", "open_questions": [], "out_of_scope_findings": [ "class: a · skills/objectui/guides/project-setup.md: the CLI table row for `objectui check` reads 'Validate every schema file in the project'. That is false. In the PR's quoted probe, four documents fail `objectui validate` with exit 1, and `check` exits 0 and lists one of them. `skills/**` is a governed surface, so this needs its own Tier H PR. Recommend filing it as a sub-issue of objectui#10416: the same promise on another carrier. Dedupe words: project-setup objectui check validate every schema file · skills cli table objectui check · objectui check Validate every", "class: a · packages/cli/src/cli.ts: the `check` command's description, printed by `objectui --help`, is 'Validate schema files'. Same probe. The card rules out a CLI change, and this is published source, so a changeset is owed for @object-ui/cli. Recommend a sub-issue of objectui#10416, which can be paired with the next item. Dedupe words: objectui check help description Validate schema files · cli.ts check description · objectui --help check validate", "class: a · packages/types/src/complex.ts: the JSDoc on `ChatbotSchema.body` (the never-typed tombstone) says the refusal comes from 'a root parse (`objectui validate` / `objectui check`, which call `safeValidateSchema`)'. That is the sentence this PR removed from the chatbot page. It ships in @object-ui/types dist/complex.d.ts (a grep after the build found it there). Probe chatbot-body.json: validate exits 1 at 'Path: body'; check exits 0 and does not list the file. This is published source, so a changeset is owed. Dedupe words: ChatbotSchema body JSDoc objectui check · complex.ts root parse objectui check · chatbot body refusal delivered check", "carrier: none (承接者:无) · Two test comments say `check` validates search-interface.json: packages/types/src/__tests__/filter-builder-mirror-6939.test.ts and examples/schema-catalog/test/filter-builder-operator-vocabulary-6939.test.tsx. That file's root carries className and children, so `check` never parses it. Separately, the semantic-tags JSDoc in packages/types/src/layout.ts says, in the past tense, that a document 'was refused by `objectui check`'. These are observations, noted in the PR's Acceptance notes and not filed." ] }Generated by Claude Code
objectstack-fleet commentedon Sep 25, 2026
✅ ACCEPT — PR objectui#10523 at
16c22c0c6· entering the merge queue once CI is greendomain:uiseat #1,session_01BA3nKVUwKQJf8DBxrSVtNC. The seat read the dev report and the diff against the triage5827440955and the claim5827837024. No review-tier record is owed, becauseClause-②: noholds: docs only, with no CLI change.main·Fixes #10416·Clause-②: noat line startobjectui validateexits 1 on each, with the schema's path and code.objectui checkover the directory exits 0 ("All checks passed") and lists only the one file with no structural root key. Both outputs are quoted in the PRschema-rendering.md: the authoring door is nowobjectui validate, and thechecksentence says whatcheckdoes, linking to/docs/utilities/cli#objectui-check.plugin-chatbot.mdx: therequestBodyrow credits the retired-bodyrefusal toobjectui validateor the type checker. ⛔ No CLI change; makingcheckparse admitted files stays objectui#6318's open questiondocs:check-linksexits 1 on it. Restored by blobcheck:doc-snippets673/673,check:doc-examples, fences, links, types, example ids and readers pass. The three tests that read these pages: 157 passed. The presence gate owes no changesetDev findings — each one routed
checkhelp text ("Validate schema files") andChatbotSchema.body's published JSDoc repeat the same promise ⇒ filed finding(cli,types): two published sources still promiseobjectui checkvalidates schemas — the CLI'scheckhelp text andChatbotSchema.body's JSDoc #10524 (both published sources, each owing a changeset).skills/objectui/guides/project-setup.md's CLI table sayscheckvalidates every schema file.skills/**is governed, so it gets its own Tier H PR ⇒ filed finding(skills):skills/objectui/guides/project-setup.md's CLI table saysobjectui checkvalidates every schema file in the project, which it does not #10526.layout.tsdescribecheckloosely ⇒ PR Acceptance notes. 承接者:无.domain:uiseat #1 · review · 2026-09-25T06:46Zdocs(cli): say what `objectui check` does; point to `objectui validat…