docs(plugin-list): compile every README snippet and leave the UNGATED_DOCS ledger - #8110
Conversation
… ledger Part of #5174 — batch 24 of the UNGATED_DOCS burn-down. packages/plugin-list/README.md leaves the ledger and every ts/tsx block on the page now compiles against the built types. The gate file's only change is the two lines of that one entry; the strictness region is byte-identical. The 8 diagnostics were three families: - TS7006x4 (implicit any on a callback parameter). Not annotated: the block simply binds ListView with a real self-import, and the parameters then take their types contextually from the shipped ListViewProps. Two are genuinely checked (ViewType and string); onSortChange / onFilterChange are declared any upstream, so those two compile without being checked — measured, and reported rather than smoothed. - TS2657x1 (JSX expressions must have one parent element). The block was a catalogue of two ALTERNATIVE grouping shapes, not two siblings a reader renders together, so it is split into the two blocks it really is rather than wrapped in a fragment that would have taught the wrong thing. - TS2304x3 (ambient names). Real self-imports of ListView, and the Schema section's hand-copied interface replaced by an example annotated against the shipped ListViewSchema. That hand copy had DRIFTED: it claimed six viewType values where the shipped union carries nine (tree, gallery and timeline missing), and the Features bullet named a "List" view type the union has never carried. The replacement annotates against @object-ui/types instead of restating it, and writes the vocabulary as a record keyed by the shipped union, so neither can go stale again without failing this gate. No packages/** source touched, no public type widened, no gate loosened, no new fragment marker (158 to 158). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr
…ated-docs-batch24
…ated-docs-batch24
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
|
Standing down on
Every other check on Generated by Claude Code |
|
Armed — squash auto-merge enabled and the PR is in the merge queue,
On MERGED: content probe on re-fetched Generated by Claude Code |
|
LANDED — merged at 2026-09-06T16:58:33Z as Content probe on re-fetched
#5174 stays open ( Generated by Claude Code |
Part of #5174 — batch 24 of the
UNGATED_DOCSburn-down.packages/plugin-list/README.mdleaves the ledger and every ts/tsx block on thepage now compiles against the built types. The gate file's only change is the
two lines of that one entry.
Notation, read this first
This repository has measured that GitHub's body sanitizer deletes tag-shaped
fragments even inside backticks and fenced blocks. So JSX elements and generic
parameters are spelled out in words below — "a ListView element", "a Record
keyed by the union" — rather than in their real angle-bracket form. The README
itself carries the real spellings; this page does not.
Concurrency
mainmoved under this batch three times. The first two were absorbed bymerging (never rebasing, never force-pushing); the third arrived after the final
measurement and is not in this branch.
295804a63to1f0f51d48— five PRs, including batch 23's docs(react-runtime): compile every README snippet and leave the UNGATED_DOCS ledger #8081 (sopackages/react-runtime/README.mdis now out of the ledger entirely ratherthan merely reserved) and fix(plugin-chatbot): fence chatbot-floating's raw props spread #8077, which moves
packages/plugin-chatbotsource. Package source moves the built types this corpus is judged
against, so the forced build, every gate, every probe and every test were
re-run on the merged head.
1f0f51d48to6a449fc49— five PRs, including fix(types): declarewrapperClasson Switch, Textarea, DatePicker, Select and List schemas, on both faces (objectui#7722) #8085, which declareswrapperClassonpackages/typessource, List schemas among them. Thatis the package this page's Schema block now annotates against, so everything
was re-run again. Readings were byte-identical: an added optional key does
not move an object literal that does not set it.
6a449fc49to7dcda9cd4— four PRs (i18n(gate): widen the defaults value-compare over the declared hand-rolled tables #8101, fix(security): FLS-gate $expand at seven remaining call sites (#7429) #8089, fix(types): correct the false "nothing reads AppComponentSchema.actions[]" changeset copy and widen its reader census #8100, fix(plugin-charts): honour series[].type override on a dataKey-shaped series too #8080) landedafter the final measurement at
5b0e22e31. This branch does not carrythem and nothing here was re-measured against them — stated as a gap, not
as a clearance. They touch package source, including
packages/plugin-list/src/ObjectGallery.tsxin this very package; no blockon this page composes
ObjectGallery, but that is a reading of the diff, nota measurement of the built types. CI on this PR is what judges it.
All 17 open pull requests' file lists were read over the REST files endpoint and
each count reconciled against that PR's own
changed_files: 8089/21, 8088/3,8087/2, 8085/6, 8082/36, 8081/2, 8080/3, 8077/5, 8076/6, 8075/3, 8073/2,
7749/4, 7685/67, 7058/24, 7054/2, 7053/2, 5400/1058. #5400's 1058-file list was
paged to exhaustion (11 pages) because the endpoint pages at 100 and a truncated
list renders as a confident absence. No open PR touches
packages/plugin-list/README.md.Live E2E (informational)is red on every branch today for an upstream reason(objectui#7990 / objectstack#16186), not because of this diff.
Ledger arithmetic
Both rows MEASURED by a real gate run, never computed. Base row at the current
merge base
6a449fc49bytes (probe M0, both paths checked out to the main blobsand proven equal by hash, restored under a trap); branch row at
5b0e22e31.6a449fc495b0e22e31UNGATED_DOCSentriescheck:readme-exports)Programmatic diff of the two
UNGATED_DOCSobjects — both imported as OBJECTS,never diffed as text: removed =
['packages/plugin-list/README.md'], added =[], reason-changed =[], survivor key order preserved = true.git diff --numstaton the gate file against the merge base is exactly0 2.On the branch: plugin-list entries 0,
packages/NAME/README.mdentries12 (from 13), control
'packages/auth/README.md'1.The strictness region — the
Fence scanningbanner line to EOF, 1178 lines onboth sides — hashes to
f46b5662ba336f026bca3a0003e0b7979789d48d0291fa5760be7d23c8ed0160on the mergebase and on the branch. Re-measured here on both sides, not inherited; it is the
value batches 15 through 23 recorded.
The ledger's reason string for this page was STALE, continuing the streak.
It claimed "1 parse diagnostic(s) — blocks fenced
tsthat are bare objectliterals or elided bodies; 7 undefined-name diagnostic(s)". Both halves are
wrong about what the debt was. The one parse diagnostic is not a bare object
literal or an elided body — it is TS2657, two sibling JSX elements with no
parent. And only 3 of the remaining 7 are undefined names; the other 4
are TS7006, implicit
anyon a parameter, which is not a missing-name problemat all but a strict-mode signature one. The total, 8, is the only figure the
string got right.
Census and the rung that decided
Re-taken on this batch's own base through the gate's exported
analyze()/compileSnippets(), one document un-gated at a time, over every non-excludedledger candidate.
Rung 1 does NOT decide on blocks alone: plugin-list TIES on 5 blocks with
packages/coreandpackages/plugin-kanban. Rung 1's second term (diagnostics)settles it — 8 against 6. Rungs 2 and 3 were never reached.
Assumption A1 is CONFIRMED — every block total, diagnostic total and
per-code figure matches batch 23's census exactly, and held across both merges.
Zero bound refusals on this page.
Exclusions re-verified against GitHub on this base, not inherited: the root
README.mdis not apackages/NAME/README.md;packages/react-runtime/README.mdwas batch 23's and merged mid-run, so it is out of the ledger rather than
reserved;
packages/auth/README.mdis held by open draft PR #7685;packages/plugin-chatbot/README.mdis deferred by the earlier ruling.The debt, and what each repair did
The 3 codes are 3 families, and one of them is new to this burn-down.
1. TS7006x4 — implicit
anyon a callback parameter. Paid down with NOannotation at all. The "With Callbacks" block passed four arrow functions to a
ListView element it never imported. With the element unresolved there is no
contextual type, so every parameter was an implicit
any. Binding the elementwith a real self-import is the entire repair: the parameters then take their
types from the shipped
ListViewProps. That is ruling 4's "bind through theshipped type" rather than annotating to a guess — no
anywritten, no lenientalias, and nothing hand-copied that could drift.
than counting four. Probe P8 assigns each parameter to a number:
view(
ViewType) andsearch(string) raise TS2322;sortandfiltersraisenothing, because the shipped props declare both as
any. The block compileshonestly either way, but two of its four documented callbacks are unverifiable
by construction. That is a shipped-surface weakness, not a doc defect, and
fixing it would move a public type — filed as objectui#8106, not decided
here.
2. TS2657x1 — JSX expressions must have one parent element. A real
fragment-shape signal, and the shape it signalled was "two blocks". The
grouping block held two sibling ListView elements: the spec-compliant
GroupingConfigand thegroupByshorthand. They are alternatives — thesecond is the shorthand form of the first, normalized into it internally — so a
reader never renders both. Wrapping them in a fragment would have made the block
compile while teaching something false. They are split into the two blocks they
really are, with the comments lifted into prose that says they are alternatives.
No fragment marker: declared fragments stay at 158.
3. TS2304x3 — ambient names. Two are the ListView element used without an
import (now real self-imports, which is why this diff hands
check:readme-exportsfour more self-imports to judge, 492 to 496, rather thanfewer). The third is
ListColumn, inside a hand-copiedinterface ListViewSchema— and that is where a real contradiction was found.The Schema section, and the drift it was carrying
A README-versus-same-package-shipped-type contradiction, fixed in the README
per ruling 5. The page restated
ListViewSchemaas a hand-written interface.Measured against the shipped type:
viewTypeunion lists six values; the shipped unioncarries nine —
tree,galleryandtimelinewere missing;listhas never been amember of the shipped union at all (it exists only as an
options.listbag).The shipped
ListViewSchemais deliberately not hand-written: its own doccomment records that a roughly 470-line hand-mirrored interface was replaced by
a zod-derived alias precisely "so this type can no longer drift from the
protocol" (issue #2231). The README was carrying exactly the drift that decision
was taken to end.
So the hand copy is replaced by an example annotated against
ListViewSchemafrom@object-ui/types, and the view-type vocabulary iswritten as a Record keyed by the shipped union. Both are now re-verified by this
gate on every commit, in both directions: probe P4 shows a value the union
does not carry fails (TS2353), and probe P5 shows a value missing from the
list fails (TS2741) — which is the direction that would have caught the actual
drift. The Features bullet now names the real vocabulary.
No
packages/**source touched, no public type widened, no lenient alias added,no gate loosened, and no new fragment marker.
Probes — a base measurement and eight probes, each predicted in writing first
Predictions were written to the scratchpad before any probe ran and were not
amended:
5174-b24-PREDICTIONS.md(md52411d2327d5093b092aeb644e6e19321) atimplementation commit
642e48041with a clean tree, plus one pinned addendum(
…-M0prime.md, md55b66c5b7f2e83b366ece14016c0bf83b) written before there-measurement that the first
mainmove forced. Every mutation is proven ondisk by occurrence counts of both the injected and the deleted text plus
git hash-objectagainst the HEAD blob; every restore is proven by an emptygit diff HEAD; every leg runs under atrap … EXIT INT TERMwith absolute paths,restoring with
git checkout HEAD --against an absolute path rather than abare checkout from the index. No dist preflight is owed, and that is a
measurement rather than an omission: both mutated paths are read from disk by
the gate itself, so no rebuild sits between a mutation and its reading.
listlisttreedeletedREADME.md:48schematoschemas)viewandsearchonlyP3 is the load-bearing one for this batch. It is what distinguishes "the
implicit-
anyfamily was paid down by binding to the shipped type" from "thediagnostics were silenced": remove the one import line and TS2304 and all four
TS7006 come straight back.
One prediction was falsified, and it is reported rather than smoothed. The
first M0 run returned exit 1 with 5 failures instead of the predicted clean base
row. The cause was not the repair:
refs/remotesis shared across worktrees, soorigin/mainadvanced inside the probe —git checkout origin/main --handedme the NEW main's gate file (react-runtime already removed) against a tree whose
react-runtime README was still the old one. The branch was merged, rebuilt
--force, and M0 re-run against the actual merge base, where it hit exactly.P2's and P6's absolute counts also shifted with the merges (by the +6/−5 block
offset and by #8081's +2 self-imports); the load-bearing halves — 8 diagnostics
over 3 codes, and 1 fabricated import naming this page — held in every run.
Gates — all at
5b0e22e31, clean tree, nothing pushed afterExit codes captured by redirect-then-capture, before any pipe; each row quotes
the gate's own verdict line. The build was forced first
(
pnpm exec turbo run build --filter=./packages/* --concurrency=2 --force, 39successful / 0 cached) and again inside the provenance gate (43 successful / 0
cached); every dist-sensitive gate was then re-run on that force-built dist.
Note the invocation: bare
turbois not on PATH in this container, sopnpm exec turbois what ran.pnpm check:doc-snippetsexit 0 — "Scanned 227 document(s): 214 covered (112 of them hold a ts/tsx block), 13 ungated" / "Covered blocks: 725 — 567 to compile, 158 declared fragment(s)" / "Root bound: no block imports a specifier that resolves only through this repository's ROOT manifest" / "Semantic phase: 567 of 567 block(s) judged, 0 failed" / "Every covered documentation snippet compiles against the built types."pnpm check:doc-fencesexit 0 — "every TypeScript block in 227 document(s) is fenced ts/tsx/typescript"pnpm check:readme-exportsexit 0 — "496 of them self-imports judged (496 real, 0 wrong-path, 0 fabricated)"pnpm check:doc-typesexit 0 — "Every documented component type is registered."node scripts/check-doc-links.mjsexit 0 — "Links are valid across 17 scan roots."pnpm check:doc-example-readersexit 0 — "OK 80 documented symbol(s), 3947 call site(s)"pnpm check:control-bytesexit 0 — "OK (scanned 6476 tracked text file(s); skipped 85 binary)"node scripts/check-node-esm-load.mjs --force-buildexit 0 — "Provenance leg: 37 of 37 gradable entries were built by this tree." Green on its first run, so no gate had to be re-run over a replayed sibling cache.pnpm type-check:scriptsexit 0node scripts/check-changeset-presence.mjsexit 0 — "2 file(s) changed, 0 of them published source of a package the release covers … no changeset is owed." Noskip-changesetlabel applied: this repository declares with an empty-frontmatter changeset rather than that label, and the presence gate says none is owed, so nothing was labelled at all by this seat.node scripts/check-governed-queue-guard.mjs --teston both paths exit 0 — "NOT GOVERNED — 2 path(s) checked against 5 governed surface(s); none matched"pnpm exec vitest run packages/plugin-list/— "Test Files 68 passed (68) / Tests 860 passed (860)";pnpm --filter @object-ui/plugin-list type-checkexit 0, its output echoingtsc --noEmit && tsc -p tsconfig.test.json, so the test tsconfig is genuinely included and the script really ran.grep -naPover the C0/DEL ranges found nothing (exit 1, zero output bytes).Lint, with the narrowing declared and its three evidence items.
pnpm linthere is
turbo run lintper package, so the repository-wide sweep is CI's run;the narrowed run over exactly this diff is
pnpm exec eslint --no-inline-config --format jsonon both paths — 2 entries,0 errors. eslint's own answer for the README is "File ignored because no
matching configuration was supplied", so the real lint surface of this diff is
the one
.mjsat 0 errors and 0 warnings. (1) The population eslint wouldotherwise judge is 4370 files by its own count. (2) That run exits 1 with
93 errors and 12177 warnings, and the touched files carry 0 of them —
measured, and reported rather than smoothed, because a reader must not mistake
the narrowing for a green repository. (3)
eslint.config.jsdeclares noproject,projectServiceorparserOptions.project(grep count 0), sotype-aware linting is off and this diff cannot move the verdict on any untouched
file.
Readers of the changed paths
Derived with
git grep -lon both paths on this head, not guessed — 16 testfiles, 578 tests, all green in one run, and the set was identical before and
after both merges.
A3 is CONFIRMED, and more strongly than for recent batches: no live test pin
names this README at all. The only file in the tree that named
packages/plugin-list/README.mdwas the gate's own ledger entry, which this PRremoves. Every one of the 16 readers is a reader of the gate file:
check-doc-snippet-types,check-doc-component-types,check-doc-expression-carriage,check-doc-fence-languages,check-links-workflow,check-readme-exports,check-skill-examplesandcomponent-node-vocabulary-7434underscripts/__tests__/, the fivepackages/types/src/__tests__/doc-surface suites,packages/plugin-gantt/src/readme-navigation-example.test.ts,packages/react/src/__tests__/LazyPluginLoader.jsdocExample.test.tsandexamples/schema-catalog/test/component-fixture-declared-keys.test.ts.(Batch 23 counted 17 because
scripts/__tests__/ci-cd-pipeline-doc.test.tsthennamed the gate file; on this head it no longer mentions it at all — checked, not
assumed.)
check-readme-exports.mjsis proven live on this page by P6, and this diff addsfour self-imports, so it hands that gate more to check than it had.
Out of scope
objectui#8106 —
ListViewProps.onSortChangeandonFilterChangearedeclared
any, so two of the four callbacks in the repaired block compilewithout either parameter being checked (measured by P8). Filed as an observation
rather than fixed: narrowing either is a public-type change with a consumer
sweep across
ObjectView,StudioDesignSurfaceand the app-shell hosts.objectui#8059 (the root bound versus a declared peer) did not bite here —
this page's only imports are its own package and
@object-ui/types, and thebound refused nothing. It was not refiled.
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_01FhBNJcLRZLe8M87VcUgpKr
Generated by Claude Code