Skip to content

finding(gate): check:doc-types does not walk packages/NAME/README.md — a package README's type literals are judged by nothing, and objectui#7856's enumeration says otherwise #7896

Description

@claude

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

  1. 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.
  2. 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.
  3. 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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repofindingpm:queuepriority:p3tooling

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions