fix(types): the last four "no error, no warning" clauses name what the parser tier answers (objectui#10981) - #11006
Conversation
…e parser tier answers (objectui#10981) Closes the family of objectui#10928 and objectui#10959. Only the false clause changes; every accept or refuse verdict is byte-identical. - FormSchema.mode refusal (objectui#10286): names `unknown-prop`. - TimelineSchema.events docblock (objectui#6170): names `unknown-prop`. - BaseSchema.bind docblock (data-table): names the render-time console warning of objectui#6575 and the parser tier's `unknown-prop`. - exportOptions note (objectui#7762): names `type-mismatch`, the code the object-typed registration input answers an array with. New pin: silence-clause-parser-tier-closure-10981.test.ts, one string per site plus a closure walk over packages/types/src. Claude-Session: https://claude.ai/code/session_012UwY3ahMixEFkfTUxMVkYm Co-authored-by: Claude <noreply@anthropic.com>
…he live registry (objectui#10981) The objectui#10959 clause says only the parser tier's `unknown-prop` warning noticed a refused `header-bar` key. The types pin can hold the prose only; this holds the behaviour where the registry lives, on `header-bar` and `ui:header-bar`, for every refused key and value shape. Claude-Session: https://claude.ai/code/session_012UwY3ahMixEFkfTUxMVkYm Co-authored-by: Claude <noreply@anthropic.com>
…osure Brings in PR #10986 (objectui#10935), which touched zod/objectql.zod.ts away from the `exportOptions` note this branch edits. Claude-Session: https://claude.ai/code/session_012UwY3ahMixEFkfTUxMVkYm Co-authored-by: Claude <noreply@anthropic.com>
|
changeset-claim-re-read
|
❌ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. Which half objected:
📦 Bundle Size Report
Size Limits
|
|
No fix exists yet. objectui#10996 names the two remedies the gate script documents (re-pin or shrink), and it is triage's and the owning lane's to execute. This seat does not widen this PR with it. Once a fix lands on |
Contract reviewServed-tier: Inputs: card objectui#10981 (body; triage 5872673096; claim 5873069682; os-dev-report 5873853507), PR #11006 (body, the 7-file list, ① Derived judgmentsGates on the head. 43 check-runs, all Each clause against the code it describes (registrations read on
② Semver level
③ Boundary flagsDev report 5873853507.
(a) (b) The parser's Bearing on this PR's (c) Three items noted, not filed: the old words in three test headers ( Landing note for the seat. The head is not green: Implemented-by: VERDICT: PASS |
…osure Picks up PR #11018 (objectui#10996), which re-pinned the eager-closure baseline and ceiling that turned main's own Bundle Analysis red. Claude-Session: https://claude.ai/code/session_012UwY3ahMixEFkfTUxMVkYm Co-authored-by: Claude <noreply@anthropic.com>
|
Regen-provenance: 5874097593 · ebd156e → 6230156 · git merge origin/main (6c57c77) → (empty) From the
|
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
…osure Picks up PR #11020 (objectui#9256), whose metric-card refusal texts the merge queue ran this branch's closure walk against. Claude-Session: https://claude.ai/code/session_012UwY3ahMixEFkfTUxMVkYm Co-authored-by: Claude <noreply@anthropic.com>
… the next sentence (objectui#10981) The walk required "the parser tier's" within 80 characters after every "no … error or warning" phrasing. objectui#9256's `metric-card` refusal (PR #11020) names the parser tier correctly, but in the sentence after, to record why it stays silent in a widget slot. So the merge queue went red on a true text. The bound is now the end of the sentence after the phrasing. `MAX_WINDOW` only guards a text with no sentence end. Claude-Session: https://claude.ai/code/session_012UwY3ahMixEFkfTUxMVkYm Co-authored-by: Claude <noreply@anthropic.com>
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
Contract reviewServed-tier: Inputs: card objectui#10981 (body; triage 5872673096; claim 5873069682; os-dev-report 5873853507; ACCEPT 5874123780; the two addenda 5877230704 and 5877836304), PR #11006 (body, the 7-file list, its 7 thread comments including record 5874097593, stand-down 5873980420, provenance 5877260576 and the head's own Console Performance Budget comment 5877870785), the 43 check-runs on the head (re-read at 2026-09-28T20:41Z, none ① Derived judgmentsWhat moved since the PASS on The dequeue, verified. Run 36476318704 is (a) The new walk bound, read.
(b) The dev's ablation record (addendum 5877836304), read and not re-run. Its shape is what the pin predicts: nine tests (two (c) The two
(d) ① ② ③ of record 5874097593 on this head. ① The four clauses: the six carrying files are patch-id-identical, the registrations and the parser they describe did not move on Gates on the head. 43 check-runs, all ② Semver level
③ Boundary flags
Landing note for the seat. Every check on the head is green and this record is PASS on it. The PR is out of draft with no auto-merge armed; the ordinary path applies (dispatched PR: the dispatching seat readies and queues). Implemented-by: VERDICT: PASS |
Fixes #10981
Clause-②: no — message,
.describe()and docblock text only; every accept or refuse verdict stays byte-identical.Implemented by the
os-devagent dispatched from thedomain:spec @ objectuiseat, sessionhttps://claude.ai/code/session_012UwY3ahMixEFkfTUxMVkYm(mode:subagent). Base4b742f41d. PR #10986 landed onzod/objectql.zod.tsmeanwhile, somain665025908was merged in before the final push. Headebd156ef5.What changed
Only the false clause changes, on four sites. Each clause names the code the parser tier answers for that key and value shape, as measured on the live registry (next section).
zod/form.zod.ts, theFormSchema.moderefusal (objectui#10286).describe(), one string throughretirementTombstoneunknown-propwarning noticed it"data-display.ts, theTimelineSchema.eventsdocblock (objectui#6170).d.tsunknown-propwarning noticed it"base.ts, thedata-tablesentence in theBaseSchema.binddocblock.d.ts[ObjectUI] DataTable bind:, objectui#6575) and the parser tier'sunknown-propwarning both name it"zod/objectql.zod.ts, the note onOBJECT_GRID_EXPORT_OPTIONS_GUIDANCE(objectui#7762).d.tstype-mismatchwarning noticed it)"base.tshas its own wording. That site was not silent at render either.data-tablehas logged[ObjectUI] DataTable bind:for an authoredbindsince objectui#6575 (aff3d7aef, 2026-08-28). The docblock was written a day later (99a3c2db6, 2026-08-29).merge-base --is-ancestor aff3d7aef 99a3c2db6answers 0, with the control leg94d4876dfalso answering 0. So "only the parser tier noticed it" would be false there too.exportOptionsnamestype-mismatch. Theobject-gridregistration declaresexportOptionsastype: 'object'. SocheckTypeanswers an array, not the undeclared-key branch.packages/types/src/__tests__/silence-clause-parser-tier-closure-10981.test.ts.packages/components/src/renderers/__tests__/header-bar-unknown-prop-parser-tier-10981.test.tsx, a new file besidecontainer-declaration-ratchet..changeset/10981-silence-clause-parser-tier-closure.md,@object-ui/types: patch.The parser tier, measured before each clause was written
Instrument. The same as PR #10980: a one-shot probe, deleted and never committed, under
packages/components/src/renderers/__tests__/.fieldsand 18 of the 19plugin-*packages (all butplugin-designer).plugin-treehas no vitest alias, so it came in by relative source path.manifestFromConfigs, the waycontainer-declaration-ratchet.test.tsxbuilds it.validateTreeon a control and on the control plus the one key, and reports only the diagnostics that key added.SchemaRenderer, insidePredicateScopeProviderandSchemaRendererProviderwith a stub data source, all insideact.console.warnandconsole.errorwere spied, and the HTML was compared with the control's.FormSchema.modeform,ui:form. Bareformresolves toui:form;view:formisskipFallbackedit,read,disabled,create,view(the objectui#10286 pin's set)unknown-proponmode, 10 of 10 legsmodeattribute on the form elementTimelineSchema.eventstimeline(resolves toview:timeline),view:timeline,plugin-timeline:timeline(theTimelineRendererregistrationTimelineSchemadescribes)[];itemspluseventsunknown-proponevents, 7 of 7BaseSchema.bindondata-tabledata-table,ui:data-tablebind: 'users'andbind: 'app.settings.users', each withdataabsent and withdata: []unknown-proponbind, 8 of 8[ObjectUI] DataTable bind: … is ignoredexportOptionsobject-grid,plugin-grid:object-grid['csv', 'xlsx'],['csv'],[]type-mismatch("expected an object"), 6 of 6{ formats: ['csv', 'json'] }, the default an array loses to. Byte-identical HTML, the export control and the rows present in both, 0 warnings, 0 errorsControls.
formwith an invented key drawsunknown-prop.view:formwithmode: 'edit'draws nothing, because that registration declaresmode.object-grid: anexportOptionsobject draws nothing, a string drawstype-mismatch, and an invented key drawsunknown-prop. So the probe tells the two codes apart on one node.accordionwith abodylist drawsnot-a-container, the third code.dataabsent, thedata-tablecontrol already carriesmissing-required-propondata; the table above counts only whatbindadds.react-i18nextinitialisation warning. No variant did.The same answer before each retirement (source reading, not executed). The
mode,eventsandexportOptionssentences are past tense.FormSchema.mode, ata05c35063^, the parent of the objectui#10286 commit: theui:formregistration declared the same 13 inputs as today, none namedmode.plugin-form'sformwasnamespace: 'view', skipFallback: true.validate.tshad the same base-prop set, withoutmode, and oneunknown-propbranch.TimelineSchema.events, at195052fff^, the parent of the objectui#6170 tombstone commit: neitherplugin-timeline:timelinenorview:timelinedeclaredevents. Agit log -Gfor aneventsinput name overpackagesfinds no registration that ever declared one, back to the shallow boundary (2026-07-20).exportOptions, atf08d1a86a^, the parent of the objectui#7762 refusal:GRID_QUERY_INPUTSdeclaredexportOptionsastype: 'object'. It had done so since375efb402(2026-08-17), and objectui#7762 was filed on 2026-09-05.checkTypegave a single non-enum armtype-mismatch, as today.BaseSchema.bindis present tense, measured today.git fetch --deepen=4000, shallow boundary 2026-07-20).Census over joined text (the closure nail)
Instrument. A one-shot script. It enumerates the non-test
.tsfiles ofpackages/types/srcfrom the ref withgit ls-treeand reads each one from the ref. It joins JSDoc and line-comment continuations and'…' + '…'concatenations, and unescapes quotes. Then it counts:4b742f41d665025908ebd156ef5base.ts,data-display.ts). F is the fourth site again.objectql.ts,zod/objectql.zod.ts, objectui#6475). That is a deprecation window, not a silence claim, so they stay.Every other byte, and only comment and string lines
4b742f41dand again against665025908.eba1c495f,4dfce4ac6,b1abfe909ande2c561734are the base blobs of the four files.git diff -U0over the four files: every changed line is a*JSDoc line or a+ '…'string-literal line.bindpins pass unchanged; they are in the fulltypesrun.dist, afterpnpm --filter @object-ui/types buildat head:modeclause:zod/form.zod.js,zod/index.zod.js;eventsclause:data-display.d.ts; thebindclause:base.d.ts;exportOptionsnote:zod/objectql.zod.js,zod/index.zod.js(the emitted JS keeps comments).Reverse verification (ablation), after the fix was committed
Instrument. objectstack's
scripts/ablation-replace.mjsin WRAP mode, run from this worktree.git diff HEADis empty.../zod/*source and reads the files from disk. The components pin resolves the registry from source through the vitest aliases. So no build sits between a mutation and a run.FormSchema.modemodearm, the spelling walk, the pairs walkTimelineSchema.eventseventsdocblock, the pairs walk, the parser-tier walkBaseSchema.bindbinddocblock, both walksexportOptionsnoteunknown-propin place oftype-mismatchzod/ai.zod.ts, which the pin does not name: an objectui#10928 clause loses its parser-tier halfheader-bar.tsxstarts declaringtitle(components pin)3a595a747,33e3a4770,a12a28cf1,4e75a80cftwice,a40e67ff6,ce3850854) with an emptygit diff HEAD. After the run,git status --porcelainwas empty.header-barattempt was a no-op. Its replacement contained the anchor, so the tool refused (anchor count 1 to 1) and ran no test. It was re-run with a replacement that does not contain the anchor. The table shows the second run.The pins
silence-clause-parser-tier-closure-10981.test.ts. It follows the house style of PR #10956 and PR #10980.@object-ui/typesimports no workspace package, so it holds the prose.FormSchema.modeis read through its refusal: codeinvalid_typeand path['mode']first, then the clause. The walk covers every spelling of the objectui#10286 pin, and the.describe()text.exportOptions. The bare array is refused withinvalid_typeat['exportOptions'], with exactly the.describe()string. Then the note aboveOBJECT_GRID_EXPORT_OPTIONS_GUIDANCEmust carry the clause and name nounknown-prop.TimelineSchema.eventsandBaseSchema.binddocblocks..tsfile ofpackages/types/srcfrom disk, with the root taken from the pin's ownimport.meta.url.header-bar-unknown-prop-parser-tier-10981.test.tsx. It answers the open question from PR #10956 and PR #10980, on the live components registry.header-barandui:header-bar, each of the 9 refused keys draws exactly oneunknown-propnaming the key. This holds in every value shape the objectui#10387 and objectui#10286 pins refuse.crumbsdeclared, and no refused key declared.Dispatch assumptions, checked
4b742f41dand on665025908. The census was widened to patterns A–H above, with controls.formwithmodedrawsunknown-prop: for all five spellings, onformandui:form.timelinewitheventsdrawsunknown-prop. The bare key resolves toview:timeline. The docblock describesTimelineRenderer, which is registered asplugin-timeline:timeline(skipFallback). That registration also answersunknown-prop, so the clause is true for the node the docblock names and for the bare key.data-tablewithbinddrawsunknown-prop. But "only the parser tier noticed it" would be false there, because a render-time console warning fires too (objectui#6575). The site names both.object-gridwith anexportOptionsarray drawstype-mismatch: for three array shapes, on both keys.8aa68b159) onzod/objectql.zod.ts.main665025908was merged in before the final push, with no conflict. The note edited here is away from that hunk. PR feat(types)!: ObjectMapConfigSchema is strict, so objectui validate refuses an undeclared map key (objectui#5157) #10997 had not landed at665025908.Gates, head
ebd156ef5All ran after the merge commit. Exit codes were captured before any pipe.
pnpm --filter @object-ui/types build→ 0. Itscheck-dist-completenessverified 134 emitted files.pnpm --filter @object-ui/types type-check→ 0.tsc -p tsconfig.test.json --listFilesincludes the new pin.pnpm --filter @object-ui/types lint→ 0, with 0 errors. The 295 warnings are existingno-explicit-anyones; none is in the new file.pnpm exec vitest run packages/types/→ 0: 272 files and 5993 tests passed.types→ 0: 27 files and 931 tests passed.packages/types/src:body-dialect-producer-scan,changeset-polarity-census,check-action-forward-parity,check-changeset-claims,check-component-surface-parity,check-doc-component-types,check-doc-example-types,check-handler-key-read-sites,check-readme-exports,check-spec-symbol-derivation,component-node-vocabulary-7434,one-authority-per-exported-name-6273,check-pending-changeset-literals,spec-symbol-ledger-types-7265,unconsumed-widget-option-claim-6186,vite-types-zod-lazy;component-fixture-declared-keysinexamples/schema-catalog;container-declaration-ratchet, the fourheader-barcomponent tests,skill-guide-data-table-bindinganddata-table-bind-diagnostic;body-dialect-6771andcontainment-declared-slot-9910.pnpm --filter '@object-ui/components^...' build, thenpnpm --filter @object-ui/components type-check→ 0.tsconfig.test.json --listFilesincludes the new components pin.eslintover the two new test files → 0, with no findings.check-changeset-presence,check-changeset-no-major,check-changeset-fixed,check-changeset-overwrite→ 0.check-changeset-claims→ 0; it is report-only.pnpm check:control-bytes,check:new-line-citations(0 new),check:pending-changeset-literals,check:test-path-roots,check:phantom-depsandcheck:self-import→ 0.check-governed-queue-guard --testover the 7 paths → NOT GOVERNED.pnpm lint, fullpnpm testand the other workflow gates.Acceptance notes
Not changed here, and left for the seat to route.
skills/objectui/rules/protocol.md, the "Readers only." paragraph, says abindondata-tablerenders its header over an empty body "no error, no warning". The render leg and the parser leg above both contradict it. It is on the governedskills/**surface, outside this card.base-bind-declared.test.tsandobject-grid-export-options-refusal-7762.test.tsrepeat it.mirror-partial-record-narrowing-8516.test.tshas a different "no error and no warning" claim, about grid columns. All three are test files, outside the census..changeset/7762-object-grid-export-options-bare-array-refusal.mdand.changeset/6575-data-table-bind-diagnostic.mddescribe the pre-fix behaviour in the old words. Pending changesets are out of scope here.base.tsheading "the one documented silent failure" stays. The corrected sentence now says in which sense it is silent: nothing on the page.exportOptionsguidance string says an array "is silently dropped for the csv/json default". That is present tense about the renderer, and "silently" alone is outside the phrasing family.objectql.ts), "zero unresolved-module diagnostics" fromtsc,checkTypeby name, the TS index signature. A few are unscoped claims about an authored value:ai.ts(maxResults),crud.ts,data-display.ts(three) andzod/data-display.zod.ts. They were not measured here.modeon aformreaches the DOM as an inertmodeattribute on the form element. The visible form is identical.view:formdeclaresmode(enumcreate,edit,view). It is a different registration and node type, which theFormSchemadocblock does not describe.validateTreeanswersbindwithunknown-proponlistandtree-viewtoo, although both readbindthroughuseDataScope. No registration declares abindinput, and the parser's base-prop set has nobind.Generated by Claude Code