fix(release): derive the artifact count from a named family list #1242

Merged
coilyco-ops merged 6 commits from aos/claude/vk48-release-fix into main 2026-08-25 21:30:57 +00:00
Owner

The release train went red on aos-v0.225.0 (run 26790), from #1240.

check-aos-release.sh asserted a checksum count of targets x 7. Retiring
agent-terminal and aosterm for a single aterm made the real number
targets x 6. Every binary built and every checksum verified, including all
four aterm-*; only the literal was stale.

aterm-darwin-arm64: OK
aterm-linux-amd64: OK
aterm-linux-arm64: OK
aterm-windows-amd64.exe: OK
checksum count does not match release target count

The message named neither number, which is most of why a one-character drift
cost a full release run to diagnose.

The fix

The expected total now derives from an explicit family list rather than a bare
multiplier, and the error prints both totals and the families.

The actual fix

tests/test_aos_cli_release.py pins that family list to RELEASE_BINARIES plus
the bundle. The count is now checked on the pull request by ci.yml instead of
after promote in the release job, which is where it should have been caught the
first time. I verified the test fails when the family list drifts, rather than
trusting that it would.

🤖 Generated with Claude Code

The release train went red on `aos-v0.225.0` (run 26790), from #1240. `check-aos-release.sh` asserted a checksum count of `targets x 7`. Retiring `agent-terminal` and `aosterm` for a single `aterm` made the real number `targets x 6`. Every binary built and every checksum verified, including all four `aterm-*`; only the literal was stale. ```text aterm-darwin-arm64: OK aterm-linux-amd64: OK aterm-linux-arm64: OK aterm-windows-amd64.exe: OK checksum count does not match release target count ``` The message named neither number, which is most of why a one-character drift cost a full release run to diagnose. ## The fix The expected total now derives from an explicit family list rather than a bare multiplier, and the error prints both totals and the families. ## The actual fix `tests/test_aos_cli_release.py` pins that family list to `RELEASE_BINARIES` plus the bundle. The count is now checked on the pull request by `ci.yml` instead of after promote in the release job, which is where it should have been caught the first time. I verified the test fails when the family list drifts, rather than trusting that it would. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aosterm had never been run once: 846 acompose invocations in shell history
against zero for it, while CI built and tested it on every push. It had also
drifted off its own contract, invoking `aoscompose <role> <seat>` positionally
against a CLI that takes --role/--agent, so the role was silently dropped and
the launch converged a stray session shadow instead.

aterm replaces it and is the windowed sibling of the acompose shell function,
running the same native runtime rather than the container path: a leased
session shadow wrapping `agent-compose launch`.

Two silent-failure holes are closed. Alacritty closes the window the instant
its child exits, so a failing launch used to vanish unread; the child now runs
through an inner `_session` stage that passes the exit code through and holds
the window on any non-zero exit. The launcher also watches the terminal for a
startup failure rather than detaching blind, so "no window appeared" comes back
naming the cause.

The roster is read live from `agent-compose catalog roles --json` on every run.
A role that left the roster is refused before anything opens, with a near-miss
suggestion and the live slugs listed. A seat is checked both for belonging to
the role and for being a harness `agent-compose launch` can start. A bare
`aterm` picks interactively instead of failing.

Alacritty stays the target and Warp is not involved. docs/agent-terminal-native.md
becomes docs/aterm.md, absorbing the launcher sections that were duplicated in
warp-host-setup.md; the docs count is at its band cap, so this renames in place
rather than adding a page.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Kai Siren <coilysiren@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Agent-Role: platform
merge origin/main into the aterm rebuild
Some checks failed
ci / aos-cli-tests (pull_request) Failing after 20s
ci / aos-eval-tests (pull_request) Successful in 6s
ci / ward-doctor (pull_request) Successful in 10s
ci / gate (pull_request) Successful in 53s
dev-base-pr / build (pull_request) Successful in 2m4s
13f511117e
Co-authored-by: Kai Siren <coilysiren@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Agent-Role: platform
fix(aterm): pin a working directory in the tests, and assert the refusal reason
All checks were successful
ci / aos-eval-tests (pull_request) Successful in 9s
ci / ward-doctor (pull_request) Successful in 6s
ci / aos-cli-tests (pull_request) Successful in 25s
ci / gate (pull_request) Successful in 1m9s
dev-base-pr / build (pull_request) Successful in 5m56s
fdef479818
The tests inherited aterm's default working directory, which is $PROJECTS_ROOT
or ~/projects. No CI container has one, so eight cases failed on a missing
/root/projects rather than on anything they were testing.

The release smoke check had the same weakness in its stale-role case: it only
asserted a non-zero exit, which the same missing directory would have produced.
It now pins the directory and greps for the refusal itself.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Kai Siren <coilysiren@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Agent-Role: platform
fix(release): derive the artifact count from a named family list
Some checks failed
ci / aos-eval-tests (pull_request) Successful in 14s
ci / ward-doctor (pull_request) Successful in 6s
ci / aos-cli-tests (pull_request) Successful in 25s
ci / gate (pull_request) Successful in 47s
dev-base-pr / build (pull_request) Has been cancelled
aa90ec4b55
The release train went red on aos-v0.225.0. check-aos-release.sh asserted a
checksum count of targets x 7, and retiring agent-terminal and aosterm for one
aterm made it targets x 6. Every binary built and every checksum verified; only
the literal was stale, and it reported that as "checksum count does not match
release target count" with neither number.

The count now derives from an explicit family list and the error prints both
totals and the families. tests/test_aos_cli_release.py pins that list to
RELEASE_BINARIES plus the bundle, so ci.yml catches this on the pull request
rather than after promote, in the release job.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Kai Siren <coilysiren@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Agent-Role: platform
Merge branch 'main' into aos/claude/vk48-release-fix
All checks were successful
ci / aos-eval-tests (pull_request) Successful in 7s
ci / ward-doctor (pull_request) Successful in 11s
ci / aos-cli-tests (pull_request) Successful in 31s
ci / gate (pull_request) Successful in 1m8s
dev-base-pr / build (pull_request) Successful in 5m55s
ebd7df17f2
test(release): pin the builder checksum glob to the family list too
All checks were successful
ci / aos-cli-tests (pull_request) Successful in 4m5s
ci / ward-doctor (pull_request) Successful in 10s
ci / gate (pull_request) Successful in 54s
ci / aos-eval-tests (pull_request) Successful in 2m32s
279d23c1a8
The release path restates the binary set three times: the builder's SHA256SUMS
glob, the packaging resources, and the check's expected count. The count catches
a mismatch, but only at release time, which is exactly where the last one
surfaced.

The family test now parses the builder's glob and asserts every family is
covered, so a binary added or retired in one place and not the other fails on
the pull request instead. Verified by dropping aterm from the glob and watching
the test go red.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Kai Siren <coilysiren@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Agent-Role: platform
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
coilyco-flight-deck/agentic-os!1242
No description provided.