Repository navigation
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 |
…re-qualify objectstack#3546 (objectui#10803, batch 8) (objectstack-ai#11012) Fixes objectstack-ai#10803 Clause-②: no Dispatched implementation of the `domain:ui` seat objectstack-ai#1 claim (comment `5873413663`) on objectui#10803, batch 8, session `https://claude.ai/code/session_01DuWo5bdP9SdVebamn99GGk`. Citations only: no sentence's claim moves, the one edited pending changeset keeps a byte-identical frontmatter, and no runtime string moves, so the only new changeset is an empty-frontmatter sweep. No test pins any changed text (**The literal-anchor sweep**), so no test file is edited. This batch carries release `5872268200`'s two lists (the seat's ruling A in ACCEPT `5870953708`, which review `5870922323` read the same way): - the **10 in-class lines that cite a dead objectstack number written bare**: `objectstack-ai#9934` seven times, "PR `objectstack-ai#6281`" twice, "objectstack PR `objectstack-ai#8452`" once; - the **6 live-but-wrong `objectstack-ai#3546` lines** that mean objectstack#3546: five written bare, one written with this repository's name. Numbers are written in code spans in this body when they are the dead or wrong spelling, so GitHub does not link them to the unrelated objectui items they would resolve to. ## Why `Fixes` Both lists read **0** after this batch (**Census**), and the closure census over the card's two classes (pending `.changeset/*.md` prose and non-test `packages/*/src`) finds nothing else dead: - **Bare numbers**, batch 7's instrument (printed under **Census**): 965 distinct at the branch point, 961 at this head. The 916 between 100 and 25000 at the branch point were each read once as objectstack issues: 877 answer 200 and 39 answer 404. The 39 were read again as objectstack issues and as pulls (404 each) and as objectui issues (200 each). Three of them are this batch's (`objectstack-ai#9934`, `objectstack-ai#6281`, `objectstack-ai#8452`), gone at this head. The other 36 remain, and each sentence was read: every one cites an objectui card or pull request, and each answers 200 in objectui with the subject its sentence names. - **The instrument's blind spot** (a number written after `/`, `-` or `.`, as in `objectui#9469/objectstack-ai#8649`): 46 numbers between 100 and 25000 appear only in that form at this head. Read as objectstack issues: 45 answer 200; one answers 404, `objectstack-ai#8649`, which sits in two lines as `objectui#9469/objectstack-ai#8649` and means objectui#8649 (200). - **Qualified citations** at this head: every distinct `objectui#N` and objectui issue or pull URL (2723 numbers) answers 200; every distinct `objectstack#N` and objectstack issue or pull URL (345 numbers) answers 200, except objectstack#14026, which answers 301 (transferred to objectui#10102, re-qualified by batch 6). So nothing dead is left in the card's classes, and nothing in them resolves to the wrong repository as far as these instruments see. **Acceptance notes** 1 and 2 record what is outside the classes, and what could not be measured. ## Premise, re-measured on `origin/main` `665025908` (the branch point) - **The three dead numbers.** objectstack `issues/N` and `pulls/N` answer 404 for 9934, 6281 and 8452 (the in-range census read each as an issue a second time). Lit controls in the same run: objectstack issues 3546, 3391, 5775 and 8326 answer 200; objectstack `pulls/13267` and `pulls/16920` answer 200. - **What they resolve to here.** objectui `objectstack-ai#9934` is a CI finding about the `needs:contract-review` label; objectui PR `objectstack-ai#6281` is an app-shell Studio grid change; objectui `objectstack-ai#8452` is a `not_contains` operator bug. None is what its sentence meant. - **`objectstack-ai#3546`, both repositories.** objectstack#3546 (200) is "detail/form 面的 edit/delete 按钮接入服务端 effective 操作集", the effective operation set on detail and form surfaces, which each of the six sentences describes. objectui `objectstack-ai#3546` (200) is the missing-i18n-keys card, unrelated. The 96 `objectui#3546` lines in the locale packs and the "slice seven" line in `.changeset/3880-es-done-listo.md` are that i18n card, and are untouched. - **The landing commits**, each read over REST (`commits/SHA`) and checked with `compare/SHA...main`, which answers `behind_by 0` for each, i.e. each is an ancestor of objectstack `main`: - `79c46da90`, "feat(contract): producer-side user-facing marking for hook refusal messages — userMessage channel (objectstack-ai#9934) (objectstack-ai#9992)", 2026-08-19: `ApiErrorSchema.userMessage`, and the dispatcher door (`packages/runtime/src/http-dispatcher.ts`) emits it as a declared sibling of `code` and `message`; - `85ec26d28`, "spec: SDUI props — enforce or remove (objectstack-ai#5775) (objectstack-ai#6281)", 2026-08-07: retires `page:card.body` in favour of `children`, with an ADR-0087 D2 conversion; - `27358d517`, "feat(spec,rest): add batch recordIds to security/explain (objectstack-ai#8326) (objectstack-ai#8452)", 2026-08-13. - These are the landings release `5872268200` names; review `5870922323` read all three against their messages. Batch 7 already cites `79c46da90` and `85ec26d28` at other sites in these classes. - The one edited changeset, `.changeset/7980-agent-key-envelope-read.md`, is pending: it is present in `.changeset/` on `main`. This checkout is not shallow. ## Census (the enumeration pin for this batch) The two lists (REF = a commit or tree): ``` git grep -nP '(?:^|(?<=[^\w#&/.\-]))#(9934|6281|8452|3546)(?![0-9A-Za-z_])' REF -- '.changeset/*.md' 'packages/*/src/**' ':!**/__tests__/**' ':!**/*.test.*' ':!**/*.spec.*' ':!**/test/**' ':!**/tests/**' | wc -l git grep -n 'objectui#3546' REF -- '.changeset/*.md' 'packages/*/src/**' ':!**/__tests__/**' ':!**/*.test.*' ':!**/*.spec.*' ':!**/test/**' ':!**/tests/**' ':!packages/i18n/src/locales/**' | wc -l ``` | REF | bare four | `objectui#3546` outside the locale packs | |:--|:--|:--| | `665025908` (branch point) | **15**: `objectstack-ai#9934` 7, `objectstack-ai#6281` 2, `objectstack-ai#8452` 1, `objectstack-ai#3546` 5 | **2**: the `plugin-detail` line and the i18n card's own line in `3880-es-done-listo.md` | | `8fe632d96` (this head) | **0** | **1**: the `3880-es-done-listo.md` line, which is the i18n card and stays | - Lit controls at this head: `objectstack#3546` reads 10 lines against 3 at the branch point (the 6 re-qualified here, and one in this PR's sweep changeset); the 96 `objectui#3546` lines in the locale packs are unchanged. - The bare-number instrument, batch 7's (the census of **Why `Fixes`**): ``` git grep -hoP '(?:^|(?<=[^\w#&/.\-]))#\d+(?![0-9A-Za-z_])' REF -- '.changeset/*.md' 'packages/*/src/**' ':!**/__tests__/**' ':!**/*.test.*' ':!**/*.spec.*' ':!**/test/**' ':!**/tests/**' | sort -u | wc -l ``` 965 at the branch point, 961 at this head: exactly `objectstack-ai#3546`, `objectstack-ai#6281`, `objectstack-ai#8452` and `objectstack-ai#9934` are gone, and nothing is new. The blind-spot reading replaces the lookbehind class with `[^\w#&]`. ## Citation form - **An objectstack commit** is written as batches 6 and 7 wrote their stand-ins: objectstack and the 9-character backticked sha of the commit on objectstack `main` that landed the change the sentence rests on. - **A bare `objectstack-ai#3546`** becomes `objectstack#3546`, including inside the `[objectstack-ai#3546]` tags that open four comments; the one written with this repository's name is re-qualified the same way. ## Mapping | site | before | after | |:--|:--|:--| | `.changeset/7980-agent-key-envelope-read.md` | "(the `objectstack-ai#9934` channel, whose presence *is* the marking)" | "(the objectstack `79c46da90` channel, …)" | | app-shell `index.ts`, the note above the `readEnvelopeFailureText` export | "(the `objectstack-ai#9934` channel, which rides through the 5xx prose withhold untouched)" | "(the objectstack `79c46da90` channel, …)" | | app-shell `utils/apiErrorEnvelope.ts`, the `userMessage` bullet | "the END USER (`objectstack-ai#9934`)" | "the END USER (objectstack `79c46da90`)" | | app-shell `utils/apiErrorEnvelope.ts`, the `errorFromThrown` bullet | "… has emitted the channel since `objectstack-ai#9934`" (a quotation) | "… has emitted the channel since [objectstack `79c46da90`]" (**Special cases** 1) | | app-shell `PackageFormDialog.tsx`, `readEnvelopeUserMessage`'s docblock | "(`error.userMessage`, `objectstack-ai#9934`)" | "(`error.userMessage`, objectstack `79c46da90`)" | | app-shell `StudioDesignSurface.tsx`, the package-switcher failure read | "the producer's `objectstack-ai#9934` channel" | "the producer's channel (objectstack `79c46da90`)" | | app-shell `packages-io.ts`, `duplicatePackage`'s failure arm | "has emitted since `objectstack-ai#9934`" | "has emitted since objectstack `79c46da90`" | | components `containers.tsx`, the `PageCardRenderer` `body` read | "objectstack#5775 (PR `objectstack-ai#6281`, ADR-0087 D2)" | "objectstack#5775 (objectstack `85ec26d28`, ADR-0087 D2)" | | components `containers.tsx`, the `card` registration's `children` input | "objectstack#5775 (PR `objectstack-ai#6281`)" | "objectstack#5775 (objectstack `85ec26d28`)" | | plugin-grid `hooks/useRecordCrudVerdicts.ts` | "shipped in objectstack PR `objectstack-ai#8452`" | "shipped in objectstack `27358d517`" | | app-shell `RecordDetailView.tsx`, two comments | "[`objectstack-ai#3546`] …" | "[objectstack#3546] …" | | app-shell `RelatedRecordActionsBridge.tsx` | "[`objectstack-ai#3546`] Intersect the child object's …" | "[objectstack#3546] …" | | plugin-detail `renderers/record-details.tsx` | "[`objectstack-ai#3546`] Also AND inline-editability …" | "[objectstack#3546] …" | | plugin-form `fieldWriteGate.ts` | "`objectstack-ai#3546` intersects that with the server's effective API operation set" | "objectstack#3546 intersects …" | | plugin-detail `index.tsx`, the `inlineEdit` input comment | "(`objectui#3546`)" | "(objectstack#3546)" | Each `objectstack-ai#9934` sentence is about the `userMessage` channel that `79c46da90` added; each `objectstack-ai#6281` sentence is about the `page:card` `body` retirement that `85ec26d28` carries; the `objectstack-ai#8452` sentence is about the batch `recordIds` form that `27358d517` shipped. ## Special cases (the judgement calls) 1. **A quotation.** The `apiErrorEnvelope.ts` bullet quotes the note beside `sendThrownError` in objectstack's `packages/rest/src/package-routes.ts`, verbatim. That note still reads "since objectstack-ai#9934" on objectstack `main` (`e956924` at the time of this PR); there the number means objectstack's card, which answers 404, and here it resolves to the unrelated objectui item. The quote keeps its words and takes the commit in square brackets, the editorial mark for a substituted word. The note's claim is the one `79c46da90` carries: its `http-dispatcher.ts` hunk adds the `userMessage` spread to the dispatcher door's `extra`. 2. **Line breaks moved** only where the stand-in made a line markedly longer: app-shell `index.ts`, `StudioDesignSurface.tsx` and `packages-io.ts`. Elsewhere the one line just grows, as batch 7's `objectstack#3391/objectstack#3546` lines did. 3. **Wording kept.** "the `objectstack-ai#9934` channel" becomes "the objectstack `79c46da90` channel" in two places, and "the producer's channel (objectstack `79c46da90`)" in `StudioDesignSurface.tsx`, where "the producer's objectstack … channel" would read as if the producer were objectstack. No other word moves. ## The literal-anchor sweep (both test-pin classes, ruling `5861900779`) - **Instrument.** Every string, template and regex literal in the 4108 tracked test and script files (104609 distinct strings, 2339 regexes), read with the TypeScript scanner. - **Test.** Does its occurrence count DROP between `665025908` and this head in any of the 14 changed files, raw or comment-flattened? - **Result.** 30 distinct literals drop, every one generic: digits, punctuation, whitespace and character classes (`#\d+`, `\d{3}`, `[:#]`, `\s+`), the bare words `objectui` and `objectui#`, `/objectui#\d+/`, and comma-and-line-break fragments. None is a changed phrase, a dead number or a `objectstack-ai#3546` tag. A search of tests for the changed spellings finds them only in test doc comments (listed in **Acceptance notes** 1), which no assertion reads. ## Held **By the serial rule: nothing.** Open PRs were mapped at the branch point before the first edit (7 open) and again before the push (7 open; objectui#11003 and objectstack-ai#10997 have since merged, and objectui#11010 and objectstack-ai#11006 have opened). - **objectui#10990** and **objectui#11010** share `packages/app-shell/src/index.ts`. objectui#10990's hunk is in the side-effect import list, near the Cloud widgets; objectui#11010's is one line in the `views` type export list. This PR's two changed lines are in the note above the `readEnvelopeFailureText` export, more than ninety lines above both hunks. - **objectui#5400** (Version Packages) carries `.changeset/7980-agent-key-envelope-read.md`, which it consumes at release; it regenerates and is not a hold. If it lands first, that file's one changed line has already published, and this PR's hunk there conflicts with the deletion. - Trial merges with this head (`git merge-tree --write-tree`): clean for objectui#11010, objectstack-ai#11006, objectstack-ai#10990, objectstack-ai#10930 and objectstack-ai#10777. objectui#10278 conflicts in `ObjectGrid.tsx`, `plugin-grid/README.md` and `content/docs/plugins/plugin-grid.mdx`, and conflicts in the same three files against the branch point alone; none is in this diff. ## Changesets - `.changeset/10803-dead-citation-sweep-eighth-batch.md`, EMPTY frontmatter. It covers the comment-only edits in 5 released packages (`app-shell`, `components`, `plugin-detail`, `plugin-form`, `plugin-grid`) and the one edited pending changeset; no published behaviour changes through them. It writes no bare number itself. - No runtime string moves, so there is no `patch` changeset (amendment `5860244997` Q1 = A applies to none of these lines: the `plugin-detail` `index.tsx` line is a comment beside the `inlineEdit` input, not its `description` string). ## Proof of prose-only (C4), against `665025908` - **Source.** Each of the 12 touched `.ts` / `.tsx` files was parsed at `665025908` and at this head with TypeScript 6.0.3's `createSourceFile`, and re-printed by `createPrinter({ removeComments: true })`: 12 of 12 prints are identical, with 0 parse diagnostics. Lit controls on the same instrument: editing a string literal moves the print; re-spacing a comment does not. - **Changesets.** The frontmatter block of `.changeset/7980-agent-key-envelope-read.md` is byte-identical at `665025908` and this head (md5); the overwrite gate below agrees. - **Scope of the diff:** 14 files, +39 / −20: 1 edited and 1 new changeset, and 12 non-test source files in 5 released packages. No test file. ## Gates, on this head `8fe632d96` Each line is the gate's own verdict and exit code, captured by redirect-then-`$?`. - `node scripts/check-changeset-presence.mjs`, exit 0: "12 source file(s) of 5 released package(s) changed, and this change declares 1 changeset(s): .changeset/10803-dead-citation-sweep-eighth-batch.md." - `pnpm changeset:check`, exit 0: "All workspace packages are in the changeset fixed group." / "No changeset declares a `major` bump." - `node scripts/check-changeset-overwrite.mjs` (report-only), exit 0: "1 changeset(s) added, 1 modified, 0 deleted"; for the modified one, `declared at base` equals `declares now` ("@object-ui/app-shell: minor, @object-ui/console: patch"). - `pnpm check:changeset-claims` (report-only), exit 0: "Every package declared across those 1 body(ies) is either not negated …", and the standing notice "15 pending changeset(s) describe a file this change touches". Read against the diff: a pending changeset quoting a replaced spelling would carry a bare number the census sees, and the census reads 0 in `.changeset/`. - `pnpm check:control-bytes`, exit 0: "check-control-bytes: OK (scanned 9291 tracked text file(s); skipped 85 binary)." A `grep -P` control-byte self-scan of the 14 files finds none. - `pnpm check:new-line-citations`, exit 0: "VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0". - `pnpm check:pending-changeset-literals`, exit 0: "No test source names a pending changeset." - Also run over the touched comments, on the tree this head carries: `pnpm check:spec-symbols` exit 0 ("spec member citations: 1424 sources + 184 documentation pages; nothing cites a key its spec symbol does not declare."); `pnpm check:installed-pin-claims` exit 0 ("OK"); `pnpm check:comment-mask-corpus` exit 0 (1 disagreeing file, within the ceiling objectui#7882 holds open); `node scripts/check-hand-rolled-comment-mask.mjs` exit 0 ("OK every carrier is a DEBT entry, and every DEBT entry still carries one."); `pnpm check:handler-key-reads` exit 0 ("every judged read is a declared member of its arm"). - The governed-surface predicate over the 14 paths, exit 0: "NOT GOVERNED — 14 path(s) checked against 5 governed surface(s); none matched." Lit control `AGENTS.md`: exit 3. **Tests and type-check**, through the shared verify lock, on `8fe632d96`. - `scripts/__tests__/`, the whole directory, whose whole-tree scanners read the touched files and changesets: `Test Files 177 passed | 2 skipped (179)`, `Tests 5350 passed | 2 skipped (5352)`, `VERDICT command-exit 0`. - `packages/components/`, `plugin-detail/`, `plugin-form/` and `plugin-grid/`, whole packages, in one run: `Test Files 847 passed | 2 skipped (849)`, `Tests 8441 passed | 33 skipped (8474)`, `VERDICT command-exit 0`; the source files were byte-identical to this head's. - `packages/app-shell/`, whole package: `Test Files 1 failed | 863 passed | 1 skipped (865)`, `Tests 1 failed | 8835 passed | 9 skipped (8845)`. The one failure is `AppContent.inaccessibleAppStrand.test.tsx`, 'bounces to the DECLARED landing where the deployment declares one', a network-escape guard trip (a real socket at `localhost:3000/api/v1/meta`) under the full suite on a shared box. That file is not in this diff, and C4 shows no code token moves; re-run alone three times on this head it reads `Tests 6 passed (6)` each, and the CI test shards are green on this head. - Type-check: `turbo run build` of the 28-package dependency closure (`Tasks: 28 successful, 28 total`), then `pnpm --workspace-concurrency=2` with the 5 package filters `run type-check`: 5 script echoes, 5 `Done`, `VERDICT command-exit 0`. - No red leg: the sweep found no anchor to move, so there is no pin whose old copy should fail. CI on `8fe632d96`: 43 check-runs, 39 success, 3 skipped, 1 failure; `Spec Main Shape Gate` success. The failure is `Bundle Analysis`, step "Check console performance budget", which fails the same way on `main` at this PR's branch point `665025908` and at `d6d8fb9d7` and `2049b03df` after it; this diff moves no code token. ## Acceptance notes 1. **Outside the card's two classes, as it stands** (whole tree at this head, bare spelling): `objectstack-ai#9934` in 3 test doc-comment lines in 2 files and in 1 `apps/console` source line (`AgentConnectSection.tsx`, "the objectstack-ai#9934 channel"); `objectstack-ai#6281` in 1 test doc-comment line; `objectstack-ai#8452` in 1 test doc-comment line; bare `objectstack-ai#3546` in 23 test lines in 14 files and 19 published `CHANGELOG.md` lines in 8 files. `apps/console`, tests and `CHANGELOG` history are outside the classes this card carries (triage `5858031244`; release `5861553562`: recorded, not carried). 2. **Not measured: `framework#N` and `cloud#N`.** The two classes also cite 82 distinct `framework#N` and 43 distinct `cloud#N` numbers. Neither repository is on this card's lists, and both answer 403 through this container's proxy, so no reading of them is offered. 3. **Left as the brief allows.** The two test comments that call objectui#8652 `pm:blocked` (it reads `pm:on-hold`) and batch 7's sweep-changeset phrase "declared separately below" are in files this PR does not touch, and stay. --- _Generated by [Claude Code](https://claude.ai/code/session_01DuWo5bdP9SdVebamn99GGk)_ Co-authored-by: Claude <noreply@anthropic.com>
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