Repository navigation
docs(report-schema): drop the retired onSave / onCancel and put the Report Builder example under check:doc-snippets - #7843
Merged
os-sam merged 1 commit intoSep 6, 2026
Conversation
…ck under the compiler gate `ReportBuilderSchema.onSave` / `.onCancel` are `?: never` on the TypeScript face and `handlerKeyRefusal(...)` arms on the zod mirror since PR #7468 (objectui#7344, in the objectui#6124 shape). The Report Builder example authored both, so the page taught a literal that is a `tsc` assignment error AND a named `safeParse` refusal. Removed, the disposition objectui#7340 chose for seven of its eight pages. The example is not hollow without them: the section teaches the ReportBuilderSchema shape (`type`, `report`, `availableFields`, `showPreview`), not a save/cancel flow. Why no gate reported it, and what changes here: check:doc-snippets compiles ts/tsx fences only — the block was ```plaintext check:doc-types reads `type` string literals 7340 pin its DOC_MEMBER_RE requires `key?: type` (a declaration row) or a markdown prop-table row; an example object literal `onSave: 'handleSaveReport',` matches neither Measured rather than assumed: re-fencing the block `ts` with the two lines still present makes check:doc-snippets report exactly two diagnostics on this page and nothing else — [semantic] content/docs/core/report-schema.mdx:421:3 TS2322: Type 'string' is not assignable to type 'undefined'. [semantic] content/docs/core/report-schema.mdx:422:3 TS2322: Type 'string' is not assignable to type 'undefined'. — so the re-fence lands with the deletion and the page joins the gate's scan surface (456 -> 457 blocks compiled). check:doc-fences then names its own remedy (baselined at 8, now carries 7), so its shrink-only ledger drops to 7, which is that lane's documented protocol: lower the number in the same pull request that re-fences the block. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KbJQ1y1J12nZxYzFWhP8Q3
This was referenced Sep 6, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #7488
ReportBuilderSchema.onSave/.onCancelhave been?: neveron the TypeScript face andhandlerKeyRefusal(...)arms on the zod mirror since PR objectui#7468 (objectui#7344, in theobjectui#6124 shape). The Report Builder example on
content/docs/core/report-schema.mdxstill authored both, so the page taught a literal that is a
tscassignment error and anamed
safeParserefusal. The two lines are removed — the disposition objectui#7340 chosefor seven of its eight pages.
The example is not hollow without them: the section teaches the
ReportBuilderSchemashape(
type,report,availableFields,showPreview), not a save/cancel flow.⭐ Why nothing went red, measured rather than asserted
Three instruments were green while the defect was present, each for its own reason:
check:doc-snippetsts/tsxfences only — this block was ```plaintextcheck:doc-typestypestring literals, nothing elsecomponent-docs-retired-handler-keys-7340.test.tsDOC_MEMBER_RErequireskey?: type(a member DECLARATION row) or a markdown prop-table row; the example'sonSave: 'handleSaveReport',is an ASSIGNMENT and matches neithercheck:doc-fencesclassifies it as a SYNONYM finding (a TypeScript body under anunhighlighted fence) and carries it inside a declared SHRINK-ONLY ledger — this page was
baselined at 8 such blocks, and
--listnames our block as one of them(
content/docs/core/report-schema.mdx:404). So the block being hidden from the compiler wasa known, baselined state, not an unknown one.
The reading the card asked for
Re-fenced the block
tswith the two lines still present, then rancheck:doc-snippets:Exactly the two lines this card is about, and nothing else on the page — no other block on
this page uses an ambient name, none continues an earlier block. ⇒ per the dispatch ruling,
the re-fence lands too. After the deletion, on the same tree:
456 → 457 compiled blocks: the page has joined the gate's scan surface, so this class is dead
on this page by construction — a retired key in a compiled block is a
tscerror.scripts/check-doc-fence-languages.mjs, one line:content/docs/core/report-schema.mdx8 → 7. The re-fence cannot land without it — that gate went red the moment the block left its
ledger, and it printed its own remedy:
That is the lane's documented protocol, stated in the gate's own header: "Every batch of that
lane now lowers these numbers in the same pull request that re-fences the blocks." The number
only ever goes down; no supported route raises it. Repo-wide the ledger moves 90 → 89 blocks.
packages/types/src/__tests__/handler-keys-string-any-mirrors-7344.test.tscites this page'sonSave: 'handleSaveReport'as the corpus source of the retired dialect. Read beforedeleting: the citation is a provenance comment, and the value is a hard-coded constant —
— while every file that test actually reads comes from
packages/types/src/zod(itsZOD_DIRwalk). It matches by existence-at-authoring-time, never by live content, so thedeletion cannot redden it, and it is green here. ⛔ The pin is not edited. The comment now
cites a page that no longer carries the spelling; that is a historical citation of where the
dialect came from and still reads correctly, so it is reported rather than rewritten.
Out of scope, filed rather than repaired
objectui#7840 — the objectui#7340 pin cannot see example object literals at all
(
DOC_MEMBER_RErequires the?). Widening it closes the class rather than thisinstance, but it is its own measurement: the parse surface of example literals is far larger
than that of declaration rows, an owner has to be resolved from a type annotation for the
PAIR RULE to run at all, and the false-positive cost is unmeasured. ⛔ Not attempted here.
Evidence
Everything below ran on
9d46971b1, the head of this branch, with the doc gate's scopedclosure built first (
pnpm exec turbo run build $(node scripts/check-doc-snippet-types.mjs --build-filter) --concurrency=2— 34/34 tasks successful).node scripts/check-doc-snippet-types.mjsnode scripts/check-doc-component-types.mjsnode scripts/check-doc-fence-languages.mjsnode scripts/check-doc-fence-languages.mjs --self-testpnpm exec vitest run packages/types/ scripts/__tests__/check-doc-fence-languages.test.ts scripts/__tests__/check-skill-examples.test.ts scripts/__tests__/one-authority-per-exported-name-6273.test.tsnode scripts/check-doc-links.mjsnode scripts/check-docs-route-eager-closure.mjsnode scripts/check-doc-example-shared-reader.mjsnode scripts/check-handler-key-read-sites.mjsnode scripts/check-control-bytes.mjsThe three test suites beyond
packages/typesare the ones that namecheck-doc-fence-languages— a gate script's own suites are owed separately from the gatesits diff triggers.
node scripts/check-changeset-presence.mjs— exit 0, verdict quoted verbatim:⇒ no changeset file, and ⛔ no
skip-changesetlabel: in this repository that label is readby no workflow and exempts nothing; the gate's own verdict line is the authority.
Lint, narrowed and proven rather than skipped. Asked ESLint itself about the two changed
paths, through its own config resolution:
The flat config's only file selector is
**/*.{ts,tsx}, so this diff intersects the lintedpopulation in zero rules; the control shows the query measures something real. And
tseslint.configs.recommendedis configured with noproject/projectService, so lintingis not type-aware and this diff cannot move the verdict of any file it did not touch.
Not run, stated plainly: the full
turbo run lintand the full test suite (CI runs both);no browser verification (documentation-only change with no runtime surface); no reverse
ablation beyond the before/after pair above, which is itself the card's required measurement
— every instrument was captured green on the unmodified tree first, which is the point the
card makes.
Session, as prose because footers get rewritten: this branch was produced by the
os-devseat at
https://claude.ai/code/session_01KbJQ1y1J12nZxYzFWhP8Q3.Generated by Claude Code