… README plus the last three .mdx entries
Batch 9 of objectui#5174. Removes four entries from `UNGATED_DOCS` in
`scripts/check-doc-snippet-types.mjs` and makes the 23 blocks they were
hiding honest: 21 compile against the built `dist/`, 2 carry a
`FRAGMENT_MARKER` with a measured reason.
- packages/plugin-report/README.md — 13 blocks, all 13 compile. 17
diagnostics cleared. Host-provided names (`dataSource`, `router`, `ds`,
`stored`, `report`, `rows`, `refetch`, `myAdapter`, `notify`) are now
declared against the shipped types instead of floating; the stored-document
example became a component so its `return` sits in a function body; the
filter-time date helper, which parsed as a labelled block statement and so
verified nothing, is now a real `defineReport` call that checks
`runtimeFilter`; the JSX-bearing `ts` fence is `tsx`.
- content/docs/plugins/plugin-detail.mdx — 7 blocks, all 7 compile. Real
defect fixed: the Console-integration example called `.map` on the result of
`dataSource.find`, which resolves to a `QueryResult`, not an array — the rows
are `.data`. The Filter Modes block restated the `FeedFilterMode` union
beside the declared one; it now checks against it.
- content/docs/plugins/plugin-calendar-view.mdx — 2 blocks: the "After" block
compiles, the "Before" block declares a fragment (it quotes the retired
package on purpose).
- content/docs/utilities/create-plugin.mdx — 1 block, declared: it points at
`./HeavyImpl` in the reader's own plugin.
Ledger 32 to 28, removals only (0 additions, 11 deletions). Covered documents
196 to 200; covered blocks 577 to 600; compiled 421 to 442; declared fragments
156 to 158. Gate strictness byte-identical from the fence-scanning banner to
EOF (sha256 b633996e6b55f08870ce1046f6f432914ca72320da6ce257dcc19fe661d6f313
on both sides).
Part of #5174
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019aCUUSwWefnbCJ4Xk1vqQW
Part of #5174 — batch 9 of the
UNGATED_DOCSshrink. The card stays open; thisremoves four of its entries.
All figures below are at
b701323ec, the final commit, after mergingorigin/maind88e20f55. Exit codes were captured by redirect before anypipe, and every gate line quotes the gate's own printed verdict.
What this removes, and what it bought
packages/plugin-report/README.mdcontent/docs/plugins/plugin-detail.mdxcontent/docs/plugins/plugin-calendar-view.mdxcontent/docs/utilities/create-plugin.mdx37 diagnostics cleared (17 on the README, 20 across the three pages). Only the
two honest routes were used — compile against the built
dist/, or aFRAGMENT_MARKERwhose reason names the diagnostics it was measured from. Nothird route, no ledger addition, and no block made vacuous to get it green.
Ledger invariants, asserted mechanically
Both copies of the gate were imported side by side and evaluated over the same
working tree, so the covered-set delta is attributable to the ledger alone:
git diff --numstat origin/main...HEADon the gate file reads0 11—0 additions, 11 deletions. The hunk is removals only.
Strictness proven byte for byte: everything from the
Fence scanningbannerto EOF is identical on both sides — 795 lines, sha256
d203debfa0073ccdb527a08e1e191b2d04b4cc00c5303ee27d4bfc76d09c7241onorigin/mainand on this branch. Nothing about how the gate judges a blockmoved; only the list of documents it is allowed to skip.
The gate, before and after
Controls all held: resolution landed on
/home/user/objectui-issue-5174-b9/packages/types/dist/index.d.ts(thisworktree's built artifact), sentinel TS2305, positive control 0 diagnostics,
undeclared control TS2307.
Per document — what changed, and why it is honest
packages/plugin-report/README.md— 13 blocks, all 13 compile17 diagnostics: TS2304x15, TS2552x1, TS1108x1. Every one was a block using an
ambient name the page never defined, and the page's own prose already said so
("
dataSourceandrouterare host-provided"). Those names are now declaredagainst the shipped types rather than floating — the pattern
packages/data-objectstack/README.mdandpackages/plugin-view/README.mdalready use:
dataSource/ds/myAdapterasDataSource,routeras{ push: (href: string) => void },reportDefinition/reportasReportComponentSchemaorSpecReportdepending on which renderer the blockaddresses,
rowsasArray of Record of string to unknown,refetchandnotifyas their real callback shapes.isDatasetReport(stored)) held a barereturnat top level (TS1108). It is now a component function, which also puts the
isDatasetReportnarrowing under the compiler:unknownnarrows to therenderer's
reporttype, and that is checked.ended in
runtimeFilter: { close_date: { $gte: daysAgo(30) } }. TypeScriptparses that as a labelled block statement, so it would have compiled green
with any spelling at all — covering it as written would have bought nothing.
It is now a real
defineReportcall, anddefineReporttakesz.inputof a strictReportSchema, so the key is genuinely checked (probe 1below).
tsfence is nowtsx. The gate parses every block as TSXregardless of the label, so this changes no verdict — it is a mislabel
correction for the reader, in the direction that keeps the block collected.
content/docs/plugins/plugin-detail.mdx— 7 blocks, all 7 compile16 diagnostics. Five blocks continued an earlier block; they now carry their own
imports and declarations. Two findings worth naming:
const comments = await dataSource.find('sys_comment', ...)and thencomments.map(...).DataSource.findresolves toPromiseofQueryResult, which is{ data: T[], total?, ... }— not an array. The rowsare
comments.data. Measured as TS2339 by probe 2.FeedFilterModeunion beside thedeclared one, where nothing compared them. It now restates it against
FeedFilterModeas imported from@object-ui/plugin-detail, so a typo or aretired member fails (probe 3). The four members are unchanged and still
visible to the reader.
content/docs/plugins/plugin-calendar-view.mdx— 1 compiles, 1 declaredThe "After" block names
@object-ui/plugin-calendarand compiles. The "Before"block quotes the retired
@object-ui/plugin-calendar-viewspecifier onpurpose — it is the before half of a migration guide — so it carries a
FRAGMENT_MARKERnaming its measured TS2882 + TS2307. Repairing it would deletethe thing the section documents. This is exactly the disposition the removed
ledger entry itself predicted.
content/docs/utilities/create-plugin.mdx— 1 block, declaredReact.lazy(() => import('./HeavyImpl'))points at a module in the reader'sown plugin, which cannot exist beside this page (TS2307), and
Reactis theUMD global a one-line excerpt does not import (TS2686). Declared with both
measured; importing our way out would make the snippet about this repository
rather than about the plugin the reader is scaffolding.
Non-vacuity — six probes, direction predicted before each run
A newly covered document that cannot fail the gate has bought nothing, so each
probe was planted, proved on disk (the injected text counted, the removed
text counted, and
git hash-objectshown to differ from theHEADblob), run,then restored with
git checkout HEAD -- ABSOLUTE_PATHunder aSIGTERM/SIGINT/exit trap, and the restore proved by an empty
git diff HEADand a blob hash equal to theHEADblob. No rebuild sitsbetween mutation and reading: the mutation is markdown the gate reads straight
from disk, and the
dist/it compiles against is untouched.runtimeFiltermisspelled in the newdefineReportcomments.data.mapreverted tocomments.mapProperty 'map' does not exist on type 'QueryResult of any''archived_only'added to the restated unionReportComponentSchemaliteralReportField'labell' does not exist in type 'ReportField'All six matched, including the direction of probe 4.
What the green does not mean
Probe 4 is the honest half.
BaseSchemadeclares[key: string]: any, so awrong top-level key on any schema literal that extends it is invisible to
this gate — measured, not assumed. Probe 5 shows the floor: one level down, in a
type that does not extend
BaseSchema(ReportField), excess-property checkingbites normally. Discharged by declaration check rather than left unknown: every
top-level key on the annotated literals in these blocks
(
type,title,fields,schedule) is a declared member ofReportComponentSchema, so nothing on these pages rides the index signature.The
defineReportcalls are not affected at all —ReportSchemais strict, soprobe 1 reds at the top level.
Probe 6 is the fragment half: a declared fragment is not compiled, so the only
thing standing behind it is its written reason. Disabling the marker shows the
reason is true — the two diagnostics it names are the two the gate reports.
Gates and tests, all at
b701323ecnode scripts/check-doc-snippet-types.mjsEvery covered documentation snippet compiles against the built types.node scripts/check-doc-fence-languages.mjsevery TypeScript block in 227 document(s) is fenced ts/tsx/typescript, except 80 declared file(s) carrying 90 block(s)node scripts/check-doc-component-types.mjsEvery documented component type is registered.node scripts/check-doc-links.mjsLinks are valid across 17 scan roots.node scripts/check-control-bytes.mjsOK (scanned 6140 tracked text file(s); skipped 85 binary)node scripts/check-readme-exports.mjs406 self-imports judged (406 real, 0 wrong-path, 0 fabricated)node scripts/check-skill-examples.mjsEvery marked skill example holds up against the built types.node scripts/check-changeset-presence.mjsNo source or published contract of a released package changed in this range, so no changeset is owed.pnpm exec vitest run --maxWorkers=2(15 suites, repo root)Test Files 15 passed (15)/Tests 489 passed (489)pnpm run lint:root32 problems (0 errors, 32 warnings)— all pre-existingThe
check-doc-fences/check-doc-snippetswalk-equality pin couples the threedoc gates, and all three are green above.
Changeset: none owed, and the verdict is the gate's, not a guess. A
packages/*/README.mddoes ship inside the package'sfiles, so it was checkedrather than assumed:
check-changeset-presencecompared the tree with themerge-base
d88e20f55and reports 5 files changed, 0 of them published source ofa package the release covers. Verdict followed; none added. No label was applied —
in objectui
skip-changesetis a historical mis-mount that no workflow reads anda pin test forbids applying.
Test suite selection re-derived at the merged head, not inherited:
git grep -lfor the gate's name plus for each edited document and the siblingREADME gate, which is 15 files including
check-skill-examples.test.tsthatlanded on
mainmid-run. vitest ran from the repo root, never throughpnpm --filter ... exec vitest.One NOT MEASURED, corrected rather than reported as red: the first run of
check-readme-exportsexited 1 with 3 findings, all the string "its type entry./dist/index.d.tsis not on disk" forplugin-ai, none naming a file in thisdiff — a missing precondition, not a verdict. Building that closure made it a
real measurement. The same half-built tree then failed two cases in
check-readme-exports.test.ts, which branch onpackagesUnbuilt === 0and arewritten for a cleanly built or cleanly unbuilt tree; building the last unbuilt
package (
plugin-tree) put the tree in one of those two states and the suite isgreen, 489/489.
Build: serialised through the shared verify lock
(
OS_VERIFY_LOCK_SLOT=issue-5174-b9, set before the first attempt),VERDICT command-exit 0on every run. Because turbo replays cached logs that can nameanother worktree's paths,
dist/index.d.tspresence was confirmed on disk inthis worktree for all 26 build-filter packages before any gate result was
trusted (26/26 present).
Serial constraint
The seat declared this file's regions disjoint at region level rather than
serialising the whole file: this branch touches the
UNGATED_DOCSobject literalonly, while #7432 touched
CONTROL_REAL_EXPORT, a one-line harness constant some290 lines away. That declaration obliged a merge of
origin/mainbefore opening,and #7432landed in the meantime. The merge was clean — no conflict, no
hand-ordering — and
CONTROL_REAL_EXPORTnow readsBaseSchemaon this branch,with the positive control still reporting 0 diagnostics. Every number above was
re-taken after that merge. #7449, which moved the three gates' scan roots and put
an ownership-map block beside this ledger, is also on
mainand is included;none of batch 8's figures were reused.
⛔ Excluded on the standing ruling, and named so the boundary is explicit:
packages/plugin-gantt/README.mdandpackages/plugin-kanban/README.mdareowned by #7302 /
PARTIAL_EXCERPTSand are untouched here.plugin-ganttis thelargest entry left in the ledger by fence count (18), so it is exactly the
neighbour the exclusion exists for.
Ledger after this batch
28 entries: 0
.mdxundercontent/docs, 27 package READMEs, plus the rootREADME.md. The.mdxhalf of this ledger is now empty.Generated by Claude Code