gate(scripts): widen the expression-carriage census to check:doc-types' surface (objectui#7878) - #8105
Merged
baozhoutao merged 2 commits intoSep 6, 2026
Conversation
…s' surface (objectui#7878) The report-only census landed (PR #7868) pointed at `content/docs` alone, while its two sibling doc gates had already been widened onto the per-app docs trees (#6600) and the root pages (#7115). That is the #7115 geometry rebuilt one gate over: the root `README.md` fell between two gates' surfaces and taught an unregistered component type four times, for exactly one reason -- nothing read the file. The surface is now imported from `check-doc-component-types.mjs` rather than copied: `APP_DOCS`, `appDocsDirs` and `ROOT_PAGES` are the same objects, so there is nothing to drift. `DOCS_ROOT` stays spelled here (that gate declares it `const`, not `export const`) and is pinned against that file's source text. Report-only is unchanged: exit 0 on findings, exit 1 only when the instrument is broken. No predicate, exit-code or ci.yml change. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr
…ression-carriage-census-surface
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 16:10
baozhoutao
deleted the
claude/issue-7878-expression-carriage-census-surface
branch
September 6, 2026 16:26
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.
Fixes #7878
The report-only expression-carriage census landed (PR #7868) with its population pinned to
content/docs, while its two sibling doc gates had already been widened onto the per-app docs trees (#6600) and the root pages (#7115). This widens it to exactly the surfacecheck:doc-typeswalks —content/docs, everyapps/*/docstree, andROOT_PAGES— and re-verifies PR #7868's four properties on the new population.Report-only is unchanged: exit 0 on findings, exit 1 only when the instrument is broken. No predicate change, no exit-code change, no
ci.ymlchange (the step invocation is untouched).docs/ARCHITECTURE.mdThe card says the widening "brings
docs/ARCHITECTURE.mdand the root README into the census". It does not, and this is a correction to the card's premise, not a scope choice. Re-derived on this branch:scripts/check-doc-component-types.mjsdeclaresROOT_PAGES = ['README.md']andAPP_DOCS = { dir: 'apps', subdir: 'docs' }.docs/**in its exclusion list.check-readme-exportsprints0 outside any package;lint:rootignoresdocs/**.docs/tree is in no gate's walk. finding(docs):docs/ARCHITECTURE.mdteaches theObjectRendererphantom in 3 blocks — third file, anddocs/**is in no gate's scan surface #7838's site stays outside this census, and the rootdocs/tree is finding(gate): the repo-rootdocs/tree is in no doc gate's scan surface — measured, it would report 40 diagnostics, 26 of them in the governeddocs/adr/**#7856's open question — deliberately not answered here.So the widened surface gains the root
README.mdand theapps/*/docstrees, and nothing else. Option C (every tracked markdown file) was rejected on the card and is not implemented.The surface is imported, not copied
APP_DOCS,appDocsDirsandROOT_PAGESare now imported fromcheck-doc-component-types.mjs, so the two walks are the same objects rather than two arrays a test hopes are equal. The three gates that carry copies do so for a stated reason that does not apply here —check-doc-snippet-typespulls intypescriptat load, andcheck-doc-fence-languagesmust run with no install.check-doc-component-types.mjsimports node built-ins plusinvoked-as.mjs, the same four this gate already imported. (regenerate-known-schema-types.mjsalready imports that module, so cross-gate import is established here.)DOCS_ROOTis the one leg still spelled locally, because that gate declares itconstrather thanexport constand this card's file surface does not extend to that file. It is pinned against that file's source text, so the enumeration and the reading come from different places.Cross-check on this head:
check:doc-typesreportsScanned 188 doc file(s); this census reportsScanned 188 file(s).The census, alongside the
content/docsfigureAll three readings taken on this branch; the first two differ only by population, so the split below is exact rather than estimated.
${…}sites59df1dab2baseline (from the card)1f0f51d48ace6fd56cDelta attribution — the two movements, separated:
59df1dab2(row 1 → row 2, population held atcontent/docs): files 0, fences 0, nodes +2, sites −2, carried +12, uncarried −14. The entire headline movement is churn — the class's open cards repairing their own sites, which is what report-only was for.Per new document:
apps/console/docs/deployment.md1 fence,README.md4 fences;apps/console/docs/UI_IMPROVEMENT_PROPOSAL.mdandapps/console/docs/error-tracking.mdcontribute 0. All 4 new expression sites are carried, so the widening adds zero findings today.check-doc-component-typesjoined the same trees at zero present yield and said so in its own header. The argument is forward: #7115 is the card where the rootREADME.mdfell BETWEEN two gates' surfaces and taught an unregistered component type four times, for exactly one reason — nothing read the file. Leaving this gate pointed away from a tree its two siblings read rebuilds that geometry in the same gate family.Summary line printed on this head:
The surface label is spelled with a glob star rather than an angle-bracket placeholder on purpose: this line is quoted into pull-request bodies and issue comments, and GitHub's body sanitizer eats tag-shaped fragments.
PR #7868's four properties, re-verified on the widened population
SchemaRenderer.tsx's own call sites, the carriage map from the built@objectstack/specdist/ui/index.mjs. Either matching nothing is still exit 1, and the two pins that prove it still pass.0 UNPARSED, per fence language, on the widened set.json 203 (203 parsed, 0 unparsed); jsonc 6 (6 parsed, 0 unparsed). Dialect blind-spot probe kept and still reports none — the 4 new documents contributed 0 unparsed and 0 out-of-set JSON-like fences.apps/*/docstree, a root page) and asserts all three are found; a population-sabotage test removes the two new legs and requires exactly the two new findings to disappear. Two new relative controls run against the real widened corpus: droppingvisibleOnorcontentfrom the channels must report strictly more sites, and emptying the carriage map must report strictly more. ⛔ No finding count is pinned — that would make this gate blocking through the back door.Reverse verification — each new control proven able to fail
Every ablation ran from the committed implementation, mutated on disk with the change proven by counting the anchor text in both directions, restored with
git checkout HEAD -- PATH, and confirmed restored by an emptygit diff HEAD. Each script carried atraponEXIT INT TERM.content/docsanalyzeignores the injectedchannelsanalyzeignores the injectedcarriageAfter all four,
git statusclean and the suite back to 37/37.The
docsrow ofcontent/docs/guide/ci-cd-pipeline.md#3653 pins that table by command, so the row is owed in the same change. Only the surface clause moved — the posture sentence, the exit-code sentence, the
docs-links.ymlhistory and everything else in the row are byte-identical.ci-cd-pipeline-doc.test.ts(44 tests) passes; the gate's own wiring pin now also requires the row to name all three legs.Scope
Three files, exactly the dispatched surface:
scripts/check-doc-expression-carriage.mjs,scripts/__tests__/check-doc-expression-carriage.test.ts, and one row ofcontent/docs/guide/ci-cd-pipeline.md. No.github/workflows/ci.yml, nopackages/**, nodocs/**, nocontent/docs/releases/.Changeset: none owed.
node scripts/check-changeset-presence.mjson this head:3 file(s) changed, 0 of them published source of a package the release covers … no changeset is owed. Clause ② confirmed no — report-only census, no published export, no existing gate's predicate touched.check-governed-queue-guard --teston all three paths: NOT GOVERNED.Gates, all on
ace6fd56cExit codes captured by redirect-then-capture, never through a pipe.
node scripts/check-doc-expression-carriage.mjsControls pass;Blind spot: nonevitest run scripts/__tests__/check-doc-expression-carriage.test.tsvitest run scripts/__tests__/ci-cd-pipeline-doc.test.tsvitest run scripts/__tests__/pnpm type-check:scriptspnpm lint:rootpnpm check:doc-fencesnode scripts/check-doc-links.mjspnpm check:control-bytesgrep -naPover the escape classpnpm check:doc-typespnpm check:unreferenced-sourcespnpm check:pre-install-import-graphpnpm check:self-import,check:esm-specifiersnode scripts/check-changeset-presence.mjsnode scripts/check-governed-queue-guard.mjs --testpnpm check:node-esm-loadexits 1 in this worktree withonly 2 entries evaluatedonERR_UNKNOWN_FILE_EXTENSIONfor.cssfiles insidereact-grid-layoutandmaplibre-gl. That is an unbuilt-workspace precondition, not a reading about this change: it grades built package artifacts, and this diff touches no package source.Live E2E (informational)is red on every branch today for an upstream reason (#7990) and is not this change's.Back-links, no closing keywords: #7851 · PR #7868 · #7838 / PR #7859 · #7856 · #3653 · #7115 · #6600 · #7872.
Generated by Claude Code