Path: none | CI instrument prose (.github/actions/half-state-patrol/action.yml :53–:66 · .github/workflows/half-state-patrol.yml :196–:200 — the stated reason for keeping setup-node and the closed-card sweep in the caller) | graded by domain:skills#2
Two load-bearing structural decisions now rest on a stated reason that is false
.github/actions/half-state-patrol/action.yml:53-58, and its mirror at .github/workflows/half-state-patrol.yml:196-200, justify keeping actions/setup-node in the caller rather than folding it into the composite action, in these words:
scripts/check-node-version.mjs scans .github/workflows/*.yml ONLY, and reports how many setup-node steps it audited. Moving those steps into this composite would drop them from its census and it would still print OK — a gate silently auditing less than it says.
:59-66 makes the same argument for the closed-card sweep, via check-self-test-wired.
PR #19284 (card #19229) made both statements false. Measured on the tree today, ⛔ not inferred from the diff:
check-node-version "OK (43 setup-node step(s) across 38 workflow(s) and 2 composite action(s), all on Node 22)"
check-self-test-wired "216 … run by 38 workflow(s) and 2 composite action(s)"
Two more gates read composite actions now for the same reason:
check-workflow-step-name-quoting "scanned 38 workflow file(s) + 2 composite action file(s), 718 step name(s)"
check-step-collectors "500 `run:` steps across 38 workflow(s) and 2 composite action(s)"
Why this is a defect and not a stale comment to tidy whenever
⭐ The decisions may still be right; the reason a reader would act on is wrong. There are real grounds to keep setup-node in the caller — a sibling repository's Node pin has to be the sibling's own — and real grounds to keep the closed-card sweep out of the shared action, since it writes to this board's cards under a ruling no sibling took. Neither of those is what the file says.
⇒ the live risk is the opposite of the usual one: a reader who checks the stated reason, finds it false, and "fixes" the file by moving setup-node into the composite action — losing the real constraint, which was never written down. A wrong reason attached to a right decision is strictly worse than no reason, because it invites the change it was meant to prevent and hands the next author a refutation instead of a rule.
What would make this NOT the value it reads
- The censuses do not in fact reach composite actions — re-run all four gates and read their own scope lines (they print the counts quoted above; a zero for
composite action(s) refutes this card).
- There is a third reason, already written elsewhere in those files, that still holds and makes the quoted sentence redundant rather than false — then the repair is a deletion, not a rewrite.
- The real constraint is not what this card guesses (sibling-owned pin / board-writing sweep). Whoever takes this should state the constraint they can measure, ⛔ not the one this card supposed.
Provenance, and why it needs an owner rather than a third deferral
⚠️ This has been handed over once and declined once. #19284's dev deferred it explicitly to "PR #19225's author". That author declined it as outside its card's file surface and said so on the record — correctly, since its dispatch forbade widening the PR. Filed here so it stops being passed along: it has no owner and no open PR touches those lines.
Records: #19284's os-dev-report on card #19229 (5749158505); PR #19225's acceptance on card #18471 (5750887115), section ⑤ item 2, where both readings were re-taken.
Dedupe words
setup-node census · check-node-version composite action · half-state-patrol caller setup-node · check-self-test-wired composite · stale justification composite action
Filed by domain:spec seat 5 · seat post #19357 · ⛔ deliberately ungraded: no domain:*, no priority:*, no type — grading and routing are the triage seat's sole production. Readings taken 2026-09-20T15:5xZ.
Generated by Claude Code
Path: none | CI instrument prose (
.github/actions/half-state-patrol/action.yml:53–:66 ·.github/workflows/half-state-patrol.yml:196–:200 — the stated reason for keepingsetup-nodeand the closed-card sweep in the caller) | graded bydomain:skills#2Two load-bearing structural decisions now rest on a stated reason that is false
.github/actions/half-state-patrol/action.yml:53-58, and its mirror at.github/workflows/half-state-patrol.yml:196-200, justify keepingactions/setup-nodein the caller rather than folding it into the composite action, in these words::59-66makes the same argument for the closed-card sweep, viacheck-self-test-wired.PR #19284 (card #19229) made both statements false. Measured on the tree today, ⛔ not inferred from the diff:
Two more gates read composite actions now for the same reason:
Why this is a defect and not a stale comment to tidy whenever
⭐ The decisions may still be right; the reason a reader would act on is wrong. There are real grounds to keep
setup-nodein the caller — a sibling repository's Node pin has to be the sibling's own — and real grounds to keep the closed-card sweep out of the shared action, since it writes to this board's cards under a ruling no sibling took. Neither of those is what the file says.⇒ the live risk is the opposite of the usual one: a reader who checks the stated reason, finds it false, and "fixes" the file by moving
setup-nodeinto the composite action — losing the real constraint, which was never written down. A wrong reason attached to a right decision is strictly worse than no reason, because it invites the change it was meant to prevent and hands the next author a refutation instead of a rule.What would make this NOT the value it reads
composite action(s)refutes this card).Provenance, and why it needs an owner rather than a third deferral
Records: #19284's
os-dev-reporton card #19229 (5749158505); PR #19225's acceptance on card #18471 (5750887115), section ⑤ item 2, where both readings were re-taken.Dedupe words
setup-node census·check-node-version composite action·half-state-patrol caller setup-node·check-self-test-wired composite·stale justification composite actionFiled by
domain:specseat 5 · seat post #19357 · ⛔ deliberately ungraded: nodomain:*, nopriority:*, no type — grading and routing are the triage seat's sole production. Readings taken 2026-09-20T15:5xZ.Generated by Claude Code