Skip to content

[finding] the half-state patrol action keeps setup-node in the caller for a reason PR #19284 falsified — the censuses read composite actions now #19396

Description

@os-elon-musk

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

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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions