release: 0.8.0 #114
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#114
Loading…
Reference in a new issue
No description provided.
Delete branch "release/0.8.0"
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?
Cuts 0.8.0. Two files, two edits, per CONTRIBUTING.md "Releases".
The stamp
VERSION:0.7.1-dev->0.8.0, bare.CHANGELOG.md:## Unreleasedrewritten to## 0.8.0 — 2026-07-19, with anempty
## Unreleasedput back above it — the re-arm half of the two-editstamp (#108). Main is never disarmed between this merge and the automatic
-devbumprelease.ymlmakes in the same job.Why 0.8.0 and not 0.7.1
Not a straight de-
devof the current value, deliberately. The shippingsection carries an
### Added(#96, the merge door), and #105 changesbox restoreto ask before it destroys — which breaks non-interactivecallers that did not pass
--force(our own drill needed exactly that).A patch number would understate both.
Verification on this tree
test/cli.shtest/release.shtest/labels-reconcile.shshellcheck -x bin/* **/*.sh.github/scripts/changelog-armed.shVERSION '0.8.0' agrees with the top section (Unreleased).github/scripts/release-notes.sh 0.8.0The #110 guard is the interesting one: this tree is precisely the case it was
written to permit. Bare
VERSION+ re-armed## Unreleasedon top takes the"either arrangement is legal" branch, and the half-ceremony backstop
(heavy-duty/rig#67) then runs
release-notes.shfor real and finds a populated0.8.0section. It passes on its merits, not by short-circuit.Merge-door interlock
Read out of
release.ymlrather than assumed. The decide step computesver=$(cat VERSION)=0.8.0(bare) andbase=$(git show HEAD^1:VERSION)=0.7.1-dev, landing in thebare, changed→ the ceremony: proceed arm. Itthen requires a merged,
release-labeled PR behind the commit (this one, labelset), extracts non-empty notes, and asserts no tag or release exists for
0.8.0— confirmed, neither does. The post-publish re-arm derives0.8.1-dev.⚠ The drill — NOT performed, and that is a maintainer call
CONTRIBUTING says: "This PR is where the release ritual hangs: the full drill
on real hardware, recorded in drill/RUNS.md." Reporting plainly rather than
quietly skipping it:
I could not run a meaningful drill here, and I have not written a RUNS.md
entry. No drill was run, so there is nothing to record, and fabricating an
entry in a file whose whole value is that it records what was actually measured
would be worse than the gap.
Why not, specifically — Incus is present in this environment, so this is not
a missing dependency:
runs in a network-isolated ephemeral VM. RUNS.md already documents this
configuration producing false readings: MU-2's egress FAIL was "a TLS
handshake that outlived its 8s budget under nested-KVM memory pressure," and
MU-3 needed right-sized boxes because "two 2GiB nested VMs on a 7.7GiB
host measured swap, not isolation." This host is 7.7GiB with zero swap —
the documented false-result shape.
drill/README: it rewrites firewall rules and phase D "deliberately mutates
the network and profile." Traps 8 and 9 record runs that left the host
minting boxes with no DNS at all. That is a self-inflicted wound with no
evidentiary upside given (1).
What CI did prove, and the exact delta. The
rehearsaljob passed on thisPR (4m53s, real Incus on the runner): install via
install.sh,setup-host,doctor, multi-user criteria a-l, and the #70 export/import round-trip. But
ci.yml says in its own words what that leaves out: "What container mode canNOT
validate is the VM trust boundary itself; that stays a real-hardware ritual
(drill/RUNS.md), same as the full drill." So the delta a release drill is meant
to add is specifically the VM trust boundary — and that is exactly the thing
a nested VM on a swapless 7.7GiB host is least able to measure honestly. The
semantics are proven; the boundary is not, and I cannot prove it from here.
What precedent actually shows. The only prior ceremony PR under this ritual,
#95 (
release: 0.7.0), changed exactly two files:VERSIONandCHANGELOG.md— no drill run, no RUNS.md entry. #56 (0.5.0) predates theritual and was a feature bundle. And
drill/RUNS.mdhas never been appendedby a release PR: every entry traces to hardening or feature work (#75, #74, #44,
#41). The CONTRIBUTING sentence has been in place since #83, i.e. it was already
there when #95 shipped without one.
So documented practice and the documented ritual disagree, and have since the
sentence was written. Whether to waive the drill for 0.8.0, or to block on a
real-hardware run on a host that can be formatted, is @danmt's call, not mine.
If it should be waived, the CONTRIBUTING sentence is arguably what needs the
edit — it describes a step no release has performed.
Minor, unrelated, not fixed here
CI's shellcheck sweep is
bin/* **/*.shwith globstar, which does not glob intodotted directories — so
.github/scripts/*.sh, including the newchangelog-armed.shandrelease-notes.sh, are not linted by CI. I ranshellcheck on them by hand (clean), but the coverage gap is real and outlives
this PR. Worth its own issue rather than a drive-by in a release PR.
Do not merge on my account — per CONTRIBUTING, the maintainer's merge is
the release.
Verdict: Approve — I agree with this as-is.
Pure two-file ceremony stamp at
8661067:VERSION:0.7.1-dev→ bare0.8.0CHANGELOG.md: empty## Unreleasedre-armed above## 0.8.0 — 2026-07-19with a populated shipping section under the stamp (the #108 two-edit shape)Minor bump is justified:
### Added(#96 merge door) plus restore prompt behavior that breaks non-interactive callers without--force.releaselabel present; checks green (check, rehearsal, reconcile, scope). Merge-door interlock should land bare-and-changed as described.Drill /
RUNS.mdgap is correctly flagged as a maintainer call, not a stamp defect — same shape as #95. No blockers from me.Verdict: I agree with everything and have no additional feedback. The ceremony diff is correctly re-armed, the 0.8.0 section and VERSION transition agree, all current checks pass, and no 0.8.0 tag or release exists. This approval covers the current head; it does not waive the repository's disclosed real-hardware drill or the maintainer's ship decision.
Verdict: Approve.
Reviewed head
8661067as a release ceremony against the CONTRIBUTING at this head, with every claim re-verified on a fresh worktree of this exact tree.Ceremony correctness
VERSION0.7.1-dev→ bare0.8.0;CHANGELOG.mdgains## 0.8.0 — 2026-07-19with an empty## Unreleasedre-armed directly above it (CHANGELOG.md:6-8) — exactly the two-edit shape CONTRIBUTING.md:55-67 mandates since #110. Nothing smuggled.2026-07-19is correct for today.Verified on this tree (not taken from the PR body)
bash test/cli.sh— 475 passed, 0 failedbash test/release.sh— 90 passed, 0 failed.github/scripts/changelog-armed.sh— passes in the stamped state:VERSION '0.8.0' agrees with the top section (Unreleased). This is the first release exercising the #110 VERSION-keyed guard on a bare tree, and it takes the either-arrangement-legal branch on its merits, with the half-ceremony backstop satisfied by a populated 0.8.0 section..github/scripts/release-notes.sh 0.8.0— exit 0, 264 non-empty lines, zero##headings inside the extraction, so no bleed into the 0.7.0 section (the0.7.0strings inside are prose references within 0.8.0 entries).bin/box:15readsVERSIONat runtime; no hardcoded version inbin/box,README.md, orinstall.shneeds a bump (remaining0.7.0mentions are historical prose about the flat-install migration).Merge-door interlock, simulated on this tree
releaselabel: present.ver=$(cat VERSION)=0.8.0(bare),base=$(git show HEAD^1:VERSION)=0.7.1-dev→ bare, changed → ceremony: proceed. The PR is a single commit atop currentmain(2c4f838, the #112 merge), so the merge commit's first parent will read the same transition.0.8.0tag (refs/tags/0.8.0→ 404) and no0.8.0GitHub release exist — the create-nothing-twice asserts hold.CHANGELOG completeness vs 0.7.0
First-parent log
0.7.0..HEADis exactly #97, #98, #101, #106, #109, #110, #112. Mapping to the 0.8.0 section: #97→#96 merge-door (Added), #110→#108 re-arm + VERSION-keyed guard, #112→#111 Ctrl-D loud abort (incl. thehost/pair), #109→#105 restore confirm, #106→#102 UFW SIGPIPE + self-diagnosing log block, #101→#99 incus-admin grant. #98 is the post-0.7.0-devbump ceremony and correctly carries no entry. Complete — nothing missing, nothing extra.Judgment calls, agreed with
### Added, and #105's restore prompt breaks non-interactive callers lacking--force— a patch number would understate both..github/scripts/*.shshellcheck coverage gap (globstar not entering dotted dirs) is real and correctly deferred to its own issue rather than patched inside a release PR.No blockers. The stamp is correct, the guard it was written for passes on it, and the merge door will read this tree as intended.
— automated review by
claude-bot-andresmgsl· heavy-duty-review-bot