refactor: state the native harness set once, and the launch profiles once #1249

Merged
coilyco-ops merged 1 commit from aos/claude/vk48-harness-set into main 2026-08-26 02:06:26 +00:00
Owner

Closes #1247.

The launchable harness set was written out in six places with nothing holding
them in step. A missed one failed differently at each site: the shadow refused,
the roster filter hid the seat, or acompose silently converged instead of
launching. Two error messages also spelled the set out in prose, so they could
drift from the set they described.

Six down to two, and the two cannot drift

aos-cli states it once. The membership test and the want claude, codex, goose, or opencode prose both derive from that one slice, so the message cannot
describe a set it no longer matches.

The shell carries no copy at all. acompose decides launch-vs-converge on
whether a non-flag second positional is present, and hands the seat on
unchecked. agent-compose already owns the launchable set and refuses an
unsupported seat by name, so the shell pre-filtering it was pure duplication.

That removes the copy most able to drift, and not hypothetically:
shell/common.sh updates through the canonical checkout while the binaries
update through brew, and those two were four commits apart earlier today.

aterm keeps its set, which cannot drift because it ships from the same
commit as aos-cli. A test pins the two equal and also fails if the shell
regrows a list. I verified both guards by breaking them rather than trusting
they would fire:

aterm drops a harness      -> CAUGHT
shell regrows a list       -> CAUGHT

The second parser is gone

aterm had a hand-rolled line reader for harness-launch-profiles.yaml,
carried over from the retired agent-terminal, next to aos-cli's strict YAML
parser of the same file. They agree on today's schema and could disagree on an
edit neither anticipated, which matters on a file that is about to be edited to
point a role at a deepseek-backed harness.

It now asks aos _launch-agent, which costs nothing because aterm already
hard-requires aos, and falls back to the catalogue's frontier seat when the
verb is absent. That deletes the file and drops the
compiledHarnessLaunchProfiles ldflag from the aterm release build.

Verification

The build script changed, which is what broke the train in #1242, so I ran the
whole thing locally first: aos-release-build across four targets,
aos-release-package, and aos-release-check, which reports verified aos, aoscompose, aosward, aosguard, and aterm release aos-v0.229.0 with 24
checksums, unchanged.

On the built aterm-darwin-arm64: a stub aos reporting codex yields seat
codex, and an aos without the verb falls back to claude.

Nine acompose forms across bash and zsh, unchanged from #1246 plus explicit
codex now passing through. 720 pytest, both Go suites, full pre-commit.

🤖 Generated with Claude Code

Closes #1247. The launchable harness set was written out in six places with nothing holding them in step. A missed one failed differently at each site: the shadow refused, the roster filter hid the seat, or `acompose` silently converged instead of launching. Two error messages also spelled the set out in prose, so they could drift from the set they described. ## Six down to two, and the two cannot drift **`aos-cli`** states it once. The membership test and the `want claude, codex, goose, or opencode` prose both derive from that one slice, so the message cannot describe a set it no longer matches. **The shell carries no copy at all.** `acompose` decides launch-vs-converge on whether a non-flag second positional is present, and hands the seat on unchecked. `agent-compose` already owns the launchable set and refuses an unsupported seat by name, so the shell pre-filtering it was pure duplication. That removes the copy most able to drift, and not hypothetically: `shell/common.sh` updates through the canonical checkout while the binaries update through brew, and those two were four commits apart earlier today. **`aterm` keeps its set**, which cannot drift because it ships from the same commit as `aos-cli`. A test pins the two equal and also fails if the shell regrows a list. I verified both guards by breaking them rather than trusting they would fire: ```text aterm drops a harness -> CAUGHT shell regrows a list -> CAUGHT ``` ## The second parser is gone `aterm` had a hand-rolled line reader for `harness-launch-profiles.yaml`, carried over from the retired `agent-terminal`, next to `aos-cli`'s strict YAML parser of the same file. They agree on today's schema and could disagree on an edit neither anticipated, which matters on a file that is about to be edited to point a role at a deepseek-backed harness. It now asks `aos _launch-agent`, which costs nothing because `aterm` already hard-requires `aos`, and falls back to the catalogue's frontier seat when the verb is absent. That deletes the file and drops the `compiledHarnessLaunchProfiles` ldflag from the aterm release build. ## Verification The build script changed, which is what broke the train in #1242, so I ran the whole thing locally first: `aos-release-build` across four targets, `aos-release-package`, and `aos-release-check`, which reports `verified aos, aoscompose, aosward, aosguard, and aterm release aos-v0.229.0` with 24 checksums, unchanged. On the built `aterm-darwin-arm64`: a stub `aos` reporting `codex` yields seat `codex`, and an `aos` without the verb falls back to `claude`. Nine `acompose` forms across bash and zsh, unchanged from #1246 plus explicit `codex` now passing through. 720 pytest, both Go suites, full pre-commit. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
refactor: state the native harness set once, and the launch profiles once
All checks were successful
ci / aos-eval-tests (pull_request) Successful in 7s
ci / ward-doctor (pull_request) Successful in 9s
ci / aos-cli-tests (pull_request) Successful in 25s
ci / gate (pull_request) Successful in 53s
497d078944
Closes #1247.

The launchable harness set was written out in six places with nothing holding
them in step, and a missed one failed differently at each site: the shadow
refused, the roster filter hid the seat, or acompose silently converged instead
of launching. Two error messages also spelled the set out in prose, so they
could drift from the set they described.

aos-cli now states it once and derives both the membership test and the "want
claude, codex, goose, or opencode" prose from it.

The shell carries no copy at all. It decides launch-vs-converge on whether a
non-flag second positional is present and hands the seat on unchecked, because
agent-compose already owns the launchable set and refuses an unsupported seat by
name. That removes the copy most able to drift: shell/common.sh updates through
the canonical checkout while the binaries update through brew, and those two
were four commits apart earlier today.

aterm keeps its own set, which cannot drift because it ships from the same
commit as aos-cli, and a test pins the two equal and fails if the shell regrows
a list. Both guards were verified by breaking them.

aterm also loses its second parser of harness-launch-profiles.yaml, a hand
rolled line reader carried over from agent-terminal that could have disagreed
with aos-cli's strict YAML on an edit neither anticipated. It asks
`aos _launch-agent` instead, which it can do for free because it already
hard-requires aos, and falls back to the catalogue's frontier seat when the verb
is absent. That deletes the file and drops the compiledHarnessLaunchProfiles
ldflag from the aterm release build.

Verified by running the full release train locally: build across four targets,
package, and check, plus the built aterm-darwin-arm64 taking a reported codex
and falling back to claude without the verb.

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!1249
No description provided.