Creasura Agentic OS Protocol · v0.1
OpenAPI contract
The CAOP v0.1 lifecycle API as an OpenAPI 3.1 document, with every operation, request, response, and error.
On this page
- Overview
- Authentication and errors
- Public operations
- Observe
- observations.ingest
- Understand
- context.resolve
- Commit
- commitments.create
- commitments.list
- Plan
- plans.create
- Execute
- executions.start
- executions.get
- executions.submit_result
- executions.transition
- approvals.decide
- Verify
- verifications.evaluate
- Record
- records.commit
- Review
- reviews.evaluate
- Full contract (YAML)
Overview
The CAOP v0.1 lifecycle API as an OpenAPI 3.1 contract: 13 operations across the eight lifecycle stages. Every schema is shared with the JSON Schema bundle.
Authentication and errors
All operations use bearer authentication. Every protected operation identifies the principal and workspace and is authorized server-side. Errors use one shape:
{
"error": {
"code": "POLICY_APPROVAL_REQUIRED",
"message": "External action requires approval",
"retryable": false,
"details": {
"approval_request_id": "approval_123"
}
},
"trace_id": "trace_456"
}
| HTTP | Error codes |
|---|---|
| 400 | INVALID_REQUEST |
| 401 | UNAUTHENTICATED |
| 403 | FORBIDDEN, POLICY_APPROVAL_REQUIRED, POLICY_DENIED |
| 404 | NOT_FOUND |
| 409 | INVALID_TRANSITION, STATE_VERSION_CONFLICT |
| 422 | VERIFICATION_FAILED |
| 429 / 500 | RATE_LIMITED, INTERNAL |
Public operations
Assistants see ten outcome-oriented MCP tools. Each maps to one endpoint (x-caop-mcp-tool in the contract):
| MCP tool | Endpoint |
|---|---|
observe | POST /v1/observations |
get_context | POST /v1/context/resolve |
create_commitment | POST /v1/commitments |
list_commitments | GET /v1/commitments |
propose_plan | POST /v1/plans |
start_work | POST /v1/executions |
get_work_status | GET /v1/executions/{execution_id} |
submit_result | POST /v1/executions/{execution_id}/results |
review_goals | POST /v1/reviews |
approve_action | POST /v1/approvals/{approval_request_id}/decision |
Observe
/v1/observationsIngest an observationRecords something the OS learned from an external source. Replaying the same source event with the same idempotency_key returns the existing observation with duplicate: true.
Request · ObservationCreate
{
"source": {
"provider": "gmail",
"resource_id": "message_123"
},
"type": "message.received",
"occurred_at": "2026-11-01T14:00:00Z",
"payload_ref": "artifact_456",
"idempotency_key": "gmail-message-123"
}Response 202 · ObservationAccepted
{
"observation_id": "obs_123",
"status": "accepted",
"duplicate": false
}Understand
/v1/context/resolveResolve contextResolves observations against known state. Retrieved facts and inferred interpretations are returned separately.
Request · ContextResolveRequest
{
"observation_ids": [
"obs_123"
],
"scope": {
"workspace_id": "personal",
"project_ids": [
"mortgage-refinance"
]
},
"include": [
"related_goals",
"open_commitments",
"relevant_policies",
"prior_decisions"
]
}Response 200 · ContextBundle
{
"context_id": "ctx_123",
"state_version": 42,
"related_goals": [
"goal_refinance"
],
"open_commitments": [
"commitment_12"
],
"applicable_policies": [
"policy_financial_approval"
],
"unresolved_questions": []
}Commit
/v1/commitmentsCreate a commitmentCreates a durable obligation or objective. A commitment cannot be completed solely because an agent claims it is complete.
Request · CommitmentCreate
{
"goal_id": "goal_refinance",
"objective": "Evaluate updated refinancing offer",
"success_criteria": [
{
"type": "artifact_exists",
"artifact_type": "refinancing_comparison"
}
],
"deadline": "2026-11-05T23:59:00Z"
}Response 201 · Commitment
{
"commitment_id": "com_123",
"status": "open",
"version": 1
}/v1/commitmentsList commitmentsReturns outstanding and recent commitments for the caller’s workspace.
| Parameter | In | Type |
|---|---|---|
status | query | open | completed | failed | cancelled | expired |
goal_id | query | string |
cursor | query | string |
Plan
/v1/plansCreate a planProduces an execution plan. The planner may use an LLM; the runtime validates the plan against schemas, dependencies, and policy.
Request · PlanCreate
{
"commitment_id": "com_123",
"constraints": {
"require_approval_for_external_actions": true
},
"preferred_capabilities": [
"document_analysis",
"calculator",
"research"
]
}Response 201 · Plan
{
"plan_id": "plan_123",
"steps": [
{
"id": "step_1",
"capability": "document_analysis",
"depends_on": []
},
{
"id": "step_2",
"capability": "calculator",
"depends_on": [
"step_1"
]
},
{
"id": "step_3",
"capability": "report_generation",
"depends_on": [
"step_2"
]
}
]
}Execute
/v1/executionsStart an executionStarts an authorized execution of a plan. Execution is asynchronous; acceptance does not mean completion.
Request · ExecutionCreate
{
"plan_id": "plan_123",
"idempotency_key": "execute-plan-123-v1",
"authorization_context": {
"principal_id": "user_123"
}
}Response 202 · ExecutionAccepted
{
"execution_id": "exec_123",
"status": "queued",
"next_action": "await_execution"
}/v1/executions/{execution_id}Get execution statusReturns the current state of an execution.
| Parameter | In | Type |
|---|---|---|
execution_idrequired | path | string |
Response 200 · Execution
{
"execution_id": "exec_123",
"plan_id": "plan_123",
"state": "RUNNING",
"state_version": 3,
"correlation_id": "goal_refinance",
"updated_at": "2026-11-01T14:05:00Z"
}/v1/executions/{execution_id}/resultsSubmit a resultSubmits output and evidence for verification. Moves a RUNNING execution to VERIFYING.
| Parameter | In | Type |
|---|---|---|
execution_idrequired | path | string |
Request · ResultSubmission
{
"output": {
"report": "artifact_789"
},
"evidence_refs": [
"artifact_789"
],
"idempotency_key": "submit-exec-123-v1"
}Response 202 · Execution
{
"execution_id": "exec_123",
"plan_id": "plan_123",
"state": "RUNNING",
"state_version": 3,
"correlation_id": "goal_refinance",
"updated_at": "2026-11-01T14:05:00Z"
}/v1/executions/{execution_id}/transitionsTransition an executionMoves an execution between states. Invalid transitions are rejected with INVALID_TRANSITION; a stale expected_state yields STATE_VERSION_CONFLICT.
| Parameter | In | Type |
|---|---|---|
execution_idrequired | path | string |
Request · TransitionRequest
{
"expected_state": "VERIFYING",
"target_state": "COMPLETED",
"verification_id": "verify_123"
}Response 200 · Transition
{
"transition_id": "tr_9",
"execution_id": "exec_123",
"from_state": "VERIFYING",
"to_state": "COMPLETED",
"state_version": 5,
"actor": {
"type": "service",
"id": "caop-runtime"
},
"reason": "verification passed",
"correlation_id": "goal_refinance",
"occurred_at": "2026-11-01T15:00:00Z"
}/v1/approvals/{approval_request_id}/decisionDecide an approval requestGrants or denies a scoped, expiring authorization for a consequential action.
| Parameter | In | Type |
|---|---|---|
approval_request_idrequired | path | string |
Request · ApprovalDecision
{
"decision": "approve",
"scope": {
"document": "offer-v2",
"max_price": 632000
},
"expires_at": "2026-11-02T22:00:00Z"
}Response 200 · Approval
{
"approval_id": "appr_301",
"approval_request_id": "approval_123",
"decision": "approve",
"scope": {
"document": "offer-v2"
},
"approved_by": {
"type": "user",
"id": "user_123"
},
"expires_at": "2026-11-02T22:00:00Z"
}Verify
/v1/verificationsEvaluate verificationEvaluates an execution result against criteria. The verdict lists every check performed and its kind.
Request · VerificationRequest
{
"execution_id": "exec_123",
"criteria": [
"all_required_steps_completed",
"result_has_supporting_evidence",
"no_policy_violations"
]
}Response 200 · Verification
{
"verification_id": "verify_123",
"verdict": "passed",
"evidence_refs": [
"artifact_789"
],
"checks": [
{
"name": "all_required_steps_completed",
"kind": "deterministic",
"result": "pass"
},
{
"name": "result_has_supporting_evidence",
"kind": "model_rubric",
"result": "pass"
},
{
"name": "no_policy_violations",
"kind": "deterministic",
"result": "pass"
}
]
}Record
/v1/records/commitCommit a recordPersists facts, evidence, and outcomes with optimistic concurrency on expected_state_version.
Request · RecordCommit
{
"execution_id": "exec_123",
"verification_id": "verify_123",
"expected_state_version": 42,
"changes": [
{
"entity_id": "com_123",
"operation": "set_status",
"value": "completed"
}
]
}Response 200 · RecordCommitted
{
"transaction_id": "txn_123",
"state_version": 43,
"status": "committed"
}Review
/v1/reviewsEvaluate a reviewEvaluates progress toward a goal. Recommended actions are proposals, not authorized actions.
Request · ReviewRequest
{
"goal_id": "goal_refinance",
"review_type": "progress",
"include": [
"outcomes",
"unresolved_commitments",
"failures",
"next_actions"
]
}Response 200 · Review
{
"review_id": "review_123",
"goal_status": "active",
"recommended_actions": [
{
"action": "request_final_offer",
"requires_approval": true
}
]
}Full contract (YAML)
Show caop-v0.1.openapi.yaml
# Creasura Agentic OS Protocol (CAOP) v0.1 · OpenAPI 3.1
openapi: "3.1.0"
info:
title: "Creasura Agentic OS Protocol (CAOP)"
version: "0.1"
description: "Lifecycle API for the Creasura Agentic OS Protocol v0.1. Every protected operation identifies the authenticated principal and workspace, is authorized server-side, and returns errors in the standard Error shape with a trace_id."
jsonSchemaDialect: "https://json-schema.org/draft/2020-12/schema"
servers:
- url: "http://localhost:8787"
description: "Self-hosted runtime (e.g. on your Mac mini)"
security:
- bearerAuth: []
tags:
- name: "Observe"
- name: "Understand"
- name: "Commit"
- name: "Plan"
- name: "Execute"
- name: "Verify"
- name: "Record"
- name: "Review"
paths:
/v1/observations:
post:
operationId: "observations.ingest"
summary: "Ingest an observation"
description: "Records something the OS learned from an external source. Replaying the same source event with the same idempotency_key returns the existing observation with duplicate: true."
tags:
- "Observe"
x-caop-stage: "Observe"
x-caop-mcp-tool: "observe"
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/ObservationCreate"
example:
source:
provider: "gmail"
resource_id: "message_123"
type: "message.received"
occurred_at: "2026-11-01T14:00:00Z"
payload_ref: "artifact_456"
idempotency_key: "gmail-message-123"
responses:
"202":
description: "Accepted"
content:
application/json:
schema:
$ref: "#/components/schemas/ObservationAccepted"
example:
observation_id: "obs_123"
status: "accepted"
duplicate: false
"400":
description: "Invalid request"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"401":
description: "Unauthenticated"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"403":
description: "Forbidden or approval required"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
/v1/context/resolve:
post:
operationId: "context.resolve"
summary: "Resolve context"
description: "Resolves observations against known state. Retrieved facts and inferred interpretations are returned separately."
tags:
- "Understand"
x-caop-stage: "Understand"
x-caop-mcp-tool: "get_context"
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/ContextResolveRequest"
example:
observation_ids:
- "obs_123"
scope:
workspace_id: "personal"
project_ids:
- "mortgage-refinance"
include:
- "related_goals"
- "open_commitments"
- "relevant_policies"
- "prior_decisions"
responses:
"200":
description: "Context bundle"
content:
application/json:
schema:
$ref: "#/components/schemas/ContextBundle"
example:
context_id: "ctx_123"
state_version: 42
related_goals:
- "goal_refinance"
open_commitments:
- "commitment_12"
applicable_policies:
- "policy_financial_approval"
unresolved_questions: []
"400":
description: "Invalid request"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"401":
description: "Unauthenticated"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"403":
description: "Forbidden or approval required"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
/v1/commitments:
post:
operationId: "commitments.create"
summary: "Create a commitment"
description: "Creates a durable obligation or objective. A commitment cannot be completed solely because an agent claims it is complete."
tags:
- "Commit"
x-caop-stage: "Commit"
x-caop-mcp-tool: "create_commitment"
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/CommitmentCreate"
example:
goal_id: "goal_refinance"
objective: "Evaluate updated refinancing offer"
success_criteria:
- type: "artifact_exists"
artifact_type: "refinancing_comparison"
deadline: "2026-11-05T23:59:00Z"
responses:
"201":
description: "Created"
content:
application/json:
schema:
$ref: "#/components/schemas/Commitment"
example:
commitment_id: "com_123"
status: "open"
version: 1
"400":
description: "Invalid request"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"401":
description: "Unauthenticated"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"403":
description: "Forbidden or approval required"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
get:
operationId: "commitments.list"
summary: "List commitments"
description: "Returns outstanding and recent commitments for the caller’s workspace."
tags:
- "Commit"
x-caop-stage: "Commit"
x-caop-mcp-tool: "list_commitments"
parameters:
- name: "status"
in: "query"
schema:
type: "string"
enum:
- "open"
- "completed"
- "failed"
- "cancelled"
- "expired"
- name: "goal_id"
in: "query"
schema:
type: "string"
- name: "cursor"
in: "query"
schema:
type: "string"
responses:
"200":
description: "Commitments"
content:
application/json:
schema:
$ref: "#/components/schemas/CommitmentList"
"401":
description: "Unauthenticated"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
/v1/plans:
post:
operationId: "plans.create"
summary: "Create a plan"
description: "Produces an execution plan. The planner may use an LLM; the runtime validates the plan against schemas, dependencies, and policy."
tags:
- "Plan"
x-caop-stage: "Plan"
x-caop-mcp-tool: "propose_plan"
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/PlanCreate"
example:
commitment_id: "com_123"
constraints:
require_approval_for_external_actions: true
preferred_capabilities:
- "document_analysis"
- "calculator"
- "research"
responses:
"201":
description: "Plan created"
content:
application/json:
schema:
$ref: "#/components/schemas/Plan"
example:
plan_id: "plan_123"
steps:
- id: "step_1"
capability: "document_analysis"
depends_on: []
- id: "step_2"
capability: "calculator"
depends_on:
- "step_1"
- id: "step_3"
capability: "report_generation"
depends_on:
- "step_2"
"400":
description: "Invalid request"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"401":
description: "Unauthenticated"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"403":
description: "Forbidden or approval required"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"404":
description: "Not found"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
/v1/executions:
post:
operationId: "executions.start"
summary: "Start an execution"
description: "Starts an authorized execution of a plan. Execution is asynchronous; acceptance does not mean completion."
tags:
- "Execute"
x-caop-stage: "Execute"
x-caop-mcp-tool: "start_work"
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/ExecutionCreate"
example:
plan_id: "plan_123"
idempotency_key: "execute-plan-123-v1"
authorization_context:
principal_id: "user_123"
responses:
"202":
description: "Queued"
content:
application/json:
schema:
$ref: "#/components/schemas/ExecutionAccepted"
example:
execution_id: "exec_123"
status: "queued"
next_action: "await_execution"
"400":
description: "Invalid request"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"401":
description: "Unauthenticated"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"403":
description: "Forbidden or approval required"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"404":
description: "Not found"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"/v1/executions/{execution_id}":
get:
operationId: "executions.get"
summary: "Get execution status"
description: "Returns the current state of an execution."
tags:
- "Execute"
x-caop-stage: "Execute"
x-caop-mcp-tool: "get_work_status"
parameters:
- name: "execution_id"
in: "path"
required: true
schema:
type: "string"
responses:
"200":
description: "Execution"
content:
application/json:
schema:
$ref: "#/components/schemas/Execution"
example:
execution_id: "exec_123"
plan_id: "plan_123"
state: "RUNNING"
state_version: 3
correlation_id: "goal_refinance"
updated_at: "2026-11-01T14:05:00Z"
"401":
description: "Unauthenticated"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"404":
description: "Not found"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"/v1/executions/{execution_id}/results":
post:
operationId: "executions.submit_result"
summary: "Submit a result"
description: "Submits output and evidence for verification. Moves a RUNNING execution to VERIFYING."
tags:
- "Execute"
x-caop-stage: "Execute"
x-caop-mcp-tool: "submit_result"
parameters:
- name: "execution_id"
in: "path"
required: true
schema:
type: "string"
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/ResultSubmission"
example:
output:
report: "artifact_789"
evidence_refs:
- "artifact_789"
idempotency_key: "submit-exec-123-v1"
responses:
"202":
description: "Accepted for verification"
content:
application/json:
schema:
$ref: "#/components/schemas/Execution"
example:
execution_id: "exec_123"
plan_id: "plan_123"
state: "RUNNING"
state_version: 3
correlation_id: "goal_refinance"
updated_at: "2026-11-01T14:05:00Z"
"400":
description: "Invalid request"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"401":
description: "Unauthenticated"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"404":
description: "Not found"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"409":
description: "Invalid transition or state version conflict"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"/v1/executions/{execution_id}/transitions":
post:
operationId: "executions.transition"
summary: "Transition an execution"
description: "Moves an execution between states. Invalid transitions are rejected with INVALID_TRANSITION; a stale expected_state yields STATE_VERSION_CONFLICT."
tags:
- "Execute"
x-caop-stage: "Execute"
parameters:
- name: "execution_id"
in: "path"
required: true
schema:
type: "string"
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/TransitionRequest"
example:
expected_state: "VERIFYING"
target_state: "COMPLETED"
verification_id: "verify_123"
responses:
"200":
description: "Transition accepted"
content:
application/json:
schema:
$ref: "#/components/schemas/Transition"
example:
transition_id: "tr_9"
execution_id: "exec_123"
from_state: "VERIFYING"
to_state: "COMPLETED"
state_version: 5
actor:
type: "service"
id: "caop-runtime"
reason: "verification passed"
correlation_id: "goal_refinance"
occurred_at: "2026-11-01T15:00:00Z"
"400":
description: "Invalid request"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"401":
description: "Unauthenticated"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"403":
description: "Forbidden or approval required"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"404":
description: "Not found"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"409":
description: "Invalid transition or state version conflict"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
/v1/verifications:
post:
operationId: "verifications.evaluate"
summary: "Evaluate verification"
description: "Evaluates an execution result against criteria. The verdict lists every check performed and its kind."
tags:
- "Verify"
x-caop-stage: "Verify"
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/VerificationRequest"
example:
execution_id: "exec_123"
criteria:
- "all_required_steps_completed"
- "result_has_supporting_evidence"
- "no_policy_violations"
responses:
"200":
description: "Verdict"
content:
application/json:
schema:
$ref: "#/components/schemas/Verification"
example:
verification_id: "verify_123"
verdict: "passed"
evidence_refs:
- "artifact_789"
checks:
- name: "all_required_steps_completed"
kind: "deterministic"
result: "pass"
- name: "result_has_supporting_evidence"
kind: "model_rubric"
result: "pass"
- name: "no_policy_violations"
kind: "deterministic"
result: "pass"
"400":
description: "Invalid request"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"401":
description: "Unauthenticated"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"404":
description: "Not found"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"422":
description: "Verification failed"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
/v1/records/commit:
post:
operationId: "records.commit"
summary: "Commit a record"
description: "Persists facts, evidence, and outcomes with optimistic concurrency on expected_state_version."
tags:
- "Record"
x-caop-stage: "Record"
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/RecordCommit"
example:
execution_id: "exec_123"
verification_id: "verify_123"
expected_state_version: 42
changes:
- entity_id: "com_123"
operation: "set_status"
value: "completed"
responses:
"200":
description: "Committed"
content:
application/json:
schema:
$ref: "#/components/schemas/RecordCommitted"
example:
transaction_id: "txn_123"
state_version: 43
status: "committed"
"400":
description: "Invalid request"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"401":
description: "Unauthenticated"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"403":
description: "Forbidden or approval required"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"409":
description: "Invalid transition or state version conflict"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
/v1/reviews:
post:
operationId: "reviews.evaluate"
summary: "Evaluate a review"
description: "Evaluates progress toward a goal. Recommended actions are proposals, not authorized actions."
tags:
- "Review"
x-caop-stage: "Review"
x-caop-mcp-tool: "review_goals"
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/ReviewRequest"
example:
goal_id: "goal_refinance"
review_type: "progress"
include:
- "outcomes"
- "unresolved_commitments"
- "failures"
- "next_actions"
responses:
"200":
description: "Review"
content:
application/json:
schema:
$ref: "#/components/schemas/Review"
example:
review_id: "review_123"
goal_status: "active"
recommended_actions:
- action: "request_final_offer"
requires_approval: true
"400":
description: "Invalid request"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"401":
description: "Unauthenticated"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"404":
description: "Not found"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"/v1/approvals/{approval_request_id}/decision":
post:
operationId: "approvals.decide"
summary: "Decide an approval request"
description: "Grants or denies a scoped, expiring authorization for a consequential action."
tags:
- "Execute"
x-caop-stage: "Execute"
x-caop-mcp-tool: "approve_action"
parameters:
- name: "approval_request_id"
in: "path"
required: true
schema:
type: "string"
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/ApprovalDecision"
example:
decision: "approve"
scope:
document: "offer-v2"
max_price: 632000
expires_at: "2026-11-02T22:00:00Z"
responses:
"200":
description: "Decision recorded"
content:
application/json:
schema:
$ref: "#/components/schemas/Approval"
example:
approval_id: "appr_301"
approval_request_id: "approval_123"
decision: "approve"
scope:
document: "offer-v2"
approved_by:
type: "user"
id: "user_123"
expires_at: "2026-11-02T22:00:00Z"
"400":
description: "Invalid request"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"401":
description: "Unauthenticated"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"403":
description: "Forbidden or approval required"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"404":
description: "Not found"
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
components:
securitySchemes:
bearerAuth:
type: "http"
scheme: "bearer"
schemas:
PrincipalRef:
type: "object"
properties:
type:
type: "string"
enum:
- "user"
- "role"
- "agent"
- "service"
id:
type: "string"
additionalProperties: false
required:
- "type"
- "id"
description: "An authenticated principal: a person, a role, an agent, or a service account."
EntityRef:
type: "string"
description: "Identifier of any entity known to the OS, e.g. \"property/14-oak-lane\"."
EvidenceRef:
type: "string"
description: "Identifier of a piece of evidence (an artifact, observation, or record) that supports a fact or outcome."
ArtifactRef:
type: "string"
description: "Identifier of a stored artifact such as a document or report."
Expression:
type: "string"
description: "A condition evaluated by the policy engine, e.g. \"recipient.type == 'client'\"."
Criterion:
type: "object"
properties:
type:
type: "string"
additionalProperties: true
required:
- "type"
description: "A success criterion. \"type\" selects the evaluator; other members are evaluator-specific."
Constraint:
type: "object"
properties:
type:
type: "string"
additionalProperties: true
required:
- "type"
description: "A constraint on how a goal may be pursued."
AuthorizationPolicy:
type: "object"
properties:
requiredScopes:
type: "array"
items:
type: "string"
policyIds:
type: "array"
items:
type: "string"
additionalProperties: false
description: "What a caller must hold to invoke a capability."
Goal:
type: "object"
properties:
id:
type: "string"
objective:
type: "string"
owner:
$ref: "#/components/schemas/PrincipalRef"
successCriteria:
type: "array"
items:
$ref: "#/components/schemas/Criterion"
constraints:
type: "array"
items:
$ref: "#/components/schemas/Constraint"
status:
type: "string"
enum:
- "active"
- "paused"
- "achieved"
- "abandoned"
createdAt:
type: "string"
format: "date-time"
updatedAt:
type: "string"
format: "date-time"
additionalProperties: false
required:
- "id"
- "objective"
- "owner"
- "successCriteria"
- "constraints"
- "status"
- "createdAt"
- "updatedAt"
description: "A desired outcome that persists beyond a single conversation."
WorkItem:
type: "object"
properties:
id:
type: "string"
goalId:
type: "string"
description:
type: "string"
dependencies:
type: "array"
items:
type: "string"
status:
type: "string"
enum:
- "pending"
- "ready"
- "running"
- "blocked"
- "completed"
- "failed"
- "cancelled"
assignedCapability:
type: "string"
result:
$ref: "#/components/schemas/ArtifactRef"
deadline:
type: "string"
format: "date-time"
additionalProperties: false
required:
- "id"
- "goalId"
- "description"
- "dependencies"
- "status"
description: "A bounded unit of execution that advances a goal."
Fact:
type: "object"
properties:
id:
type: "string"
subject:
$ref: "#/components/schemas/EntityRef"
predicate:
type: "string"
object: {}
source:
$ref: "#/components/schemas/EvidenceRef"
observedAt:
type: "string"
format: "date-time"
validFrom:
type: "string"
format: "date-time"
validTo:
type: "string"
format: "date-time"
confidence:
type: "number"
minimum: 0
maximum: 1
additionalProperties: false
required:
- "id"
- "subject"
- "predicate"
- "object"
- "source"
- "observedAt"
description: "A durable, provenance-bearing statement in the OS state. Every material fact has a traceable source."
Capability:
type: "object"
properties:
id:
type: "string"
operations:
type: "array"
items:
type: "string"
inputSchema:
type: "object"
outputSchema:
type: "object"
authorization:
$ref: "#/components/schemas/AuthorizationPolicy"
executionMode:
type: "string"
enum:
- "interactive"
- "background"
- "scheduled"
provider:
type: "string"
additionalProperties: false
required:
- "id"
- "operations"
- "inputSchema"
- "outputSchema"
- "authorization"
- "executionMode"
- "provider"
description: "Something the OS can invoke to perform work."
Policy:
type: "object"
properties:
id:
type: "string"
scope:
type: "string"
condition:
$ref: "#/components/schemas/Expression"
effect:
type: "string"
enum:
- "allow"
- "deny"
- "require_approval"
version:
type: "string"
enforcement:
type: "string"
enum:
- "advisory"
- "enforced"
description: "Advisory policies are instructions to a model. Enforced policies are checked by the runtime before an action executes."
additionalProperties: false
required:
- "id"
- "scope"
- "condition"
- "effect"
- "version"
- "enforcement"
description: "A constraint governing execution."
CapabilityDescriptor:
type: "object"
properties:
id:
type: "string"
provider:
type: "string"
operations:
type: "array"
items:
type: "string"
inputSchema:
type: "object"
outputSchema:
type: "object"
supportsAsync:
type: "boolean"
supportsResume:
type: "boolean"
supportsCancellation:
type: "boolean"
authorizationRequired:
type: "boolean"
sideEffectLevel:
type: "string"
enum:
- "none"
- "reversible"
- "irreversible"
additionalProperties: false
required:
- "id"
- "provider"
- "operations"
- "inputSchema"
- "outputSchema"
- "supportsAsync"
- "supportsResume"
- "supportsCancellation"
- "authorizationRequired"
- "sideEffectLevel"
description: "What an execution provider can do, independent of any one AI vendor."
CapabilityInvocation:
type: "object"
properties:
invocationId:
type: "string"
capabilityId:
type: "string"
input: {}
contextRefs:
type: "array"
items:
type: "string"
authorizationRef:
type: "string"
idempotencyKey:
type: "string"
additionalProperties: false
required:
- "invocationId"
- "capabilityId"
- "input"
- "contextRefs"
- "idempotencyKey"
description: "A request to a capability."
CapabilityResult:
type: "object"
properties:
invocationId:
type: "string"
status:
type: "string"
enum:
- "completed"
- "failed"
- "pending"
- "requires_approval"
output: {}
evidenceRefs:
type: "array"
items:
type: "string"
error:
type: "object"
properties:
code:
type: "string"
message:
type: "string"
retryable:
type: "boolean"
additionalProperties: false
required:
- "code"
- "message"
- "retryable"
additionalProperties: false
required:
- "invocationId"
- "status"
- "evidenceRefs"
description: "The outcome of a capability invocation."
ExecutionState:
type: "string"
enum:
- "CREATED"
- "READY"
- "RUNNING"
- "WAITING_APPROVAL"
- "BLOCKED"
- "VERIFYING"
- "FAILED"
- "COMPLETED"
- "CANCELLED"
- "EXPIRED"
description: "Execution states. COMPLETED, CANCELLED, and EXPIRED are terminal. Invalid transitions are rejected."
ObservationCreate:
type: "object"
properties:
source:
type: "object"
properties:
provider:
type: "string"
resource_id:
type: "string"
additionalProperties: false
required:
- "provider"
- "resource_id"
type:
type: "string"
occurred_at:
type: "string"
format: "date-time"
payload_ref:
$ref: "#/components/schemas/ArtifactRef"
idempotency_key:
type: "string"
additionalProperties: false
required:
- "source"
- "type"
- "occurred_at"
- "idempotency_key"
description: "Something the OS learned from an external source. Replaying the same source event must not create a duplicate."
ObservationAccepted:
type: "object"
properties:
observation_id:
type: "string"
status:
type: "string"
enum:
- "accepted"
duplicate:
type: "boolean"
additionalProperties: false
required:
- "observation_id"
- "status"
- "duplicate"
ContextResolveRequest:
type: "object"
properties:
observation_ids:
type: "array"
items:
type: "string"
goal_id:
type: "string"
scope:
type: "object"
properties:
workspace_id:
type: "string"
project_ids:
type: "array"
items:
type: "string"
additionalProperties: false
required:
- "workspace_id"
include:
type: "array"
items:
type: "string"
enum:
- "related_goals"
- "open_commitments"
- "relevant_policies"
- "prior_decisions"
additionalProperties: false
required:
- "scope"
- "include"
ContextBundle:
type: "object"
properties:
context_id:
type: "string"
state_version:
type: "integer"
minimum: 0
related_goals:
type: "array"
items:
type: "string"
open_commitments:
type: "array"
items:
type: "string"
applicable_policies:
type: "array"
items:
type: "string"
unresolved_questions:
type: "array"
items:
type: "string"
retrieved_facts:
type: "array"
items:
$ref: "#/components/schemas/Fact"
inferences:
type: "array"
items:
type: "object"
properties:
statement:
type: "string"
based_on:
type: "array"
items:
type: "string"
additionalProperties: false
required:
- "statement"
- "based_on"
additionalProperties: false
required:
- "context_id"
- "state_version"
- "related_goals"
- "open_commitments"
- "applicable_policies"
- "unresolved_questions"
description: "Resolved context. Retrieved facts and inferred interpretations are kept separate."
CommitmentCreate:
type: "object"
properties:
goal_id:
type: "string"
objective:
type: "string"
success_criteria:
type: "array"
items:
$ref: "#/components/schemas/Criterion"
deadline:
type: "string"
format: "date-time"
additionalProperties: false
required:
- "goal_id"
- "objective"
- "success_criteria"
Commitment:
type: "object"
properties:
commitment_id:
type: "string"
goal_id:
type: "string"
objective:
type: "string"
success_criteria:
type: "array"
items:
$ref: "#/components/schemas/Criterion"
deadline:
type: "string"
format: "date-time"
status:
type: "string"
enum:
- "open"
- "completed"
- "failed"
- "cancelled"
- "expired"
version:
type: "integer"
minimum: 0
additionalProperties: false
required:
- "commitment_id"
- "status"
- "version"
description: "A durable obligation. It cannot be marked completed solely because an agent claims it is complete."
CommitmentList:
type: "object"
properties:
data:
type: "array"
items:
$ref: "#/components/schemas/Commitment"
next_cursor:
type:
- "string"
- "null"
additionalProperties: false
required:
- "data"
PlanCreate:
type: "object"
properties:
commitment_id:
type: "string"
constraints:
type: "object"
properties:
require_approval_for_external_actions:
type: "boolean"
additionalProperties: true
preferred_capabilities:
type: "array"
items:
type: "string"
additionalProperties: false
required:
- "commitment_id"
Plan:
type: "object"
properties:
plan_id:
type: "string"
commitment_id:
type: "string"
steps:
type: "array"
items:
type: "object"
properties:
id:
type: "string"
capability:
type: "string"
depends_on:
type: "array"
items:
type: "string"
additionalProperties: false
required:
- "id"
- "capability"
- "depends_on"
additionalProperties: false
required:
- "plan_id"
- "steps"
description: "A validated proposal. The runtime checks it against schemas, dependencies, and policy before execution."
ExecutionCreate:
type: "object"
properties:
plan_id:
type: "string"
idempotency_key:
type: "string"
authorization_context:
type: "object"
properties:
principal_id:
type: "string"
additionalProperties: false
required:
- "principal_id"
additionalProperties: false
required:
- "plan_id"
- "idempotency_key"
- "authorization_context"
ExecutionAccepted:
type: "object"
properties:
execution_id:
type: "string"
status:
type: "string"
enum:
- "queued"
next_action:
type: "string"
additionalProperties: false
required:
- "execution_id"
- "status"
description: "Execution is asynchronous. Acceptance does not mean the work is complete."
Execution:
type: "object"
properties:
execution_id:
type: "string"
plan_id:
type: "string"
state:
$ref: "#/components/schemas/ExecutionState"
state_version:
type: "integer"
minimum: 0
correlation_id:
type: "string"
updated_at:
type: "string"
format: "date-time"
additionalProperties: false
required:
- "execution_id"
- "state"
- "state_version"
TransitionRequest:
type: "object"
properties:
expected_state:
$ref: "#/components/schemas/ExecutionState"
target_state:
$ref: "#/components/schemas/ExecutionState"
verification_id:
type: "string"
reason:
type: "string"
additionalProperties: false
required:
- "expected_state"
- "target_state"
Transition:
type: "object"
properties:
transition_id:
type: "string"
execution_id:
type: "string"
from_state:
$ref: "#/components/schemas/ExecutionState"
to_state:
$ref: "#/components/schemas/ExecutionState"
state_version:
type: "integer"
minimum: 0
actor:
$ref: "#/components/schemas/PrincipalRef"
reason:
type: "string"
correlation_id:
type: "string"
occurred_at:
type: "string"
format: "date-time"
additionalProperties: false
required:
- "transition_id"
- "execution_id"
- "from_state"
- "to_state"
- "state_version"
- "actor"
- "correlation_id"
- "occurred_at"
description: "Every accepted transition is persisted with an actor, timestamp, reason, and correlation ID."
ResultSubmission:
type: "object"
properties:
output: {}
evidence_refs:
type: "array"
items:
type: "string"
idempotency_key:
type: "string"
additionalProperties: false
required:
- "evidence_refs"
- "idempotency_key"
VerificationRequest:
type: "object"
properties:
execution_id:
type: "string"
criteria:
type: "array"
items:
type: "string"
additionalProperties: false
required:
- "execution_id"
- "criteria"
Verification:
type: "object"
properties:
verification_id:
type: "string"
verdict:
type: "string"
enum:
- "passed"
- "failed"
evidence_refs:
type: "array"
items:
type: "string"
checks:
type: "array"
items:
type: "object"
properties:
name:
type: "string"
kind:
type: "string"
enum:
- "deterministic"
- "model_rubric"
- "human"
result:
type: "string"
enum:
- "pass"
- "fail"
additionalProperties: false
required:
- "name"
- "kind"
- "result"
additionalProperties: false
required:
- "verification_id"
- "verdict"
- "evidence_refs"
- "checks"
description: "A verdict must identify which checks were performed."
RecordCommit:
type: "object"
properties:
execution_id:
type: "string"
verification_id:
type: "string"
expected_state_version:
type: "integer"
minimum: 0
changes:
type: "array"
items:
type: "object"
properties:
entity_id:
type: "string"
operation:
type: "string"
value: {}
additionalProperties: false
required:
- "entity_id"
- "operation"
additionalProperties: false
required:
- "expected_state_version"
- "changes"
description: "A state mutation. A conflicting state version rejects the transaction or invokes a declared conflict policy."
RecordCommitted:
type: "object"
properties:
transaction_id:
type: "string"
state_version:
type: "integer"
minimum: 0
status:
type: "string"
enum:
- "committed"
additionalProperties: false
required:
- "transaction_id"
- "state_version"
- "status"
ReviewRequest:
type: "object"
properties:
goal_id:
type: "string"
review_type:
type: "string"
enum:
- "progress"
- "outcome"
- "risk"
include:
type: "array"
items:
type: "string"
enum:
- "outcomes"
- "unresolved_commitments"
- "failures"
- "next_actions"
additionalProperties: false
required:
- "goal_id"
- "review_type"
Review:
type: "object"
properties:
review_id:
type: "string"
goal_status:
type: "string"
enum:
- "active"
- "paused"
- "achieved"
- "abandoned"
recommended_actions:
type: "array"
items:
type: "object"
properties:
action:
type: "string"
requires_approval:
type: "boolean"
additionalProperties: false
required:
- "action"
- "requires_approval"
additionalProperties: false
required:
- "review_id"
- "goal_status"
- "recommended_actions"
description: "Recommendations are proposals, not authorized actions."
ApprovalDecision:
type: "object"
properties:
decision:
type: "string"
enum:
- "approve"
- "deny"
scope:
type: "object"
description: "What exactly is authorized, e.g. a document, amount, or recipient."
expires_at:
type: "string"
format: "date-time"
additionalProperties: false
required:
- "decision"
- "expires_at"
Approval:
type: "object"
properties:
approval_id:
type: "string"
approval_request_id:
type: "string"
decision:
type: "string"
enum:
- "approve"
- "deny"
scope:
type: "object"
approved_by:
$ref: "#/components/schemas/PrincipalRef"
expires_at:
type: "string"
format: "date-time"
additionalProperties: false
required:
- "approval_id"
- "approval_request_id"
- "decision"
- "approved_by"
- "expires_at"
description: "A scoped, expiring authorization for a consequential action."
EventEnvelope:
type: "object"
properties:
event_id:
type: "string"
event_type:
type: "string"
description: "e.g. observation.received, commitment.created, plan.approved, execution.started, execution.blocked, approval.requested, approval.granted, execution.completed, verification.failed, record.committed, goal.achieved"
schema_version:
type: "string"
occurred_at:
type: "string"
format: "date-time"
workspace_id:
type: "string"
subject_id:
type: "string"
correlation_id:
type: "string"
causation_id:
type: "string"
payload:
type: "object"
additionalProperties: false
required:
- "event_id"
- "event_type"
- "schema_version"
- "occurred_at"
- "workspace_id"
- "subject_id"
- "correlation_id"
- "payload"
Error:
type: "object"
properties:
error:
type: "object"
properties:
code:
type: "string"
enum:
- "INVALID_REQUEST"
- "UNAUTHENTICATED"
- "FORBIDDEN"
- "NOT_FOUND"
- "POLICY_APPROVAL_REQUIRED"
- "POLICY_DENIED"
- "INVALID_TRANSITION"
- "STATE_VERSION_CONFLICT"
- "VERIFICATION_FAILED"
- "RATE_LIMITED"
- "INTERNAL"
message:
type: "string"
retryable:
type: "boolean"
details:
type: "object"
additionalProperties: false
required:
- "code"
- "message"
- "retryable"
trace_id:
type: "string"
additionalProperties: false
required:
- "error"
- "trace_id"
MetricNode:
type: "object"
properties:
id:
type: "string"
name:
type: "string"
formula:
type: "string"
parentMetricId:
type: "string"
childMetricIds:
type: "array"
items:
type: "string"
owner:
$ref: "#/components/schemas/PrincipalRef"
baselineCadence:
type: "string"
enum:
- "hourly"
- "daily"
- "weekly"
- "monthly"
varianceThresholds:
type: "object"
properties:
warningDeltaPct:
type: "number"
criticalDeltaPct:
type: "number"
additionalProperties: false
required:
- "warningDeltaPct"
- "criticalDeltaPct"
additionalProperties: false
required:
- "id"
- "name"
- "childMetricIds"
- "owner"
- "baselineCadence"
- "varianceThresholds"
description: "A node in a hierarchical KPI tree. Variance beyond thresholds triggers Understand or a Commitment."
ApprovalRoutingRule:
type: "object"
properties:
policyId:
type: "string"
requiredRoles:
type: "array"
items:
type: "string"
minQuorum:
type: "integer"
minimum: 1
expirationSeconds:
type: "integer"
minimum: 1
escalateToRoleOnTimeout:
type: "string"
additionalProperties: false
required:
- "policyId"
- "requiredRoles"
- "minQuorum"
- "expirationSeconds"
description: "Delegation of Authority routing for a policy."