feat(acompose): launch a bare role on its configured agent #1246

Merged
coilyco-ops merged 1 commit from aos/claude/vk48-default-agent into main 2026-08-26 01:43:53 +00:00
Owner

acompose <role> with no seat fell through to agent-compose compose, a host
converge rather than a launch, so every role launch had to name its harness.
aterm <role> already defaulted through the launch profiles, leaving the two
front doors inconsistent.

acompose platform          # launches claude, was a converge
acompose platform claude   # unchanged
aterm    platform          # already worked

The default is config, not code

Both doors take the agent from .agents/harness-launch-profiles.yaml, which
already maps every role and is the deployment-tuning axis AGENTS.md puts in AOS.
Pointing a role at a different harness is one line there, and both doors follow
without touching shell or Go:

roles:
  gamedev:
    agent: goose      # verified: acompose gamedev then launches goose

aos-cli owns that loader, so the shell asks aos _launch-agent <role> rather
than growing a second YAML parser. The verb is hidden, resolves in under 10ms,
and prints one bare agent name or exits non-zero.

What deliberately did not change

Bare acompose is the third-most-common form in shell history at 137 uses, so
it still converges, as do acompose --help and a first argument that is not a
live role. That last one matters: acompose also accepts a request.kdl, so
refusing an unknown first argument the way aterm refuses a stale role would
break a real invocation. The explicit-seat gate stays as the fast path.

Verification

Eight invocation forms across bash and zsh, with stub aos and agent-compose
recording the resolved command: bare converges, role-only launches the
configured agent, gamedev resolves goose from the profile rather than a
hardcoded claude, explicit seats are unchanged, trailing harness arguments
survive both paths, and a missing aos degrades to converge.

719 pytest, full aos-cli and aterm Go suites, full pre-commit.

🤖 Generated with Claude Code

`acompose <role>` with no seat fell through to `agent-compose compose`, a host converge rather than a launch, so every role launch had to name its harness. `aterm <role>` already defaulted through the launch profiles, leaving the two front doors inconsistent. ```text acompose platform # launches claude, was a converge acompose platform claude # unchanged aterm platform # already worked ``` ## The default is config, not code Both doors take the agent from `.agents/harness-launch-profiles.yaml`, which already maps every role and is the deployment-tuning axis AGENTS.md puts in AOS. Pointing a role at a different harness is one line there, and both doors follow without touching shell or Go: ```yaml roles: gamedev: agent: goose # verified: acompose gamedev then launches goose ``` `aos-cli` owns that loader, so the shell asks `aos _launch-agent <role>` rather than growing a second YAML parser. The verb is hidden, resolves in under 10ms, and prints one bare agent name or exits non-zero. ## What deliberately did not change Bare `acompose` is the third-most-common form in shell history at 137 uses, so it still converges, as do `acompose --help` and a first argument that is not a live role. That last one matters: `acompose` also accepts a `request.kdl`, so refusing an unknown first argument the way `aterm` refuses a stale role would break a real invocation. The explicit-seat gate stays as the fast path. ## Verification Eight invocation forms across bash and zsh, with stub `aos` and `agent-compose` recording the resolved command: bare converges, role-only launches the configured agent, `gamedev` resolves `goose` from the profile rather than a hardcoded claude, explicit seats are unchanged, trailing harness arguments survive both paths, and a missing `aos` degrades to converge. 719 pytest, full aos-cli and aterm Go suites, full pre-commit. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(acompose): launch a bare role on its configured agent
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 28s
ci / gate (pull_request) Successful in 58s
b70c9c36b9
`acompose <role>` with no seat fell through to `agent-compose compose`, a host
converge rather than a launch, so every role launch had to name its harness.
`aterm <role>` already defaulted through the launch profiles, leaving the two
front doors inconsistent.

Both now take the agent from .agents/harness-launch-profiles.yaml, which already
maps every role and is the deployment-tuning axis AGENTS.md puts in AOS. Pointing
a role at a different harness is one line there, and it applies to both doors
without touching shell or Go.

aos-cli owns that loader, so the shell asks `aos _launch-agent <role>` rather
than growing a second YAML parser. The verb is hidden, resolves in under 10ms,
and prints one bare agent name or exits non-zero.

The hardcoded claude|codex|goose|opencode gate in acompose stays as the explicit
seat fast path. Bare `acompose`, `acompose --help`, and a first argument that is
not a live role all still converge, because that argument may be a request.kdl.

Verified across bash and zsh: bare converges, `acompose platform` launches
claude, `acompose gamedev` launches goose when the profile says so, an explicit
seat is unchanged, and trailing harness arguments survive both paths.

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