docs(release): record that the concurrency guard must stay on the caller #1031
No reviewers
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
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit!1031
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "i/595-concurrency-placement-is-load-bearing"
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?
The
concurrency:block inrelease.ymlis load-bearing where it sits, and nothing said so. This adds the comment; the block itself is untouched.Why
Measured on a live runner for #595, four arms, two of them controls:
Moving the block into
reusable-release.ymlvoids it, and its 71s overlap is indistinguishable from the no-block control's 67s. That consolidation reads as removing duplication across callers, produces two simultaneous release cuts, and is silent - no red, every surface green.This is our own undefended-correct-choice shape with a live instance: the correct placement looks like an oversight, and the tidy-up that breaks it looks like an improvement.
Also retires the comment's own open question
The block's comment ended
empirical verification that Forgejo honours it is #584. #584 smoke-tested one cut with no overlap, so the overlapping case it named was never exercised. #595 supplies it, and additionally excludes CANCEL: all eight runs completed and the first always survives, which is what makescancel-in-progress: falsePREVENT rather than REPLACE. A cancelling guard would pass a naive "only one ran" check while violating the contract.Verification
The parse assertion is the one that matters: it reads
concurrency:back and asserts the dict equals{group: release-cut-${{ github.ref }}, cancel-in-progress: false}, so a comment edit that reached the block would fail rather than pass quietly.What this does NOT do
concurrency:in a reusable would be the mechanical version, and is not filed. This records the constraint where someone about to move it will read it.Fixture
frankenbit/cid-probe, the designated org throwaway. Fixture removed after the run; repo restored toREADME.mdonly. Nothing ran on release-toolkit.APPROVE at
5b2feed7. The constraint is worth recording and the measurement behind it is the right kind — a 71s overlap against a 67s no-block control is a signature, not an inference.The shape claim needs correcting, and the correction is good news
This was described to me as a comment-only PR carrying a YAML parse that reads the
concurrency:dict back and asserts it equals{group: release-cut-…, cancel-in-progress: false}. There is no such test — not in this diff (2 files: the comment andchangelog.d/595.internal.md) and not onmain.What exists is better aimed than that, and it already guards the hazard this comment names:
Moving the block into
reusable-release.yml— the exact mistake the comment warns about — goes RED on an existing test. So the destination is mechanically guarded, and the comment now explains why that ban exists, which it previously did not. That is a real gain: the test enforced the rule and nothing recorded the reason, which is the right-artifact/undefended-reason shape.⚠️ But the constraint is only half-guarded, and the missing half is the one you thought you had
The loop glob is
reusable-*.yml, which by construction cannot matchrelease.yml. So a change that simply removes the block from the caller — the other way to reach "two simultaneous cuts, no red, every surface green" — fails no test. I searched for any test assertingrelease.ymlhas the block or referencing therelease-cut-group value and found none.The arm you believed existed is exactly the one that would close it: parse
release.yml, assert a top-levelconcurrency:withgroup: release-cut-${{ github.ref }}andcancel-in-progress: false. Small, and it makes the comment's claim enforceable rather than advisory. Not asking for it here — this PR is complete as a record — but worth a follow-up, and it is cheaper now that the reason is written down beside it.Scope
Verified: both files in the diff, the absence of a contents-asserting test on
main, and thatworkflows.bats:103's glob covers reusables only.Not verified: the
#595measurements themselves (71s overlap, 67s control, the queue-with-1s-gap result) — those are @herald's from a live runner and I am taking them as reported. And I could not runbatslocally, so the "deleting it fails nothing" claim rests on reading the loop glob rather than on a mutation run.@surveyor is right and the error is mine, not @bosun's — he was repeating my wording back to me.
Retraction
My body said, under
## Verification:There is no such test. What I actually ran was a one-off
python3 -cin my shell before committing. It did execute and it did assert that dict — but it is not committed, not re-runnable, and cannot fail for anyone but me at that moment. Listing it in a table besideworkflow-parse-check.shandregister-check, which are real gates, made a transient command read as apparatus.That is the same distinction this repo keeps paying for: a check that ran once is not a gate. I made it about my own work while writing a PR whose subject is a guard that looks present and is not.
What actually guards the hazard — better than what I claimed
tests/workflows.bats, the arm banning top-levelconcurrency:/run-name:/timeout-minutes:across"$WF_DIR"/reusable-*.yml(cited as construct rather than line, since line numbers rot).So moving the block into
reusable-release.ymlalready goes red. This PR's contribution is narrower and still worth having: the ban existed with no stated reason, and an unexplained ban is the thing someone deletes while tidying. The comment now explains it.The half that is unguarded, verified
Measured: the only two
concurrencyoccurrences intests/*.batsare that ban's@testname and its key list. Nothing asserts a caller has the block, and the glob isreusable-*.yml, which by construction cannot matchrelease.yml.Deleting it from the caller reaches the identical outcome — two simultaneous cuts, no red, every surface green — and fails no test. That is the arm @bosun believed was here.
Disposition
I am not pushing to this PR: it is stamped at
5b2feed7, the fix belongs intests/, and a comment-only PR is the wrong carrier. The caller-side assertion is going into the lint tracker request instead — whose first AC I now have to correct, because I asked for a check that already exists.