Skip to main content
Agents see only runs they opened (another agent’s run is a 404). Auditors and above can read any run. Journaling on a run (intents, outcome) is only ever done by the principal that opened it, whatever other roles the key holds.

POST /v1/runs

→ 201. Mode and scope are sealed at this point and cannot be widened later.

POST /v1/runs/{id}/intents

Authorize a call and journal its intent. Execute the tool only on allow or would_block.
tool, args (any JSON, hashed and never stored) and reason are required; depends_on is an optional list of earlier step numbers this call needs. → {"decision":"allow","step":3} · {"decision":"would_block","step":3,"reasons":[…]} (observe or advise mode) · {"decision":"block","reasons":[…]} A call waiting for approval is a block whose reason names the request:
After an approver decides it, send the same intent again (approvals). A different set of arguments needs a new approval. Violations also come from policy, content checks and the kill switch.

POST /v1/runs/{id}/steps/{n}/outcome

result is used only to build the compensation arguments named in the manifest. It is hashed, not stored in the ledger. Reporting an outcome twice is a 409.

GET /v1/runs, GET /v1/runs/{id}

The run: run_id, actor, mode, scope (permissions and seal), created_ms, steps[] (tool, reason, effect, status, dependencies, compensation tool, handle, error, manifest version, risk score), and unresolved, the step numbers whose outcome is unknown. For a list with filters use search.