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
  1. Overview
  2. Authentication and errors
  3. Public operations
  4. Observe
  5. observations.ingest
  6. Understand
  7. context.resolve
  8. Commit
  9. commitments.create
  10. commitments.list
  11. Plan
  12. plans.create
  13. Execute
  14. executions.start
  15. executions.get
  16. executions.submit_result
  17. executions.transition
  18. approvals.decide
  19. Verify
  20. verifications.evaluate
  21. Record
  22. records.commit
  23. Review
  24. reviews.evaluate
  25. 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"
}
HTTPError codes
400INVALID_REQUEST
401UNAUTHENTICATED
403FORBIDDEN, POLICY_APPROVAL_REQUIRED, POLICY_DENIED
404NOT_FOUND
409INVALID_TRANSITION, STATE_VERSION_CONFLICT
422VERIFICATION_FAILED
429 / 500RATE_LIMITED, INTERNAL

Public operations

Assistants see ten outcome-oriented MCP tools. Each maps to one endpoint (x-caop-mcp-tool in the contract):

MCP toolEndpoint
observePOST /v1/observations
get_contextPOST /v1/context/resolve
create_commitmentPOST /v1/commitments
list_commitmentsGET /v1/commitments
propose_planPOST /v1/plans
start_workPOST /v1/executions
get_work_statusGET /v1/executions/{execution_id}
submit_resultPOST /v1/executions/{execution_id}/results
review_goalsPOST /v1/reviews
approve_actionPOST /v1/approvals/{approval_request_id}/decision

Observe

POST/v1/observationsIngest an observation

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.

operationId observations.ingestMCP tool observe202 ObservationAcceptedErrors 400, 401, 403
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

POST/v1/context/resolveResolve context

Resolves observations against known state. Retrieved facts and inferred interpretations are returned separately.

operationId context.resolveMCP tool get_context200 ContextBundleErrors 400, 401, 403
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

POST/v1/commitmentsCreate a commitment

Creates a durable obligation or objective. A commitment cannot be completed solely because an agent claims it is complete.

operationId commitments.createMCP tool create_commitment201 CommitmentErrors 400, 401, 403
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
}
GET/v1/commitmentsList commitments

Returns outstanding and recent commitments for the caller’s workspace.

operationId commitments.listMCP tool list_commitments200 CommitmentListErrors 401
ParameterInType
statusqueryopen | completed | failed | cancelled | expired
goal_idquerystring
cursorquerystring

Plan

POST/v1/plansCreate a plan

Produces an execution plan. The planner may use an LLM; the runtime validates the plan against schemas, dependencies, and policy.

operationId plans.createMCP tool propose_plan201 PlanErrors 400, 401, 403, 404
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

POST/v1/executionsStart an execution

Starts an authorized execution of a plan. Execution is asynchronous; acceptance does not mean completion.

operationId executions.startMCP tool start_work202 ExecutionAcceptedErrors 400, 401, 403, 404
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"
}
GET/v1/executions/{execution_id}Get execution status

Returns the current state of an execution.

operationId executions.getMCP tool get_work_status200 ExecutionErrors 401, 404
ParameterInType
execution_idrequiredpathstring
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"
}
POST/v1/executions/{execution_id}/resultsSubmit a result

Submits output and evidence for verification. Moves a RUNNING execution to VERIFYING.

operationId executions.submit_resultMCP tool submit_result202 ExecutionErrors 400, 401, 404, 409
ParameterInType
execution_idrequiredpathstring
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"
}
POST/v1/executions/{execution_id}/transitionsTransition an execution

Moves an execution between states. Invalid transitions are rejected with INVALID_TRANSITION; a stale expected_state yields STATE_VERSION_CONFLICT.

operationId executions.transition200 TransitionErrors 400, 401, 403, 404, 409
ParameterInType
execution_idrequiredpathstring
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"
}
POST/v1/approvals/{approval_request_id}/decisionDecide an approval request

Grants or denies a scoped, expiring authorization for a consequential action.

operationId approvals.decideMCP tool approve_action200 ApprovalErrors 400, 401, 403, 404
ParameterInType
approval_request_idrequiredpathstring
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

POST/v1/verificationsEvaluate verification

Evaluates an execution result against criteria. The verdict lists every check performed and its kind.

operationId verifications.evaluate200 VerificationErrors 400, 401, 404, 422
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

POST/v1/records/commitCommit a record

Persists facts, evidence, and outcomes with optimistic concurrency on expected_state_version.

operationId records.commit200 RecordCommittedErrors 400, 401, 403, 409
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

POST/v1/reviewsEvaluate a review

Evaluates progress toward a goal. Recommended actions are proposals, not authorized actions.

operationId reviews.evaluateMCP tool review_goals200 ReviewErrors 400, 401, 404
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."