Observation-class finding — a structural gap, measured while implementing objectui#7866. Filed unassigned, not claiming. Grading and domain:* are the triage seat's.
The claim
check:doc-types (scripts/check-doc-component-types.mjs) does not walk packages/NAME/README.md, while its two siblings check:doc-snippets and check:doc-fences do. So a package README's type literals are judged by nothing — this is objectui#7115's geometry ("the root README fell BETWEEN the two gates") rebuilt one directory over.
The gate says so itself, at check-doc-component-types.mjs:214-220:
Where the teaching prose lives. This gate walks content/docs, every apps/APP/docs/** tree (objectui#6600) and the root pages named below, and nothing else: not skills/**, not the package READMEs (check-doc-snippet-types.mjs covers those for its own question), not docs/**.
But check-doc-snippet-types.mjs covers those only for the TypeScript question — it extracts ts/tsx/typescript fences only (:489, :874). So a JSON block in a package README is read by neither: not for its type (doc-types is not there), not for its compilation (doc-snippets skips the fence language).
Measured on af05c88bb
Two-way mutation, each mutation proven on disk by counting injected and removed text, each restore proven by git hash-object equality with the HEAD blob:
| Case |
Mutation |
check:doc-types result |
| subject |
component type in packages/app-shell/README.md to action:buttonZZ |
EXIT=0, counters byte-identical to baseline (188 files / 1105 blocks / 887 literals / 770 registered) |
| control |
"type": "object-grid" to object-gridZZ in the root README.md |
EXIT=1, README.md:272 [unregistered-doc-type], counter 770 to 769 |
The control proves the instrument is alive. The byte-identical counters prove the package README is not in its scan population at all — not that the mutation was judged and forgiven.
Why this is worth a card rather than a note
objectui#7866 is a live instance: packages/app-shell/README.md taught two action:button examples in a shape nothing reads (a nested action bag), and no instrument fired at any point — not when the examples were written, not while they stood. On content/docs/guide/record-edit-modes.md (objectui#7440, the same defect) exactly one instrument read the blocks and read the type key, which at least bounded the blind spot. On a package README the blind spot is total.
Package READMEs ship to npm inside the package's files, so this is published teaching surface, not internal notes.
It also corrects a live open card
objectui#7856's enumeration states:
check:doc-fences and check:doc-types root at content/docs plus the same app/package trees.
That is accurate for check:doc-fences (it walks join(pkgDir, entry, 'README.md'), :222) but not for check:doc-types, per the gate's own header and the mutation above. Whoever picks up objectui#7856 should not rely on that line.
Shapes this could take — a maintainer call, hence finding not pm:queue
- Widen
check:doc-types onto packages/NAME/README.md. The cheapest, and the gate's own header already argues the principle for the app-docs widening it took at objectui#6600 ("a forward guard at zero yield is what objectui#7115 wishes had existed"). Cost: the widened walk will surface existing type literals across 39 package READMEs that have never been judged; expect a first-run diagnostic burst needing DOC_TYPE_EXEMPTIONS triage. ⚠️ Its header also carries an explicit "⛔ What this is NOT: a precedent for widening onto any other unscanned tree", so this needs a ruling, not a drive-by.
- A local pin under the owning package — e.g. a test in
packages/app-shell/ that parses its README's json fences and asserts no action:button example carries a nested action key. Narrow, cheap, and converts one file from human-read to gate-read, but does not generalize; it needs a positive control (inject the old shape, the pin must name itself) or it is a pin that cannot fail.
- Do nothing deliberately, and record it in
check-doc-snippet-types.mjs's UNGATED_DOCS ledger, which exists to make exactly this kind of unread surface a declared fact rather than an accident.
Related: objectui#7866 (the live instance), objectui#7115 (the root-README precedent for a file falling between two gates), objectui#7856 (the repo-root docs/ tree, same family; and the card whose enumeration this corrects), objectui#5250 (the JSON-fence half — that card is about fence LANGUAGE, this one is about scan POPULATION), objectui#7308 (doc-snippets' package-README walk stopping at the package root).
Generated by Claude Code
Observation-class finding — a structural gap, measured while implementing objectui#7866. Filed unassigned, not claiming. Grading and
domain:*are the triage seat's.The claim
check:doc-types(scripts/check-doc-component-types.mjs) does not walkpackages/NAME/README.md, while its two siblingscheck:doc-snippetsandcheck:doc-fencesdo. So a package README'stypeliterals are judged by nothing — this is objectui#7115's geometry ("the root README fell BETWEEN the two gates") rebuilt one directory over.The gate says so itself, at
check-doc-component-types.mjs:214-220:But
check-doc-snippet-types.mjscovers those only for the TypeScript question — it extractsts/tsx/typescriptfences only (:489,:874). So a JSON block in a package README is read by neither: not for itstype(doc-types is not there), not for its compilation (doc-snippets skips the fence language).Measured on
af05c88bbTwo-way mutation, each mutation proven on disk by counting injected and removed text, each restore proven by
git hash-objectequality with theHEADblob:check:doc-typesresulttypeinpackages/app-shell/README.mdtoaction:buttonZZEXIT=0, counters byte-identical to baseline (188 files / 1105 blocks / 887 literals / 770 registered)"type": "object-grid"toobject-gridZZin the rootREADME.mdEXIT=1,README.md:272 [unregistered-doc-type], counter 770 to 769The control proves the instrument is alive. The byte-identical counters prove the package README is not in its scan population at all — not that the mutation was judged and forgiven.
Why this is worth a card rather than a note
objectui#7866 is a live instance:
packages/app-shell/README.mdtaught twoaction:buttonexamples in a shape nothing reads (a nestedactionbag), and no instrument fired at any point — not when the examples were written, not while they stood. Oncontent/docs/guide/record-edit-modes.md(objectui#7440, the same defect) exactly one instrument read the blocks and read thetypekey, which at least bounded the blind spot. On a package README the blind spot is total.Package READMEs ship to npm inside the package's
files, so this is published teaching surface, not internal notes.It also corrects a live open card
objectui#7856's enumeration states:
That is accurate for
check:doc-fences(it walksjoin(pkgDir, entry, 'README.md'),:222) but not forcheck:doc-types, per the gate's own header and the mutation above. Whoever picks up objectui#7856 should not rely on that line.Shapes this could take — a maintainer call, hence
findingnotpm:queuecheck:doc-typesontopackages/NAME/README.md. The cheapest, and the gate's own header already argues the principle for the app-docs widening it took at objectui#6600 ("a forward guard at zero yield is what objectui#7115 wishes had existed"). Cost: the widened walk will surface existingtypeliterals across 39 package READMEs that have never been judged; expect a first-run diagnostic burst needingDOC_TYPE_EXEMPTIONStriage.packages/app-shell/that parses its README'sjsonfences and asserts noaction:buttonexample carries a nestedactionkey. Narrow, cheap, and converts one file from human-read to gate-read, but does not generalize; it needs a positive control (inject the old shape, the pin must name itself) or it is a pin that cannot fail.check-doc-snippet-types.mjs'sUNGATED_DOCSledger, which exists to make exactly this kind of unread surface a declared fact rather than an accident.Related: objectui#7866 (the live instance), objectui#7115 (the root-README precedent for a file falling between two gates), objectui#7856 (the repo-root
docs/tree, same family; and the card whose enumeration this corrects), objectui#5250 (the JSON-fence half — that card is about fence LANGUAGE, this one is about scan POPULATION), objectui#7308 (doc-snippets' package-README walk stopping at the package root).Generated by Claude Code