Skip to content

[coding] The Repo Coder still carries the in-agent Overseer — the route survived the UI removal #204

Closed

Description

@serge-ivo

Asked directly: why does the new coder still have Overseer and Pilot? Two different answers.

Pilot — correct, keep it

The Pilot (CodingSessionWorkflow) is the executor, not a layer of hierarchy. It is what delegate_goal routes to via delegateToPilot: read the pane → ask BYOK Claude for the next instruction → send it → repeat. Without it a Repo Coder could not do the work its Lead hands it. It is one agent's engine-driver, and it cannot delegate.

Overseer — a genuine leftover, now fixed

The Overseer is the in-agent cross-repo coordinator: it reads every repo on the instance and delegates into their engines via drive_claude. That is exactly the layer the platform supervision graph (#183) exists to replace.

Its UI is gone — grep -rn "verseer" agents/coder/web/src returns nothing, removed in fef9985. But POST /v1/instances/:id/coding/overseer stayed live behind nothing but an ownership check, so the second layer was still hanging off a leaf agent: a Repo Coder that owns one repo and is driven BY its Lead could still be handed cross-repo coordination work.

Gated on the declared surface option: an agent with coding.drive === false (which is what a Repo Coder declares) gets a 403 pointing at its supervisor. The original coder, which legitimately drives its own engines, is unaffected — as is any agent that declares coding with no options, since an absent option must never disable a capability.

Two corrections to things I said earlier

I was wrong that the /tools listing showed a problem. GET /v1/instances/:id/tools returns the whole registry — including delegate_goal, tmux_*, browser_* — for a Repo Coder declared with three GitHub tools. I read that as the agent's toolset and started gating it on toolNamesFor. The test suite immediately failed: connector tools are never in FULL, so that change would have returned almost nothing for every agent that does not declare an allowlist, and 403'd the owner's own tool calls. Reverted.

That route is the owner's surface, not the agent's. The agent's brain is correctly scoped — agent-think enforces toolNamesFor, so the Repo Coder's model is never handed delegate_goal. And a delegation from it would be refused anyway: delegateToInstance checks graph membership, and a subordinate with no subordinates can delegate to nobody.

Also fixed while here: two migrations were both numbered 0065 (0065_repo_coder_surface_options.sql and 0065_seed_local_repo_chat_agent.sql). Both applied, because wrangler tracks by filename, but the collision is a trap for the next person. Renamed the seed to 0066; it is INSERT OR IGNORE, so re-running it under the new name is a no-op.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions