Skip to content

Sub-councils

A member can hand a self-contained task to a smaller child council with the subcouncil tool. The child is a real run, linked to its parent by parent_run_id, with its own plan, members, oversight and vote. Only the chair has the tool by default; give it to other seats through their tools.

{"task": "Compare the three leading solid-state electrolyte families", "mode": "research", "size": 3}
Argument Meaning
task The self-contained task for the child
mode The child's mode
size Seats, 2 to 6 (default 3)

The child seats an ephemeral roster for its mode, using the calling member's provider and model. The tool returns the child's deliverable, or an error if the child did not complete. The tool carries the risk tag subcouncil: add it to approval_required to approve each delegation.

Guardrails are clamped

The child's guardrails never exceed the parent's:

Aspect Rule
Budgets, steps, runtime, parallelism, iterations The minimum of the child's and the parent's
Depth max_subcouncil_depth drops by one per level; at 0 the tool refuses
Tool and skill deny lists, approval_required The union of both
Tool allow list Intersected with the parent's when the parent restricts it
Dollar budget Capped at what the parent has left; with nothing left the tool refuses

Budget charge-back

sequenceDiagram
    autonumber
    participant P as Parent run
    participant T as subcouncil tool
    participant C as Child run

    P->>T: subcouncil(task, mode, size)
    T->>T: depth > 0 and budget left?
    alt depth 0 or no budget left
        T-->>P: refuse
    else
        T->>C: create run (parent_run_id, guardrails clamped,<br/>dollar budget capped at what the parent has left)
        T-->>P: subcouncil.started (stored in the parent's log)
        loop while the child runs
            C--)P: subcouncil.event (ephemeral relay, with child_run_id)
        end
        C-->>T: deliverable, tokens, cost
        T->>P: charge the child's tokens and cost to the parent's budget
        T-->>P: subcouncil.completed (stored in the parent's log)
        T-->>P: the child's deliverable
    end

Because the child's spend is charged back, the parent's budget meter and its halted check always include everything its sub-councils spent.

Live relay and lifetime

subcouncil.started and subcouncil.completed are stored in the parent's event log. The child's plan, step, member, thought, tool, intercept, correction, approval, vote, protocol.call, nested sub-council and status events are relayed live to the parent's stream as ephemeral subcouncil.event envelopes carrying child_run_id, so the parent's run views draw the child's members and traffic. Approvals requested inside a child still notify you.

The child is stopped if it exceeds its runtime or the parent is cancelled. GET /api/v1/runs lists top-level runs only; open a child with GET /api/v1/runs/{child_run_id}.