remove Role::Manager + ManagerSurface + Flavor::Manager — there is only one role: agent

This commit is contained in:
damocles 2026-06-04 00:31:00 +02:00 committed by mara
commit f56b272a23
8 changed files with 100 additions and 489 deletions

View file

@ -81,26 +81,17 @@ Three subcommands:
### `Surface` trait + zero-sized type tags
`AgentRequest` / `AgentResponse` and `ManagerRequest` /
`ManagerResponse` are wire-disjoint, but the turn loop itself
(boot → recv → drive → ack/requeue → stats → continue-sentinel)
is identical regardless of role. `bin/hive.rs` factors that
sameness through a `Surface` trait with two zero-sized impls
(`AgentSurface`, `ManagerSurface`) wrapping:
`AgentRequest` / `AgentResponse` (= `ManagerRequest` / `ManagerResponse`
type aliases) are the wire types. There is one role: agent.
`bin/hive.rs` factors the turn loop through a `Surface` trait with one
zero-sized impl (`AgentSurface`) wrapping:
- Per-role MCP `Flavor` constant (picks which system-prompt block
+ tool registration goes into the spawned claude).
- Per-role `forge_notify::run` flag (picks `AgentRequest::Wake`
vs `ManagerRequest::Wake` so the broker socket accepts the
push).
- One async method per wire op: `ack_turn`, `requeue_inflight`,
`inbox_unread`, `post_turn_counts`, `send_to_parent`,
`self_wake`, `recv_next`, `wake_external`.
`main()`'s dispatch picks `serve_main::<AgentSurface>` vs
`serve_main::<ManagerSurface>` and the turn logic stays in
lockstep by construction — there's no separate per-role copy of
`serve_loop` / `handle_turn` / `wake`.
`main()` calls `serve_main::<AgentSurface>` for all roles. The turn
loop (`serve_loop` / `handle_turn` / `wake`) has no per-role branches.
### Boot wiring
@ -272,14 +263,13 @@ socket at `/run/hive/` once at startup:
Passed via `--system-prompt-file`.
**Marker grammar.** `<!-- role:X -->` opens a block; matching
`<!-- /role:X -->` closes it. Nesting is NOT supported — a stray
opener overrides until its closing tag (or end of file). A
mismatched closer (`<!-- /role:manager -->` inside a `role:agent`
block) is elided from the output but does NOT pop the active
role: suppression stays conservative so a typo can't dump
wrong-flavor content. Whitespace inside markers is tolerated
`<!-- /role:X -->` closes it. The renderer always uses role `agent`.
Blocks with other role tags are elided. Nesting is NOT supported —
a stray opener overrides until its closing tag (or end of file). A
mismatched closer is elided from the output but does NOT pop the
active role. Whitespace inside markers is tolerated
(`<!--role:foo-->` parses the same as `<!-- role:foo -->`).
Content outside any marker is always shared.
Content outside any marker is always included.
**`hive_identity` / `swarm_identity` shape.** Each carries a
leading space + backticked name (` on hive \`pr1ma\``,