Governed plans

Register a governed plan; it authorizes no step

POST
/v1/authority/plans

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
AuthorizationBearer <token>

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.

version*string
plan_id*string
Match^[A-Za-z0-9][A-Za-z0-9_.-]*$
Length1 <= length <= 128
tenant_id*string
Formatuuid
steps*array<>
Items1 <= items <= 32
edges*array<>
Itemsitems <= 64
partial_commit*

What 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"}