ci(half-state-patrol): state the measured reason the two steps stay in the caller - #19718
Conversation
…n the caller
The two files justified keeping `actions/setup-node` and the closed-card sweep
in the CALLING workflow with a census argument -- `check-node-version` and
`check-self-test-wired` derive their population from `.github/workflows/` and
only from there, so a step moved into the composite action would drop out and
the gate would still print OK. Both censuses read `.github/actions/**` as well
now, so the sentence is false: measured on this tree they print "2 composite
action(s)", and `collectInvocations` puts the sweep's own bytes in the
population under the composite action's name when they are presented as one.
A wrong reason on a right decision invites the change it was written to
prevent, so each bullet now carries what can be measured instead:
- setup-node: the action holds NO Node pin of its own, and the floor it
asserts is read from the `.nvmrc` that shipped with it. A setup-node step
inside the composite would install the very version that floor is then
compared against -- `check-node-version` holds every pin in this repo equal
to that same file -- so the check could never fail and would say nothing
about the caller's runner.
- the closed-card sweep: the true reason was already the first half of the
sentence (it WRITES to cards under a ruling no sibling took), so the false
half is deleted rather than rewritten.
Comment-only. The parsed YAML of both files is byte-identical to the base, and
every one of the 56 changed lines is a comment line.
Claude-Session: https://claude.ai/code/session_01Wnstp2kTth7sGXfr8fXypc
Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: ① Derived judgmentsRendered in-seat by the skills seat 1 session at the served tier the maintainer named on this date (the fable tier word at
② Semver levelNone — no release. ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
Fixes #19396
Comment-only, in two files. The stated reason for keeping
actions/setup-nodeand the closed-card sweep in the CALLING workflow was a census argument, and PR #19284 made it false. Each bullet now carries a constraint that was measured on this tree instead.The premise, re-measured on the base (
a251aaa19)All four censuses reach composite actions. Their own scope lines, exit code captured before any pipe:
premise_still_valid: true— zero composite actions would have refuted the card; both counts read 2.Two further readings, so the repair rests on measurement rather than on the card's guess:
scripts/check-node-version.mjsbuilds one list,[...workflowFiles, ...actionFiles], and its own header retires the constraint by name: "With both roots read, the constraint is gone: put the step wherever the composition wants it."collectInvocationstwice, once as a workflow and once as a composite action file.So a moved step stays in the population, under the composite action's own name.
The constraint that IS measurable, per step
actions/setup-node— the action holds no Node pin, and asetup-nodestep in it would need one. The floor asserted inLocate the patrol sourcesis read from the.nvmrcthat shipped with the action (action.ymllines 202-217, already in the file and still true).check-node-version.mjsholds everysetup-nodepin in this repo — workflows and composite actions alike — equal to that same.nvmrc. So asetup-nodestep inside the composite would install the very version the floor is then compared against:haveandfloorderived from one file, equal by construction, the comparison unable to fail, and no longer a reading about the CALLER's runner at all. That holds for a sibling pinning the action too, since both the pin and the.nvmrctravel at the same sha.This is not the card's guess ("a sibling repository's Node pin has to be the sibling's own"), and the guess is not measurable today: no sibling calls this action.
objectuicarries its own.github/workflows/half-state-patrol.ymlthat runs its own copy of the sweeper, holds no.github/actions/directory at all, and names this action nowhere. The only caller on either tree is this repo's ownuses: ./.github/actions/half-state-patrol.No gate requires the pin to be a literal in the caller:
check-node-versionacceptsnode-version-file: .nvmrcas the ideal form, fails an unresolvable expression, and cannot reach a sibling repo at all.The closed-card sweep — the repair is a deletion, which is the card's second exit. A true reason already sat in both files, first in the sentence: it is the one step of the old file that was never repo-agnostic, it WRITES to cards under a ruling this repo's board took, and no sibling has taken it. The false half (the
check-self-test-wiredpopulation argument) is deleted rather than rewritten, so what remains is what still holds.Proof that this is comment-only
Parsed YAML compared against the base blob with the repo's own
yaml@2.9.0, plus a control leg that must differ so the comparison is not one that cannot fail:And every changed line is a comment line:
No step moved; no
run:,uses:,with:,if:orpaths:byte changed.Line budget:
action.ymlblock 19 lines to 21 (+2); workflowsetup-nodecomment 5 to 5 (0); workflow sweep comment 9 to 3 (-6). Net -4 across the two files, against the suggested ceiling of +12 / -14.Gates
Derived with
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands(no paths; the script took the change set from the merge base itself), then reconciled with--ran. Exit codes captured before any pipe. Readings are quoted in the report comment on #19396; the union was re-run on the final commit..github/**ships in no package, so this carriesskip-changeset: all 70 non-private packages declare an explicitfiles[]and not one entry names.githubor the repo root.Acceptance notes
.github/actions/setup-pnpmis NOT a stale sibling sentence — checked because the edited sentence cited it. It was already repaired (lines 50-58): it records the blind spot as CLOSED and says the separation is kept for no constraint at all. That difference is now stated inaction.yml, so a reader who follows the pointer does not generalise setup-pnpm's retired reason to this action, which has a live one.objectuihas not adopted this composite action, and its copy of the sweeper diverges from the one the action ships — 13,194 lines against 36,717 atobjectui@0cf2d6644anda251aaa19. That is the copy drift this action exists to delete, one board along. Out of scope here and reported for the filing seat rather than touched.Generated by Claude Code