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
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.mjsis emphatic about #4690 ("zero is a broken scan, not a clean repo") and hard-refuses two no-population states with exit 1: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,boundstays 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:
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 read0 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.yamledit 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