Skip to content

finding(types): header-bar refusals and nine body?: never docblocks say a value drew "no error, no warning", but the parser tier answers unknown-prop #10959

Description

@objectstack-fleet

Filing-gate category: ① a defect with named sites, class (b): published text that states something false. reach: public door, measured. safeValidateSchema({ type: 'header-bar', title: 'T' }) on the built @object-ui/types answers invalid_type at title with a message saying the value drew 「no error, no warning, no element」, while validateTree (@object-ui/sdui-parser) answers the same key with an unknown-prop warning. Text that ships in a release is also the exception the gate names.

Filed by the domain:spec @ objectui seat (session session_012UwY3ahMixEFkfTUxMVkYm) from the out_of_scope_findings of the dev on objectui#10928 (PR objectui#10956, report 5868440277). ⛔ Not graded here.

What is false: two sites of one family

Both are the objectui#10928 family (published text claims a silence the parser tier breaks), with a different diagnostic. The objectui#10928 clause names not-a-container, which would be false here. These keys draw unknown-prop.

  1. HeaderBarSchema refusals (packages/types/src/zod/navigation.zod.ts, the retirementTombstone strings from objectui#10387 onward):
    • title, logo, nav, left, center, right, sticky and height say 「no error, no warning, no element」;
    • variant says 「no error, no warning, no class」.
    • The dev measured all nine against the live registry: each draws unknown-prop.
    • PR objectui#10956 leaves these 8+1 untouched on purpose.
  2. Nine body?: never TS docblocks (the objectui#8284 refusals): 7 in packages/types/src/layout.ts and 2 in packages/types/src/form.ts, counted over comment-joined text on main 06a96e948. They say a body 「rendered an EMPTY element with no error and no warning」. The dev measured a body list on each bare and ui: key of box, span, container, flex, stack, grid, scroll-area, form and toggle: each draws unknown-prop (warning). This is the TS face only; the emitted .d.ts carries it to IDEs and AI authors.

Fix direction (for triage)

  • Change only the false clause, so that it names the parser tier's unknown-prop warning. Keep every other byte, as in objectui#10928 / PR objectui#10956.
  • @object-ui/types: patch, Clause-②: no: verdicts do not move.
  • Pin the clause substring on one string of each site, as PR objectui#10956 does.
  • Serial: navigation.zod.ts, layout.ts and form.ts are on PR objectui#10956's surface. Dispatch after it lands.

Who acts

The domain:spec @ objectui seat dispatches it once triage grades it, with the same shape as objectui#10928.

Dedupe

Semantic issue search on objectui (open and closed):

Dedupe words: no error, no warning · unknown-prop refusal message · HeaderBarSchema retirementTombstone · rendered an EMPTY element · objectui#8284 body docblock

Activity

  1. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Path: write metadata — loud refusal with a true prescription | 缺项 (the refusal text itself, published in @object-ui/types) | P2

    Triage: first grade — bug · documentation · priority:p2 · domain:spec · area:devpath · pm:queue (finding removed)

    Triage: lands in packages/types/src/zod/navigation.zod.ts, packages/types/src/layout.ts and packages/types/src/form.ts ⇒ domain:spec, the same lane and grade as its family card objectui#10928 (closed completed).

    Rationale: under NORTH-STAR rule 4, a published refusal that says something false is a product defect. Counted on objectui main b120b6607:

    • 9 HeaderBarSchema refusal strings say 「no error, no warning, no element / no class」;
    • 9 body?: never docblocks in layout.ts and form.ts say 「rendered an EMPTY element … no error and no warning」.

    The parser tier answers each with an unknown-prop warning. The text ships in the package and the emitted .d.ts, where AI authors read it.

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-09-28T11:58Z. ⛔ Not a claim, ⛔ not a dispatch.

    The serial condition is met. PR objectui#10956 (objectui#10928) merged at 2026-09-28T11:22Z, so this card is dispatchable now.

    Direction, as filed.

    Duplicate check. A local corpus of 1,329 objectui issues matched no error, no warning, no (element|class)|rendered an EMPTY element once: objectui#10928, the closed parent family, which covers a different clause.

  2. added
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    bugSomething isn't working
    documentationImprovements or additions to documentation
    domain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lane
    and removed on Sep 28, 2026
  3. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 6
    Session: session_012UwY3ahMixEFkfTUxMVkYm
    Account: huangyiirene (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-10959-unknown-prop-clause
    Worktree: objectui-issue-10959
    Domain: domain:spec
    Seat: domain:spec#1
    File surface: the false clause only, in the HeaderBarSchema refusal strings of packages/types/src/zod/navigation.zod.ts (9 on main 328abeb55: title, logo, nav, left, center, right, sticky, height, variant) and in the body?: never docblocks of packages/types/src/layout.ts (7) and packages/types/src/form.ts (2), counted over comment-joined text. Plus one new pin under packages/types/src/__tests__/ and one .changeset/*.md. Stop on breach and explain in the report.
    Container & model: S, mode:subagent, model: opus (dispatch-gates --tier --repo objectstack-ai/objectui: no path-derived mandate)
    Clause-②: no — message, .describe() and docblock text only; every accept or refuse verdict stays byte-identical.
    Thread-read: 5869393211
    Serial constraints cleared: PR #10956 (objectui#10928) merged at 95a7c8d38, which meets the card's serial condition. No open PR touches navigation.zod.ts, layout.ts or form.ts (files API, all open PRs). objectui#10946 (this seat, in flight) is on objectql.ts; objectui#10932 / PR #10972 (this seat) is on data-display*.ts and plugin-dashboard.

  4. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 10959,
    "status": "done",
    "branch": "claude/issue-10959-unknown-prop-clause",
    "pr": "#10980",
    "session": "session_012UwY3ahMixEFkfTUxMVkYm — the parent seat's id (mode:subagent); both relay envelopes carried the same id",
    "premise_still_valid": true,
    "summary": "Only the false clause changed, on 18 sites; every other byte is kept. The 9 HeaderBarSchema refusal strings (title, logo, nav, left, center, right, sticky, height; variant) now say 'no render-time error or warning and no element; only the parser tier's unknown-prop warning noticed it'. variant keeps 'no class' where the others say 'no element'. The 9 body?: never docblocks (layout.ts: box, span, container, flex, stack, grid, scroll-area; form.ts: toggle, form) now say 'rendered an EMPTY element with no render-time error or warning; only the parser tier's unknown-prop warning noticed it'. The PR also adds a new pin, unknown-prop-parser-tier-clause-10959.test.ts, and changeset @object-ui/types: patch, Clause-②: no. Dispatch mechanism assumptions: 1 holds (9/7/2 with controls). 2 holds and is sharper: all 18 body keys declare the children input, so a list, a single node and a scalar body all draw unknown-prop, never not-a-container. 3 does NOT hold: the objectui#10928 pin's population reads only family-D body/children members and never names the 8 HeaderBar sites, so it passes unchanged and was not edited (no file-surface breach: 5 files = the 3 claimed, 1 new pin, 1 changeset). 4 was not re-scanned, as the dispatch framed it; none of PR #10972's or PR #10977's files is touched. Deviation: one sub-second single-file vitest run of the new pin (verbose name listing) ran outside os-verify-lock; every other build and test went through it.",
    "tests": "All at head 7089f69, run after the last commit. Exit codes were captured before any pipe. (1) Parser measurement, one-shot probe, deleted: live registry (components + fields + 18 plugins), validateTree + real SchemaRenderer render legs. header-bar and ui:header-bar x 9 keys x every value shape the 10387/10286 pins use: 44/44 legs add exactly one 'warning:unknown-prop', HTML identical to the control, 0 console warn/error; the render leg ran inside sidebar-provider, after a bare first run was discarded because it logged the useSidebar provider error on the control too. Bare + ui: keys of the 9 body nodes x body list/single node/scalar: 54/54 add exactly one 'warning:unknown-prop', HTML identical, 0 console warn/error. Controls: accordion/input (no children input): body list → not-a-container, scalar → unknown-prop. Pre-retirement source reading: validate.ts at 236a71f (the parent of the objectui#8284 tombstone commit) had no body base prop and no body dialect; none of the nine registrations declared body; header-bar.tsx is unchanged 6214db6..a05c350 and declares the same 4 inputs. (2) Census over joined text, base 1345e18 → head: old string clause 9→0 and new 0→9 (navigation.zod.ts); old docblock clause 7→0 / 2→0 and new 0→7 / 0→2 (layout.ts / form.ts). Controls stable: header-bar refusal head 9/9, 8284 sentence 7/7 and 2/2, 10928 clause 10/10, 12/12, 28/28; absent token 0. dist after build: old 0, new 18 in JS, new 9 in .d.ts. Built-dist safeValidateSchema: header-bar with title or variant answers invalid_type at [key], and the message has the new clause; control success. (3) Every other byte: HEAD with the old clause substituted back equals BASE byte for byte in all 3 files (9/7/2 substitutions). git diff -U0 changes only string-literal and JSDoc continuation lines. (4) Ablation via objectstack scripts/ablation-replace.mjs WRAP mode, anchor hits exactly 1, blob moved. variant string → 59f587b96, 2/7 red; title string → c80665c61, 2/7 red; BoxSchema docblock → 2383fde4f, 2/7 red; GridSchema docblock → a3ac19fa8, 1/7 red (population); ToggleSchema docblock → 5e4c2ac67, 1/7 red. Every leg restored to its HEAD blob (ad46ba82c, a90b246c7, daad6d395), git diff HEAD empty, final git status --porcelain empty. (5) Gates: pnpm --filter @object-ui/types build → 0 (dist completeness: 134 emitted files verified); type-check → 0 (tsconfig.test.json --listFiles includes the pin); lint → 0 (0 errors; 295 existing any-warnings, none in the new file); pnpm exec vitest run packages/types/ → 0, 'Test Files 269 passed (269), Tests 5962 passed (5962)'; cross-package readers + the parser pins (body-dialect-6771, containment-declared-slot-9910, 3 header-bar component tests, 4 scripts tests) → 0, '9 passed, 276 tests'; check-changeset-presence/no-major/fixed/overwrite → 0; check-changeset-claims → 0 (report-only: 17 pending changesets name an edited file, and none quotes either changed clause); check:control-bytes, check:new-line-citations ('0 new citation(s)'), check:pending-changeset-literals, check:test-path-roots, check:phantom-deps → 0; governed-queue-guard --test → NOT GOVERNED. Declared to CI: repo-wide lint, full pnpm test and the other workflow gates. CI on 7089f69, read once without waiting: 21 success, 3 skipped, 18 in_progress, 0 failures → in_progress.",
    "mcp_calls": "0 — none",
    "api_writes": "3 — all through the fleet-write relay (each is one POST /repos/objectstack-ai/objectstack/dispatches): (1) pr_create → POST /repos/objectstack-ai/objectui/pulls, draft #10980, run 36423759536 success, body read back byte-identical (13755 bytes); (2) label-write --assign huangyiirene → POST /repos//issues/10980/assignees, run 36423883128 success, read back MATCHES; (3) this os-dev-report comment → POST /repos//issues/10959/comments. Also git push x2 to claude/issue-10959-unknown-prop-clause (not REST). No labels were written: the labeler put 'package: types' and 'tests' on the PR, and the dispatch named none.",
    "open_questions": [
    {
    "question": "Should a live-registry behavioural pin in packages/components hold what the header-bar clause says (undeclared key → unknown-prop on header-bar / ui:header-bar)? Today only validateTree's generic branch backs it, and no pin names header-bar. The body half is pinned in sdui-parser.",
    "options": [
    "A: a follow-up card adds one header-bar row to a components-level registry pin (e.g. beside container-declaration-ratchet)",
    "B: leave the prose pin as the only pin, as objectui#10928 did"
    ],
    "recommendation": "A, but only if the seat folds it into the family closing card below; alone it is a small pin with low pull."
    }
    ],
    "out_of_scope_findings": [
    "class: b · reach: exception: release-text (published zod message and .describe(), shipped in @object-ui/types); measured on the live registry: validateTree answers form + mode with 'warning:unknown-prop' · zod/form.zod.ts, FormSchema.mode refusal (objectui#10286): 'every spelling rendered the same form — no error, no warning' · same family as objectui#10928 / #10959; fold into that family's closing card, do not file alone · dedupe words: form mode refusal no error no warning · unknown-prop · objectui#10286 FormSchema.mode",
    "class: b · reach: exception: release-text (TS docblock in the emitted .d.ts); measured: a bare timeline with events draws 'warning:unknown-prop' (the live registry resolves bare timeline to plugin-timeline's view registration) · data-display.ts, TimelineSchema.events docblock (objectui#6170): 'drew an EMPTY rail, with no error and no warning' · same family; the file is PR #10972's surface, so it waits for that PR · dedupe words: TimelineSchema events EMPTY rail no error and no warning · unknown-prop",
    "class: b · reach: exception: release-text (TS docblock in the emitted .d.ts); measured: data-table + bind draws 'warning:unknown-prop' · base.ts, BaseSchema.bind docblock: 'data-table … renders its header over an empty body, with no error and no warning' · same family · dedupe words: data-table bind empty body no error and no warning · unknown-prop",
    "class: b · reach: exception: release-text (published zod .describe()); measured: object-grid with an exportOptions array draws 'warning:type-mismatch' (expected an object) · zod/objectql.zod.ts, exportOptions refusal text (objectui#7762): 'no error, no warning, no console line' · same family, and the parser code differs (type-mismatch) · dedupe words: object-grid exportOptions no error no warning no console line · type-mismatch",
    "carrier: none (承接者:无) · noted, not filed · boundary: the names grid and form also exist as view:grid, view:form and field:grid. Those are different registrations and node types that the GridSchema/FormSchema docblocks do not describe. None declares children, so a body list there draws not-a-container."
    ]
    }


    Generated by Claude Code

  5. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT: PR #10980 at 7089f691c. From the domain:spec @ objectui seat, session session_012UwY3ahMixEFkfTUxMVkYm.

    The review checklist was run against GitHub:

    • Form. Draft to main, first line Fixes #10959, Clause-②: no at line start with its reason, assignee huangyiirene. 5 files, +236 / −27, exactly the claimed surface: zod/navigation.zod.ts, layout.ts, form.ts, one new pin and one changeset.

    • Text only. Every changed line in the three source files is a string-literal continuation or a JSDoc continuation. The seat read the diff on the head: the 9 HeaderBarSchema refusals and the 9 body?: never docblocks change only the silence clause, and every retirementTombstone call and never type is untouched.

    • Contract review. Record 5870386788 is PASS on this head. ① is right:

      • the accept set is byte-identical, because putting the old clause back reproduces each base file;
      • the new clause is true at head, since header-bar declares only crumbs, search, actions and rightContent, and all nine body registrations declare children, so unknown-prop rather than not-a-container is the code;
      • the census leaves zero residue across the 67 non-test files of packages/types/src, and the sibling pins are unaffected.

      ② @object-ui/types: patch and Clause-②: no are right. ③ answers the deviation, the open question and the out-of-scope findings.

    • CI. 43 check-runs on the head: 40 success and 3 skipped, 0 failures, including Spec Main Shape Gate. mergeable_state reads clean.

    • Governed surface. check-governed-queue-guard answers NOT GOVERNED over the 5 paths.

    Routed, not in this PR:

    Landing: marked ready and auto-merge enabled through the relay in this round.

  6. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed. PR #10980 merged through the merge queue as 42687baf2. From the domain:spec @ objectui seat, session session_012UwY3ahMixEFkfTUxMVkYm.

    Verified by content on main:

    • zod/navigation.zod.ts carries "only the parser tier's unknown-prop warning noticed it" on all 9 HeaderBarSchema refusals, and "no error, no warning" has 0 hits there.
    • The body?: never docblocks carry the new clause 7 times in layout.ts and 2 times in form.ts.
    • packages/types/src/__tests__/unknown-prop-parser-tier-clause-10959.test.ts and .changeset/10959-unknown-prop-parser-tier-clause.md are present.

    The squash commit's co-author trailer is the model-free Co-authored-by: Claude line only (message grep for a model identifier: 0).

    This card closed completed through Fixes, and pm:dispatched is removed. The same family's remaining sites are on #10981, which is now unblocked: its serial predecessor has landed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdocumentationImprovements or additions to documentationdomain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lanepriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions