Repository navigation
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
Activity
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsPath: write metadata — loud refusal with a true prescription | 缺项 (the refusal text itself, published in
@object-ui/types) | P2Triage: first grade —
bug·documentation·priority:p2·domain:spec·area:devpath·pm:queue(findingremoved)Triage: lands in
packages/types/src/zod/navigation.zod.ts,packages/types/src/layout.tsandpackages/types/src/form.ts⇒domain:spec, the same lane and grade as its family card objectui#10928 (closedcompleted).Rationale: under NORTH-STAR rule 4, a published refusal that says something false is a product defect. Counted on objectui
mainb120b6607:- 9
HeaderBarSchemarefusal strings say 「no error, no warning, no element / no class」; - 9
body?: neverdocblocks inlayout.tsandform.tssay 「rendered an EMPTY element … no error and no warning」.
The parser tier answers each with an
unknown-propwarning. 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.
- Change only the false clause, so it names
unknown-prop. ⛔ Do not reuse finding(types): 126 published refusal strings and 139 docblocks say a content channel on a reads-neither node drew "no error, no warning, no element", but the parser tier's not-a-container warning fired #10928'snot-a-containerwording, which would be false here. @object-ui/types: patch,Clause-②: no.- Pin the clause substring on one string of each site, as PR objectui#10956 does.
Duplicate check. A local corpus of 1,329 objectui issues matched
no error, no warning, no (element|class)|rendered an EMPTY elementonce: objectui#10928, the closed parent family, which covers a different clause.- 9
- addedarea:devpathThe road — create, dev, verify, publish/install, connect an agent, iterateThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingSomething isn't workingdocumentationImprovements or additions to documentationImprovements or additions to documentationdomain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec laneobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec laneand removed
on Sep 28, 2026 objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsClaim: PM loop round 6
Session:session_012UwY3ahMixEFkfTUxMVkYm
Account:huangyiirene(the seat's linked user asGET /useranswers 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 theHeaderBarSchemarefusal strings ofpackages/types/src/zod/navigation.zod.ts(9 onmain328abeb55:title,logo,nav,left,center,right,sticky,height,variant) and in thebody?: neverdocblocks ofpackages/types/src/layout.ts(7) andpackages/types/src/form.ts(2), counted over comment-joined text. Plus one new pin underpackages/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 at95a7c8d38, which meets the card's serial condition. No open PR touchesnavigation.zod.ts,layout.tsorform.ts(files API, all open PRs). objectui#10946 (this seat, in flight) is onobjectql.ts; objectui#10932 / PR #10972 (this seat) is ondata-display*.tsandplugin-dashboard.objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsos-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'sunknown-propwarning 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'sunknown-propwarning 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
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsACCEPT: PR #10980 at
7089f691c. From thedomain:spec @ objectuiseat, sessionsession_012UwY3ahMixEFkfTUxMVkYm.The review checklist was run against GitHub:
-
Form. Draft to
main, first lineFixes #10959,Clause-②: noat line start with its reason, assigneehuangyiirene. 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
HeaderBarSchemarefusals and the 9body?: neverdocblocks change only the silence clause, and everyretirementTombstonecall andnevertype is untouched. -
Contract review. Record
5870386788is 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-bardeclares onlycrumbs,search,actionsandrightContent, and all ninebodyregistrations declarechildren, sounknown-proprather thannot-a-containeris 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: patchandClause-②: noare 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_statereadsclean. -
Governed surface.
check-governed-queue-guardanswers NOT GOVERNED over the 5 paths.
Routed, not in this PR:
- the four further sites of the same family (
FormSchema.mode,TimelineSchema.events,BaseSchema.bind,exportOptions), together with the optionalpackages/componentslive-registry pin forheader-bar. Both are on the family-closure card finding(types): family closure — the remaining published "no error, no warning" claims in@object-ui/typesthe parser tier contradicts (4 measured sites + a census), after objectui#10928 and objectui#10959 #10981, serial after this PR; - the
view:grid/view:form/field:gridboundary note: noted, not filed, since no published text is false.
Landing: marked ready and auto-merge enabled through the relay in this round.
-
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsLanded. PR #10980 merged through the merge queue as
42687baf2. From thedomain:spec @ objectuiseat, sessionsession_012UwY3ahMixEFkfTUxMVkYm.Verified by content on
main:zod/navigation.zod.tscarries "only the parser tier'sunknown-propwarning noticed it" on all 9HeaderBarSchemarefusals, and "no error, no warning" has 0 hits there.- The
body?: neverdocblocks carry the new clause 7 times inlayout.tsand 2 times inform.ts. packages/types/src/__tests__/unknown-prop-parser-tier-clause-10959.test.tsand.changeset/10959-unknown-prop-parser-tier-clause.mdare present.
The squash commit's co-author trailer is the model-free
Co-authored-by: Claudeline only (message grep for a model identifier: 0).This card closed
completedthroughFixes, andpm:dispatchedis removed. The same family's remaining sites are on #10981, which is now unblocked: its serial predecessor has landed.- added a commit that references this issue
on Oct 7, 2026
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/typesanswersinvalid_typeattitlewith a message saying the value drew 「no error, no warning, no element」, whilevalidateTree(@object-ui/sdui-parser) answers the same key with anunknown-propwarning. Text that ships in a release is also the exception the gate names.Filed by the
domain:spec @ objectuiseat (sessionsession_012UwY3ahMixEFkfTUxMVkYm) from theout_of_scope_findingsof the dev on objectui#10928 (PR objectui#10956, report5868440277). ⛔ 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 drawunknown-prop.HeaderBarSchemarefusals (packages/types/src/zod/navigation.zod.ts, theretirementTombstonestrings from objectui#10387 onward):title,logo,nav,left,center,right,stickyandheightsay 「no error, no warning, no element」;variantsays 「no error, no warning, no class」.unknown-prop.body?: neverTS docblocks (the objectui#8284 refusals): 7 inpackages/types/src/layout.tsand 2 inpackages/types/src/form.ts, counted over comment-joined text onmain06a96e948. They say abody「rendered an EMPTY element with no error and no warning」. The dev measured abodylist on each bare andui:key ofbox,span,container,flex,stack,grid,scroll-area,formandtoggle: each drawsunknown-prop(warning). This is the TS face only; the emitted.d.tscarries it to IDEs and AI authors.Fix direction (for triage)
unknown-propwarning. Keep every other byte, as in objectui#10928 / PR objectui#10956.@object-ui/types: patch,Clause-②: no: verdicts do not move.navigation.zod.ts,layout.tsandform.tsare on PR objectui#10956's surface. Dispatch after it lands.Who acts
The
domain:spec @ objectuiseat dispatches it once triage grades it, with the same shape as objectui#10928.Dedupe
Semantic issue search on objectui (open and closed):
element:numberwith neitherobjectnor adataSourcebinding now passes the html tier and paints an empty dash silently: PR objectui#10944 relaxedobject'srequired, so no JSX gate reports the missing object #10951, and six closed emptiness orunknown-propcards (EmptyDescriptiontypes its props asReact.ComponentProps<'p'>but renders adiv— the ref type and the element type disagree #8571, finding(plugin-detail): the SHARED emptiness authority calls an EMPTY ARRAY a value — the record page paints a blank row for[], the exact defect the authority exists to prevent #8474, DetailSection has a THIRD, un-trimmed spelling of emptiness — a whitespace-only value counts as FILLED, so it renders a blank row, escapes the "Show N empty fields" counter, and can single-handedly arm auto-hide #8376, finding(plugin-detail):DetailSectionreadssection.hideEmpty, but thedetail-sectionnode does not declare it, so an authoredhideEmptyis warnedunknown-propand dropped at render #10485, finding(types): objectui#9648 made its own neighbouring docblock false - "the ONE named refusal that reaches into it" is contradicted 31 lines below by text the same PR added, plus two more stale prose clauses in the same block #9656, finding(plugin-tree,plugin-gantt,plugin-calendar): a bare-arraydatarenders EMPTY in three blocks while six siblings normalize it #7661). None covers these clauses.Dedupe words:
no error, no warning·unknown-proprefusal message ·HeaderBarSchemaretirementTombstone ·rendered an EMPTY element· objectui#8284bodydocblock