…stead of at a remembered answer
Three prose residuals the isolated at-tier contract review of objectui#9621
named as NON-BLOCKING (VERDICT PASS). That verdict is adopted verbatim: none of
these is a contract defect, no published face moves in either direction, and no
assertion of either retirement pin is weakened.
1. The `allowCollapse` tombstone docblock wrote the pin's own per-key control
counts into prose. It now names the walk that derives them and drops the
figures, per commandment #9. The numbers had already drifted before they
landed, which is that rule's dangerous case rather than its safe one.
2. Suite 3 of `bare-kanban-node-key-retired-8802.test.ts` was titled as though
the sibling `object-kanban` arm kept every verdict it ever had, while
carrying a row asserting one of them had changed. The title now states the
claim the suite measures. The restating refusal row is DROPPED rather than
re-titled: an ablation on the mirror's tombstone turned that row and the
corresponding rows of `object-kanban-allow-collapse-retired-8801.test.ts` red
together, while that file's firing controls stayed green — so the row was a
second copy of one pin, and the refusal is now asserted in one place.
3. The objectui#8801 changeset's occurrence enumeration omitted a comment in
`packages/types/src/zod/complex.zod.ts`. Re-scanned with a whitespace-tolerant
probe, since a line-anchored grep cannot see prose that wraps mid-name. The
paragraph now names each site instead of counting them and carries the date
it was taken, because that body publishes verbatim into the CHANGELOG. Its
frontmatter is byte-identical to the merge base.
Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UanLVj6xvbS6puBCewLr8L
Fixes #9629
Clause-②: no — nothing here relaxes an accepted set or enlarges a public surface. Three prose sites, plus the removal of one test row that is redundantly pinned elsewhere. No published face moves in either direction, and no assertion of either retirement pin was weakened.
The isolated at-tier contract review of objectui#9621 (VERDICT PASS) named these three as non-blocking. That verdict is adopted verbatim and is not reopened here: none of the three is a contract defect. This corrects prose the review was right to let pass.
1. The docblock stopped writing the instrument's answer down
ObjectKanbanSchema.allowCollapse's tombstone docblock recorded per-key control counts in prose.AGENTS.md#9 asks a claim like that to point at the instrument and never write down its answer.⛔ Not repaired by writing today's number in place of the stale one. The paragraph now names the control keys without their counts, and names the walk that derives them: the
itcalled "@object-ui/plugin-kanbannames it in ZERO files, with controls firing in the same pass", inpackages/types/src/__tests__/object-kanban-allow-collapse-retired-8801.test.ts.One cardinal survives on purpose, and here is the reasoning the card asked for. The word ZERO stays. It is not a remembered reading: it is that test's own assertion,
expect(counts.get(RETIRED)).toBe(0), re-derived on every test run. The four control counts were the opposite — derived once, re-derived never, and already drifted when they landed. So the rule is applied by keeping the figure a live instrument asserts and dropping the four it does not.2. The suite title — route (b), and the reading that decided it
Route (b) was open, so route (b) was taken: the restating refusal row is dropped, and the title now states the claim the suite measures. Each pin asserts in one place.
What had to be shown first, per the dispatch: that the refusal the dropped row asserts is pinned by symbol in
object-kanban-allow-collapse-retired-8801.test.ts, with a lit control on the same instrument. A one-off ablation answered it — the mirror's tombstone key was renamed on disk, the two pin files were run, and the tree was restored.Under that one mutation,
Tests 7 failed | 24 passed (31), and the failures fall this way:REFUSES allowCollapse(the row dropped here)refuses the value %p at the key's OWN path, with the prescription(x3)reports invalid_type, the code a bare z.never() arm reportsONE string, BOTH author-facing channelsthe member is still DECLARED — a tombstone, not a deletionthe bare node is accepted, so the instrument still says yesa never-declared neighbour is ACCEPTED, because this arm is not strict⇒ the dropped row and the 8801 rows are the same claim on the same instrument, and the 8801 pin asserts strictly more of it (the message, the
invalid_typecode, the.describe()channel). The lit controls staying green is what makes those reds a reading rather than a validator that had started refusing everything. No coverage is lost by the drop.A comment stands where the row was, recording why
allowCollapseis absent from that suite and where its refusal now lives, so it is not restored in either direction. The file's docblock carried the same claim unqualified one screen above the title; it is qualified to match, since leaving two spellings of one claim in one file is the defect this card is about.3. The changeset enumeration — measured, then written as places rather than counts
The occurrence set was re-measured over every tracked file, whole-content and whitespace-tolerant, because
git grepis line-anchored and the name wraps mid-word in prose that folds near 80 columns.The absent control reading 0 while the lit control reads 1252 is what makes the target set a reading. The omission the card names is confirmed:
packages/types/src/zod/complex.zod.tsnames the key in a comment recording that the deletedretiredZeroReadKanbanKeyhelper once carried the spelling on the sibling arm. It was in none of the enumeration's categories.The paragraph now names where each occurrence is rather than counting them, carries the date the scan was taken, and points the ZERO-files walk at the pin instead of repeating its four numbers — because that body publishes verbatim into a CHANGELOG at an unknown future date, where a figure is frozen forever.
check-changeset-claimsstates in its own header that born-false is exactly the shape it cannot see. The enumeration now covers it.Frontmatter is untouched —
check-changeset-overwritecase 2A count is invariant under quotation — both positions, reported
This repair cites two test names that also exist in assertion position, so a naive phrase probe would read the citations as the assertions multiplying. Each phrase was counted in its assertion position separately from every other position, on both refs.
keeps every verdict it had(old title, retired)moved NO verdict on the SIBLING(new title)refuses the value %p at the key's OWN path, with the prescriptionnames it in ZERO files, with controls firing in the same pass(45 files)(retired figure)one pin, one docs row and two historical changesets(retired enumeration)Assertion-position counts are invariant at 1 for both cited pins — no assertion multiplied and none was removed; only quoted position rose. Neither retired figure is quoted back anywhere, so nothing stale is re-published. No row read zero on both refs, so every row measured something.
Serial constraint — re-taken, and it found a row
Re-enumerated immediately before the first write, across all 13 open PRs and the 40 most recently pushed
claude/*branches, each intersected against this card's four paths at file level.Only open draft PR objectui#9540 (card objectui#9309,
pm:blocked, head frozen at3e60765fbsince 2026-09-15) intersects, onpackages/types/src/objectql.ts. Open PR objectui#8941 (claude/pr-7058-…, card closed) touches the same file at its line 481. Neither had moved since before claim time, so nothing widened. The seat confirmed the row independently and ruled the fence holds at region granularity:ObjectKanbanSchemaopens at :3385; this change is confined to itsallowCollapsedocblockObjectGallerySchema, :4358 — 534 lines belowgit diffreports this PR's single hunk in that file as@@ -3823,6 +3823,20 @@ export interface ObjectKanbanSchema extends BaseSchema {. Nothing at or below :4358 is touched.Gates and tests
check-changeset-presencecheck-changeset-overwritecheck:changeset-claimsobjectql.ts. Each was read — none restates anything this diff movedcheck:pending-changeset-literalscheck-changeset-no-majorcheck-changeset-fixedcheck:control-bytescheck:new-line-citationscheck-governed-queue-guard(--self-test)scripts/check-governed-queue-guard.mjsin this repopnpm --filter @object-ui/types type-checktsconfig.test.json, so both pins' compile-time assertions are checkedpnpm exec vitest run packages/types/eslint --no-inline-configon the two changed sourcesno-explicit-anywarnings, none on a touched lineEvery exit code was captured to disk before any pipe. A self-scan of the four changed files for control bytes read 0 — validated by a lit control (a vertical tab fires the same probe) and an absent control (a tab, deliberately outside the class, does not). The first lit control chosen for that probe was a tab and read 0, which would have made two zeros on one instrument; it was re-drawn rather than reported.
Repo-wide
pnpm lintand the rest of the farm are CI's run, not claimed here.Out of scope, confirmed and not edited
content/docs/api/schema-reference.mdnames the key in one row that now reads stale: it says@object-ui/types"still declares both on its mirror of this face", which objectui#9621's tombstone made false forallowCollapse. Named in objectui#9621's own acceptance notes as stale and outside this card's surface, so it is reported rather than touched. Dedupe words:schema-reference·allowCollapse·quickAdd· stale docs row · object-kanban mirror declares.Not touched, deliberately
The retirement itself, both published faces, and every assertion in both pins. The tombstone message, including the "lane" precision point the review raised — changing it would change what the published refusal says to an author, which is contract surface. Release PR objectui#5400.
objectui#9628, which has landed.Generated by Claude Code