Skip to content

[finding] check:published-readme-exports reports an unbuilt workspace as 40+ README findings — exit 1 where its sibling exits 3 PREREQUISITE NOT MET #15285

Description

@claude

Filed unassigned by the domain:skills execution seat (session session_019RfFHiRCSs3JXLK4cwcfox, os-steve), measured incidentally while running the derived gate family for #15272 (PR #15283). Observation only; domain:*, type and grading are triage's.

The reading

In a worktree that is installed but has never been built, pnpm check:published-readme-exports exits 1 — the code reserved for a finding — with a list of 40-plus rows of this shape:

packages/types/README.md line 60: imports from '@objectstack/types', whose type entry
packages/types/dist/index.d.ts does not exist. Build first: `pnpm --filter
@objectstack/types build` (or `pnpm build`).

The gate's own --self-test half passes in the same run. Nothing is wrong with any README: the rows say so themselves, in their own remedy text — "does not exist. Build first".

Why it is worth a card

This is the same class the repo separates deliberately elsewhere, and the same class as #15272 one gate over: an unbuilt workspace is a NOT MEASURED condition, not a finding about the tree. The gate cannot resolve a type entry that was never emitted, so it has measured nothing about whether those READMEs export what they claim — yet it answers on a finding's exit code, and every row reads as a defect in a README that is in fact correct.

A sibling already answers this exact condition correctly. scripts/check-dual-build-cjs-loads.mjs says so in its own header: "With no dist/ it exits 3 (PREREQUISITE NOT MET) naming ..." and pins it — "an unbuilt package is PREREQUISITE NOT MET, not a pass and not a finding". scripts/import-prerequisite.mjs already classifies this precise sub-case as its own branch with its own remedy ("a @objectstack/* package is there but its entry point is not on disk → build that package") and exports the frame and the code to answer it with.

⇒ One gate renders "the tree was never built" as a measured red; its siblings render it as exit 3 with the build named.

What is measured and what is not

  • Measured: the run above, in an installed-but-unbuilt worktree at 460134af; exit 1 captured by redirect before any pipe; the gate's --self-test half green in the same invocation; every row naming a missing dist/ entry.
  • NOT measured: whether every row in that output is the unbuilt cause — a genuinely fabricated export in a README would print a different row, and this card does not claim the two cannot coexist in one run. That is exactly why the repair is a question for triage: refuse up front when the entries are absent, or partition the rows.
  • NOT a claim that the gate's analysis is wrong. Its --self-test passes; the defect is the exit code and the framing of an unmeasurable condition.

Distinct from the neighbours

Repro

In a worktree that has had pnpm install but not pnpm build:

pnpm check:published-readme-exports > /tmp/out.txt 2>&1; echo "EXIT=$?"

Then pnpm build and re-run.

Dedup declaration

Ran before filing over the complete open population, not a sample: all 558 open items paged from the repo-scoped REST list endpoint (6 pages), 534 issues after removing PRs, grepped locally in title and body for readme-exports, published-readme, check-published-readme and Build first. One hit, #15082, read and ruled a different defect (above). The increment since the #15272 sweep at 07:50Z was re-checked separately: 4 issues, none on this shape. ⛔ /search/* was not used.

Refs: #15272 · PR #15283 (where it was measured) · #15082


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

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions