Uh oh!
There was an error while loading. Please reload this page.
docs(plugins,utilities,tooling): clear three more .mdx pages off the doc-snippet ledger (#5174 batch 7) - #7325
Merged
Conversation
…pet ledger Batch 7 of the UNGATED_DOCS burn-down. Takes the next three .mdx entries by fence density -- plugin-timeline (9 blocks), plugin-kanban (8), runner (8) -- and delivers all three whole: 25 blocks, 20 compile against the built dist, 5 carry a FRAGMENT_MARKER with a measured reason. The ledger hunk is removals only and nothing about the gate's strictness moved. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BGMDbrVa8JjZcCQ7DWYH1b
… its length The sentence carried a literal "12 .mdx pages and 32 package READMEs". Both halves had drifted -- the README count has been 31 since objectui#5259, and the .mdx count moves with every batch of objectui#5174's burn-down -- and nothing fails on a stale number written there. The entries below are re-derived every run and shrink-only, so the names in the list are the count. Header prose only: the gate's strictness region, from the fence-scanning banner to EOF, is byte-identical (sha256 b87e347626a6cbab30b904eaf7d3eb72f6804122505bdf9ec8f2f2c8136e95a3). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BGMDbrVa8JjZcCQ7DWYH1b
…-ledger-batch7 # Conflicts: # scripts/check-doc-snippet-types.mjs
yinlianghui
marked this pull request as ready for review
September 2, 2026 07:14
Uh oh!
There was an error while loading. Please reload this page.
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 freeto 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.
Part of #5174
Batch 7 of the
UNGATED_DOCSburn-down. Takes the next three.mdxentries by fence density and delivers all three whole: 25 blocks, 20 compile against the builtdist, 5 carry aFRAGMENT_MARKERwith a written, measured reason. 26 diagnostics cleared. Nothing about the gate's strictness moved.Batch 6 (#7314) landed while this was in flight;
origin/mainwas merged (never rebased). The two ledger hunks conflicted textually because they are adjacent lines in one sorted object, and the conflict was resolved as the union of both removal sets — everything either side took out stays out.create-plugin.mdx, the only entry inside the conflict region that neither batch claimed, is the only one that survives it.Pages taken, and how each block reached zero
All counts produced with the gate's own
scanFences, not a hand grep.content/docs/plugins/plugin-timeline.mdx{ dateFormat: 'short' }objects that TypeScript parses as block statements containing labelled expressions —{ dateFormatt: 'short' }was equally green. Five schema literals now carry theTimelineSchemaannotation the page's own prose already claims ("Every key above is declared on the exportedTimelineSchema, so … a wrong value is a type error"), and the two value-list fences became indexed-access declarations.items: [...]in "Custom Colors" was the one parse failure.content/docs/plugins/plugin-kanban.mdxTS7006ononCardMove's four parameters, twice — the callback was untyped because the literal was unannotated, whileKanbanSchemadeclares it as taking four typed parameters. Five literals now carryKanbanSchema/KanbanCard/KanbanColumn. Three parse failures: a bareobject-kanbanliteral,cards: [...], and an "Event Handling" block withcolumns: [...], a top-levelawaitin avoid-returning callback, and three ambient names — rewritten as a real hook. One type gap found and filed (#7322), not fixed here.content/docs/utilities/runner.mdx@object-ui/plugin-yourplugin/-myplugin/./components/MyComponent— the package or file the reader is being walked through creating — and one is a single property out ofresolve.alias. Two real repairs: the Error Boundaries example importedSchemaErrorBoundarybut renderedSchemaRendererwith neither the component norschemain scope, so a reader copying it got twoTS2304s; anddefineConfigwas called with no import. Two fences holding JSX were labelledtypescriptand are nowtsx— a mislabel, corrected rather than declared. One fence held two files (a TS side-effect import and a JSON page document); the JSON half is a mislabel and now has its ownjsonfence.Ledger 37 → 34 (3
.mdx+ 31 README). Covered documents 187 → 190 — strictly grows. Covered blocks 481 → 506; compiled 345 → 365; declared fragments 136 → 141. The per-page splits (9+8+3 = 20 compile, 0+0+5 = 5 declared) reconcile exactly with those deltas.Invariants, each measured rather than asserted
ad3d4029avs this branch:sha256 b87e347626a6cbab30b904eaf7d3eb72f6804122505bdf9ec8f2f2c8136e95a3— the same value on both sides, and the same value batches 5 and 6 recorded.FRAGMENT_MARKERwhose reason names the measured diagnostics. No third route, noUNGATED_DOCSaddition, no fence re-labelled to duck the gate. The two fence-language corrections go the other way: both blocks stay in the collected ts/tsx population, and the JSON document that leaves it was never TypeScript.Before / after, both at a fully built tree, exit codes captured by redirect-then-
$?and never through a pipe:The branch point
d717e8bc3was measured the same way before the merge (184 covered / 40 ungated / 440 blocks, exit 0), which is batch 6's own BEFORE — the two agree.The lid check, per page — including the negative results
Resolving an unresolved name can uncover diagnostics the first error was hiding. Run on all three, each planted and restored from
HEADunder a trap:plugin-kanban.mdx— POSITIVE, and it is the finding. The row-cap example is anobject-kanbannode. Annotated withObjectKanbanSchema:TS2741: Property 'groupField' is missing … but required. Annotated withKanbanSchema, which is whatObjectKanbanComponentProps.schemaactually declares:TS2322: Type '"object-kanban"' is not assignable to type '"kanban"'. Neither declared type accepts the shape the renderer reads. Note what the first diagnostic does not say —groupByandlimitraised nothing at all, becauseBaseSchema's index signature absorbed them. Filed as finding(types,plugin-kanban):ObjectKanbanSchemarequiresgroupField(zero read sites) and declares neithergroupBynorlimit— no workingobject-kanbannode is assignable to any declared type #7322; the block ships as a plainconstwith no annotation.plugin-timeline.mdx— NEGATIVE. The single parse failure (items: [...]) had kept that block out of the semantic phase entirely. With it resolved and five literals newly annotated, the re-run exposed nothing underneath. Reported as a negative result.runner.mdx— NEGATIVE, twice. The declared fragments hide their contents from the gate, so both were probed with the fictional specifier shimmed to a real one: "Plugin Not Loading" with@object-ui/plugin-yourpluginswapped for@object-ui/plugin-markdown, and theComponentRegistry.registerblock with./components/MyComponentreplaced by a local declaration. Both came back clean — the declared blocks are correct documentation the gate cannot reach, not defects in hiding.The read-site grep — what the compiler structurally cannot see
BaseSchemacarries[key: string]: any, andKanbanCardcarries one of its own, so a wrong key on either is invisible to this gate. Every schema literal touched here was therefore also grepped for read sites:variant,items,dateFormat,scale,rowLabel,minDate,maxDate,classNameall read inplugin-timeline/src/renderer.tsx; the item keystime,title,description,variant,icon,content,className,startDate,endDateand the gantt row'slabellikewise. Nothing fabricated.id/title/description/badges, badgelabel/variant, columnid/title/cards/limit/classNameall read inKanbanImpl.tsxandKanbanEnhanced.tsx. Nothing fabricated.object-kanban— this is where it paid.schema.groupByis read at nine sites inObjectKanban.tsxandschema.limitat two, whilegroupField— the keyObjectKanbanSchemamarks required — has zero read sites inpackages/plugin-kanban. The package's own test suite writes{ type: 'object-kanban', objectName, groupBy, limit }, the documented shape. The page is right and the declaration is the stale half.What the green does not mean
Stated because a green run must not be read as more than it is. Each limit below was measured on these pages by planting a probe, proving it reached the disk by counting the injected and removed text, running the gate, and restoring from
HEADunder a trap with the restore proved by an emptygit diff HEADand a blob hash matching theHEADblob.Three probes stayed GREEN — these are real blind spots:
dateFormatt: 'long'added to the annotatedTimelineSchemaliteral. Gate stayed green —BaseSchema's index signature absorbs it.itemsis not caught either. Probe:titleeon a timeline item. Gate stayed green —TimelineSchema.itemsis declaredany[], deliberately, because the two element shapes are discriminated byvariantand read dynamically. The item vocabulary this page documents in full is verified by read-site grep and by nothing else.KanbanCardis not caught. Probe:descriptionnon the annotated card literal. Gate stayed green —KanbanCardcarries its own[key: string]: any, for the runtime-synthesized card keys.Two probes went RED — so the annotations are live, not no-ops:
variant: 'diagonal'on the annotatedTimelineSchemaliteral producedTS2322: Type '"diagonal"' is not assignable to type '"horizontal" | "vertical" | "gantt" | undefined'.variant: 'critical'on aKanbanCardbadge producedTS2322: Type '"critical"' is not assignable to type '"default" | "outline" | "destructive" | "secondary" | undefined'— the badge object is sealed even though its parent card is not.So the boundary on these pages is exactly this: declared members with closed unions are genuinely checked; anything reaching an index signature, and everything inside
items, is not. That is why the read-site grep above is not optional decoration — it is the only thing covering the second half.safeParse, whether atypeliteral names a registered component, and whether a shell example runs are three other questions with three other answers.Type gap found and filed, not fixed here
packages/*source is out of this PR's surface, so it was filed unassigned after a targeted dedupe search (which returned the same-family cards #7311, #7313, #5903 and #6973, so it was live rather than silently empty; none is this defect):ObjectKanbanSchemarequiresgroupField(zero read sites) and declares neithergroupBynorlimit— no workingobject-kanbannode is assignable to any declared type #7322 —ObjectKanbanSchemarequiresgroupField, a key with zero read sites inpackages/plugin-kanban, and declares neithergroupBynorlimit, the two keysObjectKanban.tsxactually reads. Separately,ObjectKanbanComponentProps.schemais typedKanbanSchema, whosetypeis the literal'kanban', so noobject-kanbannode is assignable to it either;ObjectKanbanRenderertypes its own prop asany, so nothing connects the registered node to either declaration. The row-cap block therefore ships as a plainconstwith no annotation — it compiles and is counted, but its keys are unchecked — rather than inventing agroupFieldthe renderer does not read. Same family as finding(plugin-calendar):ObjectCalendarComponentProps.schemais typedObjectGridSchema | CalendarSchema, so noobject-calendarnode is assignable — the documented direct-React usage cannot compile #7311 and finding(types):objectNameis declared REQUIRED onObjectGanttSchemaandObjectCalendarSchemawhile both renderers resolvedataandstaticDataFIRST — the documented static-data route cannot be annotated #7313.Header prose corrected, and why it is a rewrite rather than a new number
Batch 6 recorded, without filing, that the ledger docblock's sentence "what remains here is 12
.mdxpages and 32 package READMEs" had drifted. Batch 7's dispatch authorised fixing it now that the ledger surface is being edited for its own sake.It is corrected by removing the count, not by writing a fresh one. Both halves were already wrong (the README count has been 31 since #5259; the
.mdxcount moves with every batch), and any number written there would have been stale again within the hour — batch 6 landed mid-run and moved it. The sentence now points at the entries below it, which are re-derived every run and shrink-only, so the names in the list are the count. Nothing mechanical fails on a stale number in a comment, which is precisely why it should not carry one.This edit is header prose, above the fence-scanning banner, so the strictness proof above is unaffected and still holds byte-for-byte.
Gate verdict lines
Everything below at
9d6e6f5a7, the final commit, with the closure built first under the shared verify lock (VERDICT command-exit 0) anddist/index.d.tspresence confirmed on disk in this worktree for all 25 filters before any gate result was trusted — turbo replayed cached logs naming another worktree's path (objectui-issue-5174-b6) on the first build, so this was checked rather than assumed.The seven vitest files are every file
git grep -l check-doc-snippet-types -- '*.test.ts' '*.test.tsx'names — the two obvious ones plus five pin suites inexamples/schema-catalog,plugin-gantt,reactandtypesthat an edit to this script could have hijacked. Run from the repo root with--maxWorkers=2, never throughpnpm --filter.check:doc-fencesis unmoved by this PR:plugin-timeline.mdxandplugin-kanban.mdxeach carry one entry in #5867's shrink-only ledger for their plaintext-fenced "TypeScript Support" blocks, and those blocks are untouched here — that axis belongs to #5867.check:readme-exportsfirst read NOT MEASURED, not red: it exited 1 with 45 findings, all 45 the stringits type entry ./dist/index.d.ts is not on disk -- run pnpm build firstforplugin-aiandplugin-gantt, and none naming a file in this diff. Building those two closures made it a real measurement, and it is genuinely green.One process note worth recording: the probe harness's first disk-proof step was itself defective — it used
grep -cFon multi-line strings, which counts matching lines rather than occurrences, and reported a false "no-op mutation". It failed closed: the harness aborted and the trap restored before any gate ran, so no reading was taken from it. The proof step was corrected to count the full multi-line strings, and every probe above was then run and recorded once.Declared narrowing
Repo-wide
pnpm lintwas narrowed to the four changed files, and the narrowing is a measurement rather than a skip:npx eslint --no-inline-config --format jsonon the four files reports the three.mdxpages asFile ignored because no matching configuration was supplied— they are not in ESLint's population at all.scripts/check-doc-snippet-types.mjs), 0 errors, 0 warnings.eslint.config.jssets noproject,projectServiceortsconfigRootDir, so type-aware linting is not enabled and nothing in this diff can move the verdict on a file it does not touch.A control-byte self-scan (
grep -naPover the C0 range plus DEL) across the four changed files returns no hits, beside the repo-wide gate above.🤖 Generated with Claude Code
https://claude.ai/code/session_01BGMDbrVa8JjZcCQ7DWYH1b
Generated by Claude Code