docs(react-runtime): compile every README snippet and leave the UNGATED_DOCS ledger - #8081
Merged
Merged
Conversation
…ED_DOCS ledger Part of #5174 — batch 23 of the UNGATED_DOCS burn-down. All 5 ts/tsx blocks in packages/react-runtime/README.md now compile against the built types, so the document leaves the ledger. The gate file's only change is the two lines of that one entry; the strictness region is byte-identical. The 27 diagnostics across 7 codes were three families, not seven: - undefined ambient demo names (TS2304, TS18004 shorthand, TS2552) — the values a reader injects into the runtime scope, now declared; - a missing self-import of ReactRunner in three blocks; - one catalogue block that declared `Page` four ways. TS2300x4 plus the TS2813/TS2814 the ledger called "candidate real defects, un-triaged" are all downstream of that one collision, and are NOT defects: the lines are alternative sources shown together. They are named apart so the block compiles, with prose saying so. No packages/** source touched, no public type widened, no gate loosened, and no new fragment marker. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr
Brings in batch 22 (#8063, packages/layout/README.md leaves the ledger) and #8056, which moves packages/fields source and therefore the built types this corpus is judged against. Forced build, gates, probes and tests re-run on the merged head. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr
#8066 touches only scripts/check-skill-examples.mjs and its test — no package source, so the built types this corpus is judged against do not move and no rebuild is owed. Its test is a reader of the gate file, so the reader suite is re-run on this head. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr
Contributor
✅ 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
|
Contributor
Author
|
Standing down on Generated by Claude Code |
This was referenced Sep 6, 2026
baozhoutao
marked this pull request as ready for review
September 6, 2026 15:08
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.
Part of #5174 — batch 23 of the
UNGATED_DOCSburn-down.packages/react-runtime/README.mdleaves the ledger and all 5 of its ts/tsx blocksnow compile 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 ReactRunner element", "a
ComponentType" — rather than in their real angle-bracket form. The README itself
carries the real spellings; this page does not.
Concurrency
mainmoved under this batch twice, and both moves were absorbed by merging(never rebasing, never force-pushing).
BaseSchemaand pin the vocabulary #8064, docs(ci-cd-pipeline): correct the Half-State Patrol wiring and pin it against the workflow #8061, fix(fields): GeolocationField emits null for a cleared coordinate #8056 and test(app-shell,console): inherit the real surface in @object-ui/auth vi.mock factories #8054,taking
origin/mainfrom65ce8c576toa81336390. fix(fields): GeolocationField emits null for a cleared coordinate #8056 movespackages/fieldssource — package source, so the built types this corpus isjudged against move with it — so the forced build, every gate, every probe
reading and every test were re-run on the merged head.
origin/mainto295804a63. It touches onlyscripts/check-skill-examples.mjsand its test: no package source, so norebuild was owed — that is a measurement, not an omission. Its test is a
reader of the gate file, so the reader suite was re-run on this head.
All 9 open pull requests' file lists were read over the REST files endpoint and
each count reconciled against that PR's own
changed_files: 8064/3, 8063/2,8061/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/react-runtime/README.md.One neighbour worth naming, not an exclusion: PR #5400 (the release PR) edits
packages/react-runtime/package.jsonand its CHANGELOG. That manifest is whatscripts/__tests__/doc-version-claims.test.tscompares this README's peer lineagainst, so a version bump there is the one open change that could move a pin on
this page. This diff does not touch that line.
Live E2E (informational)is red on every branch today for an upstream reason(objectui#7990 / objectstack#16186), not because of this diff.
Ledger arithmetic
Base row measured at
origin/main295804a63bytes (probe M0'), branch row at8cefaa894. Both rows MEASURED by a real gate run, never computed.295804a638cefaa894UNGATED_DOCSentriescheck:readme-exports)Programmatic diff of the two
UNGATED_DOCSobjects — both imported as OBJECTS,never diffed as text: removed =
['packages/react-runtime/README.md'],added =
[], reason-changed =[], key order preserved for survivors = true.git diff --numstaton the gate file againstorigin/mainis exactly0 2.On the branch: react-runtime entries 0,
packages/NAME/README.mdentries13 (from 14), control
'packages/auth/README.md'1.The strictness region — the
Fence scanningbanner line to EOF, 1178 lines onboth sides — hashes to
f46b5662ba336f026bca3a0003e0b7979789d48d0291fa5760be7d23c8ed0160onorigin/mainand on the branch. Re-measured here on the dispatched base and onthe current merge base, not inherited; it is the value batches 15 through 22
recorded.
The ledger's reason string for this page was STALE, continuing the streak.
It claimed "25 undefined-name diagnostic(s) … plus TS2813x1 TS2814x1". The
measurement reads 20 in the undefined-name family (TS2304x13, TS18004x6,
TS2552x1) and 27 in total, and the string names neither the TS2300x4 nor the
TS2686x1 population at all.
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: react-runtime TIES on 5 blocks with
plugin-list, core and plugin-kanban. Rung 1's second term (diagnostics) settles
it — 27 against the next-best 8. Rungs 2 and 3 were never reached.
Assumption A1 is CONFIRMED — every block total, diagnostic total and
per-code figure matches batch 22's census exactly, including react-runtime's 7
distinct codes, the figure batch 21 reported as moving with the compiler
program's shape.
Exclusions re-verified against GitHub on this base, not inherited: the root
README.mdis not apackages/NAME/README.md;packages/layout/README.mdwasbatch 22's and has now merged, so it is out of the ledger entirely rather than
merely 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 7 codes are 3 families, not 7. The triage matters more than the count.
1. Ambient demo names the page never defines (TS2304x13, TS18004x6, TS2552x1 —
20 of the 27). These are the values a reader injects into the runtime scope
(
ObjectGrid,data,useAdapter), the source strings (code,src), theerror sink (
report) and the module object (dateFns). TS18004 is not JSX,as the dispatch wondered — the harness parses every block as TSX regardless of
the fence label, so a JSX-bearing
tsfence is never a parse error. TS18004 isthe object shorthand diagnostic, raised by the
scopeobject literals whoseshorthand keys named nothing. They are now
declare constbindings typed towhat each is used as. TS2552 is the same family with a near-miss attached:
useAdapterwas being matched against the DOM lib'sGPUAdapter.2. Three blocks used a ReactRunner element without importing it. The Imports
block and both halves of the scope block now self-import it, which is why this
diff hands
check:readme-exportstwo more self-imports to judge (490 to 492)rather than fewer.
3. The Accepted-source-shapes block declared
Pagefour ways — and this iswhere the ledger's "candidate real defects" claim is retired. That block is a
catalogue of alternative source strings: bare JSX, a function declaration, an
arrow expression, a class, then the
constform that does not get the implicitexport and the same form exported explicitly. They are alternatives, never one
program — but the harness gives each block its own virtual module, so all four
Pagedeclarations landed in one scope. TS2300x4 is that collision, andTS2813 and TS2814 — the two the ledger called "candidate real defects,
un-triaged" — are strictly downstream of it. Probe P4b proves this: recreate
the function-versus-class name collision alone and both codes come straight
back. Neither is a defect in the documented API. TS2686 was the same block's
Reactreference resolving to the UMD global once the block became a module.The four shapes now carry distinct names, and a new prose paragraph says why —
that each line is a separate source, that they are named apart only so the block
compiles as one program, and that the rule is about the shape the source starts
with, never about the name.
Reactis bound with adeclare consttyped as thereact module, matching what the runtime actually injects, so the page does not
tell a reader to import React into a source string when the README already says
Reactis always present.No README-versus-shipped-type contradiction was found. The props table
(
code,scope,fallback,onError) and the Lower-level API comments werechecked against the built
dist/index.d.tsand all match, so ruling 5 was notreached and nothing was filed under it.
No
packages/**source touched, no public type widened, no lenient alias added,no gate loosened, and no new fragment marker: declared fragments stay at 158.
Probes — two base measurements and nine probes, each predicted in writing first
Predictions were written to the scratchpad before any probe ran and were not
amended:
5174-b23-PREDICTIONS.md(md589e912d0714e2a2b8ee91d541e388338) atimplementation commit
2a7fb4884with a clean tree, plus two pinned addenda fora re-aim and a re-measurement (
…-P4b.md, md507cc94d60e06f0e21cb5a8436b0281c7;…-M0prime.md, md5e3187919f47ce2c04360e5c4da7be7a8). Every mutation is proven on disk byoccurrence 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 a barecheckout 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.
65ce8c576check:readme-exports295804a639beae7db…both sides)packages/react-runtime/README.md:99Three predictions were wrong, and all three are reported rather than smoothed.
page's blocks would drop out of the judged set. They do not: nothing refuses
them, so the gate judges all 554 and 5 fail. The load-bearing half — exit
1, exactly 27 diagnostics over exactly 7 codes on this page — held.
constto collide with anotherconstgives TS2451 "Cannot redeclare block-scoped variable" — correctTypeScript, and evidence my aim was wrong rather than the triage claim. P4b
re-aimed at the function-versus-class collision, which is what the base page
actually had, and was predicted in writing before it ran.
TS2814 came straight back, which is the claim that mattered. TS2300 did not
— a two-way function/class collision does not raise it; the base page's
TS2300x4 needed all four
Pagedeclarations. So the ledger's two "candidatereal defects" are proven downstream of the collision, and TS2300 is proven to
be the four-way catalogue shape specifically.
ReactRunner is a class component so a bad prop fails overload resolution. Same
meaning, different code: the message names
ReactRunnerPropsand says"Property 'scopes' does not exist … Did you mean 'scope'?", which is what makes
the point — the composition is genuinely CHECKED against the shipped props,
not merely parsed.
Gates — all at
8cefaa894, 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): 213 covered (111 of them hold a ts/tsx block), 14 ungated" / "Covered blocks: 719 — 561 to compile, 158 declared fragment(s)" / "Root bound: no block imports a specifier that resolves only through this repository's ROOT manifest" / "Semantic phase: 561 of 561 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 — "492 of them self-imports judged (492 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 6473 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. Its three ERR_UNKNOWN_FILE_EXTENSION lines are the gate's own by-design entries.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/react-runtime/— "Test Files 1 passed (1) / Tests 19 passed (19)";pnpm --filter @object-ui/react-runtime 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 4364 files by its own count. (2) That run exits 1 with
93 errors and 12171 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 — 17 testfiles, 607 tests, all green in one run.
scripts/__tests__/doc-version-claims.test.ts— the one live pin that names this README. It asserts the page'sreact ^18.0.0 || ^19.0.0prose line restatespeerDependencies.reactverbatim. This diff does not touch that line, and A3 is confirmed: exactly one live reader, as predicted.scripts/check-doc-snippet-types.mjs— the gate itself, which now COMPILES this page instead of excusing it; P1 proves the entry was what suppressed it.scripts/check-readme-exports.mjs— reads this README's self-imports, proven live by P6. This diff ADDS two, so it hands that gate more to check than it had.check-doc-snippet-types,check-doc-component-types,check-doc-expression-carriage,check-doc-fence-languages,check-links-workflow,check-readme-exports,check-skill-examples,component-node-vocabulary-7434andci-cd-pipeline-docunderscripts/__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.Out of scope
Nothing was filed this batch. The one wall this burn-down keeps meeting — the
root bound refusing a package's own declared peer — did not bite here:
reactis a declared peer of@object-ui/react-runtime, but it is mappedanyway because other workspace packages declare it under
dependencies, so thebound never refused it and this page needed no stand-in for it. objectui#8059
already records that trade-off and 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