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:
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}
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.
