… ledger entry
All 18 ts/tsx blocks in `packages/plugin-gantt/README.md` now compile against
the built types, so the document leaves `UNGATED_DOCS` in
`scripts/check-doc-snippet-types.mjs` — a two-line removal inside the object
literal, the only change to the gate file.
The 26 measured diagnostics were 13 parse (two bare object literals fenced
`typescript`, so neither was a statement), 11 fragment-shape undefined names
across four blocks, and two real drifts:
- `<ObjectGantt schema={{ type: 'gantt', … }} />` did not type-check:
`ObjectGanttProps.schema` is `ObjectGanttSchema`, whose `type` is the
literal `'object-gantt'`. The direct-React example now spells the type the
way this README's other direct-render example already does. The registry
still claims both keys; that table is unchanged.
- The data-source example's `const schema = { … }` widened `type` to `string`
and so was not assignable to `ObjectGanttSchema` where it was passed. It is
now annotated with the shipped type, which checks every key in it.
The `GanttTask` excerpt keeps its `readme-exports` partial marker and gains the
two type imports it always referenced. No `packages/**` source, no widened
type, no loosened gate, and no new fragment marker: declared fragments stay at
158, so all 18 blocks earn coverage by compiling.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MM7kaS4dPpYHV5BsMyu4tQ
Part of #5174 — batch 18 of the
UNGATED_DOCSburn-down.packages/plugin-gantt/README.mdleaves the ledger and all 18 of its ts/tsxblocks now compile against the built types. The gate file's only change is the
two lines of that one entry.
Batch 17 (PR #8000,
packages/plugin-detail/README.md) is queued and not yetmerged. Both batches are removals-only inside the
UNGATED_DOCSobjectliteral, on different lines, for different documents, and neither touches the
other's README — the same licence batches 10/11, 12/13, 14/15 and 16/17 ran
under. The merge queue reconciles two line deletions in one literal.
This batch's document lives in
packages/plugin-gantt/. #7307's batch 2will edit
packages/plugin-gantt/src/*.test.tsxafter PR #7999 lands: differentfiles, same package. Flagged here because the dispatch asked for it — the
domain:devxseat serialises #7307 batch 2 behind this PR.Live E2E (informational)is red on every branch today for an upstream reason(#7990 / objectstack#16186), not because of this diff.
Ledger arithmetic
15789d52c6e3d6UNGATED_DOCSentriesProgrammatic diff of the two
UNGATED_DOCSobjects (base copy loaded fromgit show, both imported as objects, never diffed as text): removed =['packages/plugin-gantt/README.md'], added =[], reason-changed =[], keyorder preserved for survivors = true, survivors = 20.
git diff --numstatonthe gate file is exactly
0 2.The strictness region — the
Fence scanningbanner line to EOF, 1178 lines onboth sides — hashes to
f46b5662ba336f026bca3a0003e0b7979789d48d0291fa5760be7d23c8ed0160on base and on branch, the value batches 15 to 17 recorded. Nothing in the
gate's judging logic moved.
Census and the rung that decided
Re-taken on THIS base through the gate's exported
analyze()/compileSnippets()over all 17 non-excluded ledger candidates. Rung 1 (largermeasured debt: blocks) decided outright — no tie-break was needed.
The dispatch's assumption A1 (collaboration and permissions tied at the top) is
falsified on this base, and the reason is the licence the claim itself
granted: PR #7985 merged at 07:20Z and put the gantt and kanban READMEs back
in the pool. Verified on this base rather than inherited —
6bfe358(the #7985merge commit) is an ancestor of
15789d5,git merge-base --is-ancestorexit0. At 18 blocks the gantt README is the largest remaining entry by a factor of
two and the rungs never reach a tie.
Exclusions re-verified against GitHub on this base, not inherited:
README.mdis not a
packages/NAME/README.md;packages/auth/README.mdis held by draftPR #7685 (open);
packages/plugin-detail/README.mdis batch 17's PR #8000(open, queued);
packages/plugin-chatbot/README.mdis deferred. No open PRtouches
packages/plugin-gantt/README.md— all 11 open PRs' file lists wereread over REST, including #7685's 67 paths and #5400's 1048.
What the 26 diagnostics were, and what each repair did
13 parse + 13 semantic. Two of the semantic ones were real drift, not fragment
shape; the rest were undefined names and implicit
any.onTaskUpdateopt-in (fence 78)GanttView/tasks/saveundefined,taskand the destructured{ start, end }implicitlyanydeclare constplaceholders typed to the shipped surface, JSX bound to a name (no re-indentation); the callback's params now type fromGanttViewPropsgetDataConfignode (fence 214)typescript, so it was not a statement at allconst recordSourcegetGanttConfignode (fence 241)const fieldMappingGanttTaskexcerpt (fence 393)GanttDependencyandGanttTaskTypewithout importing themimport typeline; thereadme-exportspartial marker and every member are untouchedtype: 'gantt'inside theObjectGanttelement'sschemaprop does not type-check —ObjectGanttProps.schemaisObjectGanttSchema, whosetypeis the literal'object-gantt'; plusdataSourceundefined'object-gantt', the way this README's OTHER direct-render example already spells it, plus aDataSourceplaceholder. The registration table is untouched: it describes the registry, which really does claim both keys. The gap between the two is filed as #8008, not decided hereGanttView/tasksundefinedconst schema = { … }widenedtypetostring, so it was not assignable where it was passedconst schema: ObjectGanttSchema, so every key in it is now checked against the shipped typeNo
packages/**source touched, no public type widened, no gate loosened, andno new
FRAGMENT_MARKER— declared fragments stay at 158, so all 18 blocksearn their coverage by compiling.
Probes — six, predicted in writing before each ran
Every mutation proven on disk (occurrence counts of the injected AND the deleted
text, plus
git hash-objectagainst the HEAD blob), every restoregit checkout HEAD -- ABSOLUTE_PATHproven by an emptygit diff HEAD, everyleg under a
trap … EXIT INT TERMwith absolute paths. No rebuild is owed onany leg, and that was reasoned rather than assumed: the gate reads the mutated
bytes straight from the working tree and no probe touches
dist/.206 covered … 21 ungated,661 — 503 to compile,503 of 503 judged, 0 failed. The entry is what suppressed the verificationtitleField: 42at line 744, inside a block this diff repaired521 of 521 judged, 1 failed,README.md:744:3 TS2322: Type 'number' is not assignable to type 'string'readme-navigation-example.test.ts: addbasePathback into the navigation fence5 passed; mutated3 failed / 2 passed— the accept assertion, the declared-members assertion and the section-wide onetasks: GanttTask[]tonumber[])GanttViewblock has its own declaration and stays green1 failed,README.md:87:3 TS2322: Type 'number[]' is not assignable to type 'GanttTask[]'— exactly oneGanttViewNopecheck:readme-exportsred with 1 fabricated; control green448 real, 0 fabricated; mutated exit 1,447 real, 0 wrong-path, 1 fabricated, naming line 79Gates — all at
2c6e3d6, clean tree, nothing pushed afterExit codes captured by redirect-then-capture, never through a pipe; each row
quotes the gate's own verdict line.
pnpm check:doc-snippetsScanned 227 document(s): 207 covered (105 of them hold a ts/tsx block), 20 ungated·521 of 521 block(s) judged, 0 failed·Every covered documentation snippet compiles against the built types.pnpm check:doc-fencesevery TypeScript block in 227 document(s) is fenced ts/tsx/typescriptpnpm check:readme-exports448 of them self-imports judged (448 real, 0 wrong-path, 0 fabricated)pnpm check:doc-typesEvery documented component type is registered.node scripts/check-doc-links.mjsLinks are valid across 17 scan roots.pnpm check:doc-example-readersOK 80 documented symbol(s), 3947 call site(s)pnpm check:control-bytesOK (scanned 6439 tracked text file(s); skipped 85 binary); plus a manual C0/DEL scan of both changed paths, no hitnode scripts/check-node-esm-load.mjsProvenance leg: 37 of 37 gradable entries were built by this tree.pnpm type-check:scriptsnode scripts/check-changeset-presence.mjsno changeset is owedcheck-governed-queue-guard.mjs --test(both paths)NOT GOVERNED — 2 path(s) checked against 5 governed surface(s); none matchedThe build came first and was forced:
turbo run build --filter=./packages/* --concurrency=2 --force,39 successful, 0 cached, 2m55s.--forcebecauseturbo shares one cache across every worktree of a checkout and
check-node-esm-load's provenance leg refuses artifacts this tree did notproduce — batch 17 measured exactly that failure.
Tests:
pnpm exec vitest runover every test file that reads either changedpath, derived with
git grep -land not guessed — 16 files,597 passed,including
scripts/__tests__/doc-version-claims.test.ts(a docs-only diff skipsCI's test shards by design, so a version literal on a doc surface would
otherwise red only in the merge queue). Owning package
pnpm exec vitest run packages/plugin-gantt/—Test Files 63 passed / Tests 496 passed;pnpm --filter @object-ui/plugin-gantt type-checkexit 0, itsoutput echoing
tsc --noEmit && tsc -p tsconfig.test.json.Readers of the changed README: the gate itself (proven by P1),
check:doc-fencesand
check-readme-exports(proven live by P6), and one live TEST pin —packages/plugin-gantt/src/readme-navigation-example.test.ts, which extracts thenavigation fence and parses it with the spec's
NavigationConfigSchema(provenlive by P4, non-vacuous by its own control leg).
Out of scope, filed rather than fixed: #8008 — the registered
ganttnodespelling has no declared schema type, which is why the direct-render example
moved to
object-ganttinstead of being annotated in place.This PR is a DRAFT and stays a draft: this seat does not flip ready, does not
enable auto-merge, and touches no labels or assignee.
🤖 Generated with Claude Code
https://claude.ai/code/session_01MM7kaS4dPpYHV5BsMyu4tQ
Generated by Claude Code