release flow: VERSION, CHANGELOG, tagged releases, and a tag-resolving installer that pins box #32
Labels
No labels
attention
blocked
blocker:ci-red
blocker:conflict
blocker:drill-pending
blocker:unrequested
bug
claimed
documentation
enhancement
epic
merge-next
needs-ruling
needs-triage
offsite
post-merge
ready
release
scope:bootstrap
scope:coolify
scope:db
scope:docs
scope:drill
scope:installer
scope:labels
scope:platform
scope:runner
scope:users
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/rig#32
Loading…
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?
The problem
rig has no version identity at all: no
VERSIONfile, noCHANGELOG.md, no tags, no GitHub releases, and norig --version.install.shdownloadsarchive/refs/heads/mainand upgrades byrm -rf+ reinstall — so "what rig is this host running?" has no answer better than "whenever it last curl'd main". For the tool that hardens servers and closes root, that's the wrong answer: an incident wants to know exactly which rig converged this host.This is the rig half of the flow designed in heavy-duty/box#83 — same shape, minus box's extra machinery, plus the cross-repo pin.
The flow
1. Grow the version surface first.
VERSION(start at0.1.0) and arig --versionverb that reads it.CHANGELOG.mdwith an## Unreleasedsection; from then on, feature PRs land their entry as part of the PR (box's convention).2. A release is a PR, then a tag.
release: X.Y.Z— bumpsVERSIONand stamps the Unreleased section with version + date. CI (shellcheck, cli tests, the db round-trip) green on it.X.Y.Z(matching box's tag scheme), push the tag.3.
release.yml, on tag push:VERSION— fail loudly on mismatch, create nothing.CHANGELOG.mdsection andgh release createwith it as the body.4. The installer defaults to the latest release, not main.
RIG_REFunset → resolve the latest tag by following thereleases/latestredirect (Locationheader — no API, no token), downloadarchive/refs/tags/$TAG.tar.gz.RIG_REFset → tryrefs/tags/$REFfirst, fall back torefs/heads/$REF.RIG_REF=0.1.0= pinned,RIG_REF=main= dev. README documents all three; "Re-run any time to upgrade" stays true and now means "upgrade to the latest release".(rig's installer replaces
$DESTwholesale, which is fine — rig is root-plumbing with no long-lived state under the tree, so it does not need box's side-by-sideversions/layout.)5. rig pins the box it installs.
rig puts box onto hosts (
docs/plans/2026-07-17-host-installs-box.md; #29 already flags the unpinned install). Once box installs from tags (heavy-duty/box#83), rig's box-install path setsBOX_REF=<tag>to the box version this rig was drilled against, and each rig release's notes state the box version it ships/requires. The repos still release independently — the tag is the contract surface, not a lockstep version.Order
VERSION,--version,CHANGELOG.md).release.yml+ tag-resolving installer (near-verbatim copies of box's, from heavy-duty/box#83).BOX_REFin the host-installs-box path.Companion filed: #35 (versioned installs + real uninstall, box#79's layout ported). Sequencing note: #35 wants this issue's VERSION file first — the version key is the tree's own VERSION — and the tag-resolving installer then pins into the same versions/ layout, exactly the box#79 → box#83 pairing.
Scope update: step 1 is now partially landed — #36 delivered
VERSION(currently0.1.0-dev),rig --version, and the side-by-sideversions/<v>install layout (rig adopted box's #79 layout after all, superseding this issue's "replaces $DEST wholesale" note). Remaining scope here:CHANGELOG.md,release.yml, and the tag-resolving installer. Step 5 (pinningBOX_REF) stays deferred until box cuts its first post-heavy-duty/box#83 tag.