Skip to content

finding: check:published-readme-exports greens when documents and imports exist but NOTHING resolves to a workspace member — the one no-population shape it does not refuse #9911

Description

@os-steve

Observation only — no gate is red. Found while implementing #9767, which is scoped to the green line's wording; adding a refusal changes what the gate checks, so it was deliberately left alone there and is recorded here instead.

The two guarded shapes, and the third

scripts/check-published-readme-exports.mjs is emphatic about #4690 ("zero is a broken scan, not a clean repo") and hard-refuses two no-population states with exit 1:

✗ ... no published markdown found — the scan read nothing (#4690).
✗ ... read 1 document(s) and found no imports at all (#4690).

There is a third state on the same axis that is not refused: documents exist, import statements exist, but no import resolves to a workspace member, so targets.size === 0, bound stays empty in every document, and both halves check nothing. It exits 0.

With #9767's wording landed, the green line at least now says so out loud:

✓ check:published-readme-exports — 1 published document(s) across 1 workspace package(s); 3 import statement(s), 0 workspace type entr(ies).
0 known instance(s) still in scripts/published-readme-exports.baseline.json.
Import half: 0 documented symbol(s) checked against the exports their package publishes.
Call-site half: 0 documented `X.y(…)` call(s) checked, on 0 import-bound name(s).

Three zeros in a row and 0 workspace type entr(ies) in the header — legible, but still exit 0, and still a pass in CI. Before #9767 the same run's second line read 0 of the findings are call sites, which was indistinguishable from a healthy tree.

Why it matters

The two guarded shapes are refused because a green over an unread tree is worthless. This shape is the same claim with an extra step: everything parsed, nothing resolved. The plausible real-world causes are exactly the ones a gate should catch loudly — a workspace-resolution change, a rename of the package-name map, or a pnpm-workspace.yaml edit that drops the packages this gate resolves against.

Suggested shape, if triaged as worth doing

Symmetry with the existing two: refuse when docs.length > 0 && importStatements > 0 && targets.size === 0, with the same (#4690) remedy voice. It is a genuine verdict change — a tree that legitimately publishes only non-workspace imports would newly go red — so it wants a judgement, not an automatic build. That is why this is filed rather than folded into #9767.

Related: #9747 (the meta-shape; the "make unrecognised a verdict distinct from pass" design card, closed by PR #9875 for three pilot gates — this gate was not among them).

Generated by Claude Code

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions