-
0.1.0 Stable
released this
2026-07-19 18:03:35 +00:00 | 211 commits to main since this releaseFixed
-
The release suite accepts the ceremony's own tree (#44) —
test/release.shdemanded a literal## Unreleasedheading in the real
CHANGELOG.md, extracting non-empty and containing#32. All three are
false by construction on therelease: X.Y.Ztree the ceremony's own PR
produces (it stamps that heading into## X.Y.Z — date), so the first
real release PR turned CI red and the flow blocked itself — invisible to
both fork rehearsals, which tag a branch (release.ymlruns;ci.yml
never does). The guard now asserts what it was for: whatever the TOP
##section is —Unreleasedbetween releases, the stamped version on
and right after one — the exactchangelog_sectionthe workflow runs
extracts it non-empty. The rotting issue-number grep is gone. -
The installer survives an environment with no
$HOME(#39) —
cloud-init'sruncmdrunsinstall.shwith no$HOMEset, and under
set -uthe first expansion died with a bash unbound-variable stack
instead of an install — found live by box#88's template seed, which
pinsHOME=/rootas its own scar. The installer now derives the home
fromgetentfor the effective user (root included) before any path
is built from$HOME, and when getent has no answer either it refuses
by name. Driven with a shim getent both ways: the derived-home install
lands, the no-answer refusal is pinned. (#41 — merged without its
entry; restored here at the release gate.) -
Headless credential prompts refuse loudly instead of dying silently
(#42) — the interactive credential prompts (TS_AUTHKEYinbootstrap,
RUNNER_TOKENinrunner install,RUNNER_REMOVE_TOKENin
runner remove, and both tokens inrunner repoint— a site the new
no-bare-read test caught after the issue counted three) were bare
read -rsp: with stdin not a tty (CI,
box exec, any script),readfails,set -eends the run, and the
log just stops — exit 1, no last word, measured live in the
2026-07-19 release drill. Each prompt now checks for a tty first and
dies naming the variable that unblocks an unattended run (runner removealso names--local), and everyreadis|| die-guarded so
EOF at a real prompt gets the same courtesy.db.shalready held the
line here; now all of rig does.
Added
-
Merging a release-labeled PR IS the release — and the release re-arms
main itself (#47) — the rig twin of heavy-duty/box#96, born of the
ceremony retro: the tag was a separate, manual, silent-when-forgotten
step, and a forgotten tag produces no red X.release.ymlnow fires on
pushes to main (fork-sourced ceremony PRs get a read-only token on
pull_requestevents), reading the transition from the push itself:
event.beforeto the pushed head. A decide step answers four states —
release-flow work merged under thereleaselabel (-devendstates,
the post-release window) no-ops green with a NOTICE; the two genuinely
ambiguous bare states refuse loudly; a true transition then requires a
merged,release-labeled PR behind the commit (read via the API — the
label is the operator's declared intent). Then, in the same job, it
API-creates the tag at the merge commit, publishes with the extracted
notes — and bumps main toX.Y.(Z+1)-devitself, direct push with a
loud open-a-PR fallback, so no follow-up bump PR exists on the paved
road. AGITHUB_TOKEN-created tag never fires the tag-push trigger, so
the paths cannot double-publish — and that tag-push path survives intact
as the documented manual fallback and backfill. -
Tagged releases, and an installer that installs them (#32) — the rig
half of the flow designed in heavy-duty/box#83, near-verbatim. A release
is a PR, then a tag: therelease: X.Y.ZPR bumpsVERSIONand stamps
this file's Unreleased section with version + date; the merge commit is
tagged bareX.Y.Z(box's tag scheme — novprefix).release.yml
turns the tag into the GitHub release — after asserting tag ==VERSION
(mismatch fails loudly and creates nothing) — with that version's section
of this file as the body, extracted by the samechangelog_sectionthe
test harness drives. No assets: for a pure-bash tree, GitHub's source
tarball for the tag IS the package.install.shnow defaults to the
latest release: the tag is resolved by following the
releases/latestredirect and reading theLocationheader — no API, no
token — and the download isarchive/refs/tags/<tag>.tar.gz.RIG_REF
picks the other two channels: a tag pins (refs/tagsoutranks a
same-named branch), a branch (RIG_REF=main) tracks the development
tree. Until 0.1.0 is cut the default channel has nothing to resolve and
dies saying exactly that, namingRIG_REF=mainas the way to install
today — it never falls back to main silently, because "I installed the
latest release" must not quietly mean "I installed whatever main was that
second". Step 5 of #32 — pinningBOX_REFin the host-installs-box path
— stays open until box cuts its next tagged release.
Downloads
-
Source code (ZIP)
1 download
-
Source code (TAR.GZ)
0 downloads
-