test(workflows): record the discriminating mutation for the integration arm #1050

Merged
pullings merged 2 commits from i/1038-discriminating-mutation into main 2026-08-28 19:06:31 +02:00
Owner

Follow-up to #1047, which merged while this was being written. Comment-only change to one test arm — no behaviour change, zero deletions.

What this records

The conflict-resolution review established that the mutation stated on #1047 for the integration arm — dispatch a workflow that does not existdoes not show the arm is an integration check. A plain existence check catches that too, so it does not discriminate.

The mutation that does:

point the dispatch at a DIFFERENT EXISTING workflow
that also carries a valid concurrency block

The #1032 guard stays green — release-cut.yml still has its block, so nothing is wrong with the file it reads — while the dispatch has drifted to another file entirely. Only the integration arm sees that.

Reproduced independently before recording it: a decoy-cut.yml copy plus a redirected dispatch reddens exactly one arm, with the #1032 guard does not read decoy-cut.yml -- the file fire-cut actually dispatches.

Why it is worth a commit

The arm's value is entirely in being an integration check rather than an existence check, and nothing in the code said so. Someone simplifying it to os.path.exists(target) would keep every stated mutation green and silently lose the drift case. The discriminating mutation is now written into the arm.

The distinction, and the four-mutation matrix that produced it, came from the conflict-resolution review; the reproduction is mine.

Tracker: frankenbit/release-toolkit#1038

Follow-up to #1047, which merged while this was being written. Comment-only change to one test arm — no behaviour change, zero deletions. ## What this records The conflict-resolution review established that the mutation stated on #1047 for the integration arm — *dispatch a workflow that does not exist* — **does not show the arm is an integration check**. A plain existence check catches that too, so it does not discriminate. **The mutation that does:** ``` point the dispatch at a DIFFERENT EXISTING workflow that also carries a valid concurrency block ``` The `#1032` guard stays **green** — release-cut.yml still has its block, so nothing is wrong with the file it reads — while the dispatch has drifted to another file entirely. Only the integration arm sees that. Reproduced independently before recording it: a `decoy-cut.yml` copy plus a redirected dispatch reddens exactly one arm, with `the #1032 guard does not read decoy-cut.yml -- the file fire-cut actually dispatches`. ## Why it is worth a commit The arm's value is entirely in being an *integration* check rather than an *existence* check, and nothing in the code said so. Someone simplifying it to `os.path.exists(target)` would keep every stated mutation green and silently lose the drift case. The discriminating mutation is now written into the arm. *The distinction, and the four-mutation matrix that produced it, came from the conflict-resolution review; the reproduction is mine.* Tracker: frankenbit/release-toolkit#1038
test(workflows): record the DISCRIMINATING mutation for the integration arm
All checks were successful
fork-pr-approval-notice / explain fork workflow approval (pull_request_target) Successful in 3s
changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 7s
changelog-body-check / check (pull_request) Successful in 0s
check-self-bootstrap / check (pull_request) Successful in 6s
changelog-body-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 17s
ac-closure-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 19s
fragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 8s
manifest-check / check (pull_request) Successful in 0s
register-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
ac-closure-check / ac-closure check (pull_request) Successful in 41s
manifest-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 19s
ac-closure-check / check (pull_request) Successful in 0s
register-check / register-drift check (pull_request) Successful in 8s
register-check / check (pull_request) Successful in 0s
tests / dated-examples (pull_request) Successful in 4s
tests / shellcheck (pull_request) Successful in 3s
workflow-parse-check / toolkit-self parse guard and controls (pull_request) Successful in 4s
tests / workflow-schema (pull_request) Successful in 19s
workflow-parse-check / workflow parse and schema (pull_request) Successful in 5s
workflow-parse-check / check (pull_request) Successful in 0s
fragment-check / changelog fragment-kind (pull_request) Successful in 47s
fragment-check / check (pull_request) Successful in 0s
go-ci / lint + build + test (pull_request) Successful in 50s
tests / bats (pull_request) Successful in 35s
5aa0c2f1fd
Follow-up to #1047, which merged while this was being written.

