test/release.sh demanded a literal '## Unreleased' heading extracting non-empty with '#32' in it — all false by construction on the very tree the release PR produces, so the first real 'release: 0.1.0' PR turned CI red and the ceremony blocked itself. Both fork rehearsals missed it: they tag a branch, which runs release.yml and never ci.yml. The guard now asserts its actual purpose — the TOP section, whatever its name, extracts non-empty via the exact function release.yml runs — and passes on both legitimate tree states (verified on main's shape and on a stamped copy). Fixes #44 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3.4 KiB
Changelog
History before 0.1.0 lives in git — rig grew its version surface (VERSION,
rig --version, the side-by-side versions/<v> install layout; #35/#36)
on the way to cutting its first release, and this file starts there.
Unreleased
Fixed
-
The release suite accepts the ceremony's own tree (#44) —
test/release.shdemanded a literal## Unreleasedheading in the realCHANGELOG.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.ymlnever 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. -
Headless credential prompts refuse loudly instead of dying silently (#42) — the interactive credential prompts (
TS_AUTHKEYinbootstrap,RUNNER_TOKENinrunner install,RUNNER_REMOVE_TOKENinrunner remove, and both tokens inrunner repoint— a site the new no-bare-read test caught after the issue counted three) were bareread -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
- 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: the
release: 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.ymlturns 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 thereleases/latestredirect and reading theLocationheader — no API, no token — and the download isarchive/refs/tags/<tag>.tar.gz.RIG_REFpicks 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.