Measured while fixing objectui#7838, which asked for this number rather than an estimate. Filed as the shape of the next card; objectui#7838 deliberately changed no gate's population, because moving one is a change that carries its own ruling — objectui#7115 needed a dedicated card and a whole UNGATED_DOCS ledger entry to bring the root README.md in.
The gap, re-verified at 8507a2283
The repo-root docs/ tree is read by no documentation gate:
scripts/check-doc-snippet-types.mjs — listDocuments() walks content/docs (its DOCS_ROOT), the per-app docs trees, packages/NAME/README.md, and ROOT_PAGES = ['README.md']. No repo-root docs/.
scripts/check-readme-exports.mjs — its own census line prints 43 tracked README(s) under packages/ (0 outside any package).
lint:root — literally --ignore-pattern 'docs/**' in the root package.json script.
check:doc-fences and check:doc-types root at content/docs plus the same app/package trees.
So docs/*.md is an authored-documentation directory that nothing judges. objectui#7838 is the third phantom-teaching site found in it by hand.
How big the tree is
17 markdown files, of which 5 hold any ts/tsx fenced block, 10 blocks total:
docs/ARCHITECTURE.md 5 blocks
docs/adr/0001-master-detail-subform.md 2
docs/adr/0036-field-conditional-rules.md 1
docs/adr/0057-console-ai-chat-one-conversation-docked.md 1
docs/audits/2026-07-objectview-detailview-schema.md 1
What it would report — measured, not estimated
Run over the gate's own analyze() / derivePackageTypePaths() / deriveDeclaredDependencyPaths() / compileSnippets(), against the gate's own build closure (pnpm exec turbo run build $(node scripts/check-doc-snippet-types.mjs --build-filter) --concurrency=2, 34/34 tasks successful), with the docs/ tree substituted for the document list. All 27 imported workspace packages were built, so this is a result and not an unmet prerequisite.
40 diagnostics, and the split is the interesting part:
|
count |
| syntax phase (blocks that do not parse as TSX at all) |
21 |
| semantic phase |
19 |
| total |
40 |
| subtree |
diagnostics |
docs/adr/** |
26 |
docs/*.md |
11 |
docs/audits/** |
3 |
By code: TS1005 x11, TS1109 x9, TS7031 x5, TS2304 x4, TS7006 x3, TS2552 x2, TS2323 x2, TS2393 x2, TS1011 x1, TS7053 x1.
⚠️ Tens of diagnostics is itself the answer to "why was it never added"
Half of the total (21) is the syntax phase: three files carry pseudo-code in ts/tsx fences that does not parse as TypeScript at all — docs/adr/0001-master-detail-subform.md alone accounts for 15. Those are not import defects; they are prose-shaped blocks in a code fence, and the gate's fragment-marker escape hatch would have to be applied to each before the tree could go green.
And 26 of the 40 sit in docs/adr/**, which is a governed surface (node scripts/check-governed-queue-guard.mjs --test docs/adr/0001-master-detail-subform.md). A card that brings the whole tree in is therefore partly a governed-surface change, which is a materially different review route from the rest of docs/.
Suggested shape for the card
Two cards, not one, and in this order:
docs/*.md only (the two top-level files, 11 diagnostics, ungoverned). Small enough to pay down or declare, and it is where the three phantom-teaching sites were actually found.
docs/adr/** and docs/audits/** separately, as a governed-surface card, where the honest first move is probably declaring the pseudo-code blocks as fragments rather than making them compile.
Either card must bring its own UNGATED_DOCS ledger entry or its own declaration, exactly as objectui#7115 did for the root README — the ledger is re-derived and never trusted, so an entry that names no live measurement fails the gate's own stale-ungated-entry check.
Related: objectui#7838 (found it), objectui#7417 / PR objectui#7836 (the root README's equivalent), objectui#7115 (the precedent for moving a doc gate's population), objectui#7854 (three more wrong names in the same ungated files).
Measured while fixing objectui#7838, which asked for this number rather than an estimate. Filed as the shape of the next card; objectui#7838 deliberately changed no gate's population, because moving one is a change that carries its own ruling — objectui#7115 needed a dedicated card and a whole
UNGATED_DOCSledger entry to bring the rootREADME.mdin.The gap, re-verified at
8507a2283The repo-root
docs/tree is read by no documentation gate:scripts/check-doc-snippet-types.mjs—listDocuments()walkscontent/docs(itsDOCS_ROOT), the per-app docs trees,packages/NAME/README.md, andROOT_PAGES = ['README.md']. No repo-rootdocs/.scripts/check-readme-exports.mjs— its own census line prints43 tracked README(s) under packages/ (0 outside any package).lint:root— literally--ignore-pattern 'docs/**'in the rootpackage.jsonscript.check:doc-fencesandcheck:doc-typesroot atcontent/docsplus the same app/package trees.So
docs/*.mdis an authored-documentation directory that nothing judges. objectui#7838 is the third phantom-teaching site found in it by hand.How big the tree is
17 markdown files, of which 5 hold any ts/tsx fenced block, 10 blocks total:
What it would report — measured, not estimated
Run over the gate's own
analyze()/derivePackageTypePaths()/deriveDeclaredDependencyPaths()/compileSnippets(), against the gate's own build closure (pnpm exec turbo run build $(node scripts/check-doc-snippet-types.mjs --build-filter) --concurrency=2, 34/34 tasks successful), with thedocs/tree substituted for the document list. All 27 imported workspace packages were built, so this is a result and not an unmet prerequisite.40 diagnostics, and the split is the interesting part:
docs/adr/**docs/*.mddocs/audits/**By code:
TS1005x11,TS1109x9,TS7031x5,TS2304x4,TS7006x3,TS2552x2,TS2323x2,TS2393x2,TS1011x1,TS7053x1.Half of the total (21) is the syntax phase: three files carry pseudo-code in ts/tsx fences that does not parse as TypeScript at all —
docs/adr/0001-master-detail-subform.mdalone accounts for 15. Those are not import defects; they are prose-shaped blocks in a code fence, and the gate's fragment-marker escape hatch would have to be applied to each before the tree could go green.And 26 of the 40 sit in
docs/adr/**, which is a governed surface (node scripts/check-governed-queue-guard.mjs --test docs/adr/0001-master-detail-subform.md). A card that brings the whole tree in is therefore partly a governed-surface change, which is a materially different review route from the rest ofdocs/.Suggested shape for the card
Two cards, not one, and in this order:
docs/*.mdonly (the two top-level files, 11 diagnostics, ungoverned). Small enough to pay down or declare, and it is where the three phantom-teaching sites were actually found.docs/adr/**anddocs/audits/**separately, as a governed-surface card, where the honest first move is probably declaring the pseudo-code blocks as fragments rather than making them compile.Either card must bring its own
UNGATED_DOCSledger entry or its own declaration, exactly as objectui#7115 did for the root README — the ledger is re-derived and never trusted, so an entry that names no live measurement fails the gate's ownstale-ungated-entrycheck.Related: objectui#7838 (found it), objectui#7417 / PR objectui#7836 (the root README's equivalent), objectui#7115 (the precedent for moving a doc gate's population), objectui#7854 (three more wrong names in the same ungated files).