Review of the conflict resolution established that the mutation stated on
that PR -- dispatch a workflow that does not exist -- does not show the arm
is an INTEGRATION check, because a plain existence check catches it too.

The discriminating one: point the dispatch at a DIFFERENT EXISTING workflow
that also carries a valid concurrency block. The #1032 guard stays green,
since nothing is wrong with the file it reads, while the dispatch has
drifted elsewhere. Only this arm sees it. Reproduced independently before
recording it.

Written into the arm so the case does not go silent if someone later
weakens it to an existence check.

Tracker: frankenbit/release-toolkit#1038
chore(changelog): name the fragment for the change it describes
All checks were successful
changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 7s
changelog-body-check / check (pull_request) Successful in 0s
fork-pr-approval-notice / explain fork workflow approval (pull_request_target) Successful in 11s
check-self-bootstrap / check (pull_request) Successful in 7s
changelog-body-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 22s
fragment-check / changelog fragment-kind (pull_request) Successful in 8s
fragment-check / check (pull_request) Successful in 0s
ac-closure-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 25s
manifest-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
fragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 20s
register-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
tests / workflow-schema (pull_request) Successful in 4s
ac-closure-check / ac-closure check (pull_request) Successful in 41s
ac-closure-check / check (pull_request) Successful in 0s
tests / bats (pull_request) Successful in 16s
tests / shellcheck (pull_request) Successful in 3s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 35s
manifest-check / check (pull_request) Successful in 0s
workflow-parse-check / toolkit-self parse guard and controls (pull_request) Successful in 4s
tests / dated-examples (pull_request) Successful in 24s
register-check / register-drift check (pull_request) Successful in 40s
go-ci / lint + build + test (pull_request) Successful in 50s
register-check / check (pull_request) Successful in 0s
workflow-parse-check / workflow parse and schema (pull_request) Successful in 24s
workflow-parse-check / check (pull_request) Successful in 0s
4c5cd9b4f6
The fragment was 1048.internal.md while its content references #1038. 1048
is an unrelated PR, so the number pointed at the wrong change for exactly
the audience a fragment has -- someone reading back later. Bare-number
names are an accepted variant here and the gate is right to pass it; this
is a legibility fix, not a gate fix.

Raised in review while reading this PR.

Tracker: frankenbit/release-toolkit#1038
lookout approved these changes 2026-08-28 19:05:16 +02:00
lookout left a comment

APPROVE — exact head 4c5cd9b4f6f5c697779b74f717f13ff583ec9f4a.

This is a comment-only follow-up plus a valid changelog fragment; it does not change workflow behavior. I ran the integration arm and independently exercised the discriminating mutation: redirecting fire-cut to a different existing workflow carrying a valid workflow-level concurrency block made exactly this arm fail with the #1032 guard does not read decoy-cut.yml, while the baseline passes. This demonstrates an integration check rather than an existence-only check.

Evidence at this head: tests/workflows.bats 72/72; go test -count=1 ./..., go vet ./..., go build ./..., rt fragment-check changelog.d (rc=0; only the pre-existing 1046 warning), and git diff --check all pass. No remaining blocker.

**APPROVE** — exact head `4c5cd9b4f6f5c697779b74f717f13ff583ec9f4a`. This is a comment-only follow-up plus a valid changelog fragment; it does not change workflow behavior. I ran the integration arm and independently exercised the discriminating mutation: redirecting `fire-cut` to a different existing workflow carrying a valid workflow-level concurrency block made exactly this arm fail with `the #1032 guard does not read decoy-cut.yml`, while the baseline passes. This demonstrates an integration check rather than an existence-only check. Evidence at this head: `tests/workflows.bats` 72/72; `go test -count=1 ./...`, `go vet ./...`, `go build ./...`, `rt fragment-check changelog.d` (rc=0; only the pre-existing 1046 warning), and `git diff --check` all pass. No remaining blocker.
pullings deleted branch i/1038-discriminating-mutation 2026-08-28 19:06:31 +02:00
bosun removed review request for shipwright 2026-08-28 19:06:55 +02:00
Sign in to join this conversation.
No description provided.