skip to content
Replays

Gantry Builds Its Own Releases

Replacing the GitHub Actions release pipeline with one local, self-verifying command.

Gantry milestones

0 milestones 3 sprints

2 plan 3 execute 3 review

Replacing the GitHub Actions release pipeline with one local, self-verifying command.

58m 23s total 10m 48s per sprint

12.3M tokens in 120.1k tokens out

$16.71 nominal cost

This job moved Gantry release production out of GitHub Releases and into the repository itself. It added a local producer script, rewrote the public install and verification story around website downloads, then removed the retired workflow and the release config that kept the old model alive. The result is not just a different command; the release path, user docs, version-check comments, and tests all describe the same website-hosted, locally verified distribution model.

How this walkthrough is structured

Feature

What did the run build and ship?

The current tree still releases through the local producer, keeps the GitHub release workflow deleted, and tests the website download model instead of the retired release path.

Build

How did Gantry structure the work?

The run kept the dependency order explicit: establish the producer, make the docs true against it, then retire the old pipeline with the tests that had been pinning it.

Release Producer Script

2 agents 10m 48s wall time 29.8k tokens out $3.70 nominal cost

`scripts/release/build-local-release.sh` is still the release entry point, though later release work has expanded what it does. The script still fails early on missing signing and toolchain inputs, builds the supported Linux musl set, assembles the installer, source-review zip, SBOM, notices, checksum manifest, signature, and public key, then verifies the manifest and signature in the output directory. Its focused contract coverage also still exists, now under the integration test layout rather than the original top-level test path.

This piece carried the replacement mechanism by itself. The brief gave a fresh agent a bounded shell-script contract: parse the release arguments, reuse the existing source-archive producer, enumerate prerequisites before writing output, build the Linux musl artifacts, and verify the assembled release before exit. The run record shows no repair or retry here, with the extra gate pass sitting at the boundary where the new contract test proved the script without doing a real cross-build.

Website Download Model

2 agents 9m 39s wall time 25.3k tokens out $3.51 nominal cost

The specific README lines from this sprint have since been rewritten, so its text cannot be isolated at today's head. The documentation model it introduced is still present: Gantry is downloaded from the website, verified locally against the signed checksum set, and described as Linux-only for native binaries. The superseded source-review and version-check notes also still mark the GitHub Release channel as historical rather than current.

This was a documentation-only correction placed between the producer and the deletion work. The brief made the boundary small enough for a memoryless agent: rewrite the install, source-review, and staying-current sections, annotate superseded design notes, and leave code and tests alone. It stayed green, which matches the cut; the sprint removed false claims before the final sprint turned that absence into a gate assertion.

Retire GitHub Releases

2 agents 14m 49s wall time 34.1k tokens out $5.32 nominal cost

The GitHub release workflow is absent while the unrelated license workflow remains. `Cargo.toml` no longer carries the retired release tooling block, `about.toml` and the source archive script name only the Linux musl ship set, and `src/engine/update_check.rs` keeps a quiet no-op network seam pointed at the website manifest. The retirement tests are still present under the integration suite, where they check that no live GitHub release URL or retired release tooling reference returns to shipped code, config, or primary docs.

The last piece was intentionally larger because the gate tied the old config and its tests together. Its brief joined deletion, target-set reconciliation, version-check prose, and test rewrites in one sprint so the tree would not pass through a state where tests asserted a release model that no longer existed. The run record shows another clean boundary here, with the final extra gate pass attached to the place where config removal and test replacement had to agree.