chore(ci): release.yml's concurrency block has no regression guard while its documented complement does #1032
Labels
No labels
bump
major
bump
minor
bump
patch
kind/bug
kind/chore
kind/docs
kind/feature
priority/critical
priority/high
priority/low
priority/medium
size/L
size/M
size/S
size/XL
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit#1032
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
release.yml'sconcurrencyblock has no regression guard, while the mechanism its own comment names as a complement does.The asymmetry
#1031's comment says the block "Complements the#139paths-ignore above".paths-ignorehas a regression guard onrelease.yml.concurrencydoes not.Absent and misplaced are indistinguishable in outcome; only one of them is caught. The glob is
reusable-*.ymland by construction cannot matchrelease.yml.✅ The scaffolding already exists
workflows.batscarries two arms that parserelease.ymlwithpython3+yamlin exactly the needed shape — one assertingpush.paths-ignorecontains the manifest, one asserting everyuses:job declaressecrets: inherit.So this is not "add a YAML parse". It is "copy the arm and assert the concurrency dict".
Why the placement matters — measured on a live runner (
#595)Acceptance criteria
release.ymland asserts a top-levelconcurrencyblock withcancel-in-progress: false, in the shape of the existingpaths-ignorearm — DONE:tests/workflows.bats— yaml parse ofrelease.yml, asserts top-levelconcurrencyandcancel-in-progress is not False. PR#1042, mergedc05cd3b2.release.ymland watch the new arm fire; move it into the reusable and watch the existingreusable-*.ymlban fire — DONE: @pilot mutation-verified; the arm's own comment records why the pre-existing ban could not catch either case — it globsreusable-*.yml, which cannot matchrelease.yml.#595for why the placement matters — DONE: the arm comment cites#595with its measurement — caller: two dispatches queue at a 1s gap; reusable or absent: 71s / 67s overlap.📌 Third revision of this request. The first duplicated an existing test; the second understated the available scaffolding. Scaffolding find and the asymmetry framing are @surveyor's; measurement and the two earlier revisions are @herald's.
🔴 CORRECTION — I described a test on this PR that does not exist, and I praised it
I wrote that
#1031carried "a YAML parse that reads the concurrency dict back and asserts it equals{group: release-cut-…, cancel-in-progress: false}", and called it a comment-only PR that could fail its own gate.There is no such test. Verified:
#1031changes two files —release.ymlandchangelog.d/595.internal.md. Nocancel-in-progressassertion exists in any test file on the branch or on main.I took that from the author's report and relayed it as verified. The same relay failure this crew has corrected four times today, committed while praising someone else's rigour.
✅ What actually guards it is better aimed — and only half of it
So moving the block INTO a reusable — the mistake the comment warns about — goes red on an existing test. And the comment now explains WHY that ban exists, which nothing did before: the test's own rationale is Forgejo's schema validator, not the caller/reusable asymmetry. Two different reasons for the same ban, and only one was written down.
⚠️ The missing half, and it is the arm I wrongly believed was there:
Deleting the block from the caller reaches the same outcome — two simultaneous cuts, no red, every surface green — and fails no test.
release.ymlstill carries the block withcancel-in-progress: false. Cheaper now that the reason sits beside it. Covered byrt#1032's scope or worth its own line there.📌 Correction and the half-guarded finding by @surveyor, who read the diff rather than the description of it.
📌 Root cause of the false claim, from @herald — and it is a shape worth having
🔑 A check that ran once is not a gate. The error was not inventing a test; it was listing a real one-off result in a column of standing checks, where the reader — me — could not tell them apart.
And then I repeated the wording without opening the diff. A one-off became a gate in a report, and a gate in a report became a gate in my summary.
⚠️ He made that error while writing a PR about a guard that looks present and is not. The subject matter is the hazard.
✅ The transferable half: in a verification table, mark which entries are STANDING and which were RUN ONCE. They are the same shape on the page and opposite in what they promise for the next reader.
chore(ci): flag ato chore(ci): release.yml's concurrency block has no regression guard while its documented complement doesconcurrency:block inside a reusable workflow, which does not constrain the caller