Register a governed plan; it authorizes no step
Registers one change carried out as several governed operations
(agent-safe.plan/1): its steps, a coupling per dependency edge, a
partial-commit rule and the compensation steps a failure opens. The
plan is a governance object, not an orchestrator: registering it
authorizes nothing, and every step is still decided by
enforce-and-bind and claimed before it commits, with a grant of its
own. A step's intent names the plan it belongs to in its hashed
context (agent_safe.plan: plan_id, plan_digest, step_id);
Decionis derives the step's facts from the plan and its own claim
records and writes them under agent_safe.plan for policy to read,
and binds the step's view of the plan as a material signal the claim
rechecks. Plans are immutable: the same plan_id with another digest
is refused. One organisation in v1: tenant_id must be the caller's.
Requires decision:write, decision:* or org:*.
Authorization
ApiKeyAuth An organization API key. Its scopes decide what it may call;
decision:shadow is the narrowest: SHADOW evaluations through
POST /v1/authority/grants or its alias
POST /v1/authority/enforce-and-bind only (DECISION_SHADOW_MODE_DENIED
in any other mode; DECISION_SHADOW_FIELD_DENIED for a body carrying
context.decionis_policy, evidence or escalation), with no
integration dispatch. A key whose only scope is decision:shadow
(an AgentSafe hosted gateway's) reaches exactly those two,
POST /v1/auth/credential-context, POST /v1/hosted-gateway/keys/confirm
and POST /v1/hosted-gateway/keys/revoke-self; every other route
answers 403 HOSTED_GATEWAY_KEY_PATH_DENIED.
decision:enforce is an enforced hosted gateway's key: evaluations
in SHADOW or ENFORCEMENT through POST /v1/authority/grants or its
alias (400 DECISION_ENFORCE_FIELD_DENIED for a body carrying
context.decionis_policy; it never holds policy:write), and the
grants and managed escalations they bind. A key whose scopes are
decision:enforce (with or without decision:shadow) reaches exactly
POST /v1/authority/enforce-and-bind, POST /v1/authority/grants,
GET /v1/authority/grants/{grant_id},
POST /v1/authority/grants/{grant_id}/claims,
POST /v1/authority/grants/{grant_id}/receipts,
POST /v1/authority/grants/{grant_id}/reconciliations,
POST /v1/execution/verify-token, POST /v1/execution/claim-token,
POST /v1/execution/consume-token, POST /v1/execution/finalize-token,
GET /v1/authority/escalations/{escalation_id},
DELETE /v1/authority/escalations/{escalation_id},
POST /v1/auth/credential-context, POST /v1/hosted-gateway/keys/confirm
and POST /v1/hosted-gateway/keys/revoke-self, each id a UUID; every
other route answers 403 HOSTED_GATEWAY_KEY_PATH_DENIED.
In: header
Request Body
application/json
agent-safe.plan/1, as AgentSafe defines it (ADR 0008): its digest is
SHA-256 over the plan's RFC 8785 form. Edges join known, distinct steps
once and form no cycle; a compensation step stands outside the edges and
compensates ordinary steps only.
^[A-Za-z0-9][A-Za-z0-9_.-]*$1 <= length <= 128uuid1 <= items <= 32items <= 64What stays admissible once a step has FAILED: the listed steps, if
their edges allow it; every other remaining step takes otherwise.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/authority/plans" \ -H "Content-Type: application/json" \ -d '{ "version": "agent-safe.plan/1", "plan_id": "string", "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0", "steps": [ { "step_id": "string", "action": "string", "target": "string" } ], "edges": [ { "from": "string", "to": "string", "coupling": "independent" } ], "partial_commit": { "admissible": [ "string" ], "otherwise": "ESCALATE" } }'{ "plan_id": "string", "plan_digest": "string", "registered_at": "2019-08-24T14:15:22Z", "authorizes": "NOTHING"}Notify Decionis that signed Presence proof may be ready POST
Service-to-service recovery hint. The body is never authorization. Decionis locates the tenant-bound escalation, fetches the signed Presence dossier, verifies it independently, and performs current-policy re-authorization before any grant can be issued. Duplicate notifications are idempotent.
Read a governed plan's state and each step's status GET
The plan as registered, its state and each step's status, derived now from the claim records of every grant issued for one of its steps: `COMMITTED` only with a confirmed effect. `PARTIAL` (a step failed after others committed) stays so once reached and maps to the SCITT execution profile's `partially_completed`; `SUSPENDED` (a step's outcome is unknown) lasts until reconciliation settles it.

