Councils are orchestration, not a new agent subsystem. The temporary mob is a
real mob created from your explicit definition through the ordinary
create path.
MobMachine, the member machines, and the forked-participant
lifecycle machine remain the canonical owners of every mob, member, and
capability decision.Mental Model
Source-Owned Capabilities
A participant is not a copy of a member and not a new agent built from a prompt. The council asks the source owner for a forked-participant capability over a chosen prefix of the source member’s transcript, and seats that branch. Consequences worth stating plainly:- The source owner stays the authority. Tool, auth, realm, and filesystem boundaries remain those of the source execution context. The council request has no credential, auth override, or mutable session state field, so it cannot widen them.
- The capability is held by reference. The council persists the capability reference so a crashed coordinator can still revoke it at the owning runtime — including a HOST-owned capability whose record lives in a remote host’s store.
- No bearer material ever reaches a caller. Results and record projections carry non-secret provenance only: owner route, fork session, source session with its selected prefix length and prefix digest, granted scope, reuse policy, expiry, and a non-secret correlation hint. There is no wire field that could hold a capability id, bearer token, revocation id, or cleanup id.
Real Temporary Mobs
The council creates a real mob whose id is derived deterministically from the council id (council--<council_id>). That is what makes a retry after a
crash find the same mob instead of creating a second one, and it is why the
temporary mob shows up in rkat mob list while the council runs.
Your definition_template is used verbatim apart from its id, which is
replaced with the deterministic council mob id. Every participant’s
target_profile must exist in that template.
Bounds
Every bound is validated before any side effect: an over-budget request never creates a mob, a capability, or a turn.Merge-Back Modes
Exactly one policy per council. No mode merges a transcript, and no mode writes into the calling session — the outcome is returned to you.Durability And Crash Cleanup
Durability is an explicit declaration, never an inference.durablerequires a council store that actually survives a restart. If the serving runtime’s store is process-bound, the request is refused withcapability_unavailablerather than silently promising crash recovery.process_boundis the explicit opt-in for tests, embedders, and ephemeral surfaces. It says out loud that a process death loses the record and the source capability TTL is the only remaining backstop.
coordinator_interrupted terminal and runs cleanup. Recovery never re-executes
a council, because a re-run would duplicate model work and result delivery.
Cleanup is reported separately from the result, and the two are never
folded into one verdict:
A sealed result with outstanding cleanup is a success carrying a cleanup
status — never an error.
Host Bootstrap
A HOST-owned participant can only be seated once its owning host is bound into the temporary mob. The coordinator cannot mint or copy that binding from the source mob, because a host binding descriptor carries a one-time ceremony token that has already been spent. So the caller declares it, and it lives outside the request:- it is not fingerprinted, so an honest retry is still a retry rather than a conflicting request, and
- it is not persisted, so credential-like material never enters the durable council record.
Idempotency
The council id is the idempotency key.- Same id + same request ⇒ join the running execution, or replay its sealed result.
- Same id + a materially different request ⇒ refused as a conflict
(
duplicate_input), with both fingerprints in the error payload. - A second coordinator may take a council over only after observing the
claim lease expired; the takeover advances the claim epoch and fences the
previous executor (
stale_fence).
Agent Tool
Temporary councils are invoked by agents through thecouncil mob tool,
beside delegate and fork_off. They are deliberately absent from CLI, REST,
JSON-RPC, public MCP, and generated SDKs: convening a council is an agent
decision-support action, not a human-operated lifecycle surface.
The caller names existing source members and the question to decide. The tool
resolves each member’s current profile and placement, synthesizes the explicit
temporary MobDefinition, derives stable branch identities, runs the council,
and returns the sealed result through the ordinary structured tool-result
channel.
Example Tool Call
council_id is optional. Omit it for an id derived from the tool call; provide
one when the agent needs an explicit idempotency key across retries. The default
merge is a bounded summary by the last participant. Other policies are
structured, selected_exchanges, artifact_reference, and no_merge.
The tool is available only when the calling agent’s generated mob authority can
create a temporary mob and manage every source mob in the participant list.
Errors
Malformed input and missing mob authority are ordinary tool errors. Once a council is admitted, its structured result separates the discussion terminal from cleanup status. A repeated explicitcouncil_id with the same arguments
joins or replays the original run; the same id with different arguments is a
conflict.
Seating failures, wiring gaps, exhausted budgets, and elapsed deadlines are
not errors: they are typed exit_reason values on a sealed result, so you
still receive the exchanges that did happen and the provenance of everyone who
was seated.
