Found and measured while fixing #13429 (PR on claude/issue-13429-pipe-shape-advisory-siblings). Out of scope there: that card is about the advisory's CONTENT; this is the interpolated command beside it, a separate defect with a separate fix.
The defect
scripts/import-prerequisite.mjs derives the gate name from the importer's basename:
constgate=fileURLToPath(importerUrl).split('/').pop().replace(/\.mjs$/,'');and then prints a command that hard-codes the scripts/ directory: node scripts/${gate}.mjs .... The basename is right for the 42 importers under scripts/**, and wrong for the three that are not:
packages/lint/scripts/check-doc-formula-expressions.mjspackages/lint/scripts/check-doc-security-posture.mjspackages/lint/scripts/check-reference-carrier-shape.mjs
Measured, not reasoned
On claude/issue-13429-pipe-shape-advisory-siblings at 8f739a646, with @objectstack/formula deliberately unbuilt:
$ node packages/lint/scripts/check-doc-formula-expressions.mjs
check-doc-formula-expressions: PREREQUISITE NOT MET — the workspace package `@objectstack/formula` is not built
...
`node scripts/check-doc-formula-expressions.mjs > /tmp/check-doc-formula-expressions.log 2>&1; echo "EXIT=$?"`.
There is no scripts/check-doc-formula-expressions.mjs. Copy-pasting the printed line answers Cannot find module, which reads as a second, unrelated breakage rather than as a typo in the banner. The derivation predates #13429 and is untouched by it — that PR changed the sentence around this command, not the command.
Why it matters more than a cosmetic path
The whole point of this banner is that the reader is already confused about why a gate exited non-zero. Handing them a command that fails for a THIRD reason is the failure mode the module exists to end, one level down.
Suggested shape
Derive the repo-relative path rather than the basename — the module already has importerUrl and can locate the repo root — so the printed command is the one the reader actually ran. The gate NAME in the headline is correct as a basename and should not change; only the command needs the real path. scripts/import-prerequisite.mjs --self-test is the place to pin it, next to the advisory pins #13429 added.
Severity not judged. No gate verdict is computed from this text; it wastes the reader's next step.
Generated by Claude Code
Found and measured while fixing #13429 (PR on
claude/issue-13429-pipe-shape-advisory-siblings). Out of scope there: that card is about the advisory's CONTENT; this is the interpolated command beside it, a separate defect with a separate fix.The defect
scripts/import-prerequisite.mjsderives the gate name from the importer's basename:and then prints a command that hard-codes the
scripts/directory:node scripts/${gate}.mjs .... The basename is right for the 42 importers underscripts/**, and wrong for the three that are not:packages/lint/scripts/check-doc-formula-expressions.mjspackages/lint/scripts/check-doc-security-posture.mjspackages/lint/scripts/check-reference-carrier-shape.mjsMeasured, not reasoned
On
claude/issue-13429-pipe-shape-advisory-siblingsat8f739a646, with@objectstack/formuladeliberately unbuilt:There is no
scripts/check-doc-formula-expressions.mjs. Copy-pasting the printed line answersCannot find module, which reads as a second, unrelated breakage rather than as a typo in the banner. The derivation predates #13429 and is untouched by it — that PR changed the sentence around this command, not the command.Why it matters more than a cosmetic path
The whole point of this banner is that the reader is already confused about why a gate exited non-zero. Handing them a command that fails for a THIRD reason is the failure mode the module exists to end, one level down.
Suggested shape
Derive the repo-relative path rather than the basename — the module already has
importerUrland can locate the repo root — so the printed command is the one the reader actually ran. The gate NAME in the headline is correct as a basename and should not change; only the command needs the real path.scripts/import-prerequisite.mjs --self-testis the place to pin it, next to the advisory pins #13429 added.Severity not judged. No gate verdict is computed from this text; it wastes the reader's next step.
Generated by Claude Code