Changelog
10 July 2026roder/v0.1.12

Agent teams get Codex V2-style lifecycle semantics

Roder 0.1.12 makes Ultra-powered teammate workflows more durable, with canonical agent trees, reusable follow-up turns, mailbox-aware waiting, typed inter-agent messages, and richer app-server team results.

What changed

Roder 0.1.12 tightens the agent-team runtime that backs Ultra delegation and model-facing teammate tools. Spawned agents now live in a canonical task tree such as /root/reviewer or /root/reviewer/tests, and each teammate keeps a durable identity that can receive later work instead of being treated as a throwaway child run.

The model-facing agent-control tools are now split around the real lifecycle:

  • spawn_agent creates a teammate, starts its first turn, and returns the canonical path.
  • send_message queues coordination for an existing teammate without starting an idle turn.
  • followup_task assigns new work and starts or wakes the teammate when it is idle.
  • wait_agent can wake on terminal completion or on mailbox/user-steer activity.
  • interrupt_agent stops the active turn without deleting the teammate identity.

Context for a new teammate is explicit. A spawn can fork all parent turns, fork no parent turns, or fork only the last N turns. When no override is supplied, the child inherits the parent model, provider, reasoning effort, workspace, policy, tools, runner, and live developer context, including Ultra mode.

Why it matters

  • Long-running agent work can be coordinated more like a team. You can start a reviewer, send it extra context, wait for its answer, interrupt a bad turn, and then assign a follow-up without losing the teammate’s identity.
  • Parent and child agents get clearer messages. MESSAGE, NEW_TASK, and FINAL_ANSWER envelopes carry canonical sender and recipient paths, so copied conversation history is no longer confused with the child’s newest assignment.
  • Waiting is less brittle. A parent can wake when a worker finishes, when new mailbox activity arrives, or when user steering changes the plan, instead of polling blindly.
  • App-server clients get better team state. Team notifications now include started-member details and terminal completion payloads with final text and errors, so desktop and hosted clients can render richer teammate status without scraping transcripts.
  • Interruption is safer for day-to-day work. Interrupting a teammate no longer means deleting or cleaning up the whole member; the same canonical path can receive a later followup_task.

Using it

The easiest path is still to use Codex-backed Ultra mode when a task benefits from bounded proactive delegation:

roder auth login codex
RODER_PROVIDER=codex RODER_MODEL=gpt-5.6-sol RODER_REASONING=ultra roder

For model-facing teammate work, use canonical paths returned by spawn_agent whenever possible. A fresh-context specialist can be started with no copied parent turns:

{
  "task_name": "fast_search",
  "message": "Locate the relevant implementation and report file paths.",
  "fork_turns": "none",
  "model_provider": "codex",
  "model": "gpt-5.6-sol",
  "reasoning_effort": "high"
}

For app-server clients, keep using the team/* methods and subscribe to team notifications. team/read mailbox entries now carry typed delivery intent, and team/member/completed can include both finalMessage and error so clients can distinguish completed, failed, and interrupted teammate turns.