You are watching a coding agent work. You see it go the wrong way at step 6 of 40. You type.

The product has three bad options: queue the message until the turn ends (too late), inject it into the same turn (prefix-cache roulette), or cancel the turn (you just threw away the useful half).

I kept hitting this in Grok Build, Claude Code, and Codex. Different UIs. Same bug: the composer is owned by the worker.

Before

One agent is both conversational partner and writer. Tools run in the main checkout. Subagents exist but nesting is effectively off. The task pane is a flat list.

You ──every message──► Agent
                          │
                          ├── edits / shell ──► MainTree
                          └── optional depth-1 child ──► MainTree

Enter means "talk to the thing that holds the write lock." Esc means "abort the useful half." That is not a conversation. It is a hostage negotiation with a process.

After

You always talk to a supervisor. Mutating work is a tree of background jobs. Writers get worktrees. The supervisor reads, steers, kills. It does not hold the write lock.

You ──every message──► Supervisor
                          │
                          ├── read / search ──► MainTree
                          ├── spawn / steer / kill ──► JobA (worktree)
                          └── JobB (shared if read-only)

The supervisor is the free conversational partner. Jobs own context. Parallel. May nest within a depth cap. Writers stay isolated by default.

What Enter does

ActionStops a job?Prefix cache
Type to supervisorNoJobs untouched
Supervisor steers a jobNoChild: append-only
Supervisor kills a jobThat node/subtreeChild aborted; committed history kept
Esc / send-nowSupervisor turn onlyJobs keep running

Steer is append-only interjection at the child's next safe gap. Kill is explicit. Cancel never means "throw away the worker that was almost done."

Landing

When a writer finishes: try to apply the worktree onto main.

  • Clean: land, wake supervisor.
  • Conflict: spawn a merge worker with "resolve, do not invent features." Two retries. Then tell the supervisor it is blocked.

Default is not "please click Approve on this diff." That is a setting (auto_merge / propose / branch). Humans are not the merge tool by default.

Isolation rules that matter

  • Mutating jobs: worktree default.
  • Explore / plan: shared tree default.
  • Depth while supervisor is on: parent → child → grandchild (cap 3).
  • Concurrency: capped. Unlimited nesting is a non-goal.

What this is not

Not a second IDE. Not a mission-control dashboard product. Not unlimited nesting. Headless one-shots stay single-agent (Solo) unless opted in. The supervisor does not do long-running shell or file edits itself — that is the whole point.

Why labs should care

Post-training improves tool-call validity. It does not fix a product that destroys prefix cache or cancels useful work when a human wants to talk. The harness shape is the control plane around the model. If talking kills the job, you are measuring the wrong failure.

The eval that matters is boring: did talking kill the job? That is the first slice of what I am calling steer-bench.

Offer

This pattern is being implemented in the open as steer — a clean-room control plane. Original code. Not a fork of any vendor CLI. Public names: Supervisor, Job, Isolation, LandingPolicy, spawn_job, steer_job, kill_job.

I build the layer around the model. This is the architecture I want to push until the boring eval turns green.