fix: the release suite accepts the ceremony's own tree #146
Labels
No labels
blocked
blocker:ci-red
blocker:conflict
blocker:drill-pending
blocker:unrequested
bug
claimed
documentation
enhancement
epic
merge-next
needs-triage
ready
release
scope:cli
scope:drill
scope:host
scope:installer
scope:templates
scope:tiers
stale
state:addressing
state:bots-reviewing
state:building
state:needs-human
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: heavy-duty/box#146
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/release-suite-ceremony-tree"
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?
test/release.shfails on the one tree that has to be green for a release toship: the release ceremony's own.
The defect
Two of the monotonic fixtures pin the fact that the other guard is green on a
tree
changelog-monotonic.shrejects — the whole reason that script exists:$G/CHANGELOG.mdis the fixture.$ROOT/VERSIONis box's real VERSION. Sowhat those two checks assert depends on what box happens to be versioned at on
the day you run them.
-devtree,changelog-armed.shtakes its development branch, wants## Unreleasedon top, finds it, passes. This is why nobody has seen it.VERSIONis bare, so the guard takes its releasebranch instead and demands a non-empty section for that version — inside a
fixture changelog that has only ever contained
## 0.8.0.Two failures, and they appear only while cutting a release.
Reproduction
On
maintoday, with nothing else changed:The fix
grepo()now writes its ownVERSION, and the two checks read that — which iswhat
tree()andarmed()have done since they were written, a hundred linesfurther up the same file:
The monotonic fixtures were simply the later arrivals (#122, #126) that never
got the same treatment.
-devis the right fixture value because every one ofthese fixtures tops out at
## Unreleased, which is exactly what a developmenttree is required to carry — so the checks still assert what they were written to
assert, just hermetically.
This is not a new class of bug in the family. rig and cast each hit it and
fixed it before their first releases — heavy-duty/rig#45 and heavy-duty/cast#109,
both titled "the release suite accepts the ceremony's own tree". Box's instance
survived because it lives in fixtures added after that sweep.
Verification
test/release.sh,-devtreetest/release.sh, bareVERSION(ceremony)test/cli.shtest/labels-reconcile.shshellcheck -x bin/* **/*.shchangelog-armed.shchangelog-monotonic.sh origin/mainThe clean-baseline number matters here:
mainat9fcd2e4in a fresh worktreeis 134 passed, 0 failed, so the two failures are caused by the ceremony tree
and nothing else.
Found by running the suite on a real ceremony tree, not by reading it.
Why it is its own PR
It blocks the 0.9.0 release, and a release PR is meant to be two files. Same
shape as rig#45 and cast#109, which both landed ahead of their releases.
Verdict: Approve — I agree with this as-is.
Why
grepo()fixtures ranchangelog-armed.shagainst$ROOT/VERSION, so bare ceremonyVERSIONtakes the release branch and demands a section the fixture never had. Only fails when cutting a release.grepo()writes its ownVERSION(0.8.1-dev), commits it, and the two FINE checks read$G/VERSION.-devis the right fixture value — every mono fixture tops at## Unreleased.@
f7058b2✅ Approved — I agree with all of this, no concerns.
Verified the mechanism from the diff:
grepo()fixtures now carry their ownVERSIONexactly astree()has always done, and the two #122-gap checks read$G/VERSIONinstead of$ROOT/VERSION(test/release.sh:346, test/release.sh:367). That removes the only path by which the repo's real version leaked into fixture assertions, and the both-ways verification (134/0 on a-devtree and on a bare-VERSION ceremony tree) pins it. The0.8.1-devliteral is fine — only the-devsuffix is load-bearing, so it can't rot as versions bump. Same shape as rig#45/cast#109, correctly scoped as its own two-file PR ahead of 0.9.0.— automated review by
claude-bot-andresmgsl· heavy-duty-review-botVerdict: I agree with everything and have no additional feedback. The fixtures now carry and consume their own development VERSION, removing the ceremony-tree dependency while preserving the intended guard interaction; all checks pass.
@danmt — round 1 closed, all three bots approving with no changes requested and no nits to address. Handing this over.
What it fixes
test/release.shwas red on any release ceremony tree. Two monotonic fixtures ranchangelog-armed.shagainst a fixture changelog while handing it the repo's realVERSION, so the assertion depended on what box happened to be versioned at:-devtree → guard takes its development branch, wants## Unreleased, finds it, passes. Invisible.VERSION→ guard takes its release branch and demands a non-empty section for that version, inside a fixture that only knew## 0.8.0. Two failures, only ever while cutting a release.grepo()now writes its ownVERSIONand the checks read it — the patterntree()/armed()have used since they were written, a hundred lines up the same file. The monotonic fixtures were the later arrivals (#122, #126) that never got it.Round history
One round, three approvals, zero changes requested:
grok-bot-andresmgsl-devis the right fixture valueclaude-bot-andresmgslcodex-bot-andresmgslVerification
test/release.sh,-devtreetest/release.sh, bareVERSIONtest/cli.shtest/labels-reconcile.shshellcheck -x bin/* **/*.shThe clean-baseline number is the one that matters:
mainat9fcd2e4in a fresh worktree is 134 / 0, so the two failures are caused by the ceremony tree and nothing else.Nothing flagged for your judgement
No design question here — this is a test-harness bug with a mechanical fix, and it is the same defect rig#45 and cast#109 each fixed before their first releases.
Ordering
This is the bottom of the box stack and wants to land first:
#146 (this)→#147 docs/changelog→#148 release: 0.9.0(draft until the two below it merge)0.9.0 cannot go green without this one.