openapi: 3.1.2
jsonSchemaDialect: https://json-schema.org/draft/2020-12/schema
info:
  title: Indwel API Reference
  version: mark-iii-launch-reference-r12
  summary: The launch API for durable Work, governed cognition, and governed applications.
  description: "One logical API for durable Work, governed application execution, Conversation and Session Continuity, Memory,\
    \ Scheduled Work, Parallel Cognition, evidence, effects, artifacts, receipts, and the developer control plane.\n\n**Production\
    \ origin:** `https://api.indwel.ai`  \n**Development origin:** `https://api.dev.indwel.ai`\n\nAuthentication and backend\
    \ authority determine what a principal may observe or change. Possession of a resource identifier never confers authority\
    \ by itself.\n\n**Protocol posture:** OAuth 2.0 · Problem Details errors · explicit idempotency where declared · durable\
    \ asynchronous work survives HTTP timeouts."
  contact:
    name: Indwel
servers:
- url: https://api.indwel.ai
  description: Production
- url: https://api.dev.indwel.ai
  description: Development
tags:
- name: Platform
  description: Service identity, capabilities, and release metadata.
  x-displayName: Service & Capabilities
- name: Account
  description: Self-scoped account projections.
  x-displayName: Account
- name: Organizations
  description: Organization and workspace authority visible to the authenticated principal.
  x-displayName: Organizations
- name: Projects
  description: Developer projects and their bounded application-development context.
  x-displayName: Projects
- name: Environments
  description: Project environments and deployment boundaries.
  x-displayName: Environments
- name: Clients
  description: Bounded developer clients.
  x-displayName: Clients
- name: Credentials
  description: Credential metadata, rotation, and revocation.
  x-displayName: Credentials
- name: App Templates
  description: Governed application templates and their immutable definitions.
  x-displayName: App Templates
- name: Apps
  description: Project-owned governed applications, versions, deployments, and installations.
  x-displayName: Apps & Versions
- name: Collections
  description: Collections, Sources, and durable ingestion lineage.
  x-displayName: Collections, Sources & Ingestion
- name: Work
  description: Durable longitudinal undertakings in the Indwel operating plane.
  x-displayName: Work
- name: Conversation & Sessions
  description: Principal-bound interactive Conversation, bounded Sessions, and server-settled Continuity.
  x-displayName: Conversation, Sessions & Continuity
- name: Cases
  description: Business App Engine Cases, governance, human authority, transitions, and Effects.
  x-displayName: Cases, Governance & Effects
- name: Runs
  description: Case-bound governed cognition and its terminal projections.
  x-displayName: Runs, Evidence & Receipts
- name: Memory
  description: Authenticated Memory V2 and Work/answer-bound Memory projections. Personal Memory is user-delegated only; client
    credentials cannot acquire account Memory authority.
  x-displayName: Memory
- name: Scheduled Work
  description: Governed cognition due at a time or condition.
  x-displayName: Scheduled Work
- name: Parallel Cognition
  description: Work-bound governed parallel programs and program-level cancellation.
  x-displayName: Parallel Cognition
- name: Operations
  description: Explicit long-running control-plane operations and cancellation.
  x-displayName: Operations
- name: Events
  description: Customer event destinations, deliveries, replay, and signing-secret lifecycle.
  x-displayName: Events & Integrations
- name: Activity
  description: Customer-safe activity projections.
  x-displayName: Activity
- name: Usage
  description: Quotas, metering, and usage projections.
  x-displayName: Usage & Quotas
- name: Commercial
  description: Commercial metadata exposed as API resources.
  x-displayName: Plans & Commercial Metadata
- name: Compatibility
  description: Launch-supported compatibility and convenience operations that do not define the canonical resource model.
  x-displayName: Compatibility & Migration
paths:
  /v1/services:
    get:
      operationId: listServices
      summary: List API services
      description: 'Returns non-tenant service discovery metadata. Current metadata routes require consolidation and privacy
        review before runtime binding.


        **Contract:** global public · read.'
      tags:
      - Platform
      security: []
      responses:
        '200':
          description: Successful response.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceListResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      items:
                      - serviceId: platform
                        name: Indwel Platform
                        status: operational
                        apiVersions:
                        - v1
                        governance: evidence-first
                        releaseId: null
                      nextCursor: null
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.service
      x-indwel-tenancy: global-public
      x-indwel-effect:
        level: read
        receiptRequired: false
  /v1/capabilities:
    get:
      operationId: listCapabilities
      summary: List admitted capabilities
      description: 'Returns lifecycle and claim posture for platform capabilities. It must not manufacture capability from
        route existence.


        **Contract:** scope `platform.read` · authenticated tenant context · read.'
      tags:
      - Platform
      security:
      - IndwelOAuth:
        - platform.read
      responses:
        '200':
          description: Successful response.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CapabilityListResponse'
              example:
                data:
                  items:
                  - capabilityId: governed-app-templates
                    name: Governed app templates
                    lifecycle: preview
                    claimStatus: qualified
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.capability
      x-indwel-tenancy: authenticated-tenant-context
      x-indwel-effect:
        level: read
        receiptRequired: false
  /v1/releases:
    get:
      operationId: listPlatformReleases
      summary: List platform releases
      description: 'Returns release identities and compatibility notices bound to the atomic release record.


        **Contract:** scope `platform.read` · authenticated tenant context · read.'
      tags:
      - Platform
      security:
      - IndwelOAuth:
        - platform.read
      responses:
        '200':
          description: Successful response.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PlatformReleaseListResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      items:
                      - releaseId: release_candidate_001
                        version: 0.1.0-design.1
                        releasedAt: '2026-07-23T21:40:00Z'
                        status: candidate
                        summary: Design contract candidate
                        breakingChanges: []
                      nextCursor: null
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.platformRelease
      x-indwel-tenancy: authenticated-tenant-context
      x-indwel-effect:
        level: read
        receiptRequired: false
  /v1/subscription-plans:
    get:
      operationId: listSubscriptionPlans
      summary: List subscription plans
      description: 'Returns product packaging and entitlement metadata. Price, payment and availability remain governed by
        Financial Operations and commercial authority.


        **Contract:** global public · read.'
      tags:
      - Commercial
      security: []
      responses:
        '200':
          description: Successful response.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SubscriptionPlanListResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      items:
                      - planKey: team
                        label: Team
                        seatLimit: 25
                        workspaceLimit: 3
                        storageBytesLimit: 107374182400
                        evidenceBytesLimit: 53687091200
                        monthlyRunsLimit: 5000
                        monthlyTokensLimit: 25000000
                        connectorSyncsLimit: 250
                        identityProviderModes:
                        - native
                        - oidc
                        - saml
                        environments:
                        - dev
                        - staging
                        - prod
                        auditRetentionDays: 180
                        supportTier: standard
                        commercialStatus: design-candidate
                      nextCursor: null
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.subscriptionPlan
      x-indwel-tenancy: global-public
      x-indwel-effect:
        level: read
        receiptRequired: false
  /v1/app-templates:
    get:
      operationId: listAppTemplates
      summary: List governed app templates
      description: 'Lists curated app templates. This operation does not imply mutable customer App authority.


        **Contract:** scope `catalog.read` · authenticated tenant context · read.'
      tags:
      - App Templates
      security:
      - IndwelOAuth:
        - catalog.read
      responses:
        '200':
          description: Successful response.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AppTemplateListResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      items:
                      - appTemplateId: contract-review
                        name: Contract Review
                        description: Governed contract review template.
                        domain: legal-operations
                        lifecycle: preview
                        version: 1.0.0-preview
                        defaultWorkflowId: review
                        supportedRunFields:
                        - objective
                        requiredArtifacts:
                        - review-memo
                        links:
                          self: /v1/app-templates/contract-review
                          workflows: /v1/app-templates/contract-review/workflows
                          schemas: /v1/app-templates/contract-review/schemas
                          actionDefinitions: /v1/app-templates/contract-review/action-definitions
                          policies: /v1/app-templates/contract-review/policies
                          capabilities: /v1/app-templates/contract-review/capabilities
                      nextCursor: null
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.appTemplate
      x-indwel-tenancy: authenticated-tenant-context
      x-indwel-effect:
        level: read
        receiptRequired: false
      parameters:
      - $ref: '#/components/parameters/Limit'
      - $ref: '#/components/parameters/Cursor'
  /v1/app-templates/{appTemplateId}:
    get:
      operationId: getAppTemplate
      summary: Get a governed app template
      description: 'Returns one curated app template.


        **Contract:** scope `catalog.read` · authenticated tenant context · read.'
      tags:
      - App Templates
      security:
      - IndwelOAuth:
        - catalog.read
      responses:
        '200':
          description: Successful response.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AppTemplateResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      appTemplateId: contract-review
                      name: Contract Review
                      description: Governed contract review template.
                      domain: legal-operations
                      lifecycle: preview
                      version: 1.0.0-preview
                      defaultWorkflowId: review
                      supportedRunFields:
                      - objective
                      requiredArtifacts:
                      - review-memo
                      links:
                        self: /v1/app-templates/contract-review
                        workflows: /v1/app-templates/contract-review/workflows
                        schemas: /v1/app-templates/contract-review/schemas
                        actionDefinitions: /v1/app-templates/contract-review/action-definitions
                        policies: /v1/app-templates/contract-review/policies
                        capabilities: /v1/app-templates/contract-review/capabilities
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.appTemplate
      x-indwel-tenancy: authenticated-tenant-context
      x-indwel-effect:
        level: read
        receiptRequired: false
      parameters:
      - $ref: '#/components/parameters/AppTemplateId'
  /v1/app-templates/{appTemplateId}/workflows:
    get:
      operationId: listAppTemplateWorkflows
      summary: List template workflows
      description: 'Returns workflow definitions belonging to an app template.


        **Contract:** scope `catalog.read` · authenticated tenant context · read.'
      tags:
      - App Templates
      security:
      - IndwelOAuth:
        - catalog.read
      responses:
        '200':
          description: Successful response.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkflowListResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      items:
                      - workflowId: review
                        name: Review
                        description: Review a contract under admitted evidence and policy.
                        lifecycle: preview
                        steps:
                        - stepId: admit-evidence
                          kind: evidence-admission
                          description: Admit governing evidence.
                      nextCursor: null
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.workflow
      x-indwel-tenancy: authenticated-tenant-context
      x-indwel-effect:
        level: read
        receiptRequired: false
      parameters:
      - $ref: '#/components/parameters/AppTemplateId'
  /v1/app-templates/{appTemplateId}/workflows/{workflowId}:
    get:
      operationId: getAppTemplateWorkflow
      summary: Get a template workflow
      description: 'Returns one workflow definition belonging to an app template.


        **Contract:** scope `catalog.read` · authenticated tenant context · read.'
      tags:
      - App Templates
      security:
      - IndwelOAuth:
        - catalog.read
      responses:
        '200':
          description: Successful response.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkflowResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      workflowId: review
                      name: Review
                      description: Review a contract under admitted evidence and policy.
                      lifecycle: preview
                      steps:
                      - stepId: admit-evidence
                        kind: evidence-admission
                        description: Admit governing evidence.
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.workflow
      x-indwel-tenancy: authenticated-tenant-context
      x-indwel-effect:
        level: read
        receiptRequired: false
      parameters:
      - $ref: '#/components/parameters/AppTemplateId'
      - $ref: '#/components/parameters/WorkflowId'
  /v1/app-templates/{appTemplateId}/schemas:
    get:
      operationId: listAppTemplateSchemas
      summary: List template schemas
      description: 'Returns JSON Schema definitions belonging to an app template.


        **Contract:** scope `catalog.read` · authenticated tenant context · read.'
      tags:
      - App Templates
      security:
      - IndwelOAuth:
        - catalog.read
      responses:
        '200':
          description: Successful response.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SchemaDefinitionListResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      items:
                      - schemaId: contract-input
                        name: Contract input
                        schema:
                          type: object
                          required:
                          - objective
                          properties:
                            objective:
                              type: string
                      nextCursor: null
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.schema
      x-indwel-tenancy: authenticated-tenant-context
      x-indwel-effect:
        level: read
        receiptRequired: false
      parameters:
      - $ref: '#/components/parameters/AppTemplateId'
  /v1/app-templates/{appTemplateId}/action-definitions:
    get:
      operationId: listAppTemplateActionDefinitions
      summary: List template action definitions
      description: 'Returns action definitions and their effect and review posture.


        **Contract:** scope `catalog.read` · authenticated tenant context · read.'
      tags:
      - App Templates
      security:
      - IndwelOAuth:
        - catalog.read
      responses:
        '200':
          description: Successful response.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ActionDefinitionListResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      items:
                      - actionId: approve-contract
                        name: Approve contract
                        effectLevel: external-effect
                        reviewRequired: true
                        receiptRequired: true
                      nextCursor: null
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.actionDefinition
      x-indwel-tenancy: authenticated-tenant-context
      x-indwel-effect:
        level: read
        receiptRequired: false
      parameters:
      - $ref: '#/components/parameters/AppTemplateId'
  /v1/app-templates/{appTemplateId}/policies:
    get:
      operationId: getAppTemplatePolicies
      summary: Get template policies
      description: 'Returns the policy catalog associated with an app template.


        **Contract:** scope `catalog.read` · authenticated tenant context · read.'
      tags:
      - App Templates
      security:
      - IndwelOAuth:
        - catalog.read
      responses:
        '200':
          description: Successful response.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PolicyCollectionResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      appTemplateId: contract-review
                      policies:
                      - policyId: evidence-default
                        kind: evidence
                        lifecycle: preview
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.policy
      x-indwel-tenancy: authenticated-tenant-context
      x-indwel-effect:
        level: read
        receiptRequired: false
      parameters:
      - $ref: '#/components/parameters/AppTemplateId'
  /v1/app-templates/{appTemplateId}/capabilities:
    get:
      operationId: getAppTemplateCapabilities
      summary: Get template capabilities
      description: 'Returns capability counts and explicit limitations for an app template.


        **Contract:** scope `catalog.read` · authenticated tenant context · read.'
      tags:
      - App Templates
      security:
      - IndwelOAuth:
        - catalog.read
      responses:
        '200':
          description: Successful response.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AppTemplateCapabilitiesResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      appTemplateId: contract-review
                      workflowCount: 1
                      schemaCount: 1
                      actionCount: 1
                      policyCount: 1
                      lifecycle: preview
                      limitations:
                      - Execution semantics are resolved by the installed application and governed runtime.
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.capability
      x-indwel-tenancy: authenticated-tenant-context
      x-indwel-effect:
        level: read
        receiptRequired: false
      parameters:
      - $ref: '#/components/parameters/AppTemplateId'
  /v1/me:
    get:
      operationId: getCurrentUser
      summary: Get the current account
      description: 'Returns the self-scoped durable account profile. Workspace authority remains separate.


        **Contract:** scope `account.read` · self scoped · read.'
      tags:
      - Account
      security:
      - IndwelOAuth:
        - account.read
      responses:
        '200':
          description: Successful response.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserAccountResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      userId: user_01J0EXAMPLE
                      displayName: Developer
                      email: developer@example.com
                      preferences:
                        locale: en-US
                        timezone: America/New_York
                        defaultWorkspaceId: null
                        reducedMotion: false
                      revision: rev_0001
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.userAccount
      x-indwel-tenancy: self-scoped
      x-indwel-effect:
        level: read
        receiptRequired: false
  /v1/me/preferences:
    get:
      operationId: getCurrentUserPreferences
      summary: Get current account preferences
      description: 'Returns self-scoped account preferences.


        **Contract:** scope `account.read` · self scoped · read.'
      tags:
      - Account
      security:
      - IndwelOAuth:
        - account.read
      responses:
        '200':
          description: Successful response.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserPreferencesResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      locale: en-US
                      timezone: America/New_York
                      defaultWorkspaceId: null
                      reducedMotion: false
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.userAccount
      x-indwel-tenancy: self-scoped
      x-indwel-effect:
        level: read
        receiptRequired: false
    patch:
      operationId: updateCurrentUserPreferences
      summary: Update current account preferences
      description: 'Updates preferences under optimistic concurrency and idempotency.


        **Contract:** scope `account.write` · self scoped · bounded write · receipt required.'
      tags:
      - Account
      security:
      - IndwelOAuth:
        - account.write
      responses:
        '200':
          description: Successful response.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserPreferencesResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      locale: en-US
                      timezone: America/New_York
                      defaultWorkspaceId: null
                      reducedMotion: false
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '409':
          $ref: '#/components/responses/Problem409'
        '428':
          $ref: '#/components/responses/Problem428'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.userAccount
      x-indwel-tenancy: self-scoped
      x-indwel-effect:
        level: bounded-write
        receiptRequired: true
      parameters:
      - $ref: '#/components/parameters/IfMatch'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserPreferences'
            example:
              locale: en-US
              timezone: America/New_York
              reducedMotion: true
  /v1/organisations:
    get:
      operationId: listOrganisations
      summary: List accessible organizations
      description: 'Lists organizations in which the authenticated principal may create or use developer projects. It supplies
        the explicit tenant identifier required by raw-HTTP onboarding.


        **Contract:** scope `organizations.read` · principal accessible organizations · read.'
      tags:
      - Organizations
      security:
      - IndwelOAuth:
        - organisations.read
      responses:
        '200':
          description: Accessible organizations.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrganisationListResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      items:
                      - organisationId: organ_01J0EXAMPLE
                        name: Acme Holdings
                        slug: acme
                        lifecycle: active
                        createdAt: '2026-07-24T01:00:00Z'
                      nextCursor: null
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.organisation
      x-indwel-tenancy: principal-accessible-organisations
      x-indwel-effect:
        level: read
        receiptRequired: false
      parameters:
      - $ref: '#/components/parameters/Limit'
      - $ref: '#/components/parameters/Cursor'
  /v1/organisations/{organisationId}/workspaces:
    get:
      operationId: listWorkspaces
      summary: List accessible workspaces
      description: 'Lists workspaces accessible to the principal within an organization. Workspace discovery is explicit so
        examples and SDKs never rely on hidden identifiers.


        **Contract:** scope `workspaces.read` · organization bound · read.'
      tags:
      - Organizations
      security:
      - IndwelOAuth:
        - workspaces.read
      responses:
        '200':
          description: Accessible workspaces.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkspaceListResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      items:
                      - workspaceId: works_01J0EXAMPLE
                        organisationId: organ_01J0EXAMPLE
                        name: Operations
                        slug: operations
                        lifecycle: active
                        createdAt: '2026-07-24T01:00:00Z'
                      nextCursor: null
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.workspace
      x-indwel-tenancy: organisation-bound
      x-indwel-effect:
        level: read
        receiptRequired: false
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/Limit'
      - $ref: '#/components/parameters/Cursor'
  /v1/organisations/{organisationId}/projects:
    post:
      operationId: createProject
      summary: Create a developer project
      description: 'Creates the developer-owned boundary for environments, clients, apps, events and usage. A project is not
        a governed App.


        **Contract:** scope `projects.write` · organization bound · bounded write · receipt required · idempotency required.'
      tags:
      - Projects
      security:
      - IndwelOAuth:
        - projects.write
      responses:
        '201':
          description: Project created.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
            Location:
              description: Canonical project URL.
              schema:
                type: string
            ETag:
              description: Current project revision.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectResponse'
              example:
                data:
                  projectId: proje_01J0EXAMPLE
                  organisationId: org_acme
                  name: Company Answers
                  slug: company-answers
                  lifecycle: active
                  createdAt: '2026-09-01T15:00:00Z'
                  updatedAt: '2026-09-01T15:00:00Z'
                  revision: 1
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.project
      x-indwel-tenancy: organisation-bound
      x-indwel-effect:
        level: bounded-write
        receiptRequired: true
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateProjectRequest'
            example:
              name: Vendor Risk
      x-indwel-idempotency:
        required: true
        requestFingerprint: method + canonical path + tenant boundary + canonical request body
        replayOutcome: return original terminal response or stable in-progress state
        conflictingRequest: 409 IDEMPOTENCY_KEY_REUSED
    get:
      operationId: listProjects
      summary: List developer projects
      description: 'Lists developer-owned project boundaries visible to the authorized principal.


        **Contract:** scope `projects.read` · organization project bound · read.'
      tags:
      - Projects
      security:
      - IndwelOAuth:
        - projects.read
      responses:
        '200':
          description: List developer projects.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectListResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      items:
                      - projectId: proje_01J0EXAMPLE
                        organisationId: organ_01J0EXAMPLE
                        name: Company Answers
                        slug: company-answers
                        description: Evidence-backed answers.
                        lifecycle: active
                        revision: 1
                        createdAt: '2026-07-24T01:00:00Z'
                        updatedAt: '2026-07-24T01:00:00Z'
                      nextCursor: null
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.project
      x-indwel-tenancy: organisation-project-bound
      x-indwel-effect:
        level: read
        receiptRequired: false
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/Limit'
      - $ref: '#/components/parameters/Cursor'
  /v1/organisations/{organisationId}/projects/{projectId}/environments:
    post:
      operationId: createEnvironment
      summary: Create a project environment
      description: 'Creates an isolated sandbox, development, staging or production boundary. Sandbox environments default
        to simulated effects.


        **Contract:** scope `environments.write` · organization project bound · bounded write · receipt required · idempotency
        required.'
      tags:
      - Projects
      security:
      - IndwelOAuth:
        - environments.write
      responses:
        '201':
          description: Environment created.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
            Location:
              description: Canonical environment URL.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EnvironmentResponse'
              example:
                data:
                  environmentId: envir_01J0EXAMPLE
                  projectId: project_vendor_risk
                  name: Reference Sandbox
                  slug: reference
                  kind: sandbox
                  effectMode: simulated
                  lifecycle: active
                  createdAt: '2026-09-01T15:00:00Z'
                  organisationId: org_acme
                  revision: 1
                  updatedAt: '2026-09-01T15:00:00Z'
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.environment
      x-indwel-tenancy: organisation-project-bound
      x-indwel-effect:
        level: bounded-write
        receiptRequired: true
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateEnvironmentRequest'
            example:
              name: Vendor Risk
              kind: sandbox
      x-indwel-idempotency:
        required: true
        requestFingerprint: method + canonical path + tenant boundary + canonical request body
        replayOutcome: return original terminal response or stable in-progress state
        conflictingRequest: 409 IDEMPOTENCY_KEY_REUSED
    get:
      operationId: listEnvironments
      summary: List project environments
      description: 'Lists sandbox, development, staging and production environments with explicit effect boundaries.


        **Contract:** scope `environments.read` · organization project bound · read.'
      tags:
      - Environments
      security:
      - IndwelOAuth:
        - environments.read
      responses:
        '200':
          description: List project environments.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EnvironmentListResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      items:
                      - environmentId: envir_01J0EXAMPLE
                        organisationId: organ_01J0EXAMPLE
                        projectId: proje_01J0EXAMPLE
                        name: Reference Sandbox
                        slug: reference-sandbox
                        kind: sandbox
                        effectMode: simulated
                        lifecycle: active
                        revision: 1
                        createdAt: '2026-07-24T01:00:00Z'
                        updatedAt: '2026-07-24T01:00:00Z'
                      nextCursor: null
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.environment
      x-indwel-tenancy: organisation-project-bound
      x-indwel-effect:
        level: read
        receiptRequired: false
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/Limit'
      - $ref: '#/components/parameters/Cursor'
  /v1/organisations/{organisationId}/projects/{projectId}/clients:
    post:
      operationId: createClient
      summary: Register a bounded developer client
      description: 'Registers an environment-bound client profile. The registration remains pending and receives no OAuth
        credential until an authorized issuer binding is completed.


        **Contract:** scope `clients.write` · organization project environment bound · bounded write · receipt required ·
        idempotency required.'
      tags:
      - Projects
      security:
      - IndwelOAuth:
        - clients.write
      responses:
        '201':
          description: Pending client registration created; no OAuth credential issued.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
            Location:
              description: Canonical client URL.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClientRegistrationReceiptResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      client:
                        clientId: clien_01J0EXAMPLE
                        organisationId: organ_01J0EXAMPLE
                        projectId: proje_01J0EXAMPLE
                        environmentId: envir_01J0EXAMPLE
                        name: Company Answers Service
                        applicationType: service
                        oauthClientType: confidential
                        grantTypes:
                        - client_credentials
                        tokenEndpointAuthMethod: client_secret_basic
                        redirectUris: []
                        pkceRequired: false
                        issuerBindingStatus: pending
                        authorizationServerIssuer: null
                        scopes:
                        - apps.write
                        - collections.write
                        - cases.write
                        status: pending
                        revision: 1
                        createdAt: '2026-07-24T01:00:00Z'
                        updatedAt: '2026-07-24T01:00:00Z'
                        lastRotatedAt: null
                      credentialId: null
                      secret: null
                      secretDisplay: not-issued-pending-issuer-binding
                      registeredAt: '2026-07-24T01:00:00Z'
                      pkceRequired: false
                      issuerBindingStatus: pending
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.client
      x-indwel-tenancy: organisation-project-environment-bound
      x-indwel-effect:
        level: bounded-write
        receiptRequired: true
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateClientRequest'
            example:
              name: Company Answers Service
              environmentId: envir_01J0EXAMPLE
              scopes:
              - apps.write
              - collections.write
              - cases.write
              applicationType: service
      x-indwel-idempotency:
        required: true
        requestFingerprint: method + canonical path + tenant boundary + canonical request body
        replayOutcome: return original terminal response or stable in-progress state
        conflictingRequest: 409 IDEMPOTENCY_KEY_REUSED
    get:
      operationId: listClients
      summary: List developer clients
      description: 'Lists bounded clients without secret material or secret hashes.


        **Contract:** scope `clients.read` · organization project bound · read.'
      tags:
      - Clients
      security:
      - IndwelOAuth:
        - clients.read
      responses:
        '200':
          description: List developer clients.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClientListResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      items:
                      - clientId: clien_01J0EXAMPLE
                        organisationId: organ_01J0EXAMPLE
                        projectId: proje_01J0EXAMPLE
                        environmentId: envir_01J0EXAMPLE
                        name: Company Answers Service
                        applicationType: service
                        oauthClientType: confidential
                        grantTypes:
                        - client_credentials
                        tokenEndpointAuthMethod: client_secret_basic
                        redirectUris: []
                        pkceRequired: false
                        issuerBindingStatus: pending
                        authorizationServerIssuer: null
                        scopes:
                        - apps.read
                        - collections.write
                        status: pending
                        revision: 1
                        createdAt: '2026-07-24T01:00:00Z'
                        updatedAt: '2026-07-24T01:00:00Z'
                        lastRotatedAt: null
                      nextCursor: null
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.client
      x-indwel-tenancy: organisation-project-bound
      x-indwel-effect:
        level: read
        receiptRequired: false
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/Limit'
      - $ref: '#/components/parameters/Cursor'
  /v1/organisations/{organisationId}/projects/{projectId}/apps:
    post:
      operationId: createApp
      summary: Create a governed app
      description: 'Creates a project-owned governed business application identity. It does not create a credential client
        or publish an executable version.


        **Contract:** scope `apps.write` · organization project bound · bounded write · receipt required · idempotency required.'
      tags:
      - Apps
      security:
      - IndwelOAuth:
        - apps.write
      responses:
        '201':
          description: App created.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
            Location:
              description: Canonical app URL.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AppResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      appId: app_01J0EXAMPLE
                      projectId: proje_01J0EXAMPLE
                      name: Company Answers
                      slug: company-answers
                      description: Evidence-backed internal answers.
                      archetype: authoritative-determination
                      lifecycle: active
                      createdAt: '2026-07-24T01:00:00Z'
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.app
      x-indwel-tenancy: organisation-project-bound
      x-indwel-effect:
        level: bounded-write
        receiptRequired: true
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateAppRequest'
            example:
              name: Company Answers
              slug: company-answers
              description: Evidence-backed internal answers.
              archetype: authoritative-determination
      x-indwel-idempotency:
        required: true
        requestFingerprint: method + canonical path + tenant boundary + canonical request body
        replayOutcome: return original terminal response or stable in-progress state
        conflictingRequest: 409 IDEMPOTENCY_KEY_REUSED
  /v1/organisations/{organisationId}/projects/{projectId}/apps/{appId}/versions:
    post:
      operationId: createAppVersion
      summary: Create an app-version draft
      description: 'Creates a versioned draft containing workflows, schemas, policies, installed action definitions and application-specific
        Cognitive Contracts. Published versions become immutable.


        **Contract:** scope `apps.write` · organization project app bound · bounded write · receipt required · idempotency
        required.'
      tags:
      - Apps
      security:
      - IndwelOAuth:
        - apps.write
      responses:
        '201':
          description: App-version draft created.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
            Location:
              description: Canonical app-version URL.
              schema:
                type: string
            ETag:
              description: Current app-version revision.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AppVersionResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      appVersionId: appve_01J0EXAMPLE
                      appId: app_01J0EXAMPLE
                      version: 1.0.0
                      status: draft
                      revision: rev_0001
                      manifestDigest: sha256:example
                      validation:
                        status: not-run
                        issueCount: 0
                      createdAt: '2026-07-24T01:00:00Z'
                      publishedAt: null
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.appVersion
      x-indwel-tenancy: organisation-project-app-bound
      x-indwel-effect:
        level: bounded-write
        receiptRequired: true
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/AppId'
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateAppVersionRequest'
            example:
              version: 1.0.0
              manifest:
                workflows:
                - workflowId: answer
                  name: Answer
                  description: Answer under current authority.
                  lifecycle: draft
                  steps:
                  - stepId: determine
                    kind: governed-determination
                  cognitiveContract:
                    schema: indwel.cognitive-contract.v1
                    contractId: contract.company-answers
                    version: 1.0.0
                    initialStage: answering
                    transitions:
                    - transitionId: settle-answer
                      fromStage: answering
                      toStage: answered
                      evidenceRequirements:
                      - requirementId: evidence.company-policy
                        acceptedSources:
                        - deterministic-evaluator
                      humanAuthorityRequirements: []
                schemas:
                - schemaId: question
                  name: Question
                  schema:
                    type: object
                    required:
                    - question
                    properties:
                      question:
                        type: string
                policies:
                - policyId: evidence-current
                  kind: evidence
                  lifecycle: draft
                  configuration:
                    requireCurrentAuthority: true
                actionDefinitions: []
                cognitionProfileRef: null
      x-indwel-idempotency:
        required: true
        requestFingerprint: method + canonical path + tenant boundary + canonical request body
        replayOutcome: return original terminal response or stable in-progress state
        conflictingRequest: 409 IDEMPOTENCY_KEY_REUSED
  /v1/organisations/{organisationId}/projects/{projectId}/apps/{appId}/versions/{appVersionId}:validate:
    post:
      operationId: validateAppVersion
      summary: Validate an app-version draft
      description: 'Validates references, schemas, policies and effect declarations without publishing the version.


        **Contract:** scope `apps.write` · organization project app bound · bounded write · receipt required · idempotency
        required.'
      tags:
      - Apps
      security:
      - IndwelOAuth:
        - apps.write
      responses:
        '200':
          description: Validation report.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AppVersionValidationReportResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      appVersionId: appve_01J0EXAMPLE
                      status: invalid
                      issues:
                      - code: COGNITION_PROFILE_AUTHORITY_UNAVAILABLE
                        severity: error
                        path: cognitionProfileRef
                        message: The cognition profile reference could not be resolved through launch-admitted cognition-profile
                          authority.
                      checkedAt: '2026-07-24T01:00:00Z'
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.appVersion
      x-indwel-tenancy: organisation-project-app-bound
      x-indwel-effect:
        level: bounded-write
        receiptRequired: true
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/AppId'
      - $ref: '#/components/parameters/AppVersionId'
      - $ref: '#/components/parameters/IdempotencyKey'
      x-indwel-idempotency:
        required: true
        requestFingerprint: method + canonical path + tenant boundary + canonical request body
        replayOutcome: return original terminal response or stable in-progress state
        conflictingRequest: 409 IDEMPOTENCY_KEY_REUSED
  /v1/organisations/{organisationId}/projects/{projectId}/apps/{appId}/versions/{appVersionId}:publish:
    post:
      operationId: publishAppVersion
      summary: Publish an app version
      description: 'Atomically publishes a validated app version. Published content is immutable; later changes require a
        new version.


        **Contract:** scope `apps.write` · organization project app bound · bounded write · receipt required · idempotency
        required.'
      tags:
      - Apps
      security:
      - IndwelOAuth:
        - apps.write
      responses:
        '200':
          description: Published app version.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
            ETag:
              description: Published revision.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AppVersionResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      appVersionId: appve_01J0EXAMPLE
                      appId: app_01J0EXAMPLE
                      version: 1.0.0
                      status: published
                      revision: rev_0002
                      manifestDigest: sha256:example
                      validation:
                        status: valid
                        issueCount: 0
                      createdAt: '2026-07-24T01:00:00Z'
                      publishedAt: '2026-07-24T01:05:00Z'
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '428':
          $ref: '#/components/responses/Problem428'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.appVersion
      x-indwel-tenancy: organisation-project-app-bound
      x-indwel-effect:
        level: bounded-write
        receiptRequired: true
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/AppId'
      - $ref: '#/components/parameters/AppVersionId'
      - $ref: '#/components/parameters/IfMatch'
      - $ref: '#/components/parameters/IdempotencyKey'
      x-indwel-idempotency:
        required: true
        requestFingerprint: method + canonical path + tenant boundary + canonical request body
        replayOutcome: return original terminal response or stable in-progress state
        conflictingRequest: 409 IDEMPOTENCY_KEY_REUSED
  /v1/organisations/{organisationId}/projects/{projectId}/environments/{environmentId}/deployments:
    post:
      operationId: createDeployment
      summary: Deploy a published app version
      description: 'Begins a durable deployment operation binding an immutable app version to an environment. The returned
        Operation is the status authority until terminal.


        **Contract:** scope `deployments.write` · organization project environment bound · bounded write · receipt required
        · idempotency required.'
      tags:
      - Apps
      security:
      - IndwelOAuth:
        - deployments.write
      responses:
        '202':
          description: Deployment operation accepted.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
            Location:
              description: Operation status URL.
              schema:
                type: string
            Retry-After:
              description: Suggested poll interval in seconds.
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OperationResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      operationId: opera_01J0EXAMPLE
                      kind: deployment.create
                      status: queued
                      targetResourceId: deplo_01J0EXAMPLE
                      createdAt: '2026-07-24T01:00:00Z'
                      updatedAt: '2026-07-24T01:00:00Z'
                      terminalAt: null
                      problem: null
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.deployment
      x-indwel-tenancy: organisation-project-environment-bound
      x-indwel-effect:
        level: bounded-write
        receiptRequired: true
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/EnvironmentId'
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateDeploymentRequest'
            example:
              appVersionId: appve_01J0EXAMPLE
              description: Reference application deployment.
      x-indwel-idempotency:
        required: true
        requestFingerprint: method + canonical path + tenant boundary + canonical request body
        replayOutcome: return original terminal response or stable in-progress state
        conflictingRequest: 409 IDEMPOTENCY_KEY_REUSED
  /v1/organisations/{organisationId}/workspaces/{workspaceId}/installations:
    post:
      operationId: createInstallation
      summary: Install a deployment into a workspace
      description: 'Grants a deployed app explicit workspace permissions and policy overlays. Installation authority is bounded
        to the target workspace.


        **Contract:** scope `installations.write` · organization workspace bound · bounded write · receipt required · idempotency
        required.'
      tags:
      - Apps
      security:
      - IndwelOAuth:
        - installations.write
      responses:
        '201':
          description: Installation created.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
            Location:
              description: Canonical installation URL.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InstallationResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      installationId: insta_01J0EXAMPLE
                      organisationId: organ_01J0EXAMPLE
                      workspaceId: works_01J0EXAMPLE
                      deploymentId: deplo_01J0EXAMPLE
                      permissions:
                      - collections.read
                      - cases.write
                      status: active
                      createdAt: '2026-07-24T01:00:00Z'
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.installation
      x-indwel-tenancy: organisation-workspace-bound
      x-indwel-effect:
        level: bounded-write
        receiptRequired: true
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/WorkspaceId'
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateInstallationRequest'
            example:
              deploymentId: deplo_01J0EXAMPLE
              permissions:
              - collections.read
              - cases.write
              policyOverrides: {}
      x-indwel-idempotency:
        required: true
        requestFingerprint: method + canonical path + tenant boundary + canonical request body
        replayOutcome: return original terminal response or stable in-progress state
        conflictingRequest: 409 IDEMPOTENCY_KEY_REUSED
  /v1/organisations/{organisationId}/workspaces/{workspaceId}/collections:
    post:
      operationId: createCollection
      summary: Create an evidence collection
      description: 'Creates a durable workspace collection under an explicit custody policy. Existing catalog projections
        do not satisfy this mutation.


        **Contract:** scope `collections.write` · organization workspace bound · bounded write · receipt required · idempotency
        required.'
      tags:
      - Collections
      security:
      - IndwelOAuth:
        - collections.write
      responses:
        '201':
          description: Collection created.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
            Location:
              description: Canonical collection URL.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CollectionResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      collectionId: colle_01J0EXAMPLE
                      workspaceId: works_01J0EXAMPLE
                      name: Company policy authority
                      description: Current employee policies.
                      status: active
                      custodyPolicyId: null
                      createdAt: '2026-07-24T01:00:00Z'
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.collection
      x-indwel-tenancy: organisation-workspace-bound
      x-indwel-effect:
        level: bounded-write
        receiptRequired: true
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/WorkspaceId'
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateCollectionRequest'
            example:
              name: Company policy authority
              description: Current employee policies.
              custodyPolicyId: null
      x-indwel-idempotency:
        required: true
        requestFingerprint: method + canonical path + tenant boundary + canonical request body
        replayOutcome: return original terminal response or stable in-progress state
        conflictingRequest: 409 IDEMPOTENCY_KEY_REUSED
  /v1/organisations/{organisationId}/workspaces/{workspaceId}/collections/{collectionId}/sources:
    post:
      operationId: createSource
      summary: Create a source and direct-upload session
      description: 'Creates the source custody record and returns short-lived upload instructions. The upload URL is a one-time
        secret and is not retained in ordinary Source responses.


        **Contract:** scope `collections.write` · organization workspace collection bound · bounded write · receipt required
        · idempotency required.'
      tags:
      - Collections
      security:
      - IndwelOAuth:
        - collections.write
      responses:
        '201':
          description: Source and upload instructions created.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
            Location:
              description: Canonical source URL.
              schema:
                type: string
            Cache-Control:
              description: Upload-instruction responses must not be stored.
              schema:
                type: string
                example: no-store
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SourceCreateResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      source:
                        sourceId: sourc_01J0EXAMPLE
                        collectionId: colle_01J0EXAMPLE
                        name: employee-handbook.pdf
                        mediaType: application/pdf
                        sizeBytes: 240000
                        sha256: abc123
                        status: awaiting-upload
                        custody:
                          classification: internal-policy
                          authorityClass: governing-policy
                          effectiveAt: '2026-07-01T00:00:00Z'
                          retentionPolicyId: null
                        createdAt: '2026-07-24T01:00:00Z'
                      upload:
                        method: PUT
                        url: https://upload.indwel.example/one-time
                        headers:
                          content-type: application/pdf
                        expiresAt: '2026-07-24T01:15:00Z'
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.source
      x-indwel-tenancy: organisation-workspace-collection-bound
      x-indwel-effect:
        level: bounded-write
        receiptRequired: true
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/WorkspaceId'
      - $ref: '#/components/parameters/CollectionId'
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateSourceRequest'
            example:
              name: employee-handbook.pdf
              mediaType: application/pdf
              sizeBytes: 240000
              sha256: abc123
              custody:
                classification: internal-policy
                authorityClass: governing-policy
                effectiveAt: '2026-07-01T00:00:00Z'
                retentionPolicyId: null
      x-indwel-idempotency:
        required: true
        requestFingerprint: method + canonical path + tenant boundary + canonical request body
        replayOutcome: return original terminal response or stable in-progress state
        conflictingRequest: 409 IDEMPOTENCY_KEY_REUSED
  /v1/organisations/{organisationId}/workspaces/{workspaceId}/collections/{collectionId}/sources/{sourceId}/ingestions:
    post:
      operationId: createIngestion
      summary: Start durable source ingestion
      description: 'Begins parsing, custody verification and evidence admission for an uploaded source. The returned Operation
        is the processing status authority; the Ingestion resource preserves lineage.


        **Contract:** scope `collections.write` · organization workspace collection source bound · bounded write · receipt
        required · idempotency required.'
      tags:
      - Collections
      security:
      - IndwelOAuth:
        - collections.write
      responses:
        '202':
          description: Ingestion operation accepted.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
            Location:
              description: Operation status URL.
              schema:
                type: string
            Retry-After:
              description: Suggested poll interval in seconds.
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OperationResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      operationId: opera_01J0INGEST
                      kind: ingestion.create
                      status: queued
                      targetResourceId: inges_01J0EXAMPLE
                      createdAt: '2026-07-24T01:00:00Z'
                      updatedAt: '2026-07-24T01:00:00Z'
                      terminalAt: null
                      problem: null
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.ingestion
      x-indwel-tenancy: organisation-workspace-collection-source-bound
      x-indwel-effect:
        level: bounded-write
        receiptRequired: true
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/WorkspaceId'
      - $ref: '#/components/parameters/CollectionId'
      - $ref: '#/components/parameters/SourceId'
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateIngestionRequest'
            example:
              parserProfile: null
              language: en
              options: {}
      x-indwel-idempotency:
        required: true
        requestFingerprint: method + canonical path + tenant boundary + canonical request body
        replayOutcome: return original terminal response or stable in-progress state
        conflictingRequest: 409 IDEMPOTENCY_KEY_REUSED
  ? /v1/organisations/{organisationId}/workspaces/{workspaceId}/collections/{collectionId}/sources/{sourceId}/ingestions/{ingestionId}
  : get:
      operationId: getIngestion
      summary: Get ingestion state
      description: 'Returns the durable ingestion attempt, terminal status, evidence-readiness state and any problem details.


        **Contract:** scope `collections.read` · organization workspace collection source bound · read.'
      tags:
      - Collections
      security:
      - IndwelOAuth:
        - collections.read
      responses:
        '200':
          description: Ingestion state.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IngestionResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      ingestionId: inges_01J0EXAMPLE
                      sourceId: sourc_01J0EXAMPLE
                      status: ready
                      operationId: opera_01J0INGEST
                      evidenceReady: true
                      createdAt: '2026-07-24T01:00:00Z'
                      completedAt: '2026-07-24T01:02:00Z'
                      problem: null
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.ingestion
      x-indwel-tenancy: organisation-workspace-collection-source-bound
      x-indwel-effect:
        level: read
        receiptRequired: false
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/WorkspaceId'
      - $ref: '#/components/parameters/CollectionId'
      - $ref: '#/components/parameters/SourceId'
      - $ref: '#/components/parameters/IngestionId'
  /v1/organisations/{organisationId}/workspaces/{workspaceId}/cases:
    post:
      operationId: createCase
      summary: Create a governed business case
      description: 'Creates the durable business object to which an installed app and workflow apply. Case creation does not
        itself invoke cognition.


        **Contract:** scope `cases.write` · organization workspace installation bound · bounded write · receipt required ·
        idempotency required.'
      tags:
      - Cases
      security:
      - IndwelOAuth:
        - cases.write
      responses:
        '201':
          description: Case created.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
            Location:
              description: Canonical case URL.
              schema:
                type: string
            ETag:
              description: Current case revision.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CaseResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      caseId: case_01J0EXAMPLE
                      workspaceId: works_01J0EXAMPLE
                      installationId: insta_01J0EXAMPLE
                      workflowId: answer
                      title: Remote-work policy question
                      externalReference: hr-2026-0042
                      status: open
                      input:
                        question: May I work remotely from another state for six weeks?
                      revision: rev_0001
                      createdAt: '2026-07-24T01:00:00Z'
        '400':
          description: Bad request
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                installationIdAmbiguous:
                  value:
                    type: https://api.indwel.ai/problems/installation-id-ambiguous
                    title: Bad request
                    status: 400
                    detail: appInstallationId and installationId must match when both are supplied
                    instance: /v1/organisations/org_acme/workspaces/ws_risk/cases
                    code: INSTALLATION_ID_AMBIGUOUS
                    traceId: trace_01J0EXAMPLE
                    retryable: false
                installationIdRequired:
                  value:
                    type: https://api.indwel.ai/problems/invalid-argument
                    title: Bad request
                    status: 400
                    detail: appInstallationId is required
                    instance: /v1/organisations/org_acme/workspaces/ws_risk/cases
                    code: INVALID_ARGUMENT
                    traceId: trace_01J0EXAMPLE
                    retryable: false
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.case
      x-indwel-tenancy: organisation-workspace-installation-bound
      x-indwel-effect:
        level: bounded-write
        receiptRequired: true
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/WorkspaceId'
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateCaseRequest'
            example:
              installationId: insta_01J0EXAMPLE
              workflowId: answer
              title: Remote-work policy question
              externalReference: hr-2026-0042
              input:
                question: May I work remotely from another state for six weeks?
      x-indwel-idempotency:
        required: true
        requestFingerprint: method + canonical path + tenant boundary + canonical request body
        replayOutcome: return original terminal response or stable in-progress state
        conflictingRequest: 409 IDEMPOTENCY_KEY_REUSED
  /v1/organisations/{organisationId}/projects/{projectId}:
    get:
      operationId: getProject
      summary: Get a developer project
      description: 'Returns one developer project without embedding credentials or tenant-internal authority.


        **Contract:** scope `projects.read` · organization project bound · read.'
      tags:
      - Projects
      security:
      - IndwelOAuth:
        - projects.read
      responses:
        '200':
          description: Get a developer project.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      projectId: proje_01J0EXAMPLE
                      organisationId: organ_01J0EXAMPLE
                      name: Company Answers
                      slug: company-answers
                      description: Evidence-backed answers.
                      lifecycle: active
                      revision: 1
                      createdAt: '2026-07-24T01:00:00Z'
                      updatedAt: '2026-07-24T01:00:00Z'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.project
      x-indwel-tenancy: organisation-project-bound
      x-indwel-effect:
        level: read
        receiptRequired: false
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/ProjectId'
  /v1/organisations/{organisationId}/projects/{projectId}/environments/{environmentId}:
    get:
      operationId: getEnvironment
      summary: Get a project environment
      description: 'Returns an environment and its fail-closed effect mode.


        **Contract:** scope `environments.read` · organization project bound · read.'
      tags:
      - Environments
      security:
      - IndwelOAuth:
        - environments.read
      responses:
        '200':
          description: Get a project environment.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EnvironmentResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      environmentId: envir_01J0EXAMPLE
                      organisationId: organ_01J0EXAMPLE
                      projectId: proje_01J0EXAMPLE
                      name: Reference Sandbox
                      slug: reference-sandbox
                      kind: sandbox
                      effectMode: simulated
                      lifecycle: active
                      revision: 1
                      createdAt: '2026-07-24T01:00:00Z'
                      updatedAt: '2026-07-24T01:00:00Z'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.environment
      x-indwel-tenancy: organisation-project-bound
      x-indwel-effect:
        level: read
        receiptRequired: false
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/EnvironmentId'
  /v1/organisations/{organisationId}/projects/{projectId}/clients/{clientId}:
    get:
      operationId: getClient
      summary: Get a developer client
      description: 'Returns one client and its scopes, PKCE posture and lifecycle without credential material.


        **Contract:** scope `clients.read` · organization project bound · read.'
      tags:
      - Clients
      security:
      - IndwelOAuth:
        - clients.read
      responses:
        '200':
          description: Get a developer client.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClientResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      clientId: clien_01J0EXAMPLE
                      organisationId: organ_01J0EXAMPLE
                      projectId: proje_01J0EXAMPLE
                      environmentId: envir_01J0EXAMPLE
                      name: Company Answers Service
                      applicationType: service
                      oauthClientType: confidential
                      grantTypes:
                      - client_credentials
                      tokenEndpointAuthMethod: client_secret_basic
                      redirectUris: []
                      pkceRequired: false
                      issuerBindingStatus: pending
                      authorizationServerIssuer: null
                      scopes:
                      - apps.read
                      - collections.write
                      status: pending
                      revision: 1
                      createdAt: '2026-07-24T01:00:00Z'
                      updatedAt: '2026-07-24T01:00:00Z'
                      lastRotatedAt: null
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.client
      x-indwel-tenancy: organisation-project-bound
      x-indwel-effect:
        level: read
        receiptRequired: false
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/ClientId'
  /v1/organisations/{organisationId}/projects/{projectId}/clients/{clientId}/credentials:
    get:
      operationId: listCredentials
      summary: List credential metadata
      description: 'Lists credential lifecycle metadata without hashes or plaintext secrets.


        **Contract:** scope `credentials.read` · organization project bound · read.'
      tags:
      - Credentials
      security:
      - IndwelOAuth:
        - credentials.read
      responses:
        '200':
          description: List credential metadata.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CredentialListResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      items:
                      - credentialId: crede_01J0EXAMPLE
                        organisationId: organ_01J0EXAMPLE
                        projectId: proje_01J0EXAMPLE
                        clientId: clien_01J0EXAMPLE
                        status: active
                        revision: 1
                        createdAt: '2026-07-24T01:00:00Z'
                        updatedAt: '2026-07-24T01:00:00Z'
                        expiresAt: null
                        validUntil: null
                      nextCursor: null
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.credential
      x-indwel-tenancy: organisation-project-bound
      x-indwel-effect:
        level: read
        receiptRequired: false
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/ClientId'
      - $ref: '#/components/parameters/Limit'
      - $ref: '#/components/parameters/Cursor'
  /v1/organisations/{organisationId}/projects/{projectId}/clients/{clientId}/credentials/{credentialId}:revoke:
    post:
      operationId: revokeCredential
      summary: Revoke a client credential
      description: 'Revokes a bounded credential and returns its non-secret terminal metadata plus a receipt.


        **Contract:** scope `credentials.write` · organization project bound · bounded write · receipt required · idempotency
        required.'
      tags:
      - Credentials
      security:
      - IndwelOAuth:
        - credentials.write
      responses:
        '200':
          description: Revoke a client credential.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CredentialResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      credentialId: crede_01J0EXAMPLE
                      organisationId: organ_01J0EXAMPLE
                      projectId: proje_01J0EXAMPLE
                      clientId: clien_01J0EXAMPLE
                      status: revoked
                      revision: 2
                      createdAt: '2026-07-24T01:00:00Z'
                      updatedAt: '2026-07-24T01:00:00Z'
                      expiresAt: null
                      validUntil: '2026-07-24T01:05:00Z'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.credential
      x-indwel-tenancy: organisation-project-bound
      x-indwel-effect:
        level: bounded-write
        receiptRequired: true
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/ClientId'
      - $ref: '#/components/parameters/CredentialId'
      - $ref: '#/components/parameters/IdempotencyKey'
      x-indwel-idempotency:
        required: true
        requestFingerprint: method + canonical path + tenant boundary + canonical request body
        replayOutcome: return original response and receipt
        conflictingRequest: 409 IDEMPOTENCY_KEY_REUSED
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
            example: {}
  /v1/organisations/{organisationId}/workspaces/{workspaceId}/cases/{caseId}/run-plans:
    post:
      operationId: createRunPlan
      tags:
      - Runs
      security:
      - IndwelOAuth:
        - runs.write
      x-indwel-resource-id: resource.runPlan
      x-indwel-tenancy: organisation-workspace-case-bound
      x-indwel-effect:
        level: bounded-write
        receiptRequired: true
      summary: Create a governed run plan
      description: 'Creates an Installation- and Case-revision-bound admission plan for canonical Case-bound governed cognition.


        **Contract:** scope `runs.write` · organization workspace case bound · bounded write · receipt required · idempotency
        required.'
      responses:
        '201':
          description: Resource created and admitted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RunPlanResponse'
              examples:
                representative:
                  value:
                    data:
                      planId: runpl_01J0EXAMPLE
                      caseId: case_01J0EXAMPLE
                      caseRevision: 1
                      installationId: insta_01J0EXAMPLE
                      workflowId: answer
                      sessionId: session-1
                      promptDigest: sha256-prompt
                      requestedModeId: ordinary
                      routeTemplateId: native-ordinary
                      previewContractHash: sha256-contract
                      previewAdmissionSnapshotDigest: sha256-admission
                      executionBasisDigest: sha256-basis
                      status: admitted
                      createdAt: '2026-08-03T21:35:00Z'
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/WorkspaceId'
      - name: caseId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateRunPlanRequest'
            example:
              sessionId: session-1
              prompt: Assess the case evidence.
              history: []
              mode: ordinary
              routeTemplateId: native-ordinary
      x-indwel-idempotency:
        required: true
        requestFingerprint: case authority + canonical request body
        replayOutcome: return original terminal response
        conflictingRequest: 409 IDEMPOTENCY_KEY_REUSED
  /v1/organisations/{organisationId}/workspaces/{workspaceId}/cases/{caseId}/runs:
    post:
      operationId: createRun
      tags:
      - Runs
      security:
      - IndwelOAuth:
        - runs.write
      x-indwel-resource-id: resource.run
      x-indwel-tenancy: organisation-workspace-case-bound
      x-indwel-effect:
        level: bounded-write
        receiptRequired: true
      summary: Execute an admitted governed run
      description: 'Executes the previously admitted Run Plan through canonical Case-bound cognition authority and returns
        the terminal governed Run projection.


        **Authority:** organization/workspace/Case and installed application authority.


        **Contract:** scope `runs.write` · organization workspace case bound · bounded write · receipt required · idempotency
        required.'
      responses:
        '201':
          description: Resource created and admitted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CaseRunResponse'
              example:
                data:
                  caseId: case_vendor_review
                  planId: runplan_vendor_review_01
                  sourceOfTruth: example
                  projection:
                    runId: run_vendor_review_01
                    contractHash: sha256:contract-vendor-review
                    lifecycleState: settled_success
                    status: complete
                    renderManifest:
                      renderManifestId: render_vendor_review_01
                      renderManifestDigest: sha256:example
                      evidenceBindingCount: 1
                      suppressedEvidenceCount: 1
                    createdAt: '2026-09-01T15:00:00Z'
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/WorkspaceId'
      - name: caseId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateRunRequest'
            example:
              planId: runplan_vendor_review_01
              prompt: Assess the admitted vendor evidence against the installed workflow and return the governed result.
      x-indwel-idempotency:
        required: true
        requestFingerprint: case authority + canonical request body
        replayOutcome: return original terminal response
        conflictingRequest: 409 IDEMPOTENCY_KEY_REUSED
      x-indwel-semantics:
        authority: organisation/workspace/Case and installed application authority
        effect: bounded-write
        receipt: required
        idempotency: required
  /v1/organisations/{organisationId}/workspaces/{workspaceId}/cases/{caseId}/runs/{runId}:
    get:
      operationId: getRun
      tags:
      - Runs
      security:
      - IndwelOAuth:
        - runs.read
      x-indwel-resource-id: resource.run
      x-indwel-tenancy: organisation-workspace-case-bound
      x-indwel-effect:
        level: read
        receiptRequired: false
      summary: Get an authorized run projection
      description: 'Returns the terminal governed Run projection after Installation and principal-scope checks.


        **Contract:** scope `runs.read` · organization workspace case bound · read.'
      responses:
        '200':
          description: Authorized projection.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CaseRunResponse'
              example:
                data:
                  caseId: case_vendor_review
                  planId: runplan_vendor_review_01
                  sourceOfTruth: example
                  projection:
                    runId: run_vendor_review_01
                    contractHash: sha256:contract-vendor-review
                    lifecycleState: settled_success
                    status: complete
                    renderManifest:
                      renderManifestId: render_vendor_review_01
                      renderManifestDigest: sha256:example
                      evidenceBindingCount: 1
                      suppressedEvidenceCount: 1
                    createdAt: '2026-09-01T15:00:00Z'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/WorkspaceId'
      - name: caseId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
      - name: runId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
  /v1/organisations/{organisationId}/workspaces/{workspaceId}/cases/{caseId}/runs/{runId}/evidence:
    get:
      operationId: listEvidence
      tags:
      - Runs
      security:
      - IndwelOAuth:
        - runs.read
      x-indwel-resource-id: resource.evidence
      x-indwel-tenancy: organisation-workspace-case-bound
      x-indwel-effect:
        level: read
        receiptRequired: false
      summary: List terminal run evidence
      description: 'Lists admitted, suppressed and unsupported evidence from the terminal governed Run render manifest.


        **Contract:** scope `runs.read` · organization workspace case bound · read.'
      responses:
        '200':
          description: Authorized projection.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RunEvidenceListResponse'
              example:
                data:
                  runId: run_vendor_review_01
                  caseId: case_vendor_review
                  sourceOfTruth: example
                  renderManifestId: render_vendor_review_01
                  renderManifestDigest: sha256:example
                  items:
                  - evidenceId: evidence_vendor_policy_01
                    disposition: admitted
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/WorkspaceId'
      - name: caseId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
      - name: runId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
  /v1/organisations/{organisationId}/workspaces/{workspaceId}/cases/{caseId}/business-transitions/{transitionId}:
    post:
      operationId: advanceCognitiveBusinessTransition
      tags:
      - Cases
      security:
      - IndwelOAuth:
        - case-transitions.write
      x-indwel-resource-id: resource.case
      x-indwel-tenancy: organisation-workspace-case-bound
      x-indwel-effect:
        level: bounded-write
        receiptRequired: true
      summary: Attempt a Cognitive Contract-governed Case business transition
      description: 'Attempts the named transition against the Case-retained canonical Cognitive Contract. The client supplies
        only transition identity, expected Case revision and Idempotency-Key. Destination stage, contract, evidence state,
        human approvals and transition authority cannot be client-submitted. OAuth permission authorizes only the attempt;
        organizational approval must already exist as a durable Work governance receipt.


        **Contract:** scope `case-transitions.write` · organization workspace case bound · bounded write · receipt required
        · idempotency required.'
      responses:
        '200':
          description: Transition adjudicated. A withheld adjudication leaves the Case business stage unchanged; an authorized
            adjudication advances only the business stage while preserving administrative Case state.
          content:
            application/json:
              schema:
                type: object
                additionalProperties: false
                required:
                - data
                properties:
                  data:
                    type: object
                    additionalProperties: false
                    required:
                    - case
                    - transitionId
                    - disposition
                    - authorityReceiptId
                    properties:
                      case:
                        type: object
                      transitionId:
                        type: string
                      disposition:
                        type: string
                        enum:
                        - authorised
                        - withheld
                      authorityReceiptId:
                        type: string
              examples:
                representative:
                  summary: Governed business-transition adjudication
                  value:
                    data:
                      case:
                        caseId: case_01J0EXAMPLE
                        state: in-progress
                        businessStage: approved
                        revision: 3
                      transitionId: approve-review
                      disposition: authorised
                      authorityReceiptId: work_transition_sha256
        '400':
          description: Bad request
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                idempotencyKeyRequired:
                  value:
                    type: https://api.indwel.ai/problems/idempotency-key-required
                    title: Bad request
                    status: 400
                    detail: Idempotency-Key is required for this operation
                    instance: /v1/organisations/org_acme/workspaces/ws_risk/cases/case_vendor/business-transitions/approve
                    code: IDEMPOTENCY_KEY_REQUIRED
                    traceId: trace_01J0EXAMPLE
                    retryable: false
                invalidExpectedRevision:
                  value:
                    type: https://api.indwel.ai/problems/invalid-argument
                    title: Bad request
                    status: 400
                    detail: expectedRevision must be a positive integer
                    instance: /v1/organisations/org_acme/workspaces/ws_risk/cases/case_vendor/business-transitions/approve
                    code: INVALID_ARGUMENT
                    traceId: trace_01J0EXAMPLE
                    retryable: false
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/WorkspaceId'
      - name: caseId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
      - name: transitionId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              required:
              - expectedRevision
              properties:
                expectedRevision:
                  type: integer
                  minimum: 1
            example:
              expectedRevision: 2
      x-indwel-idempotency:
        required: true
        requestFingerprint: organisation + workspace + case + transition identity + expected Case revision
        replayOutcome: return the original durable transition adjudication; later evidence cannot reinterpret the same attempt
        conflictingRequest: 409 IDEMPOTENCY_KEY_REUSED
  /v1/organisations/{organisationId}/workspaces/{workspaceId}/cases/{caseId}/governance:
    get:
      operationId: getCaseGovernanceProjection
      tags:
      - Cases
      security:
      - IndwelOAuth:
        - cases.read
      x-indwel-resource-id: resource.case
      x-indwel-tenancy: organisation-workspace-case-bound
      x-indwel-effect:
        level: read-only
        receiptRequired: false
      summary: Read the governed Case Attention projection
      description: 'Returns a server-owned, receipt-backed projection of the Case administrative state, Cognitive Contract
        business stage, current transition readiness, exact evidence and human-authority requirement posture, and active causal
        governance signals. The client receives projection authority only and must not reconstruct adjudication from raw ledger
        receipts.


        **Contract:** scope `cases.read` · organization workspace case bound · read only.'
      responses:
        '200':
          description: Current governed Case projection.
          content:
            application/json:
              schema:
                type: object
              examples:
                representative:
                  summary: Receipt-backed governed Case Attention projection
                  value:
                    schema: indwel.developer-case-governance-projection.v1
                    organisationId: org_acme
                    workspaceId: ws_vendor_risk
                    caseId: case_01J0EXAMPLE
                    revision: 2
                    administrativeState: in-progress
                    businessStage: intake
                    contract:
                      contractId: contract.vendor-risk-review
                      version: 1.0.0
                    attention:
                      posture: attention
                      activeVetoCount: 0
                      unresolvedVarianceCount: 0
                      pendingNotificationCount: 0
                      activeEscalationCount: 0
                      unsatisfiedRequirementCount: 1
                    transitions: []
                    receiptCount: 1
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/WorkspaceId'
      - name: caseId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
  ? /v1/organisations/{organisationId}/workspaces/{workspaceId}/cases/{caseId}/human-authority-requirements/{requirementId}/participations
  : post:
      operationId: recordCaseHumanParticipation
      tags:
      - Cases
      security:
      - IndwelOAuth:
        - case-participation.write
      x-indwel-resource-id: resource.case
      x-indwel-tenancy: organisation-workspace-case-bound
      x-indwel-effect:
        level: governed-human-participation
        receiptRequired: true
      summary: Record a governed human participation decision
      description: 'Records an authenticated participant decision against one exact current Cognitive Contract human-authority
        requirement. The client may supply only Case revision and disposition. Platform resolves authority class and participant
        identity, verifies organizational eligibility, and writes an immutable human-authority receipt. A contradictory later
        decision under the single-authority policy is rejected rather than timestamp-arbitrated.


        **Contract:** scope `case-participation.write` · organization workspace case bound · governed human participation
        · receipt required · idempotency required.'
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/WorkspaceId'
      - name: caseId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
      - name: requirementId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              required:
              - expectedRevision
              - disposition
              properties:
                expectedRevision:
                  type: integer
                  minimum: 1
                disposition:
                  type: string
                  enum:
                  - approved
                  - rejected
                  - abstained
            example:
              expectedRevision: 7
              disposition: approved
      x-indwel-idempotency:
        required: true
        requestFingerprint: organisation + workspace + case + current human-authority requirement + authenticated participant
          + disposition
        replayOutcome: return the existing immutable single-authority decision when semantically identical
        conflictingRequest: 409 HUMAN_AUTHORITY_DECISION_ALREADY_SETTLED
      responses:
        '200':
          description: Equivalent existing single-authority decision returned.
          content:
            application/json:
              schema:
                type: object
                additionalProperties: false
                required:
                - data
                properties:
                  data:
                    type: object
                    additionalProperties: false
                    required:
                    - receiptId
                    - requirementId
                    - disposition
                    properties:
                      receiptId:
                        type: string
                      requirementId:
                        type: string
                      disposition:
                        type: string
                        enum:
                        - approved
                        - rejected
                        - abstained
              examples:
                representative:
                  summary: Governed human-participation receipt
                  value:
                    data:
                      receiptId: work_human_sha256
                      requirementId: authority.risk-owner
                      disposition: approved
        '201':
          description: Human participation recorded.
          content:
            application/json:
              schema:
                type: object
                additionalProperties: false
                required:
                - data
                properties:
                  data:
                    type: object
                    additionalProperties: false
                    required:
                    - receiptId
                    - requirementId
                    - disposition
                    properties:
                      receiptId:
                        type: string
                      requirementId:
                        type: string
                      disposition:
                        type: string
                        enum:
                        - approved
                        - rejected
                        - abstained
              examples:
                representative:
                  summary: Governed human-participation receipt
                  value:
                    data:
                      receiptId: work_human_sha256
                      requirementId: authority.risk-owner
                      disposition: approved
        '400':
          description: Bad request
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                idempotencyKeyRequired:
                  value:
                    type: https://api.indwel.ai/problems/idempotency-key-required
                    title: Bad request
                    status: 400
                    detail: Idempotency-Key is required for this operation
                    instance: /v1/organisations/org_acme/workspaces/ws_risk/cases/case_vendor/human-authority-requirements/har_01/participations
                    code: IDEMPOTENCY_KEY_REQUIRED
                    traceId: trace_01J0EXAMPLE
                    retryable: false
                invalidExpectedRevision:
                  value:
                    type: https://api.indwel.ai/problems/invalid-argument
                    title: Bad request
                    status: 400
                    detail: expectedRevision must be a positive integer
                    instance: /v1/organisations/org_acme/workspaces/ws_risk/cases/case_vendor/human-authority-requirements/har_01/participations
                    code: INVALID_ARGUMENT
                    traceId: trace_01J0EXAMPLE
                    retryable: false
                invalidDisposition:
                  value:
                    type: https://api.indwel.ai/problems/invalid-argument
                    title: Bad request
                    status: 400
                    detail: disposition must be approved, rejected or abstained
                    instance: /v1/organisations/org_acme/workspaces/ws_risk/cases/case_vendor/human-authority-requirements/har_01/participations
                    code: INVALID_ARGUMENT
                    traceId: trace_01J0EXAMPLE
                    retryable: false
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
  /v1/organisations/{organisationId}/workspaces/{workspaceId}/cases/{caseId}/effects/{actionId}:
    post:
      operationId: executeInstalledEffect
      tags:
      - Cases
      security:
      - IndwelOAuth:
        - effects.write
      x-indwel-resource-id: resource.case
      x-indwel-tenancy: organisation-workspace-case-bound
      x-indwel-effect:
        level: external-effect
        receiptRequired: true
      summary: Execute an installed governed effect
      description: 'Executes only an effect action declared by the immutable installed app version. Platform resolves the
        installed action, Cognitive Contract authority, durable human participation, provider binding, idempotency and postcondition
        verification before settlement; the client cannot create an arbitrary effect definition.


        **Authority:** installed immutable App Version + Cognitive Contract + durable human participation where required.


        **Contract:** scope `effects.write` · organization workspace case bound · external effect · receipt required · idempotency
        required.'
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/WorkspaceId'
      - name: caseId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
      - name: actionId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              required:
              - expectedRevision
              - payload
              - expectedPostcondition
              properties:
                expectedRevision:
                  type: integer
                  minimum: 1
                payload:
                  type: object
                expectedPostcondition:
                  type: object
            example:
              expectedRevision: 3
              payload:
                release: ACT-991
                state: deployed
              expectedPostcondition:
                release: ACT-991
                state: deployed
      responses:
        '200':
          description: Equivalent settled effect returned or newly settled effect completed.
          content:
            application/json:
              schema:
                type: object
              examples:
                representative:
                  value:
                    data:
                      actionId: release.deploy
                      settlementState: settled
                      receiptId: effect_receipt_sha256
                      providerRequestId: sandbox_request_sha256
                      verificationReceiptId: sandbox_verify_sha256
        '400':
          description: Bad request
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                idempotencyKeyRequired:
                  value:
                    type: https://api.indwel.ai/problems/idempotency-key-required
                    title: Bad request
                    status: 400
                    detail: Idempotency-Key is required for this operation
                    instance: /v1/organisations/org_acme/workspaces/ws_risk/cases/case_vendor/effects/notify_vendor
                    code: IDEMPOTENCY_KEY_REQUIRED
                    traceId: trace_01J0EXAMPLE
                    retryable: false
                invalidExpectedRevision:
                  value:
                    type: https://api.indwel.ai/problems/invalid-argument
                    title: Bad request
                    status: 400
                    detail: expectedRevision must be a positive integer
                    instance: /v1/organisations/org_acme/workspaces/ws_risk/cases/case_vendor/effects/notify_vendor
                    code: INVALID_ARGUMENT
                    traceId: trace_01J0EXAMPLE
                    retryable: false
                payloadObjectRequired:
                  value:
                    type: https://api.indwel.ai/problems/invalid-argument
                    title: Bad request
                    status: 400
                    detail: payload must be an object
                    instance: /v1/organisations/org_acme/workspaces/ws_risk/cases/case_vendor/effects/notify_vendor
                    code: INVALID_ARGUMENT
                    traceId: trace_01J0EXAMPLE
                    retryable: false
                postconditionObjectRequired:
                  value:
                    type: https://api.indwel.ai/problems/invalid-argument
                    title: Bad request
                    status: 400
                    detail: expectedPostcondition must be an object
                    instance: /v1/organisations/org_acme/workspaces/ws_risk/cases/case_vendor/effects/notify_vendor
                    code: INVALID_ARGUMENT
                    traceId: trace_01J0EXAMPLE
                    retryable: false
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-semantics:
        authority: installed immutable App Version + Cognitive Contract + durable human participation where required
        effect: external-effect
        receipt: required
        idempotency: required
  /v1/organisations/{organisationId}/workspaces/{workspaceId}/cases/{caseId}/runs/{runId}/artifacts:
    get:
      operationId: listArtifacts
      tags:
      - Runs
      security:
      - IndwelOAuth:
        - runs.read
      x-indwel-resource-id: resource.artifact
      x-indwel-tenancy: organisation-workspace-case-bound
      x-indwel-effect:
        level: read
        receiptRequired: false
      summary: List terminal run artifacts
      description: 'Projects the stable terminal work product for an authorized developer Run. The projection is derived from
        durable terminal Run truth and includes the answer/display artifact without exposing private execution state.


        **Contract:** scope `runs.read` · organization workspace case bound · read.'
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/WorkspaceId'
      - name: caseId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
      - name: runId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
      responses:
        '200':
          description: Authorized terminal artifact projection.
          content:
            application/json:
              schema:
                type: object
              examples:
                representative:
                  value:
                    data:
                      schema: indwel.developer-run-artifact-list.v1
                      runId: run_01J0EXAMPLE
                      caseId: case_01J0EXAMPLE
                      items:
                      - artifactId: projection_01J0EXAMPLE
                        kind: answer
                        status: complete
                        answer: Assessment complete.
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
  /v1/organisations/{organisationId}/workspaces/{workspaceId}/cases/{caseId}/runs/{runId}/receipts:
    get:
      operationId: listReceipts
      tags:
      - Runs
      security:
      - IndwelOAuth:
        - runs.read
      x-indwel-resource-id: resource.receipt
      x-indwel-tenancy: organisation-workspace-case-bound
      x-indwel-effect:
        level: read
        receiptRequired: false
      summary: List governed run and case receipts
      description: 'Returns an authorized receipt projection combining durable terminal run settlement, Case governance receipts
        and governed Effect Egress settlement receipts for the exact developer run and Case.


        **Authority:** authorized Case-bound Run projection.


        **Contract:** scope `runs.read` · organization workspace case bound · read.'
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/WorkspaceId'
      - name: caseId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
      - name: runId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
      responses:
        '200':
          description: Authorized receipt projection.
          content:
            application/json:
              schema:
                type: object
              examples:
                representative:
                  value:
                    data:
                      schema: indwel.developer-run-receipt-list.v1
                      runId: run_01J0EXAMPLE
                      caseId: case_01J0EXAMPLE
                      items:
                      - schema: indwel.developer-run-settlement-receipt-projection.v1
                        receiptId: run-settlement:projection_01J0EXAMPLE
                        status: complete
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-semantics:
        authority: authorised Case-bound Run projection
        receipt: customer-safe governed receipt set
  /v1/organisations/{organisationId}/projects/{projectId}/event-destinations:
    post:
      operationId: createEventDestination
      summary: Create an event destination
      description: 'Creates an environment-bound signed event destination with explicit event filters and version posture.


        **Contract:** scope `events.write` · project bound · bounded write · receipt required · idempotency required.'
      tags:
      - Events
      security:
      - IndwelOAuth:
        - events.write
      responses:
        '201':
          description: Successful response.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EventDestinationResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      eventDestinationId: event_01J0EXAMPLE
                      projectId: proje_01J0EXAMPLE
                      environmentId: envir_01J0EXAMPLE
                      url: https://example.test/indwel-events
                      eventTypes:
                      - indwel.run.settled.v1
                      apiVersion: '2026-07-23'
                      status: active
                      signingAlgorithm: hmac-sha256
                      secretLastRotatedAt: '2026-07-23T22:45:00Z'
                      createdAt: '2026-07-23T22:45:00Z'
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '428':
          $ref: '#/components/responses/Problem428'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.eventDestination
      x-indwel-tenancy: project-bound
      x-indwel-effect:
        level: bounded-write
        receiptRequired: true
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateEventDestinationRequest'
            example:
              environmentId: envir_01J0EXAMPLE
              url: https://example.test/indwel-events
              eventTypes:
              - indwel.run.settled.v1
              apiVersion: '2026-07-23'
              description: Company Answers event consumer.
      x-indwel-idempotency:
        required: true
        requestFingerprint: method + canonical path + tenant boundary + canonical request body
        replayOutcome: return original terminal response or stable in-progress state
        conflictingRequest: 409 IDEMPOTENCY_KEY_REUSED
  /v1/organisations/{organisationId}/projects/{projectId}/event-destinations/{eventDestinationId}:send-test-event:
    post:
      operationId: sendTestEvent
      summary: Send a test event
      description: 'Creates a non-production test Delivery through the same signing and dispatch pipeline used by the destination.


        **Contract:** scope `events.write` · project bound · bounded write · receipt required · idempotency required.'
      tags:
      - Events
      security:
      - IndwelOAuth:
        - events.write
      responses:
        '202':
          description: Successful response.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeliveryResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      deliveryId: deliv_01J0EXAMPLE
                      eventDestinationId: event_01J0EXAMPLE
                      eventId: evt_01J0EXAMPLE
                      originalDeliveryId: null
                      attemptNumber: 1
                      status: queued
                      responseStatus: null
                      latencyMs: null
                      nextAttemptAt: null
                      createdAt: '2026-07-23T22:45:00Z'
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '428':
          $ref: '#/components/responses/Problem428'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.eventDestination
      x-indwel-tenancy: project-bound
      x-indwel-effect:
        level: bounded-write
        receiptRequired: true
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/EventDestinationId'
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SendTestEventRequest'
            example:
              eventType: indwel.test.v1
              payload:
                message: verification
      x-indwel-idempotency:
        required: true
        requestFingerprint: method + canonical path + tenant boundary + canonical request body
        replayOutcome: return original terminal response or stable in-progress state
        conflictingRequest: 409 IDEMPOTENCY_KEY_REUSED
  /v1/organisations/{organisationId}/operations/{operationId}:
    get:
      operationId: getOperation
      summary: Get a long-running operation
      description: 'Returns the durable progress, terminal result or problem for work initiated by another platform command.


        **Contract:** scope `operations.read` · organization bound · read.'
      tags:
      - Operations
      security:
      - IndwelOAuth:
        - operations.read
      responses:
        '200':
          description: Successful response.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OperationResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      operationId: opera_01J0EXAMPLE
                      kind: deployment.rollback
                      status: running
                      targetResourceId: deplo_01J0EXAMPLE
                      progressPercent: 25
                      cancellable: true
                      resultResourceId: null
                      receiptId: null
                      createdAt: '2026-07-23T22:45:00Z'
                      updatedAt: '2026-07-23T22:46:00Z'
                      terminalAt: null
                      problem: null
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '428':
          $ref: '#/components/responses/Problem428'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.operation
      x-indwel-tenancy: organisation-bound
      x-indwel-effect:
        level: read
        receiptRequired: false
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/OperationId'
  /v1/organisations/{organisationId}/projects/{projectId}/quotas/effective:
    get:
      operationId: getQuota
      summary: Get effective project quotas
      description: 'Returns effective limits, reservations, usage and remaining capacity for the project and environment context.


        **Contract:** scope `usage.read` · project bound · read.'
      tags:
      - Usage
      security:
      - IndwelOAuth:
        - usage.read
      responses:
        '200':
          description: Successful response.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/QuotaSetResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      items:
                      - quotaId: quota_runs
                        metric: governed_runs
                        limit: 1000
                        used: 120
                        reserved: 10
                        remaining: 870
                        unit: runs
                        periodStart: '2026-07-01T00:00:00Z'
                        periodEnd: '2026-08-01T00:00:00Z'
                      nextCursor: null
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '428':
          $ref: '#/components/responses/Problem428'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.quota
      x-indwel-tenancy: project-bound
      x-indwel-effect:
        level: read
        receiptRequired: false
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/ProjectId'
  /v1/services/{serviceId}:
    get:
      operationId: getServiceStatus
      summary: Get service status
      description: 'Returns a bounded service identity and availability projection without claiming operational certification
        not supported by evidence.


        **Contract:** none · read.'
      tags:
      - Platform
      security: []
      responses:
        '200':
          description: Successful response.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ServiceResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      serviceId: platform
                      name: Indwel Platform
                      status: operational
                      apiVersions:
                      - v1
                      governance: evidence-first
                      releaseId: null
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '428':
          $ref: '#/components/responses/Problem428'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.service
      x-indwel-tenancy: none
      x-indwel-effect:
        level: read
        receiptRequired: false
      parameters:
      - $ref: '#/components/parameters/ServiceId'
  /v1/organisations/{organisationId}/projects/{projectId}/activity-events:
    get:
      operationId: listActivityEvents
      summary: List customer-safe activity events
      description: 'Lists privacy-filtered project activity derived from authoritative audit, event and receipt records without
        exposing private operator context.


        **Contract:** scope `activity.read` · project bound · read.'
      tags:
      - Activity
      security:
      - IndwelOAuth:
        - activity.read
      responses:
        '200':
          description: Successful response.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ActivityEventListResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      items:
                      - activityEventId: activ_01J0EXAMPLE
                        projectId: proje_01J0EXAMPLE
                        type: deployment.rollback.requested
                        actor: user_01J0EXAMPLE
                        resourceId: deplo_01J0EXAMPLE
                        summary: Rollback requested.
                        occurredAt: '2026-07-23T22:45:00Z'
                      nextCursor: null
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '428':
          $ref: '#/components/responses/Problem428'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.activityEvent
      x-indwel-tenancy: project-bound
      x-indwel-effect:
        level: read
        receiptRequired: false
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/Limit'
      - $ref: '#/components/parameters/Cursor'
  /v1/organisations/{organisationId}/projects/{projectId}/event-destinations/{eventDestinationId}/deliveries:
    get:
      operationId: listDeliveries
      summary: List event deliveries
      description: 'Lists signed delivery attempts, response outcomes, retry posture and replay lineage for one destination.


        **Contract:** scope `events.read` · project bound · read.'
      tags:
      - Events
      security:
      - IndwelOAuth:
        - events.read
      responses:
        '200':
          description: Successful response.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeliveryListResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      items:
                      - deliveryId: deliv_01J0EXAMPLE
                        eventDestinationId: event_01J0EXAMPLE
                        eventId: evt_01J0EXAMPLE
                        originalDeliveryId: null
                        attemptNumber: 1
                        status: succeeded
                        responseStatus: 204
                        latencyMs: 83
                        nextAttemptAt: null
                        createdAt: '2026-07-23T22:45:00Z'
                      nextCursor: null
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '428':
          $ref: '#/components/responses/Problem428'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.delivery
      x-indwel-tenancy: project-bound
      x-indwel-effect:
        level: read
        receiptRequired: false
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/EventDestinationId'
      - $ref: '#/components/parameters/Limit'
      - $ref: '#/components/parameters/Cursor'
  /v1/organisations/{organisationId}/projects/{projectId}/usage-records:
    get:
      operationId: listUsageRecords
      summary: List project usage records
      description: 'Lists immutable metered usage records bound to project, environment, release and cost class.


        **Contract:** scope `usage.read` · project bound · read.'
      tags:
      - Usage
      security:
      - IndwelOAuth:
        - usage.read
      responses:
        '200':
          description: Successful response.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UsageRecordListResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      items:
                      - usageRecordId: usage_01J0EXAMPLE
                        projectId: proje_01J0EXAMPLE
                        environmentId: envir_01J0EXAMPLE
                        metric: governed_runs
                        quantity: 1
                        unit: run
                        costClass: cognition.standard
                        releaseId: null
                        occurredAt: '2026-07-23T22:45:00Z'
                      nextCursor: null
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '428':
          $ref: '#/components/responses/Problem428'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.usageRecord
      x-indwel-tenancy: project-bound
      x-indwel-effect:
        level: read
        receiptRequired: false
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/Limit'
      - $ref: '#/components/parameters/Cursor'
  /v1/organisations/{organisationId}/operations/{operationId}:cancel:
    post:
      operationId: cancelOperation
      summary: Cancel a long-running operation
      description: 'Requests cancellation where the initiating command declares cancellation lawful; cancellation is idempotent
        by operation state and idempotency key.


        **Contract:** scope `operations.write` · organization bound · bounded write · receipt required · idempotency required.'
      tags:
      - Operations
      security:
      - IndwelOAuth:
        - operations.write
      responses:
        '200':
          description: Successful response.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OperationResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      operationId: opera_01J0EXAMPLE
                      kind: deployment.rollback
                      status: running
                      targetResourceId: deplo_01J0EXAMPLE
                      progressPercent: 25
                      cancellable: true
                      resultResourceId: null
                      receiptId: null
                      createdAt: '2026-07-23T22:45:00Z'
                      updatedAt: '2026-07-23T22:46:00Z'
                      terminalAt: null
                      problem: null
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '428':
          $ref: '#/components/responses/Problem428'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.operation
      x-indwel-tenancy: organisation-bound
      x-indwel-effect:
        level: bounded-write
        receiptRequired: true
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/OperationId'
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CancelOperationRequest'
            example:
              reason: Operator requested cancellation before external effect.
      x-indwel-idempotency:
        required: true
        requestFingerprint: method + canonical path + tenant boundary + canonical request body
        replayOutcome: return original terminal response or stable in-progress state
        conflictingRequest: 409 IDEMPOTENCY_KEY_REUSED
  ? /v1/organisations/{organisationId}/projects/{projectId}/event-destinations/{eventDestinationId}/deliveries/{deliveryId}:replay
  : post:
      operationId: replayDelivery
      summary: Replay an event delivery
      description: 'Creates a new signed Delivery attempt linked to the original immutable attempt and current destination
        secret version.


        **Contract:** scope `events.write` · project bound · bounded write · receipt required · idempotency required.'
      tags:
      - Events
      security:
      - IndwelOAuth:
        - events.write
      responses:
        '202':
          description: Successful response.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeliveryResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      deliveryId: deliv_01J0EXAMPLE
                      eventDestinationId: event_01J0EXAMPLE
                      eventId: evt_01J0EXAMPLE
                      originalDeliveryId: null
                      attemptNumber: 1
                      status: queued
                      responseStatus: null
                      latencyMs: null
                      nextAttemptAt: null
                      createdAt: '2026-07-23T22:45:00Z'
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '428':
          $ref: '#/components/responses/Problem428'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.delivery
      x-indwel-tenancy: project-bound
      x-indwel-effect:
        level: bounded-write
        receiptRequired: true
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/EventDestinationId'
      - $ref: '#/components/parameters/DeliveryId'
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ReplayDeliveryRequest'
            example:
              reason: Consumer recovered after outage.
      x-indwel-idempotency:
        required: true
        requestFingerprint: method + canonical path + tenant boundary + canonical request body
        replayOutcome: return original terminal response or stable in-progress state
        conflictingRequest: 409 IDEMPOTENCY_KEY_REUSED
  /v1/organisations/{organisationId}/projects/{projectId}/environments/{environmentId}/deployments/{deploymentId}:rollback:
    post:
      operationId: rollbackDeployment
      summary: Roll back a deployment
      description: 'Begins a durable rollback operation to the previous certified deployment or an explicitly named compatible
        deployment.


        **Contract:** scope `deployments.write` · project bound · external effect · receipt required · idempotency required.'
      tags:
      - Apps
      security:
      - IndwelOAuth:
        - deployments.write
      responses:
        '202':
          description: Successful response.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OperationResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      operationId: opera_01J0EXAMPLE
                      kind: deployment.rollback
                      status: running
                      targetResourceId: deplo_01J0EXAMPLE
                      progressPercent: 25
                      cancellable: true
                      resultResourceId: null
                      receiptId: null
                      createdAt: '2026-07-23T22:45:00Z'
                      updatedAt: '2026-07-23T22:46:00Z'
                      terminalAt: null
                      problem: null
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '428':
          $ref: '#/components/responses/Problem428'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.deployment
      x-indwel-tenancy: project-bound
      x-indwel-effect:
        level: external-effect
        receiptRequired: true
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/EnvironmentId'
      - $ref: '#/components/parameters/DeploymentId'
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RollbackDeploymentRequest'
            example:
              targetDeploymentId: null
              reason: Production readiness evidence was invalidated.
      x-indwel-idempotency:
        required: true
        requestFingerprint: method + canonical path + tenant boundary + canonical request body
        replayOutcome: return original terminal response or stable in-progress state
        conflictingRequest: 409 IDEMPOTENCY_KEY_REUSED
  /v1/organisations/{organisationId}/projects/{projectId}/clients/{clientId}/credentials/{credentialId}:rotate:
    post:
      operationId: rotateCredential
      summary: Rotate a client credential
      description: 'Creates replacement credential material returned once, records overlap posture, and schedules or performs
        prior-credential revocation.


        **Contract:** scope `clients.write` · project bound · bounded write · receipt required · idempotency required.'
      tags:
      - Credentials
      security:
      - IndwelOAuth:
        - clients.write
      responses:
        '201':
          description: Successful response.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CredentialRotationReceiptResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      credentialId: crede_01J0EXAMPLE
                      clientId: clien_01J0EXAMPLE
                      secret: indwel_secret_returned_once
                      rotatedAt: '2026-07-23T22:45:00Z'
                      previousCredentialValidUntil: '2026-07-23T23:00:00Z'
                      expiresAt: null
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '428':
          $ref: '#/components/responses/Problem428'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.credential
      x-indwel-tenancy: project-bound
      x-indwel-effect:
        level: bounded-write
        receiptRequired: true
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/ClientId'
      - $ref: '#/components/parameters/CredentialId'
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RotateCredentialRequest'
            example:
              overlapSeconds: 900
              expiresAt: null
      x-indwel-idempotency:
        required: true
        requestFingerprint: method + canonical path + tenant boundary + canonical request body
        replayOutcome: return original terminal response or stable in-progress state
        conflictingRequest: 409 IDEMPOTENCY_KEY_REUSED
  /v1/organisations/{organisationId}/projects/{projectId}/event-destinations/{eventDestinationId}:rotate-secret:
    post:
      operationId: rotateEventDestinationSecret
      summary: Rotate an event signing secret
      description: 'Creates a replacement signing secret returned once and records the bounded overlap period for safe consumer
        migration.


        **Contract:** scope `events.write` · project bound · bounded write · receipt required · idempotency required.'
      tags:
      - Events
      security:
      - IndwelOAuth:
        - events.write
      responses:
        '200':
          description: Successful response.
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EventDestinationSecretRotationReceiptResponse'
              examples:
                representative:
                  summary: Representative response
                  value:
                    data:
                      eventDestinationId: event_01J0EXAMPLE
                      signingSecret: whsec_returned_once
                      rotatedAt: '2026-07-23T22:45:00Z'
                      previousSecretValidUntil: '2026-07-23T23:00:00Z'
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '428':
          $ref: '#/components/responses/Problem428'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      x-indwel-resource-id: resource.eventDestination
      x-indwel-tenancy: project-bound
      x-indwel-effect:
        level: bounded-write
        receiptRequired: true
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/EventDestinationId'
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RotateEventDestinationSecretRequest'
            example:
              overlapSeconds: 900
      x-indwel-idempotency:
        required: true
        requestFingerprint: method + canonical path + tenant boundary + canonical request body
        replayOutcome: return original terminal response or stable in-progress state
        conflictingRequest: 409 IDEMPOTENCY_KEY_REUSED
  /v1/work:
    get:
      operationId: listWork
      tags:
      - Work
      summary: List authorized Work
      description: 'Returns durable Work visible to the authenticated principal. Organization and workspace authority are
        resolved by the backend; query filters do not grant access.


        **Authority:** backend-derived organization/workspace membership.


        **Contract:** scope `work.read`.'
      responses:
        '200':
          description: Authorized Work docket projection.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkListResponse'
              example:
                data:
                  items:
                  - workId: work_vendor_assurance
                    title: Quarterly vendor assurance
                    lifecycle: active
                    posture: advancing
                    tenantId: org_acme
                    workspaceId: ws_risk
                    portfolioId: portfolio_vendor_risk
                    teamIds:
                    - team_risk
                    updatedAt: '2026-09-01T14:30:00Z'
                  count: 1
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - work.read
      parameters:
      - name: q
        in: query
        required: false
        schema:
          type: string
          minLength: 1
        description: Case-insensitive text search over authorized Work identifiers, titles, and portfolio identifiers.
      - name: workspaceIds
        in: query
        required: false
        description: Comma-separated workspace filters applied only after backend authority is established.
        style: form
        explode: false
        schema:
          type: array
          items:
            type: string
      - name: portfolioIds
        in: query
        required: false
        description: Comma-separated portfolio filters over authorized Work.
        style: form
        explode: false
        schema:
          type: array
          items:
            type: string
      - name: teamIds
        in: query
        required: false
        description: Comma-separated team filters over authorized Work.
        style: form
        explode: false
        schema:
          type: array
          items:
            type: string
      - name: lifecycle
        in: query
        required: false
        description: Comma-separated Work lifecycle filters.
        style: form
        explode: false
        schema:
          type: array
          items:
            type: string
            enum:
            - proposed
            - active
            - paused
            - review
            - closed
      - name: posture
        in: query
        required: false
        description: Comma-separated Work progress-posture filters.
        style: form
        explode: false
        schema:
          type: array
          items:
            type: string
            enum:
            - advancing
            - steady
            - blocked
            - decision_ready
            - settlement_candidate
      - name: limit
        in: query
        required: false
        schema:
          type: integer
          minimum: 1
          maximum: 500
          default: 100
        description: Maximum authorized Work projections to return. The server clamps the value to 1–500 and defaults to 100.
      x-indwel-semantics:
        authority: backend-derived organisation/workspace membership
        custody: durable Work operating table
    post:
      operationId: createWork
      tags:
      - Work
      summary: Create durable Work
      description: 'Creates a durable longitudinal undertaking. Tenant and principal authority are derived from authenticated
        backend state; `workspaceId` is a reference, not an authority grant.


        **Authority:** backend-derived organization/workspace membership.


        **Contract:** scope `work.write` · bounded write.'
      responses:
        '201':
          description: Durable Work created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkProjectionResponse'
              example:
                data:
                  schema: indwel.work_status_projection.v1
                  workId: work_vendor_assurance
                  title: Quarterly vendor assurance
                  tenantId: org_acme
                  workspaceId: ws_risk
                  lifecycle: active
                  posture: advancing
                  docketRevision: 11
                  progressRevision: 8
                  residuals:
                    unsatisfiedCriterionIds:
                    - criterion_data_retention
                    unresolvedQuestionIds: []
                    blockerIds: []
                    frontierItemIds:
                    - review_retention
                  settlementCandidate: false
                  settlementReasonCodes:
                  - WORK_RESIDUALS_REMAIN
                  legalNextActions:
                  - advance
                  updatedAt: '2026-09-01T14:30:00Z'
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - work.write
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WorkCreateRequest'
            example:
              title: Quarterly vendor assurance
              workspaceId: ws_01J0EXAMPLE
              objectiveIds:
              - obj_01J0EXAMPLE
      x-indwel-semantics:
        authority: backend-derived organisation/workspace membership
        custody: durable Work operating table
        effect: bounded-write
  /v1/work/portfolios:
    get:
      operationId: getWorkPortfolios
      tags:
      - Work
      summary: Read Work portfolio projection
      description: 'Returns the authorized portfolio projection over durable Work. Portfolios are subordinate Work projections
        rather than independent write authority.


        **Authority:** backend-derived organization/workspace membership.


        **Contract:** scope `work.read`.'
      responses:
        '200':
          description: Portfolio projection.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkPortfolioResponse'
              example:
                data:
                  schema: indwel.work_portfolio_projection.v1
                  tenantId: org_acme
                  principalId: user_42
                  visibleWorkCount: 1
                  portfolios:
                  - portfolioId: portfolio_vendor_risk
                    workCount: 1
                    lifecycleCounts:
                      active: 1
                    postureCounts:
                      advancing: 1
                    blockedWorkIds: []
                    settlementCandidateWorkIds: []
                    lastUpdatedAt: '2026-09-01T14:30:00Z'
                    workIds:
                    - work_vendor_assurance
                  reasonCodes: []
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - work.read
      x-indwel-semantics:
        authority: backend-derived organisation/workspace membership
        custody: durable Work operating table
  /v1/work/{workId}:
    get:
      operationId: getWorkStatus
      tags:
      - Work
      summary: Read durable Work
      description: 'Returns durable Work status and any canonical settlement receipt after backend membership authority is
        satisfied.


        **Authority:** backend-derived organization/workspace membership.


        **Contract:** scope `work.read`.'
      responses:
        '200':
          description: Work status and settlement receipt.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkStatusResponse'
              example:
                data:
                  status:
                    schema: indwel.work_status_projection.v1
                    workId: work_vendor_assurance
                    title: Quarterly vendor assurance
                    tenantId: org_acme
                    workspaceId: ws_risk
                    lifecycle: active
                    posture: advancing
                    docketRevision: 11
                    progressRevision: 8
                    residuals:
                      unsatisfiedCriterionIds:
                      - criterion_data_retention
                      unresolvedQuestionIds: []
                      blockerIds: []
                      frontierItemIds:
                      - review_retention
                    settlementCandidate: false
                    settlementReasonCodes:
                    - WORK_RESIDUALS_REMAIN
                    legalNextActions:
                    - advance
                    updatedAt: '2026-09-01T14:30:00Z'
                  settlementReceipt: null
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - work.read
      parameters:
      - name: workId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Durable Work identifier.
      x-indwel-semantics:
        authority: backend-derived organisation/workspace membership
        custody: durable Work operating table
    patch:
      operationId: updateWork
      tags:
      - Work
      summary: Update durable Work
      description: 'Updates mutable Work docket fields under optimistic concurrency. Backend authority owns tenant, workspace,
        participation, settlement, and Objective authority.


        **Authority:** backend-derived organization/workspace membership.


        **Contract:** scope `work.write` · bounded write · optimistic concurrency.'
      responses:
        '200':
          description: Updated Work docket.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkProjectionResponse'
              example:
                data:
                  schema: indwel.work_status_projection.v1
                  workId: work_vendor_assurance
                  title: Quarterly vendor assurance
                  tenantId: org_acme
                  workspaceId: ws_risk
                  lifecycle: active
                  posture: advancing
                  docketRevision: 12
                  progressRevision: 8
                  residuals:
                    unsatisfiedCriterionIds:
                    - criterion_data_retention
                    unresolvedQuestionIds: []
                    blockerIds: []
                    frontierItemIds:
                    - review_retention
                  settlementCandidate: false
                  settlementReasonCodes:
                  - WORK_RESIDUALS_REMAIN
                  legalNextActions:
                  - advance
                  updatedAt: '2026-09-01T14:36:00Z'
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - work.write
      parameters:
      - name: workId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Durable Work identifier.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WorkUpdateRequest'
            example:
              expectedRevision: 3
              description: Assurance review covering the current contract year.
              lifecycle: active
      x-indwel-semantics:
        authority: backend-derived organisation/workspace membership
        custody: durable Work operating table
        effect: bounded-write
        concurrency: expectedRevision
  /v1/work/{workId}/economics:
    get:
      operationId: getWorkEconomics
      tags:
      - Work
      summary: Read Work economics
      description: 'Returns backend-owned cumulative Work economics. Clients may observe authorized economic state; they do
        not establish authoritative cost or budget state by supplying larger numbers.


        **Authority:** backend-derived organization/workspace membership.


        **Contract:** scope `work.read` · auditor authority.'
      responses:
        '200':
          description: Complete bounded Work economics projection.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkEconomicsResponse'
              example:
                data:
                  projection:
                    schema: indwel.work_economics_projection.v1
                    tenantId: org_acme
                    workId: work_vendor_assurance
                    workspaceIds:
                    - ws_risk
                    currency: USD
                    truthClass: provider_priced_settlement
                    machineCostMicros: 1842000
                    terminalInferenceRuns: 4
                    unpricedTerminalRuns: 0
                    unpricedPhysicalAttempts: 0
                    humanEngagementEvents: 2
                    byUser: []
                    byTeam: []
                    unallocatedUserMachineCostMicros: 0
                    unallocatedTeamMachineCostMicros: 0
                    sourceEventIds:
                    - evt_01
                    - evt_02
                    reasonCodes: []
                  provenance:
                    schemaVersion: indwel.work_economics_provenance.v1
                    authority: unified-system-ledger
                    complete: true
                    eventCount: 6
                    reasonCodes: []
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - work.read
      parameters:
      - name: workId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Durable Work identifier.
      x-indwel-semantics:
        authority: backend-derived organisation/workspace membership
        custody: durable Work operating table
        economics: backend-derived
        role: auditor
  /v1/work/{workId}/advance:
    post:
      operationId: advanceWork
      tags:
      - Work
      summary: Record causal Work advancement
      description: 'Records a governed causal advancement against the current Work progress revision. Advancement describes
        what changed in the undertaking; it does not let the caller manufacture evidence, decision, approval, or settlement
        authority.


        **Authority:** backend-derived organization/workspace membership.


        **Contract:** scope `work.write` · causal advance · optimistic concurrency.'
      responses:
        '200':
          description: Updated Work status.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkProjectionResponse'
              example:
                data:
                  schema: indwel.work_status_projection.v1
                  workId: work_vendor_assurance
                  title: Quarterly vendor assurance
                  tenantId: org_acme
                  workspaceId: ws_risk
                  lifecycle: active
                  posture: advancing
                  docketRevision: 11
                  progressRevision: 9
                  residuals:
                    unsatisfiedCriterionIds:
                    - criterion_data_retention
                    unresolvedQuestionIds: []
                    blockerIds: []
                    frontierItemIds:
                    - review_retention
                  settlementCandidate: false
                  settlementReasonCodes:
                  - WORK_RESIDUALS_REMAIN
                  legalNextActions:
                  - advance
                  updatedAt: '2026-09-01T14:42:00Z'
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - work.write
      parameters:
      - name: workId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Durable Work identifier.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WorkAdvanceRequest'
            example:
              expectedProgressRevision: 7
              kind: evidence_admitted
              summary: Current SOC 2 report admitted to the assurance record.
              receiptIds:
              - receipt_01J0EXAMPLE
              posture: advancing
      x-indwel-semantics:
        authority: backend-derived organisation/workspace membership
        custody: durable Work operating table
        effect: causal-advance
        concurrency: expectedProgressRevision
  /v1/work/{workId}/settle:
    post:
      operationId: settleWork
      tags:
      - Work
      summary: Settle durable Work
      description: 'Attempts terminal settlement under canonical Work authority. Settlement may be refused when completion
        claims are false, required conditions remain unresolved, or the docket revision has changed.


        **Authority:** backend-derived organization/workspace membership.


        **Contract:** scope `work.write` · terminal settlement.'
      responses:
        '200':
          description: Settlement status and canonical receipt.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkSettlementResponse'
              example:
                data:
                  status:
                    schema: indwel.work_status_projection.v1
                    workId: work_vendor_assurance
                    title: Quarterly vendor assurance
                    tenantId: org_acme
                    workspaceId: ws_risk
                    lifecycle: closed
                    posture: steady
                    docketRevision: 13
                    progressRevision: 10
                    residuals:
                      unsatisfiedCriterionIds: []
                      unresolvedQuestionIds: []
                      blockerIds: []
                      frontierItemIds: []
                    settlementCandidate: false
                    settlementReasonCodes: []
                    legalNextActions: []
                    updatedAt: '2026-09-01T15:10:00Z'
                  receipt:
                    schema: indwel.work_settlement_receipt.v1
                    receiptId: receipt_work_settlement_01
                    workId: work_vendor_assurance
                    disposition: satisfied
                    closedAt: '2026-09-01T15:10:00Z'
                    closedBy: user_42
                    docketRevision: 13
                    progressRevision: 10
                    residuals:
                      unsatisfiedCriterionIds: []
                      unresolvedQuestionIds: []
                      blockerIds: []
                      frontierItemIds: []
                    evidenceRefs:
                    - evidence_soc2_2026
                    decisionRefs:
                    - decision_accept_vendor
                    sourceReceiptIds:
                    - receipt_run_01
                    residualRisk: low
                    status: settled
                    reasonCodes: []
                    digest: sha256:example
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - work.write
      parameters:
      - name: workId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Durable Work identifier.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WorkSettleRequest'
            example:
              expectedDocketRevision: 11
              disposition: satisfied
              summary: Assurance review settled on the admitted record.
              satisfiedCriterionIds:
              - criterion_01
              residualRisk: low
              userAccepted: true
      x-indwel-semantics:
        authority: backend-derived organisation/workspace membership
        custody: durable Work operating table
        effect: terminal-settlement
        receipt: canonical
  /v2/account/memory/items:
    get:
      operationId: listMemoryItems
      tags:
      - Memory
      summary: List Memory items
      description: 'Returns the authenticated subject''s Memory items. Personal Memory scope is derived from authenticated
        identity; callers cannot select another subject or manufacture scope.


        **Authority:** authenticated personal Memory authority.


        **Contract:** scope `memory.read` · user delegated only.'
      responses:
        '200':
          description: Memory item projection.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemoryListResponse'
              example:
                ok: true
                items:
                - schemaVersion: personal_memory_view.v2
                  memoryRef: mem_response_style
                  version: 1
                  title: Response style
                  content: Prefer concise release briefs that lead with the decision, evidence, and remaining risk.
                  category: preference
                  state: active
                  importance: ordinary
                  authority: user_authored
                  origin:
                    kind: conversation
                    label: Account memory
                  scope:
                    mode: account
                    label: Account memory
                  influence:
                    eligible: true
                    explanation: Eligible to shape response structure under the active Memory posture.
                  createdAt: '2026-09-01T15:00:00Z'
                  updatedAt: '2026-09-01T15:00:00Z'
                  capabilities:
                    edit: true
                    correct: true
                    makeImportant: true
                    pause: true
                    restore: true
                    stop: true
                    useAgain: true
                    delete: true
                    versions: true
                    proof: true
                page:
                  hasMore: true
                query: {}
                freshness:
                  schemaVersion: memory_projection_freshness.v1
                  state: complete
                  readAvailable: true
                  mutationAvailable: true
                  observedAt: '2026-09-01T15:00:00Z'
                  explanation: Eligible to shape response structure under the active Memory posture.
                  reasonCodes:
                  - REPRESENTATIVE_REASON
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - memory.read
      parameters:
      - name: view
        in: query
        required: false
        schema:
          type: string
          enum:
          - remembered
          - review
          - inactive
          - all
      - name: q
        in: query
        required: false
        schema:
          type: string
          minLength: 1
      - name: cursor
        in: query
        required: false
        schema:
          type: string
          minLength: 1
      - name: limit
        in: query
        required: false
        schema:
          type: integer
          minimum: 1
      x-indwel-semantics:
        authority: authenticated personal Memory authority
        evidenceBoundary: Memory informs cognition under governance; it is not sovereign evidence
        delegation: user-delegated-only
    post:
      operationId: createMemoryItem
      tags:
      - Memory
      summary: Create a Memory item
      description: 'Creates an explicit personal Memory item for the authenticated subject. This changes Memory, not evidence
        authority.


        **Authority:** authenticated personal Memory authority.


        **Contract:** scope `memory.write` · idempotency required · user delegated only.'
      responses:
        '201':
          description: Memory item created or idempotently replayed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemoryItemCreateResponse'
              example:
                ok: true
                item:
                  schemaVersion: personal_memory_view.v2
                  memoryRef: mem_response_style
                  version: 1
                  title: Response style
                  content: Prefer concise release briefs that lead with the decision, evidence, and remaining risk.
                  category: preference
                  state: active
                  importance: ordinary
                  authority: user_authored
                  origin:
                    kind: conversation
                    label: Account memory
                  scope:
                    mode: account
                    label: Account memory
                  influence:
                    eligible: true
                    explanation: Eligible to shape response structure under the active Memory posture.
                  createdAt: '2026-09-01T15:00:00Z'
                  updatedAt: '2026-09-01T15:00:00Z'
                  capabilities:
                    edit: true
                    correct: true
                    makeImportant: true
                    pause: true
                    restore: true
                    stop: true
                    useAgain: true
                    delete: true
                    versions: true
                    proof: true
                created: true
                idempotentReplay: true
                freshness:
                  schemaVersion: memory_projection_freshness.v1
                  state: complete
                  readAvailable: true
                  mutationAvailable: true
                  observedAt: '2026-09-01T15:00:00Z'
                  explanation: Eligible to shape response structure under the active Memory posture.
                  reasonCodes:
                  - REPRESENTATIVE_REASON
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - memory.write
      parameters:
      - $ref: '#/components/parameters/MemoryIdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MemoryCreateRequest'
            example:
              title: Response style
      x-indwel-semantics:
        authority: authenticated personal Memory authority
        evidenceBoundary: Memory informs cognition under governance; it is not sovereign evidence
        delegation: user-delegated-only
        idempotency: required
  /v2/account/memory/items/{memoryRef}:
    get:
      operationId: getMemoryItem
      tags:
      - Memory
      summary: Get a Memory item
      description: 'Returns one authorized Memory item for the authenticated subject.


        **Authority:** authenticated personal Memory authority.


        **Contract:** scope `memory.read` · user delegated only.'
      responses:
        '200':
          description: Memory item.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemoryItemResponse'
              example:
                ok: true
                item:
                  schemaVersion: personal_memory_view.v2
                  memoryRef: mem_response_style
                  version: 1
                  title: Response style
                  content: Prefer concise release briefs that lead with the decision, evidence, and remaining risk.
                  category: preference
                  state: active
                  importance: ordinary
                  authority: user_authored
                  origin:
                    kind: conversation
                    label: Account memory
                  scope:
                    mode: account
                    label: Account memory
                  influence:
                    eligible: true
                    explanation: Eligible to shape response structure under the active Memory posture.
                  createdAt: '2026-09-01T15:00:00Z'
                  updatedAt: '2026-09-01T15:00:00Z'
                  capabilities:
                    edit: true
                    correct: true
                    makeImportant: true
                    pause: true
                    restore: true
                    stop: true
                    useAgain: true
                    delete: true
                    versions: true
                    proof: true
                freshness:
                  schemaVersion: memory_projection_freshness.v1
                  state: complete
                  readAvailable: true
                  mutationAvailable: true
                  observedAt: '2026-09-01T15:00:00Z'
                  explanation: Eligible to shape response structure under the active Memory posture.
                  reasonCodes:
                  - REPRESENTATIVE_REASON
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - memory.read
      parameters:
      - name: memoryRef
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Opaque Memory item reference.
      x-indwel-semantics:
        authority: authenticated personal Memory authority
        evidenceBoundary: Memory informs cognition under governance; it is not sovereign evidence
        delegation: user-delegated-only
    delete:
      operationId: deleteMemoryItem
      tags:
      - Memory
      summary: Delete a Memory item
      description: 'Deletes the selected personal Memory item under authenticated subject authority. An optional expected
        version may be supplied for concurrency.


        **Authority:** authenticated personal Memory authority.


        **Contract:** scope `memory.write` · idempotency required · user delegated only.'
      responses:
        '200':
          description: Deletion result.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemoryDeleteResponse'
              example:
                ok: true
                memoryRef: mem_response_style
                deleted: true
                deletedAt: '2026-09-01T15:00:00Z'
                idempotentReplay: true
                freshness:
                  schemaVersion: memory_projection_freshness.v1
                  state: complete
                  readAvailable: true
                  mutationAvailable: true
                  observedAt: '2026-09-01T15:00:00Z'
                  explanation: Eligible to shape response structure under the active Memory posture.
                  reasonCodes:
                  - REPRESENTATIVE_REASON
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - memory.write
      parameters:
      - name: memoryRef
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Opaque Memory item reference.
      - $ref: '#/components/parameters/MemoryIdempotencyKey'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              properties:
                expectedVersion:
                  type: integer
                  minimum: 1
            example: {}
      x-indwel-semantics:
        authority: authenticated personal Memory authority
        evidenceBoundary: Memory informs cognition under governance; it is not sovereign evidence
        delegation: user-delegated-only
        idempotency: required
  /v2/account/memory/items/{memoryRef}/versions:
    get:
      operationId: listMemoryItemVersions
      tags:
      - Memory
      summary: List Memory versions
      description: 'Returns the governed version history for one authorized Memory item.


        **Authority:** authenticated personal Memory authority.


        **Contract:** scope `memory.read` · user delegated only.'
      responses:
        '200':
          description: Memory version history.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemoryVersionsResponse'
              example:
                ok: true
                memoryRef: mem_response_style
                versions:
                - version: 1
                  createdAt: '2026-09-01T15:00:00Z'
                  mutationEventId: mem_event_03
                  item:
                    schemaVersion: personal_memory_view.v2
                    memoryRef: mem_response_style
                    version: 1
                    title: Response style
                    content: Prefer concise release briefs that lead with the decision, evidence, and remaining risk.
                    category: preference
                    state: active
                    importance: ordinary
                    authority: user_authored
                    origin:
                      kind: conversation
                      label: Account memory
                    scope:
                      mode: account
                      label: Account memory
                    influence:
                      eligible: true
                      explanation: Eligible to shape response structure under the active Memory posture.
                    createdAt: '2026-09-01T15:00:00Z'
                    updatedAt: '2026-09-01T15:00:00Z'
                    capabilities:
                      edit: true
                      correct: true
                      makeImportant: true
                      pause: true
                      restore: true
                      stop: true
                      useAgain: true
                      delete: true
                      versions: true
                      proof: true
                page:
                  hasMore: true
                freshness:
                  schemaVersion: memory_projection_freshness.v1
                  state: complete
                  readAvailable: true
                  mutationAvailable: true
                  observedAt: '2026-09-01T15:00:00Z'
                  explanation: Eligible to shape response structure under the active Memory posture.
                  reasonCodes:
                  - REPRESENTATIVE_REASON
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - memory.read
      parameters:
      - name: memoryRef
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Opaque Memory item reference.
      - name: cursor
        in: query
        required: false
        schema:
          type: string
          minLength: 1
      - name: limit
        in: query
        required: false
        schema:
          type: integer
          minimum: 1
      x-indwel-semantics:
        authority: authenticated personal Memory authority
        evidenceBoundary: Memory informs cognition under governance; it is not sovereign evidence
        delegation: user-delegated-only
  /v2/account/memory/items/{memoryRef}/links:
    post:
      operationId: createMemoryItemLink
      tags:
      - Memory
      summary: Create an opaque Memory link
      description: 'Creates an opaque link token for an authorized non-proposal Memory item. The token resolves only under
        the same authenticated personal Memory authority.


        **Authority:** authenticated personal Memory authority.


        **Contract:** scope `memory.write` · user delegated only.'
      responses:
        '201':
          description: Opaque Memory link token.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemoryLinkCreateResponse'
              example:
                ok: true
                linkToken: memlink_response_style
                createdAt: '2026-09-01T15:00:00Z'
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - memory.write
      parameters:
      - name: memoryRef
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Opaque Memory item reference.
      x-indwel-semantics:
        authority: authenticated personal Memory authority
        evidenceBoundary: Memory informs cognition under governance; it is not sovereign evidence
        delegation: user-delegated-only
  /v2/account/memory/links/{linkToken}:
    get:
      operationId: resolveMemoryItemLink
      tags:
      - Memory
      summary: Resolve an opaque Memory link
      description: 'Resolves an opaque Memory link within the authenticated subject''s personal Memory authority.


        **Authority:** authenticated personal Memory authority.


        **Contract:** scope `memory.read` · user delegated only.'
      responses:
        '200':
          description: Authorized Memory item.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemoryItemResponse'
              example:
                ok: true
                item:
                  schemaVersion: personal_memory_view.v2
                  memoryRef: mem_response_style
                  version: 1
                  title: Response style
                  content: Prefer concise release briefs that lead with the decision, evidence, and remaining risk.
                  category: preference
                  state: active
                  importance: ordinary
                  authority: user_authored
                  origin:
                    kind: conversation
                    label: Account memory
                  scope:
                    mode: account
                    label: Account memory
                  influence:
                    eligible: true
                    explanation: Eligible to shape response structure under the active Memory posture.
                  createdAt: '2026-09-01T15:00:00Z'
                  updatedAt: '2026-09-01T15:00:00Z'
                  capabilities:
                    edit: true
                    correct: true
                    makeImportant: true
                    pause: true
                    restore: true
                    stop: true
                    useAgain: true
                    delete: true
                    versions: true
                    proof: true
                freshness:
                  schemaVersion: memory_projection_freshness.v1
                  state: complete
                  readAvailable: true
                  mutationAvailable: true
                  observedAt: '2026-09-01T15:00:00Z'
                  explanation: Eligible to shape response structure under the active Memory posture.
                  reasonCodes:
                  - REPRESENTATIVE_REASON
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - memory.read
      parameters:
      - name: linkToken
        in: path
        required: true
        schema:
          type: string
          minLength: 1
      x-indwel-semantics:
        authority: authenticated personal Memory authority
        evidenceBoundary: Memory informs cognition under governance; it is not sovereign evidence
        delegation: user-delegated-only
  /v2/account/memory/items/{memoryRef}/keep:
    post:
      operationId: memoryKeep
      tags:
      - Memory
      summary: Keep a Memory item
      description: 'Keeps the selected item in active personal Memory under versioned lifecycle authority.


        **Authority:** authenticated personal Memory authority.


        **Contract:** scope `memory.write` · idempotency required · user delegated only.'
      responses:
        '200':
          description: Updated Memory item and mutation receipt.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemoryMutationResponse'
              example:
                ok: true
                item:
                  schemaVersion: personal_memory_view.v2
                  memoryRef: mem_response_style
                  version: 1
                  title: Response style
                  content: Prefer concise release briefs that lead with the decision, evidence, and remaining risk.
                  category: preference
                  state: active
                  importance: ordinary
                  authority: user_authored
                  origin:
                    kind: conversation
                    label: Account memory
                  scope:
                    mode: account
                    label: Account memory
                  influence:
                    eligible: true
                    explanation: Eligible to shape response structure under the active Memory posture.
                  createdAt: '2026-09-01T15:00:00Z'
                  updatedAt: '2026-09-01T15:00:00Z'
                  capabilities:
                    edit: true
                    correct: true
                    makeImportant: true
                    pause: true
                    restore: true
                    stop: true
                    useAgain: true
                    delete: true
                    versions: true
                    proof: true
                receipt:
                  schemaVersion: memory_lifecycle_mutation.v2
                  action: keep
                  memoryRef: mem_response_style
                  expectedVersion: 1
                  resultingVersion: 1
                  stateBefore: active
                  stateAfter: active
                  importanceBefore: ordinary
                  importanceAfter: ordinary
                  occurredAt: '2026-09-01T15:00:00Z'
                  idempotentReplay: true
                freshness:
                  schemaVersion: memory_projection_freshness.v1
                  state: complete
                  readAvailable: true
                  mutationAvailable: true
                  observedAt: '2026-09-01T15:00:00Z'
                  explanation: Eligible to shape response structure under the active Memory posture.
                  reasonCodes:
                  - REPRESENTATIVE_REASON
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - memory.write
      parameters:
      - name: memoryRef
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Opaque Memory item reference.
      - $ref: '#/components/parameters/MemoryIdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MemoryVersionedActionRequest'
            example:
              expectedVersion: 1
      x-indwel-semantics:
        authority: authenticated personal Memory authority
        evidenceBoundary: Memory informs cognition under governance; it is not sovereign evidence
        delegation: user-delegated-only
        idempotency: required
        receipt: mutation
  /v2/account/memory/items/{memoryRef}/pause:
    post:
      operationId: memoryPause
      tags:
      - Memory
      summary: Pause a Memory item
      description: 'Pauses use of the selected item without deleting its governed history.


        **Authority:** authenticated personal Memory authority.


        **Contract:** scope `memory.write` · idempotency required · user delegated only.'
      responses:
        '200':
          description: Updated Memory item and mutation receipt.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemoryMutationResponse'
              example:
                ok: true
                item:
                  schemaVersion: personal_memory_view.v2
                  memoryRef: mem_response_style
                  version: 1
                  title: Response style
                  content: Prefer concise release briefs that lead with the decision, evidence, and remaining risk.
                  category: preference
                  state: active
                  importance: ordinary
                  authority: user_authored
                  origin:
                    kind: conversation
                    label: Account memory
                  scope:
                    mode: account
                    label: Account memory
                  influence:
                    eligible: true
                    explanation: Eligible to shape response structure under the active Memory posture.
                  createdAt: '2026-09-01T15:00:00Z'
                  updatedAt: '2026-09-01T15:00:00Z'
                  capabilities:
                    edit: true
                    correct: true
                    makeImportant: true
                    pause: true
                    restore: true
                    stop: true
                    useAgain: true
                    delete: true
                    versions: true
                    proof: true
                receipt:
                  schemaVersion: memory_lifecycle_mutation.v2
                  action: keep
                  memoryRef: mem_response_style
                  expectedVersion: 1
                  resultingVersion: 1
                  stateBefore: active
                  stateAfter: active
                  importanceBefore: ordinary
                  importanceAfter: ordinary
                  occurredAt: '2026-09-01T15:00:00Z'
                  idempotentReplay: true
                freshness:
                  schemaVersion: memory_projection_freshness.v1
                  state: complete
                  readAvailable: true
                  mutationAvailable: true
                  observedAt: '2026-09-01T15:00:00Z'
                  explanation: Eligible to shape response structure under the active Memory posture.
                  reasonCodes:
                  - REPRESENTATIVE_REASON
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - memory.write
      parameters:
      - name: memoryRef
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Opaque Memory item reference.
      - $ref: '#/components/parameters/MemoryIdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MemoryVersionedActionRequest'
            example:
              expectedVersion: 1
      x-indwel-semantics:
        authority: authenticated personal Memory authority
        evidenceBoundary: Memory informs cognition under governance; it is not sovereign evidence
        delegation: user-delegated-only
        idempotency: required
        receipt: mutation
  /v2/account/memory/items/{memoryRef}/restore:
    post:
      operationId: memoryRestore
      tags:
      - Memory
      summary: Restore a Memory item
      description: 'Restores an eligible paused or inactive Memory item under versioned lifecycle authority.


        **Authority:** authenticated personal Memory authority.


        **Contract:** scope `memory.write` · idempotency required · user delegated only.'
      responses:
        '200':
          description: Updated Memory item and mutation receipt.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemoryMutationResponse'
              example:
                ok: true
                item:
                  schemaVersion: personal_memory_view.v2
                  memoryRef: mem_response_style
                  version: 1
                  title: Response style
                  content: Prefer concise release briefs that lead with the decision, evidence, and remaining risk.
                  category: preference
                  state: active
                  importance: ordinary
                  authority: user_authored
                  origin:
                    kind: conversation
                    label: Account memory
                  scope:
                    mode: account
                    label: Account memory
                  influence:
                    eligible: true
                    explanation: Eligible to shape response structure under the active Memory posture.
                  createdAt: '2026-09-01T15:00:00Z'
                  updatedAt: '2026-09-01T15:00:00Z'
                  capabilities:
                    edit: true
                    correct: true
                    makeImportant: true
                    pause: true
                    restore: true
                    stop: true
                    useAgain: true
                    delete: true
                    versions: true
                    proof: true
                receipt:
                  schemaVersion: memory_lifecycle_mutation.v2
                  action: keep
                  memoryRef: mem_response_style
                  expectedVersion: 1
                  resultingVersion: 1
                  stateBefore: active
                  stateAfter: active
                  importanceBefore: ordinary
                  importanceAfter: ordinary
                  occurredAt: '2026-09-01T15:00:00Z'
                  idempotentReplay: true
                freshness:
                  schemaVersion: memory_projection_freshness.v1
                  state: complete
                  readAvailable: true
                  mutationAvailable: true
                  observedAt: '2026-09-01T15:00:00Z'
                  explanation: Eligible to shape response structure under the active Memory posture.
                  reasonCodes:
                  - REPRESENTATIVE_REASON
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - memory.write
      parameters:
      - name: memoryRef
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Opaque Memory item reference.
      - $ref: '#/components/parameters/MemoryIdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MemoryVersionedActionRequest'
            example:
              expectedVersion: 1
      x-indwel-semantics:
        authority: authenticated personal Memory authority
        evidenceBoundary: Memory informs cognition under governance; it is not sovereign evidence
        delegation: user-delegated-only
        idempotency: required
        receipt: mutation
  /v2/account/memory/items/{memoryRef}/stop:
    post:
      operationId: memoryStop
      tags:
      - Memory
      summary: Stop using a Memory item
      description: 'Stops ordinary use of the selected item while preserving governed history.


        **Authority:** authenticated personal Memory authority.


        **Contract:** scope `memory.write` · idempotency required · user delegated only.'
      responses:
        '200':
          description: Updated Memory item and mutation receipt.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemoryMutationResponse'
              example:
                ok: true
                item:
                  schemaVersion: personal_memory_view.v2
                  memoryRef: mem_response_style
                  version: 1
                  title: Response style
                  content: Prefer concise release briefs that lead with the decision, evidence, and remaining risk.
                  category: preference
                  state: active
                  importance: ordinary
                  authority: user_authored
                  origin:
                    kind: conversation
                    label: Account memory
                  scope:
                    mode: account
                    label: Account memory
                  influence:
                    eligible: true
                    explanation: Eligible to shape response structure under the active Memory posture.
                  createdAt: '2026-09-01T15:00:00Z'
                  updatedAt: '2026-09-01T15:00:00Z'
                  capabilities:
                    edit: true
                    correct: true
                    makeImportant: true
                    pause: true
                    restore: true
                    stop: true
                    useAgain: true
                    delete: true
                    versions: true
                    proof: true
                receipt:
                  schemaVersion: memory_lifecycle_mutation.v2
                  action: keep
                  memoryRef: mem_response_style
                  expectedVersion: 1
                  resultingVersion: 1
                  stateBefore: active
                  stateAfter: active
                  importanceBefore: ordinary
                  importanceAfter: ordinary
                  occurredAt: '2026-09-01T15:00:00Z'
                  idempotentReplay: true
                freshness:
                  schemaVersion: memory_projection_freshness.v1
                  state: complete
                  readAvailable: true
                  mutationAvailable: true
                  observedAt: '2026-09-01T15:00:00Z'
                  explanation: Eligible to shape response structure under the active Memory posture.
                  reasonCodes:
                  - REPRESENTATIVE_REASON
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - memory.write
      parameters:
      - name: memoryRef
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Opaque Memory item reference.
      - $ref: '#/components/parameters/MemoryIdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MemoryVersionedActionRequest'
            example:
              expectedVersion: 1
      x-indwel-semantics:
        authority: authenticated personal Memory authority
        evidenceBoundary: Memory informs cognition under governance; it is not sovereign evidence
        delegation: user-delegated-only
        idempotency: required
        receipt: mutation
  /v2/account/memory/items/{memoryRef}/use-again:
    post:
      operationId: memoryUseAgain
      tags:
      - Memory
      summary: Use a Memory item again
      description: 'Returns an eligible stopped Memory item to ordinary governed use.


        **Authority:** authenticated personal Memory authority.


        **Contract:** scope `memory.write` · idempotency required · user delegated only.'
      responses:
        '200':
          description: Updated Memory item and mutation receipt.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemoryMutationResponse'
              example:
                ok: true
                item:
                  schemaVersion: personal_memory_view.v2
                  memoryRef: mem_response_style
                  version: 1
                  title: Response style
                  content: Prefer concise release briefs that lead with the decision, evidence, and remaining risk.
                  category: preference
                  state: active
                  importance: ordinary
                  authority: user_authored
                  origin:
                    kind: conversation
                    label: Account memory
                  scope:
                    mode: account
                    label: Account memory
                  influence:
                    eligible: true
                    explanation: Eligible to shape response structure under the active Memory posture.
                  createdAt: '2026-09-01T15:00:00Z'
                  updatedAt: '2026-09-01T15:00:00Z'
                  capabilities:
                    edit: true
                    correct: true
                    makeImportant: true
                    pause: true
                    restore: true
                    stop: true
                    useAgain: true
                    delete: true
                    versions: true
                    proof: true
                receipt:
                  schemaVersion: memory_lifecycle_mutation.v2
                  action: keep
                  memoryRef: mem_response_style
                  expectedVersion: 1
                  resultingVersion: 1
                  stateBefore: active
                  stateAfter: active
                  importanceBefore: ordinary
                  importanceAfter: ordinary
                  occurredAt: '2026-09-01T15:00:00Z'
                  idempotentReplay: true
                freshness:
                  schemaVersion: memory_projection_freshness.v1
                  state: complete
                  readAvailable: true
                  mutationAvailable: true
                  observedAt: '2026-09-01T15:00:00Z'
                  explanation: Eligible to shape response structure under the active Memory posture.
                  reasonCodes:
                  - REPRESENTATIVE_REASON
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - memory.write
      parameters:
      - name: memoryRef
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Opaque Memory item reference.
      - $ref: '#/components/parameters/MemoryIdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MemoryVersionedActionRequest'
            example:
              expectedVersion: 1
      x-indwel-semantics:
        authority: authenticated personal Memory authority
        evidenceBoundary: Memory informs cognition under governance; it is not sovereign evidence
        delegation: user-delegated-only
        idempotency: required
        receipt: mutation
  /v2/account/memory/items/{memoryRef}/edit:
    post:
      operationId: memoryEdit
      tags:
      - Memory
      summary: Edit a Memory item
      description: 'Edits content fields on an authorized Memory item under optimistic version control.


        **Authority:** authenticated personal Memory authority.


        **Contract:** scope `memory.write` · idempotency required · user delegated only.'
      responses:
        '200':
          description: Updated Memory item and mutation receipt.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemoryMutationResponse'
              example:
                ok: true
                item:
                  schemaVersion: personal_memory_view.v2
                  memoryRef: mem_response_style
                  version: 1
                  title: Response style
                  content: Prefer concise release briefs that lead with the decision, evidence, and remaining risk.
                  category: preference
                  state: active
                  importance: ordinary
                  authority: user_authored
                  origin:
                    kind: conversation
                    label: Account memory
                  scope:
                    mode: account
                    label: Account memory
                  influence:
                    eligible: true
                    explanation: Eligible to shape response structure under the active Memory posture.
                  createdAt: '2026-09-01T15:00:00Z'
                  updatedAt: '2026-09-01T15:00:00Z'
                  capabilities:
                    edit: true
                    correct: true
                    makeImportant: true
                    pause: true
                    restore: true
                    stop: true
                    useAgain: true
                    delete: true
                    versions: true
                    proof: true
                receipt:
                  schemaVersion: memory_lifecycle_mutation.v2
                  action: keep
                  memoryRef: mem_response_style
                  expectedVersion: 1
                  resultingVersion: 1
                  stateBefore: active
                  stateAfter: active
                  importanceBefore: ordinary
                  importanceAfter: ordinary
                  occurredAt: '2026-09-01T15:00:00Z'
                  idempotentReplay: true
                freshness:
                  schemaVersion: memory_projection_freshness.v1
                  state: complete
                  readAvailable: true
                  mutationAvailable: true
                  observedAt: '2026-09-01T15:00:00Z'
                  explanation: Eligible to shape response structure under the active Memory posture.
                  reasonCodes:
                  - REPRESENTATIVE_REASON
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - memory.write
      parameters:
      - name: memoryRef
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Opaque Memory item reference.
      - $ref: '#/components/parameters/MemoryIdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MemoryEditRequest'
            example:
              expectedVersion: 1
      x-indwel-semantics:
        authority: authenticated personal Memory authority
        evidenceBoundary: Memory informs cognition under governance; it is not sovereign evidence
        delegation: user-delegated-only
        idempotency: required
        receipt: mutation
  /v2/account/memory/items/{memoryRef}/correct:
    post:
      operationId: memoryCorrect
      tags:
      - Memory
      summary: Correct a Memory item
      description: 'Creates a corrected replacement while preserving the supersession relationship to the prior item.


        **Authority:** authenticated personal Memory authority.


        **Contract:** scope `memory.write` · idempotency required · user delegated only.'
      responses:
        '200':
          description: Updated Memory item and mutation receipt.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemoryCorrectionResponse'
              example:
                ok: true
                item:
                  schemaVersion: personal_memory_view.v2
                  memoryRef: mem_response_style
                  version: 1
                  title: Response style
                  content: Prefer concise release briefs that lead with the decision, evidence, and remaining risk.
                  category: preference
                  state: active
                  importance: ordinary
                  authority: user_authored
                  origin:
                    kind: conversation
                    label: Account memory
                  scope:
                    mode: account
                    label: Account memory
                  influence:
                    eligible: true
                    explanation: Eligible to shape response structure under the active Memory posture.
                  createdAt: '2026-09-01T15:00:00Z'
                  updatedAt: '2026-09-01T15:00:00Z'
                  capabilities:
                    edit: true
                    correct: true
                    makeImportant: true
                    pause: true
                    restore: true
                    stop: true
                    useAgain: true
                    delete: true
                    versions: true
                    proof: true
                replacedItem:
                  schemaVersion: personal_memory_view.v2
                  memoryRef: mem_response_style
                  version: 1
                  title: Response style
                  content: Prefer concise release briefs that lead with the decision, evidence, and remaining risk.
                  category: preference
                  state: active
                  importance: ordinary
                  authority: user_authored
                  origin:
                    kind: conversation
                    label: Account memory
                  scope:
                    mode: account
                    label: Account memory
                  influence:
                    eligible: true
                    explanation: Eligible to shape response structure under the active Memory posture.
                  createdAt: '2026-09-01T15:00:00Z'
                  updatedAt: '2026-09-01T15:00:00Z'
                  capabilities:
                    edit: true
                    correct: true
                    makeImportant: true
                    pause: true
                    restore: true
                    stop: true
                    useAgain: true
                    delete: true
                    versions: true
                    proof: true
                receipt:
                  schemaVersion: memory_correction_receipt.v2
                  correctedMemoryRef: correctedmemoryref_01
                  replacementMemoryRef: replacementmemoryref_01
                  expectedVersion: 1
                  resultingSourceVersion: 1
                  replacementVersion: 1
                  occurredAt: '2026-09-01T15:00:00Z'
                  idempotentReplay: true
                freshness:
                  schemaVersion: memory_projection_freshness.v1
                  state: complete
                  readAvailable: true
                  mutationAvailable: true
                  observedAt: '2026-09-01T15:00:00Z'
                  explanation: Eligible to shape response structure under the active Memory posture.
                  reasonCodes:
                  - REPRESENTATIVE_REASON
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - memory.write
      parameters:
      - name: memoryRef
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Opaque Memory item reference.
      - $ref: '#/components/parameters/MemoryIdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MemoryEditRequest'
            example:
              expectedVersion: 1
      x-indwel-semantics:
        authority: authenticated personal Memory authority
        evidenceBoundary: Memory informs cognition under governance; it is not sovereign evidence
        delegation: user-delegated-only
        idempotency: required
        receipt: mutation
  /v2/account/memory/items/{memoryRef}/importance:
    post:
      operationId: memoryImportance
      tags:
      - Memory
      summary: Change Memory importance
      description: 'Changes the item''s importance posture under versioned personal Memory authority.


        **Authority:** authenticated personal Memory authority.


        **Contract:** scope `memory.write` · idempotency required · user delegated only.'
      responses:
        '200':
          description: Updated Memory item and mutation receipt.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemoryMutationResponse'
              example:
                ok: true
                item:
                  schemaVersion: personal_memory_view.v2
                  memoryRef: mem_response_style
                  version: 1
                  title: Response style
                  content: Prefer concise release briefs that lead with the decision, evidence, and remaining risk.
                  category: preference
                  state: active
                  importance: ordinary
                  authority: user_authored
                  origin:
                    kind: conversation
                    label: Account memory
                  scope:
                    mode: account
                    label: Account memory
                  influence:
                    eligible: true
                    explanation: Eligible to shape response structure under the active Memory posture.
                  createdAt: '2026-09-01T15:00:00Z'
                  updatedAt: '2026-09-01T15:00:00Z'
                  capabilities:
                    edit: true
                    correct: true
                    makeImportant: true
                    pause: true
                    restore: true
                    stop: true
                    useAgain: true
                    delete: true
                    versions: true
                    proof: true
                receipt:
                  schemaVersion: memory_lifecycle_mutation.v2
                  action: keep
                  memoryRef: mem_response_style
                  expectedVersion: 1
                  resultingVersion: 1
                  stateBefore: active
                  stateAfter: active
                  importanceBefore: ordinary
                  importanceAfter: ordinary
                  occurredAt: '2026-09-01T15:00:00Z'
                  idempotentReplay: true
                freshness:
                  schemaVersion: memory_projection_freshness.v1
                  state: complete
                  readAvailable: true
                  mutationAvailable: true
                  observedAt: '2026-09-01T15:00:00Z'
                  explanation: Eligible to shape response structure under the active Memory posture.
                  reasonCodes:
                  - REPRESENTATIVE_REASON
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - memory.write
      parameters:
      - name: memoryRef
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Opaque Memory item reference.
      - $ref: '#/components/parameters/MemoryIdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MemoryImportanceRequest'
            example:
              expectedVersion: 1
              importance: ordinary
      x-indwel-semantics:
        authority: authenticated personal Memory authority
        evidenceBoundary: Memory informs cognition under governance; it is not sovereign evidence
        delegation: user-delegated-only
        idempotency: required
        receipt: mutation
  /v2/account/memory/proposals:
    get:
      operationId: listMemoryProposals
      tags:
      - Memory
      summary: List Memory proposals
      description: 'Returns inert Memory proposals awaiting the authenticated subject''s review. Proposals do not become ordinary
        Memory until resolved through proposal authority.


        **Authority:** authenticated personal Memory authority.


        **Contract:** scope `memory.read` · user delegated only.'
      responses:
        '200':
          description: Pending Memory proposals.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemoryProposalListResponse'
              example:
                ok: true
                proposals:
                - schemaVersion: memory_proposal_view.v2
                  proposalRef: mprop_release_briefs
                  version: 1
                  title: Response style
                  content: Prefer concise release briefs that lead with the decision, evidence, and remaining risk.
                  category: preference
                  suggestedImportance: ordinary
                  inert: true
                  sourceType: conversation
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                  origin:
                    label: Account memory
                    sourceType: conversation
                    authorisedRunBound: true
                    authorisedSessionBound: true
                  scope:
                    kind: account
                    label: Account memory
                  createdAt: '2026-09-01T15:00:00Z'
                  updatedAt: '2026-09-01T15:00:00Z'
                page:
                  hasMore: true
                query: {}
                freshness:
                  schemaVersion: memory_projection_freshness.v1
                  state: complete
                  readAvailable: true
                  mutationAvailable: true
                  observedAt: '2026-09-01T15:00:00Z'
                  explanation: Eligible to shape response structure under the active Memory posture.
                  reasonCodes:
                  - REPRESENTATIVE_REASON
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - memory.read
      parameters:
      - name: q
        in: query
        required: false
        schema:
          type: string
          minLength: 1
      - name: cursor
        in: query
        required: false
        schema:
          type: string
          minLength: 1
      - name: limit
        in: query
        required: false
        schema:
          type: integer
          minimum: 1
      x-indwel-semantics:
        authority: authenticated personal Memory authority
        evidenceBoundary: Memory informs cognition under governance; it is not sovereign evidence
        delegation: user-delegated-only
  /v2/account/memory/proposals/batch-dismiss:
    post:
      operationId: dismissMemoryProposals
      tags:
      - Memory
      summary: Dismiss Memory proposals
      description: 'Dismisses between one and fifty proposals atomically under personal Memory authority.


        **Authority:** authenticated personal Memory authority.


        **Contract:** scope `memory.write` · idempotency required · user delegated only.'
      responses:
        '200':
          description: Dismissal result and receipt.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemoryProposalBatchDismissalResponse'
              example:
                ok: true
                dismissed:
                - proposalRef: mprop_release_briefs
                  version: 1
                  state: dismissed
                receipt:
                  schemaVersion: memory_proposal_batch_dismissal_receipt.v2
                  authority: personal_memory_proposal_batch_resolution
                  action: dismiss
                  proposalRefs:
                  - mprop_release_briefs
                  count: 1
                  consequence: no_active_memory_created
                  occurredAt: '2026-09-01T15:00:00Z'
                  idempotentReplay: true
                  nonClaim: This receipt records the selected proposal dismissals only; it does not settle wider Work.
                freshness:
                  schemaVersion: memory_projection_freshness.v1
                  state: complete
                  readAvailable: true
                  mutationAvailable: true
                  observedAt: '2026-09-01T15:00:00Z'
                  explanation: Eligible to shape response structure under the active Memory posture.
                  reasonCodes:
                  - REPRESENTATIVE_REASON
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - memory.write
      parameters:
      - $ref: '#/components/parameters/MemoryIdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              required:
              - proposals
              properties:
                proposals:
                  type: array
                  minItems: 1
                  maxItems: 50
                  items:
                    type: object
                    additionalProperties: false
                    required:
                    - proposalRef
                    - expectedVersion
                    properties:
                      proposalRef:
                        type: string
                      expectedVersion:
                        type: integer
                        minimum: 1
            example:
              proposals:
              - proposalRef: mprop_release_briefs
                expectedVersion: 1
      x-indwel-semantics:
        authority: authenticated personal Memory authority
        evidenceBoundary: Memory informs cognition under governance; it is not sovereign evidence
        delegation: user-delegated-only
        idempotency: required
        receipt: proposal-dismissal
  /v2/account/memory/proposals/{proposalRef}/resolve:
    post:
      operationId: resolveMemoryProposal
      tags:
      - Memory
      summary: Resolve a Memory proposal
      description: 'Approves, edits-and-approves, or dismisses an inert proposal. Approval produces an ordinary governed Memory
        item; it does not create evidence authority.


        **Authority:** authenticated personal Memory authority.


        **Contract:** scope `memory.write` · idempotency required · user delegated only.'
      responses:
        '200':
          description: Proposal resolution and receipt.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemoryProposalResolutionResponse'
              example:
                ok: true
                resolution:
                  schemaVersion: memory_proposal_resolution.v2
                  action: approve
                  proposalRef: mprop_release_briefs
                  proposalVersion: 1
                  resolvedState: active
                  idempotentReplay: true
                receipt:
                  schemaVersion: memory_proposal_resolution_receipt.v2
                  authority: personal_memory_proposal_resolution
                  action: approve
                  proposalRef: mprop_release_briefs
                  expectedVersion: 1
                  proposalResultingVersion: 1
                  proposalStateBefore: awaiting_approval
                  proposalStateAfter: resolved
                  consequence: active_memory_created
                  occurredAt: '2026-09-01T15:00:00Z'
                  idempotentReplay: true
                  nonClaim: This receipt records the Memory consequence only; it does not settle wider Work.
                freshness:
                  schemaVersion: memory_projection_freshness.v1
                  state: complete
                  readAvailable: true
                  mutationAvailable: true
                  observedAt: '2026-09-01T15:00:00Z'
                  explanation: Eligible to shape response structure under the active Memory posture.
                  reasonCodes:
                  - REPRESENTATIVE_REASON
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - memory.write
      parameters:
      - name: proposalRef
        in: path
        required: true
        schema:
          type: string
          minLength: 1
      - $ref: '#/components/parameters/MemoryIdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MemoryProposalResolutionRequest'
            example:
              expectedVersion: 1
              action: approve
      x-indwel-semantics:
        authority: authenticated personal Memory authority
        evidenceBoundary: Memory informs cognition under governance; it is not sovereign evidence
        delegation: user-delegated-only
        idempotency: required
        receipt: proposal-resolution
  /v2/account/memory/preferences:
    get:
      operationId: getMemoryPreferences
      tags:
      - Memory
      summary: Get Memory preferences
      description: 'Returns the authenticated subject''s Memory formation and display preferences.


        **Authority:** authenticated personal Memory authority.


        **Contract:** scope `memory.read` · user delegated only.'
      responses:
        '200':
          description: Memory preferences.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemoryPreferencesResponse'
              example:
                ok: true
                preferences:
                  useSavedMemory: true
                  formationMode: explicit_only
                  showSaveNotices: true
                  showAnswerImpact: true
                  version: 1
                  createdAt: '2026-09-01T15:00:00Z'
                  updatedAt: '2026-09-01T15:00:00Z'
                freshness:
                  schemaVersion: memory_projection_freshness.v1
                  state: complete
                  readAvailable: true
                  mutationAvailable: true
                  observedAt: '2026-09-01T15:00:00Z'
                  explanation: Eligible to shape response structure under the active Memory posture.
                  reasonCodes:
                  - REPRESENTATIVE_REASON
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - memory.read
      x-indwel-semantics:
        authority: authenticated personal Memory authority
        evidenceBoundary: Memory informs cognition under governance; it is not sovereign evidence
        delegation: user-delegated-only
    put:
      operationId: updateMemoryPreferences
      tags:
      - Memory
      summary: Update Memory preferences
      description: 'Updates Memory preferences under optimistic version control.


        **Authority:** authenticated personal Memory authority.


        **Contract:** scope `memory.write` · idempotency required · user delegated only.'
      responses:
        '200':
          description: Updated Memory preferences.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemoryPreferencesResponse'
              example:
                ok: true
                preferences:
                  useSavedMemory: true
                  formationMode: explicit_only
                  showSaveNotices: true
                  showAnswerImpact: true
                  version: 1
                  createdAt: '2026-09-01T15:00:00Z'
                  updatedAt: '2026-09-01T15:00:00Z'
                freshness:
                  schemaVersion: memory_projection_freshness.v1
                  state: complete
                  readAvailable: true
                  mutationAvailable: true
                  observedAt: '2026-09-01T15:00:00Z'
                  explanation: Eligible to shape response structure under the active Memory posture.
                  reasonCodes:
                  - REPRESENTATIVE_REASON
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - memory.write
      parameters:
      - $ref: '#/components/parameters/MemoryIdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MemoryPreferencesUpdateRequest'
            example:
              expectedVersion: 1
      x-indwel-semantics:
        authority: authenticated personal Memory authority
        evidenceBoundary: Memory informs cognition under governance; it is not sovereign evidence
        delegation: user-delegated-only
        idempotency: required
  /v2/account/memory/exports:
    post:
      operationId: exportMemory
      tags:
      - Memory
      summary: Export personal Memory
      description: 'Returns either a safe current inventory or a complete personal archive. This is a read projection expressed
        as POST because the export variant and query are supplied as a body.


        **Authority:** authenticated personal Memory authority.


        **Contract:** scope `memory.read` · user delegated only.'
      responses:
        '200':
          description: Memory export packet.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemoryExportResponse'
              example:
                ok: true
                schemaVersion: memory_export_packet.v2
                variant: safe_current_inventory
                exportedAt: '2026-09-01T15:00:00Z'
                count: 1
                query: {}
                items:
                - schemaVersion: personal_memory_view.v2
                  memoryRef: mem_response_style
                  version: 1
                  title: Response style
                  content: Prefer concise release briefs that lead with the decision, evidence, and remaining risk.
                  category: preference
                  state: active
                  importance: ordinary
                  authority: user_authored
                  origin:
                    kind: conversation
                    label: Account memory
                  scope:
                    mode: account
                    label: Account memory
                  influence:
                    eligible: true
                    explanation: Eligible to shape response structure under the active Memory posture.
                  createdAt: '2026-09-01T15:00:00Z'
                  updatedAt: '2026-09-01T15:00:00Z'
                  capabilities:
                    edit: true
                    correct: true
                    makeImportant: true
                    pause: true
                    restore: true
                    stop: true
                    useAgain: true
                    delete: true
                    versions: true
                    proof: true
                freshness:
                  schemaVersion: memory_projection_freshness.v1
                  state: complete
                  readAvailable: true
                  mutationAvailable: true
                  observedAt: '2026-09-01T15:00:00Z'
                  explanation: Eligible to shape response structure under the active Memory posture.
                  reasonCodes:
                  - REPRESENTATIVE_REASON
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - memory.read
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MemoryExportRequest'
            example: {}
      x-indwel-semantics:
        authority: authenticated personal Memory authority
        evidenceBoundary: Memory informs cognition under governance; it is not sovereign evidence
        delegation: user-delegated-only
  /v2/account/memory/answer-links/{answerLinkToken}:
    get:
      operationId: resolveMemoryAnswerImpactLink
      tags:
      - Memory
      summary: Resolve an answer-impact link
      description: 'Resolves an opaque link to a terminal Memory answer-impact receipt for the authenticated subject.


        **Authority:** authenticated personal Memory authority.


        **Contract:** scope `memory.read` · user delegated only.'
      responses:
        '200':
          description: Terminal Memory answer-impact receipt.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemoryAnswerImpactResponse'
              example:
                ok: true
                answerRef: answer_vendor_risk_01
                receipt:
                  schemaVersion: 2
                  source: memory_answer_impact_receipt.v2
                  answerRef: answer_vendor_risk_01
                  terminalEffectId: effect_answer_vendor_risk_01
                  terminalOutboxEventId: outbox_answer_vendor_risk_01
                  settlement:
                    state: settled
                    settledAt: '2026-09-01T15:00:00Z'
                  requestedPosture: account_default
                  effectivePosture: account_default
                  outcome: memory_helped
                  helpedShape:
                  - memoryRef: mem_response_style
                  consideredNotUsed:
                  - memoryRef: mem_response_style
                    title: Response style
                    explanation: Eligible to shape response structure under the active Memory posture.
                  heldBack:
                  - label: Account memory
                    reason: REPRESENTATIVE_REASON
                  suggestions:
                  - proposalRef: mprop_release_briefs
                    title: Response style
                    state: awaiting_approval
                  completeness: complete
                  nonClaims:
                  - retrieval_or_admission_alone_does_not_prove_answer_influence
                  - suggestions_are_inert_until_explicit_approval
                freshness:
                  schemaVersion: memory_projection_freshness.v1
                  state: complete
                  readAvailable: true
                  mutationAvailable: true
                  observedAt: '2026-09-01T15:00:00Z'
                  explanation: Eligible to shape response structure under the active Memory posture.
                  reasonCodes:
                  - REPRESENTATIVE_REASON
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - memory.read
      parameters:
      - name: answerLinkToken
        in: path
        required: true
        schema:
          type: string
          minLength: 1
      x-indwel-semantics:
        authority: authenticated personal Memory authority
        evidenceBoundary: Memory informs cognition under governance; it is not sovereign evidence
        delegation: user-delegated-only
  /v2/work/{workRef}/memory-posture:
    get:
      operationId: getWorkMemoryPosture
      tags:
      - Memory
      summary: Get Work Memory posture
      description: 'Returns how authorized personal Memory may participate in the selected durable Work. Work authority and
        personal Memory authority remain distinct.


        **Authority:** authenticated personal Memory authority.


        **Contract:** scope `memory.read` · user delegated only.'
      responses:
        '200':
          description: Work-bound Memory posture.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemoryWorkPostureGetResponse'
              example:
                ok: true
                posture:
                  schemaVersion: 2
                  source: memory_work_posture.v2
                  workRef: work_vendor_risk_review
                  requestedPosture: account_default
                  version: 1
                  createdAt: '2026-09-01T15:00:00Z'
                  updatedAt: '2026-09-01T15:00:00Z'
                persisted: true
                freshness:
                  schemaVersion: memory_projection_freshness.v1
                  state: complete
                  readAvailable: true
                  mutationAvailable: true
                  observedAt: '2026-09-01T15:00:00Z'
                  explanation: Eligible to shape response structure under the active Memory posture.
                  reasonCodes:
                  - REPRESENTATIVE_REASON
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - memory.read
      parameters:
      - name: workRef
        in: path
        required: true
        schema:
          type: string
          minLength: 1
      x-indwel-semantics:
        authority: authenticated personal Memory authority
        evidenceBoundary: Memory informs cognition under governance; it is not sovereign evidence
        delegation: user-delegated-only
    put:
      operationId: updateWorkMemoryPosture
      tags:
      - Memory
      summary: Update Work Memory posture
      description: 'Updates the authenticated subject''s Work-bound Memory posture under optimistic version and idempotency
        authority.


        **Authority:** authenticated personal Memory authority.


        **Contract:** scope `memory.write` · idempotency required · user delegated only.'
      responses:
        '200':
          description: Updated Work-bound Memory posture.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemoryWorkPosturePutResponse'
              example:
                ok: true
                posture:
                  schemaVersion: 2
                  source: memory_work_posture.v2
                  workRef: work_vendor_risk_review
                  requestedPosture: account_default
                  version: 1
                  createdAt: '2026-09-01T15:00:00Z'
                  updatedAt: '2026-09-01T15:00:00Z'
                created: true
                idempotentReplay: true
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - memory.write
      parameters:
      - name: workRef
        in: path
        required: true
        schema:
          type: string
          minLength: 1
      - $ref: '#/components/parameters/MemoryIdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MemoryWorkPostureUpdateRequest'
            example:
              requestedPosture: account_default
              expectedVersion: 1
      x-indwel-semantics:
        authority: authenticated personal Memory authority
        evidenceBoundary: Memory informs cognition under governance; it is not sovereign evidence
        delegation: user-delegated-only
        idempotency: required
  /v2/answers/{answerRef}/memory-impact:
    get:
      operationId: getAnswerMemoryImpact
      tags:
      - Memory
      summary: Get Memory impact for an answer
      description: 'Returns the terminal receipt describing how Memory affected an authorized answer. The receipt reports
        Memory influence without converting Memory into evidence.


        **Authority:** authenticated personal Memory authority.


        **Contract:** scope `memory.read` · user delegated only.'
      responses:
        '200':
          description: Terminal Memory answer-impact receipt.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemoryAnswerImpactResponse'
              example:
                ok: true
                answerRef: answer_vendor_risk_01
                receipt:
                  schemaVersion: 2
                  source: memory_answer_impact_receipt.v2
                  answerRef: answer_vendor_risk_01
                  terminalEffectId: effect_answer_vendor_risk_01
                  terminalOutboxEventId: outbox_answer_vendor_risk_01
                  settlement:
                    state: settled
                    settledAt: '2026-09-01T15:00:00Z'
                  requestedPosture: account_default
                  effectivePosture: account_default
                  outcome: memory_helped
                  helpedShape:
                  - memoryRef: mem_response_style
                  consideredNotUsed:
                  - memoryRef: mem_response_style
                    title: Response style
                    explanation: Eligible to shape response structure under the active Memory posture.
                  heldBack:
                  - label: Account memory
                    reason: REPRESENTATIVE_REASON
                  suggestions:
                  - proposalRef: mprop_release_briefs
                    title: Response style
                    state: awaiting_approval
                  completeness: complete
                  nonClaims:
                  - retrieval_or_admission_alone_does_not_prove_answer_influence
                  - suggestions_are_inert_until_explicit_approval
                freshness:
                  schemaVersion: memory_projection_freshness.v1
                  state: complete
                  readAvailable: true
                  mutationAvailable: true
                  observedAt: '2026-09-01T15:00:00Z'
                  explanation: Eligible to shape response structure under the active Memory posture.
                  reasonCodes:
                  - REPRESENTATIVE_REASON
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - memory.read
      parameters:
      - name: answerRef
        in: path
        required: true
        schema:
          type: string
          minLength: 1
      x-indwel-semantics:
        authority: authenticated personal Memory authority
        evidenceBoundary: Memory informs cognition under governance; it is not sovereign evidence
        delegation: user-delegated-only
  /v2/answers/{answerRef}/memory-impact/links:
    post:
      operationId: createAnswerMemoryImpactLink
      tags:
      - Memory
      summary: Create an answer-impact link
      description: 'Creates an opaque link token for the selected terminal Memory answer-impact receipt.


        **Authority:** authenticated personal Memory authority.


        **Contract:** scope `memory.write` · user delegated only.'
      responses:
        '201':
          description: Opaque answer-impact link token.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemoryLinkCreateResponse'
              example:
                ok: true
                linkToken: memlink_response_style
                createdAt: '2026-09-01T15:00:00Z'
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - memory.write
      parameters:
      - name: answerRef
        in: path
        required: true
        schema:
          type: string
          minLength: 1
      x-indwel-semantics:
        authority: authenticated personal Memory authority
        evidenceBoundary: Memory informs cognition under governance; it is not sovereign evidence
        delegation: user-delegated-only
  /v1/scheduled-work/proposals:
    post:
      operationId: proposeScheduledWork
      tags:
      - Scheduled Work
      summary: Propose Scheduled Work
      description: 'Compiles a natural-language request into a charter proposal for governed work due at a time or condition.
        A proposal is not active Scheduled Work until accepted through creation.


        **Authority:** authenticated principal and backend Scheduled Work charter authority.


        **Contract:** scope `scheduled-work.write` · durable asynchronous.'
      responses:
        '200':
          description: Scheduled Work charter proposal.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScheduledWorkProposalProjection'
              example:
                schemaVersion: indwel.scheduled_work.v1
                proposal:
                  schemaVersion: indwel.scheduled_work.v1
                  proposalId: swp_vendor_risk_watch
                  principalId: user_christian
                  tenantId: org_acme
                  workspaceId: ws_vendor_risk
                  request: Check the approved vendor-risk sources each weekday and report material changes.
                  title: Vendor risk change watch
                  kind: scheduled_observation
                  charter:
                    objective: Detect material changes in the approved vendor-risk evidence set.
                    mission: Review admitted sources on schedule and surface only changes that alter the current risk posture.
                    sourcePolicy:
                      requiredAuthority: workspace membership and admitted source authority
                      sourceSelectionPolicy: named_sources_only
                      namedSourceIds:
                      - source_vendor_status
                      permittedDomains:
                      - vendor.example
                      openWebFallback: deny
                    stoppingRule: Stop after the admitted sources are checked or the run budget is exhausted.
                    ordinaryCognitionPolicy: eligible_when_admitted_and_fresh
                    mutationPolicy: read_only
                  schedule:
                    kind: manual
                  scheduleTimeZoneAssumed: true
                  requiresUserReview: true
                  reviewReasonCodes:
                  - REPRESENTATIVE_REASON
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                  compiledAt: '2026-09-01T15:00:00Z'
                  digest: sha256:example
                reasonCodes:
                - REPRESENTATIVE_REASON
                digest: sha256:example
        '400':
          description: Invalid Scheduled Work request
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              example:
                type: https://api.indwel.ai/problems/scheduled-work-body-object-required
                title: Invalid Scheduled Work request
                status: 400
                detail: The request body must be a JSON object.
                instance: /v1/scheduled-work/proposals
                code: SCHEDULED_WORK_BODY_OBJECT_REQUIRED
                traceId: trace_01J0EXAMPLE
                retryable: false
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - scheduled-work.write
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ScheduledWorkProposalRequest'
            example:
              workspaceId: ws_vendor_risk
              request: Check the approved vendor-risk sources each weekday and report material changes.
      x-indwel-semantics:
        authority: authenticated principal and backend Scheduled Work charter authority
        asynchrony: durable; HTTP timeout does not imply cancellation
  /v1/scheduled-work:
    post:
      operationId: createScheduledWork
      tags:
      - Scheduled Work
      summary: Create Scheduled Work
      description: 'Creates durable Scheduled Work from an accepted charter proposal. The recurring clock is backend infrastructure
        and is not itself an API resource.


        **Authority:** authenticated principal and backend Scheduled Work charter authority.


        **Contract:** scope `scheduled-work.write` · bounded write · durable asynchronous.'
      responses:
        '201':
          description: Scheduled Work detail.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScheduledWorkDetailProjection'
              example:
                schemaVersion: indwel.scheduled_work.v1
                watchpoint:
                  watchpointId: sw_vendor_risk_watch
                  title: Vendor risk change watch
                  kind: scheduled_observation
                  status: active
                  charterVersion: 1
                  charter:
                    objective: Detect material changes in the approved vendor-risk evidence set.
                    mission: Review admitted sources on schedule and surface only changes that alter the current risk posture.
                    sourcePolicy:
                      requiredAuthority: workspace membership and admitted source authority
                      sourceSelectionPolicy: named_sources_only
                      namedSourceIds:
                      - source_vendor_status
                      permittedDomains:
                      - vendor.example
                      openWebFallback: deny
                    stoppingRule: Stop after the admitted sources are checked or the run budget is exhausted.
                    ordinaryCognitionPolicy: eligible_when_admitted_and_fresh
                    mutationPolicy: read_only
                  schedule:
                    kind: manual
                  budget:
                    maxRunsPerWindow: 1
                    windowMinutes: 1
                    maxAcquisitionsPerRun: 1
                    maxWallClockMsPerRun: 1
                    maxCostUnitsPerRun: 1
                  notificationPolicy: {}
                  retentionPolicy: {}
                  createdAt: '2026-09-01T15:00:00Z'
                  updatedAt: '2026-09-01T15:00:00Z'
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                readModel:
                  schemaVersion: indwel.scheduled_work.v1
                  watchpointId: sw_vendor_risk_watch
                  title: Vendor risk change watch
                  status: draft
                  ownership:
                    workspaceId: ws_vendor_risk
                    ownerPrincipalId: user_christian
                    visibility: private
                  charter:
                    mission: Review admitted sources on schedule and surface only changes that alter the current risk posture.
                    requiredAuthority: workspace membership and admitted source authority
                    ordinaryCognitionPolicy: eligible_when_admitted_and_fresh
                    readOnly: true
                  schedule:
                    kind: manual
                  capabilities:
                    canView: true
                    canEdit: true
                    canRunTest: true
                    canPause: true
                    canResume: true
                    canArchive: true
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                lifecycleControls: {}
                runHistory:
                - runId: run_vendor_watch_20260902
                  invocation: manual_test
                  outcome: completed
                  startedAt: '2026-09-01T15:00:00Z'
                  settledAt: '2026-09-01T15:00:00Z'
                  sourceObservationCount: 1
                  artifactCount: 1
                  reportCount: 1
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                observationJournal:
                - observationId: obs_vendor_status_20260902
                  runId: run_vendor_watch_20260902
                  sourceId: source_vendor_status
                  sourceLocator: https://example.invalid/vendor/status
                  contentDigest: sha256:example
                  observedAt: '2026-09-01T15:00:00Z'
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                reports:
                - reportId: report_vendor_watch_20260902
                  artifactId: artifact_vendor_watch_20260902
                  runId: run_vendor_watch_20260902
                  title: Vendor risk change watch
                  abstract: No material vendor-risk change was found in the admitted evidence.
                  createdAt: '2026-09-01T15:00:00Z'
                  observedAsOf: '2026-09-01T15:00:00Z'
                  sourceObservationCount: 1
                  retentionClass: standard
                  contentDigest: sha256:example
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                reasonCodes:
                - REPRESENTATIVE_REASON
                digest: sha256:example
        '400':
          description: Invalid Scheduled Work request
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              example:
                type: https://api.indwel.ai/problems/scheduled-work-body-object-required
                title: Invalid Scheduled Work request
                status: 400
                detail: The request body must be a JSON object.
                instance: /v1/scheduled-work
                code: SCHEDULED_WORK_BODY_OBJECT_REQUIRED
                traceId: trace_01J0EXAMPLE
                retryable: false
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - scheduled-work.write
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ScheduledWorkCreateRequest'
            example:
              proposal:
                schemaVersion: indwel.scheduled_work.v1
                proposalId: swp_vendor_risk_watch
                principalId: user_christian
                tenantId: org_acme
                workspaceId: ws_vendor_risk
                request: Check the approved vendor-risk sources each weekday and report material changes.
                title: Vendor risk change watch
                kind: scheduled_observation
                charter:
                  objective: Detect material changes in the approved vendor-risk evidence set.
                  mission: Review admitted sources on schedule and surface only changes that alter the current risk posture.
                  sourcePolicy:
                    requiredAuthority: workspace membership and admitted source authority
                    sourceSelectionPolicy: named_sources_only
                    namedSourceIds:
                    - source_vendor_status
                    permittedDomains:
                    - vendor.example
                    openWebFallback: deny
                  stoppingRule: Stop after the admitted sources are checked or the run budget is exhausted.
                  ordinaryCognitionPolicy: eligible_when_admitted_and_fresh
                  mutationPolicy: read_only
                schedule:
                  kind: manual
                scheduleTimeZoneAssumed: true
                requiresUserReview: true
                reviewReasonCodes:
                - REPRESENTATIVE_REASON
                reasonCodes:
                - REPRESENTATIVE_REASON
                compiledAt: '2026-09-01T15:00:00Z'
                digest: sha256:example
              acceptedByPrincipalId: acceptedbyprincipalid_01
      x-indwel-semantics:
        authority: authenticated principal and backend Scheduled Work charter authority
        asynchrony: durable; HTTP timeout does not imply cancellation
        effect: bounded-write
    get:
      operationId: listScheduledWork
      tags:
      - Scheduled Work
      summary: List Scheduled Work
      description: 'Lists Scheduled Work visible to the authenticated principal.


        **Authority:** authenticated principal and backend Scheduled Work charter authority.


        **Contract:** scope `scheduled-work.read` · durable asynchronous.'
      responses:
        '200':
          description: Scheduled Work list.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScheduledWorkListProjection'
              example:
                schemaVersion: indwel.scheduled_work.v1
                items:
                - schemaVersion: indwel.scheduled_work.v1
                  watchpointId: sw_vendor_risk_watch
                  title: Vendor risk change watch
                  status: draft
                  ownership:
                    workspaceId: ws_vendor_risk
                    ownerPrincipalId: user_christian
                    visibility: private
                  charter:
                    mission: Review admitted sources on schedule and surface only changes that alter the current risk posture.
                    requiredAuthority: workspace membership and admitted source authority
                    ordinaryCognitionPolicy: eligible_when_admitted_and_fresh
                    readOnly: true
                  schedule:
                    kind: manual
                  capabilities:
                    canView: true
                    canEdit: true
                    canRunTest: true
                    canPause: true
                    canResume: true
                    canArchive: true
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                reasonCodes:
                - REPRESENTATIVE_REASON
                digest: sha256:example
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - scheduled-work.read
      x-indwel-semantics:
        authority: authenticated principal and backend Scheduled Work charter authority
        asynchrony: durable; HTTP timeout does not imply cancellation
  /v1/scheduled-work/{watchpointId}:
    get:
      operationId: getScheduledWork
      tags:
      - Scheduled Work
      summary: Get Scheduled Work
      description: 'Returns the durable charter, lifecycle, and report projection for one authorized Scheduled Work item.


        **Authority:** authenticated principal and backend Scheduled Work charter authority.


        **Contract:** scope `scheduled-work.read` · durable asynchronous.'
      responses:
        '200':
          description: Scheduled Work detail.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScheduledWorkDetailProjection'
              example:
                schemaVersion: indwel.scheduled_work.v1
                watchpoint:
                  watchpointId: sw_vendor_risk_watch
                  title: Vendor risk change watch
                  kind: scheduled_observation
                  status: active
                  charterVersion: 1
                  charter:
                    objective: Detect material changes in the approved vendor-risk evidence set.
                    mission: Review admitted sources on schedule and surface only changes that alter the current risk posture.
                    sourcePolicy:
                      requiredAuthority: workspace membership and admitted source authority
                      sourceSelectionPolicy: named_sources_only
                      namedSourceIds:
                      - source_vendor_status
                      permittedDomains:
                      - vendor.example
                      openWebFallback: deny
                    stoppingRule: Stop after the admitted sources are checked or the run budget is exhausted.
                    ordinaryCognitionPolicy: eligible_when_admitted_and_fresh
                    mutationPolicy: read_only
                  schedule:
                    kind: manual
                  budget:
                    maxRunsPerWindow: 1
                    windowMinutes: 1
                    maxAcquisitionsPerRun: 1
                    maxWallClockMsPerRun: 1
                    maxCostUnitsPerRun: 1
                  notificationPolicy: {}
                  retentionPolicy: {}
                  createdAt: '2026-09-01T15:00:00Z'
                  updatedAt: '2026-09-01T15:00:00Z'
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                readModel:
                  schemaVersion: indwel.scheduled_work.v1
                  watchpointId: sw_vendor_risk_watch
                  title: Vendor risk change watch
                  status: draft
                  ownership:
                    workspaceId: ws_vendor_risk
                    ownerPrincipalId: user_christian
                    visibility: private
                  charter:
                    mission: Review admitted sources on schedule and surface only changes that alter the current risk posture.
                    requiredAuthority: workspace membership and admitted source authority
                    ordinaryCognitionPolicy: eligible_when_admitted_and_fresh
                    readOnly: true
                  schedule:
                    kind: manual
                  capabilities:
                    canView: true
                    canEdit: true
                    canRunTest: true
                    canPause: true
                    canResume: true
                    canArchive: true
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                lifecycleControls: {}
                runHistory:
                - runId: run_vendor_watch_20260902
                  invocation: manual_test
                  outcome: completed
                  startedAt: '2026-09-01T15:00:00Z'
                  settledAt: '2026-09-01T15:00:00Z'
                  sourceObservationCount: 1
                  artifactCount: 1
                  reportCount: 1
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                observationJournal:
                - observationId: obs_vendor_status_20260902
                  runId: run_vendor_watch_20260902
                  sourceId: source_vendor_status
                  sourceLocator: https://example.invalid/vendor/status
                  contentDigest: sha256:example
                  observedAt: '2026-09-01T15:00:00Z'
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                reports:
                - reportId: report_vendor_watch_20260902
                  artifactId: artifact_vendor_watch_20260902
                  runId: run_vendor_watch_20260902
                  title: Vendor risk change watch
                  abstract: No material vendor-risk change was found in the admitted evidence.
                  createdAt: '2026-09-01T15:00:00Z'
                  observedAsOf: '2026-09-01T15:00:00Z'
                  sourceObservationCount: 1
                  retentionClass: standard
                  contentDigest: sha256:example
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                reasonCodes:
                - REPRESENTATIVE_REASON
                digest: sha256:example
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - scheduled-work.read
      parameters:
      - name: watchpointId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Current underlying Scheduled Work identifier. The external product noun remains Scheduled Work.
      x-indwel-semantics:
        authority: authenticated principal and backend Scheduled Work charter authority
        asynchrony: durable; HTTP timeout does not imply cancellation
    patch:
      operationId: editScheduledWork
      tags:
      - Scheduled Work
      summary: Edit Scheduled Work
      description: 'Replaces the accepted charter proposal under optimistic charter-version authority.


        **Authority:** authenticated principal and backend Scheduled Work charter authority.


        **Contract:** scope `scheduled-work.write` · optimistic concurrency · durable asynchronous.'
      responses:
        '200':
          description: Updated Scheduled Work detail.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScheduledWorkDetailProjection'
              example:
                schemaVersion: indwel.scheduled_work.v1
                watchpoint:
                  watchpointId: sw_vendor_risk_watch
                  title: Vendor risk change watch
                  kind: scheduled_observation
                  status: active
                  charterVersion: 1
                  charter:
                    objective: Detect material changes in the approved vendor-risk evidence set.
                    mission: Review admitted sources on schedule and surface only changes that alter the current risk posture.
                    sourcePolicy:
                      requiredAuthority: workspace membership and admitted source authority
                      sourceSelectionPolicy: named_sources_only
                      namedSourceIds:
                      - source_vendor_status
                      permittedDomains:
                      - vendor.example
                      openWebFallback: deny
                    stoppingRule: Stop after the admitted sources are checked or the run budget is exhausted.
                    ordinaryCognitionPolicy: eligible_when_admitted_and_fresh
                    mutationPolicy: read_only
                  schedule:
                    kind: manual
                  budget:
                    maxRunsPerWindow: 1
                    windowMinutes: 1
                    maxAcquisitionsPerRun: 1
                    maxWallClockMsPerRun: 1
                    maxCostUnitsPerRun: 1
                  notificationPolicy: {}
                  retentionPolicy: {}
                  createdAt: '2026-09-01T15:00:00Z'
                  updatedAt: '2026-09-01T15:00:00Z'
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                readModel:
                  schemaVersion: indwel.scheduled_work.v1
                  watchpointId: sw_vendor_risk_watch
                  title: Vendor risk change watch
                  status: draft
                  ownership:
                    workspaceId: ws_vendor_risk
                    ownerPrincipalId: user_christian
                    visibility: private
                  charter:
                    mission: Review admitted sources on schedule and surface only changes that alter the current risk posture.
                    requiredAuthority: workspace membership and admitted source authority
                    ordinaryCognitionPolicy: eligible_when_admitted_and_fresh
                    readOnly: true
                  schedule:
                    kind: manual
                  capabilities:
                    canView: true
                    canEdit: true
                    canRunTest: true
                    canPause: true
                    canResume: true
                    canArchive: true
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                lifecycleControls: {}
                runHistory:
                - runId: run_vendor_watch_20260902
                  invocation: manual_test
                  outcome: completed
                  startedAt: '2026-09-01T15:00:00Z'
                  settledAt: '2026-09-01T15:00:00Z'
                  sourceObservationCount: 1
                  artifactCount: 1
                  reportCount: 1
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                observationJournal:
                - observationId: obs_vendor_status_20260902
                  runId: run_vendor_watch_20260902
                  sourceId: source_vendor_status
                  sourceLocator: https://example.invalid/vendor/status
                  contentDigest: sha256:example
                  observedAt: '2026-09-01T15:00:00Z'
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                reports:
                - reportId: report_vendor_watch_20260902
                  artifactId: artifact_vendor_watch_20260902
                  runId: run_vendor_watch_20260902
                  title: Vendor risk change watch
                  abstract: No material vendor-risk change was found in the admitted evidence.
                  createdAt: '2026-09-01T15:00:00Z'
                  observedAsOf: '2026-09-01T15:00:00Z'
                  sourceObservationCount: 1
                  retentionClass: standard
                  contentDigest: sha256:example
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                reasonCodes:
                - REPRESENTATIVE_REASON
                digest: sha256:example
        '400':
          description: Invalid Scheduled Work request
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              example:
                type: https://api.indwel.ai/problems/scheduled-work-body-object-required
                title: Invalid Scheduled Work request
                status: 400
                detail: The request body must be a JSON object.
                instance: /v1/scheduled-work/wp_01J0EXAMPLE
                code: SCHEDULED_WORK_BODY_OBJECT_REQUIRED
                traceId: trace_01J0EXAMPLE
                retryable: false
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
        '428':
          description: Expected charter version required
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              example:
                type: https://api.indwel.ai/problems/watchpoint-command-expected-version-required
                title: Expected charter version required
                status: 428
                detail: A positive expected charter version is required for this Scheduled Work command.
                instance: /v1/scheduled-work/wp_01J0EXAMPLE
                code: WATCHPOINT_COMMAND_EXPECTED_VERSION_REQUIRED
                traceId: trace_01J0EXAMPLE
                retryable: false
      security:
      - IndwelOAuth:
        - scheduled-work.write
      parameters:
      - name: watchpointId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Current underlying Scheduled Work identifier. The external product noun remains Scheduled Work.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ScheduledWorkEditRequest'
            example:
              expectedCharterVersion: 1
              proposal:
                schemaVersion: indwel.scheduled_work.v1
                proposalId: swp_vendor_risk_watch
                principalId: user_christian
                tenantId: org_acme
                workspaceId: ws_vendor_risk
                request: Check the approved vendor-risk sources each weekday and report material changes.
                title: Vendor risk change watch
                kind: scheduled_observation
                charter:
                  objective: Detect material changes in the approved vendor-risk evidence set.
                  mission: Review admitted sources on schedule and surface only changes that alter the current risk posture.
                  sourcePolicy:
                    requiredAuthority: workspace membership and admitted source authority
                    sourceSelectionPolicy: named_sources_only
                    namedSourceIds:
                    - source_vendor_status
                    permittedDomains:
                    - vendor.example
                    openWebFallback: deny
                  stoppingRule: Stop after the admitted sources are checked or the run budget is exhausted.
                  ordinaryCognitionPolicy: eligible_when_admitted_and_fresh
                  mutationPolicy: read_only
                schedule:
                  kind: manual
                scheduleTimeZoneAssumed: true
                requiresUserReview: true
                reviewReasonCodes:
                - REPRESENTATIVE_REASON
                reasonCodes:
                - REPRESENTATIVE_REASON
                compiledAt: '2026-09-01T15:00:00Z'
                digest: sha256:example
              acceptedByPrincipalId: acceptedbyprincipalid_01
      x-indwel-semantics:
        authority: authenticated principal and backend Scheduled Work charter authority
        asynchrony: durable; HTTP timeout does not imply cancellation
        concurrency: expectedCharterVersion
    delete:
      operationId: archiveScheduledWork
      tags:
      - Scheduled Work
      summary: Archive Scheduled Work
      description: 'Archives Scheduled Work under an expected charter version. Archive is a governed lifecycle transition
        rather than deletion of backend scheduling infrastructure.


        **Authority:** authenticated principal and backend Scheduled Work charter authority.


        **Contract:** scope `scheduled-work.write` · optimistic concurrency · durable asynchronous.'
      responses:
        '200':
          description: Archived Scheduled Work status.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScheduledWorkArchiveResponse'
              example:
                ok: true
                watchpointId: sw_vendor_risk_watch
                status: archived
                charterVersion: 1
        '400':
          description: Invalid Scheduled Work request
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              example:
                type: https://api.indwel.ai/problems/scheduled-work-body-object-required
                title: Invalid Scheduled Work request
                status: 400
                detail: The request body must be a JSON object.
                instance: /v1/scheduled-work/wp_01J0EXAMPLE
                code: SCHEDULED_WORK_BODY_OBJECT_REQUIRED
                traceId: trace_01J0EXAMPLE
                retryable: false
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
        '428':
          description: Expected charter version required
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              example:
                type: https://api.indwel.ai/problems/watchpoint-command-expected-version-required
                title: Expected charter version required
                status: 428
                detail: A positive expected charter version is required for this Scheduled Work command.
                instance: /v1/scheduled-work/wp_01J0EXAMPLE
                code: WATCHPOINT_COMMAND_EXPECTED_VERSION_REQUIRED
                traceId: trace_01J0EXAMPLE
                retryable: false
      security:
      - IndwelOAuth:
        - scheduled-work.write
      parameters:
      - name: watchpointId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Current underlying Scheduled Work identifier. The external product noun remains Scheduled Work.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ScheduledWorkTransitionRequest'
            example:
              expectedCharterVersion: 1
      x-indwel-semantics:
        authority: authenticated principal and backend Scheduled Work charter authority
        asynchrony: durable; HTTP timeout does not imply cancellation
        concurrency: expectedCharterVersion
  /v1/scheduled-work/{watchpointId}/test:
    post:
      operationId: testScheduledWork
      tags:
      - Scheduled Work
      summary: Run a one-shot proof
      description: 'Runs the Scheduled Work charter once without activating the recurring schedule and returns its proof posture
        and report identifiers.


        **Authority:** authenticated principal and backend Scheduled Work charter authority.


        **Contract:** scope `scheduled-work.write` · durable asynchronous.'
      responses:
        '200':
          description: One-shot proof result.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScheduledWorkTestResponse'
              example:
                ok: true
                watchpointId: sw_vendor_risk_watch
                runId: run_vendor_watch_20260902
                outcome: settled_success
                reportIds:
                - report_vendor_watch_20260902
                charterVersion: 1
                activationEligible: true
        '400':
          description: Invalid Scheduled Work request
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              example:
                type: https://api.indwel.ai/problems/scheduled-work-body-object-required
                title: Invalid Scheduled Work request
                status: 400
                detail: The request body must be a JSON object.
                instance: /v1/scheduled-work/wp_01J0EXAMPLE/test
                code: SCHEDULED_WORK_BODY_OBJECT_REQUIRED
                traceId: trace_01J0EXAMPLE
                retryable: false
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
        '428':
          description: Expected charter version required
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              example:
                type: https://api.indwel.ai/problems/watchpoint-command-expected-version-required
                title: Expected charter version required
                status: 428
                detail: A positive expected charter version is required for this Scheduled Work command.
                instance: /v1/scheduled-work/wp_01J0EXAMPLE/test
                code: WATCHPOINT_COMMAND_EXPECTED_VERSION_REQUIRED
                traceId: trace_01J0EXAMPLE
                retryable: false
      security:
      - IndwelOAuth:
        - scheduled-work.write
      parameters:
      - name: watchpointId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Current underlying Scheduled Work identifier. The external product noun remains Scheduled Work.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ScheduledWorkTestRequest'
            example:
              expectedCharterVersion: 1
      x-indwel-semantics:
        authority: authenticated principal and backend Scheduled Work charter authority
        asynchrony: durable; HTTP timeout does not imply cancellation
  /v1/scheduled-work/{watchpointId}/activate:
    post:
      operationId: activateScheduledWork
      tags:
      - Scheduled Work
      summary: Activate Scheduled Work
      description: 'Activate Scheduled Work under the current expected charter version.


        **Authority:** authenticated principal and backend Scheduled Work charter authority.


        **Contract:** scope `scheduled-work.write` · optimistic concurrency · durable asynchronous.'
      responses:
        '200':
          description: Updated Scheduled Work detail.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScheduledWorkDetailProjection'
              example:
                schemaVersion: indwel.scheduled_work.v1
                watchpoint:
                  watchpointId: sw_vendor_risk_watch
                  title: Vendor risk change watch
                  kind: scheduled_observation
                  status: active
                  charterVersion: 1
                  charter:
                    objective: Detect material changes in the approved vendor-risk evidence set.
                    mission: Review admitted sources on schedule and surface only changes that alter the current risk posture.
                    sourcePolicy:
                      requiredAuthority: workspace membership and admitted source authority
                      sourceSelectionPolicy: named_sources_only
                      namedSourceIds:
                      - source_vendor_status
                      permittedDomains:
                      - vendor.example
                      openWebFallback: deny
                    stoppingRule: Stop after the admitted sources are checked or the run budget is exhausted.
                    ordinaryCognitionPolicy: eligible_when_admitted_and_fresh
                    mutationPolicy: read_only
                  schedule:
                    kind: manual
                  budget:
                    maxRunsPerWindow: 1
                    windowMinutes: 1
                    maxAcquisitionsPerRun: 1
                    maxWallClockMsPerRun: 1
                    maxCostUnitsPerRun: 1
                  notificationPolicy: {}
                  retentionPolicy: {}
                  createdAt: '2026-09-01T15:00:00Z'
                  updatedAt: '2026-09-01T15:00:00Z'
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                readModel:
                  schemaVersion: indwel.scheduled_work.v1
                  watchpointId: sw_vendor_risk_watch
                  title: Vendor risk change watch
                  status: draft
                  ownership:
                    workspaceId: ws_vendor_risk
                    ownerPrincipalId: user_christian
                    visibility: private
                  charter:
                    mission: Review admitted sources on schedule and surface only changes that alter the current risk posture.
                    requiredAuthority: workspace membership and admitted source authority
                    ordinaryCognitionPolicy: eligible_when_admitted_and_fresh
                    readOnly: true
                  schedule:
                    kind: manual
                  capabilities:
                    canView: true
                    canEdit: true
                    canRunTest: true
                    canPause: true
                    canResume: true
                    canArchive: true
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                lifecycleControls: {}
                runHistory:
                - runId: run_vendor_watch_20260902
                  invocation: manual_test
                  outcome: completed
                  startedAt: '2026-09-01T15:00:00Z'
                  settledAt: '2026-09-01T15:00:00Z'
                  sourceObservationCount: 1
                  artifactCount: 1
                  reportCount: 1
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                observationJournal:
                - observationId: obs_vendor_status_20260902
                  runId: run_vendor_watch_20260902
                  sourceId: source_vendor_status
                  sourceLocator: https://example.invalid/vendor/status
                  contentDigest: sha256:example
                  observedAt: '2026-09-01T15:00:00Z'
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                reports:
                - reportId: report_vendor_watch_20260902
                  artifactId: artifact_vendor_watch_20260902
                  runId: run_vendor_watch_20260902
                  title: Vendor risk change watch
                  abstract: No material vendor-risk change was found in the admitted evidence.
                  createdAt: '2026-09-01T15:00:00Z'
                  observedAsOf: '2026-09-01T15:00:00Z'
                  sourceObservationCount: 1
                  retentionClass: standard
                  contentDigest: sha256:example
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                reasonCodes:
                - REPRESENTATIVE_REASON
                digest: sha256:example
        '400':
          description: Invalid Scheduled Work request
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              example:
                type: https://api.indwel.ai/problems/scheduled-work-body-object-required
                title: Invalid Scheduled Work request
                status: 400
                detail: The request body must be a JSON object.
                instance: /v1/scheduled-work/wp_01J0EXAMPLE/activate
                code: SCHEDULED_WORK_BODY_OBJECT_REQUIRED
                traceId: trace_01J0EXAMPLE
                retryable: false
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
        '428':
          description: Expected charter version required
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              example:
                type: https://api.indwel.ai/problems/watchpoint-command-expected-version-required
                title: Expected charter version required
                status: 428
                detail: A positive expected charter version is required for this Scheduled Work command.
                instance: /v1/scheduled-work/wp_01J0EXAMPLE/activate
                code: WATCHPOINT_COMMAND_EXPECTED_VERSION_REQUIRED
                traceId: trace_01J0EXAMPLE
                retryable: false
      security:
      - IndwelOAuth:
        - scheduled-work.write
      parameters:
      - name: watchpointId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Current underlying Scheduled Work identifier. The external product noun remains Scheduled Work.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ScheduledWorkTransitionRequest'
            example:
              expectedCharterVersion: 1
      x-indwel-semantics:
        authority: authenticated principal and backend Scheduled Work charter authority
        asynchrony: durable; HTTP timeout does not imply cancellation
        concurrency: expectedCharterVersion
  /v1/scheduled-work/{watchpointId}/pause:
    post:
      operationId: pauseScheduledWork
      tags:
      - Scheduled Work
      summary: Pause Scheduled Work
      description: 'Pause Scheduled Work under the current expected charter version.


        **Authority:** authenticated principal and backend Scheduled Work charter authority.


        **Contract:** scope `scheduled-work.write` · optimistic concurrency · durable asynchronous.'
      responses:
        '200':
          description: Updated Scheduled Work detail.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScheduledWorkDetailProjection'
              example:
                schemaVersion: indwel.scheduled_work.v1
                watchpoint:
                  watchpointId: sw_vendor_risk_watch
                  title: Vendor risk change watch
                  kind: scheduled_observation
                  status: active
                  charterVersion: 1
                  charter:
                    objective: Detect material changes in the approved vendor-risk evidence set.
                    mission: Review admitted sources on schedule and surface only changes that alter the current risk posture.
                    sourcePolicy:
                      requiredAuthority: workspace membership and admitted source authority
                      sourceSelectionPolicy: named_sources_only
                      namedSourceIds:
                      - source_vendor_status
                      permittedDomains:
                      - vendor.example
                      openWebFallback: deny
                    stoppingRule: Stop after the admitted sources are checked or the run budget is exhausted.
                    ordinaryCognitionPolicy: eligible_when_admitted_and_fresh
                    mutationPolicy: read_only
                  schedule:
                    kind: manual
                  budget:
                    maxRunsPerWindow: 1
                    windowMinutes: 1
                    maxAcquisitionsPerRun: 1
                    maxWallClockMsPerRun: 1
                    maxCostUnitsPerRun: 1
                  notificationPolicy: {}
                  retentionPolicy: {}
                  createdAt: '2026-09-01T15:00:00Z'
                  updatedAt: '2026-09-01T15:00:00Z'
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                readModel:
                  schemaVersion: indwel.scheduled_work.v1
                  watchpointId: sw_vendor_risk_watch
                  title: Vendor risk change watch
                  status: draft
                  ownership:
                    workspaceId: ws_vendor_risk
                    ownerPrincipalId: user_christian
                    visibility: private
                  charter:
                    mission: Review admitted sources on schedule and surface only changes that alter the current risk posture.
                    requiredAuthority: workspace membership and admitted source authority
                    ordinaryCognitionPolicy: eligible_when_admitted_and_fresh
                    readOnly: true
                  schedule:
                    kind: manual
                  capabilities:
                    canView: true
                    canEdit: true
                    canRunTest: true
                    canPause: true
                    canResume: true
                    canArchive: true
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                lifecycleControls: {}
                runHistory:
                - runId: run_vendor_watch_20260902
                  invocation: manual_test
                  outcome: completed
                  startedAt: '2026-09-01T15:00:00Z'
                  settledAt: '2026-09-01T15:00:00Z'
                  sourceObservationCount: 1
                  artifactCount: 1
                  reportCount: 1
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                observationJournal:
                - observationId: obs_vendor_status_20260902
                  runId: run_vendor_watch_20260902
                  sourceId: source_vendor_status
                  sourceLocator: https://example.invalid/vendor/status
                  contentDigest: sha256:example
                  observedAt: '2026-09-01T15:00:00Z'
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                reports:
                - reportId: report_vendor_watch_20260902
                  artifactId: artifact_vendor_watch_20260902
                  runId: run_vendor_watch_20260902
                  title: Vendor risk change watch
                  abstract: No material vendor-risk change was found in the admitted evidence.
                  createdAt: '2026-09-01T15:00:00Z'
                  observedAsOf: '2026-09-01T15:00:00Z'
                  sourceObservationCount: 1
                  retentionClass: standard
                  contentDigest: sha256:example
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                reasonCodes:
                - REPRESENTATIVE_REASON
                digest: sha256:example
        '400':
          description: Invalid Scheduled Work request
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              example:
                type: https://api.indwel.ai/problems/scheduled-work-body-object-required
                title: Invalid Scheduled Work request
                status: 400
                detail: The request body must be a JSON object.
                instance: /v1/scheduled-work/wp_01J0EXAMPLE/pause
                code: SCHEDULED_WORK_BODY_OBJECT_REQUIRED
                traceId: trace_01J0EXAMPLE
                retryable: false
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
        '428':
          description: Expected charter version required
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              example:
                type: https://api.indwel.ai/problems/watchpoint-command-expected-version-required
                title: Expected charter version required
                status: 428
                detail: A positive expected charter version is required for this Scheduled Work command.
                instance: /v1/scheduled-work/wp_01J0EXAMPLE/pause
                code: WATCHPOINT_COMMAND_EXPECTED_VERSION_REQUIRED
                traceId: trace_01J0EXAMPLE
                retryable: false
      security:
      - IndwelOAuth:
        - scheduled-work.write
      parameters:
      - name: watchpointId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Current underlying Scheduled Work identifier. The external product noun remains Scheduled Work.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ScheduledWorkTransitionRequest'
            example:
              expectedCharterVersion: 1
      x-indwel-semantics:
        authority: authenticated principal and backend Scheduled Work charter authority
        asynchrony: durable; HTTP timeout does not imply cancellation
        concurrency: expectedCharterVersion
  /v1/scheduled-work/{watchpointId}/resume:
    post:
      operationId: resumeScheduledWork
      tags:
      - Scheduled Work
      summary: Resume Scheduled Work
      description: 'Resume Scheduled Work under the current expected charter version.


        **Authority:** authenticated principal and backend Scheduled Work charter authority.


        **Contract:** scope `scheduled-work.write` · optimistic concurrency · durable asynchronous.'
      responses:
        '200':
          description: Updated Scheduled Work detail.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScheduledWorkDetailProjection'
              example:
                schemaVersion: indwel.scheduled_work.v1
                watchpoint:
                  watchpointId: sw_vendor_risk_watch
                  title: Vendor risk change watch
                  kind: scheduled_observation
                  status: active
                  charterVersion: 1
                  charter:
                    objective: Detect material changes in the approved vendor-risk evidence set.
                    mission: Review admitted sources on schedule and surface only changes that alter the current risk posture.
                    sourcePolicy:
                      requiredAuthority: workspace membership and admitted source authority
                      sourceSelectionPolicy: named_sources_only
                      namedSourceIds:
                      - source_vendor_status
                      permittedDomains:
                      - vendor.example
                      openWebFallback: deny
                    stoppingRule: Stop after the admitted sources are checked or the run budget is exhausted.
                    ordinaryCognitionPolicy: eligible_when_admitted_and_fresh
                    mutationPolicy: read_only
                  schedule:
                    kind: manual
                  budget:
                    maxRunsPerWindow: 1
                    windowMinutes: 1
                    maxAcquisitionsPerRun: 1
                    maxWallClockMsPerRun: 1
                    maxCostUnitsPerRun: 1
                  notificationPolicy: {}
                  retentionPolicy: {}
                  createdAt: '2026-09-01T15:00:00Z'
                  updatedAt: '2026-09-01T15:00:00Z'
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                readModel:
                  schemaVersion: indwel.scheduled_work.v1
                  watchpointId: sw_vendor_risk_watch
                  title: Vendor risk change watch
                  status: draft
                  ownership:
                    workspaceId: ws_vendor_risk
                    ownerPrincipalId: user_christian
                    visibility: private
                  charter:
                    mission: Review admitted sources on schedule and surface only changes that alter the current risk posture.
                    requiredAuthority: workspace membership and admitted source authority
                    ordinaryCognitionPolicy: eligible_when_admitted_and_fresh
                    readOnly: true
                  schedule:
                    kind: manual
                  capabilities:
                    canView: true
                    canEdit: true
                    canRunTest: true
                    canPause: true
                    canResume: true
                    canArchive: true
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                lifecycleControls: {}
                runHistory:
                - runId: run_vendor_watch_20260902
                  invocation: manual_test
                  outcome: completed
                  startedAt: '2026-09-01T15:00:00Z'
                  settledAt: '2026-09-01T15:00:00Z'
                  sourceObservationCount: 1
                  artifactCount: 1
                  reportCount: 1
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                observationJournal:
                - observationId: obs_vendor_status_20260902
                  runId: run_vendor_watch_20260902
                  sourceId: source_vendor_status
                  sourceLocator: https://example.invalid/vendor/status
                  contentDigest: sha256:example
                  observedAt: '2026-09-01T15:00:00Z'
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                reports:
                - reportId: report_vendor_watch_20260902
                  artifactId: artifact_vendor_watch_20260902
                  runId: run_vendor_watch_20260902
                  title: Vendor risk change watch
                  abstract: No material vendor-risk change was found in the admitted evidence.
                  createdAt: '2026-09-01T15:00:00Z'
                  observedAsOf: '2026-09-01T15:00:00Z'
                  sourceObservationCount: 1
                  retentionClass: standard
                  contentDigest: sha256:example
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                reasonCodes:
                - REPRESENTATIVE_REASON
                digest: sha256:example
        '400':
          description: Invalid Scheduled Work request
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              example:
                type: https://api.indwel.ai/problems/scheduled-work-body-object-required
                title: Invalid Scheduled Work request
                status: 400
                detail: The request body must be a JSON object.
                instance: /v1/scheduled-work/wp_01J0EXAMPLE/resume
                code: SCHEDULED_WORK_BODY_OBJECT_REQUIRED
                traceId: trace_01J0EXAMPLE
                retryable: false
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
        '428':
          description: Expected charter version required
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              example:
                type: https://api.indwel.ai/problems/watchpoint-command-expected-version-required
                title: Expected charter version required
                status: 428
                detail: A positive expected charter version is required for this Scheduled Work command.
                instance: /v1/scheduled-work/wp_01J0EXAMPLE/resume
                code: WATCHPOINT_COMMAND_EXPECTED_VERSION_REQUIRED
                traceId: trace_01J0EXAMPLE
                retryable: false
      security:
      - IndwelOAuth:
        - scheduled-work.write
      parameters:
      - name: watchpointId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Current underlying Scheduled Work identifier. The external product noun remains Scheduled Work.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ScheduledWorkTransitionRequest'
            example:
              expectedCharterVersion: 1
      x-indwel-semantics:
        authority: authenticated principal and backend Scheduled Work charter authority
        asynchrony: durable; HTTP timeout does not imply cancellation
        concurrency: expectedCharterVersion
  /v1/scheduled-work/{watchpointId}/reports:
    get:
      operationId: listScheduledWorkReports
      tags:
      - Scheduled Work
      summary: List Scheduled Work reports
      description: 'Returns reports produced by the selected Scheduled Work item.


        **Authority:** authenticated principal and backend Scheduled Work charter authority.


        **Contract:** scope `scheduled-work.read` · durable asynchronous.'
      responses:
        '200':
          description: Scheduled Work reports.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScheduledWorkReportListResponse'
              example:
                watchpointId: sw_vendor_risk_watch
                reports:
                - reportId: report_vendor_watch_20260902
                  artifactId: artifact_vendor_watch_20260902
                  runId: run_vendor_watch_20260902
                  title: Vendor risk change watch
                  abstract: No material vendor-risk change was found in the admitted evidence.
                  createdAt: '2026-09-01T15:00:00Z'
                  observedAsOf: '2026-09-01T15:00:00Z'
                  sourceObservationCount: 1
                  retentionClass: standard
                  contentDigest: sha256:example
                  reasonCodes:
                  - REPRESENTATIVE_REASON
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - scheduled-work.read
      parameters:
      - name: watchpointId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Current underlying Scheduled Work identifier. The external product noun remains Scheduled Work.
      x-indwel-semantics:
        authority: authenticated principal and backend Scheduled Work charter authority
        asynchrony: durable; HTTP timeout does not imply cancellation
  /v1/scheduled-work/{watchpointId}/reports/{reportId}:
    get:
      operationId: getScheduledWorkReport
      tags:
      - Scheduled Work
      summary: Get a Scheduled Work report
      description: 'Returns one report produced by the selected Scheduled Work item.


        **Authority:** authenticated principal and backend Scheduled Work charter authority.


        **Contract:** scope `scheduled-work.read` · durable asynchronous.'
      responses:
        '200':
          description: Scheduled Work report.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScheduledWorkReportProjection'
              example:
                schemaVersion: indwel.scheduled_work.v1
                report:
                  schemaVersion: indwel.scheduled_work.v1
                  reportId: report_vendor_watch_20260902
                  artifactId: artifact_vendor_watch_20260902
                  watchpointId: sw_vendor_risk_watch
                  runId: run_vendor_watch_20260902
                  title: Vendor risk change watch
                  bodyMarkdown: No material change was found in the admitted vendor-risk evidence as of 2026-09-02.
                  abstract: No material vendor-risk change was found in the admitted evidence.
                  createdAt: '2026-09-01T15:00:00Z'
                  observedAsOf: '2026-09-01T15:00:00Z'
                  sourceObservationIds:
                  - obs_vendor_status_20260902
                  citationItems:
                  - sourceId: source_vendor_status
                    sourceLocator: https://example.invalid/vendor/status
                    observedAt: '2026-09-01T15:00:00Z'
                    contentDigest: sha256:example
                  evidentiaryPosture: advisory_synthesis
                  retentionClass: standard
                  contentDigest: sha256:example
                  reasonCodes:
                  - REPRESENTATIVE_REASON
                  digest: sha256:example
                reasonCodes:
                - REPRESENTATIVE_REASON
                digest: sha256:example
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          description: Scheduled Work route not found
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              example:
                type: https://api.indwel.ai/problems/scheduled-work-route-not-found
                title: Scheduled Work route not found
                status: 404
                detail: No Scheduled Work route matched the request.
                instance: /v1/scheduled-work/wp_01J0EXAMPLE/reports/report_01J0EXAMPLE
                code: SCHEDULED_WORK_ROUTE_NOT_FOUND
                traceId: trace_01J0EXAMPLE
                retryable: false
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - scheduled-work.read
      parameters:
      - name: watchpointId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Current underlying Scheduled Work identifier. The external product noun remains Scheduled Work.
      - name: reportId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
      x-indwel-semantics:
        authority: authenticated principal and backend Scheduled Work charter authority
        asynchrony: durable; HTTP timeout does not imply cancellation
  /v1/parallel-cognition/work/{workId}:
    get:
      operationId: listParallelCognitionForWork
      tags:
      - Parallel Cognition
      summary: Read Parallel Cognition for Work
      description: 'Returns the aggregate Work-level projection of governed Parallel Cognition Programs. Branch Jobs and worker
        lease state are intentionally not public resources.


        **Authority:** program-level authority subordinate to durable Work.


        **Contract:** scope `parallel-cognition.read` · durable asynchronous · explicit cancellation.'
      responses:
        '200':
          description: Aggregate Parallel Cognition Program projection.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ParallelCognitionProgrammeProjection'
              example:
                workId: work_vendor_assurance
                programmes:
                - workId: work_vendor_assurance
                  programmeId: programme_parallel_01
                  posture: settled
                  branchDenominator: 3
                  branchSettlement:
                    settled: 3
                    failed: 0
                  cumulativeEconomics:
                    currency: USD
                    machineCostMicros: 920000
                  stoppingPosture:
                    requested: false
                    terminal: true
                  fanIn:
                    status: settled
                    parentSynthesisRunId: run_parent_01
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - parallel-cognition.read
      parameters:
      - name: workId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Durable Work identifier.
      x-indwel-semantics:
        authority: programme-level authority subordinate to durable Work
        jobs: raw durable Jobs are internal orchestration substrate
        cancellation: programme-level only
        asynchrony: durable; HTTP timeout does not imply cancellation
  /v1/parallel-cognition/work/{workId}/programmes/{programmeId}:
    get:
      operationId: getParallelCognitionProgramme
      tags:
      - Parallel Cognition
      summary: Read a Parallel Cognition Program
      description: 'Returns program posture, branch denominator and settlement, cumulative economics, stopping posture, and
        fan-in/parent-synthesis posture under durable Work authority.


        **Authority:** program-level authority subordinate to durable Work.


        **Contract:** scope `parallel-cognition.read` · durable asynchronous · explicit cancellation.'
      responses:
        '200':
          description: Parallel Cognition Program projection.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ParallelCognitionProgrammeProjection'
              example:
                workId: work_vendor_assurance
                programmeId: programme_parallel_01
                posture: settled
                branchDenominator: 3
                branchSettlement:
                  settled: 3
                  failed: 0
                cumulativeEconomics:
                  currency: USD
                  machineCostMicros: 920000
                stoppingPosture:
                  requested: false
                  terminal: true
                fanIn:
                  status: settled
                  parentSynthesisRunId: run_parent_01
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - parallel-cognition.read
      parameters:
      - name: workId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Durable Work identifier.
      - name: programmeId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
      x-indwel-semantics:
        authority: programme-level authority subordinate to durable Work
        jobs: raw durable Jobs are internal orchestration substrate
        cancellation: programme-level only
        asynchrony: durable; HTTP timeout does not imply cancellation
  /v1/parallel-cognition/work/{workId}/programmes/{programmeId}/cancel:
    post:
      operationId: cancelParallelCognitionProgramme
      tags:
      - Parallel Cognition
      summary: Cancel a Parallel Cognition Program
      description: 'Requests governed cancellation at program level. The runtime performs any corresponding internal Job cancellation;
        callers cannot cancel raw Jobs or supply worker authority.


        **Authority:** program-level authority subordinate to durable Work.


        **Contract:** scope `parallel-cognition.write` · governed cancellation · durable asynchronous · explicit cancellation.'
      responses:
        '200':
          description: Updated program stopping posture.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ParallelCognitionProgrammeProjection'
              example:
                workId: work_vendor_assurance
                programmeId: programme_parallel_01
                posture: cancelling
                branchDenominator: 3
                branchSettlement:
                  settled: 3
                  failed: 0
                cumulativeEconomics:
                  currency: USD
                  machineCostMicros: 920000
                stoppingPosture:
                  requested: true
                  terminal: false
                fanIn:
                  status: settled
                  parentSynthesisRunId: run_parent_01
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - parallel-cognition.write
      parameters:
      - name: workId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Durable Work identifier.
      - name: programmeId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
      x-indwel-semantics:
        authority: programme-level authority subordinate to durable Work
        jobs: raw durable Jobs are internal orchestration substrate
        cancellation: programme-level only
        asynchrony: durable; HTTP timeout does not imply cancellation
        effect: governed-cancellation
  /v1/organisations/{organisationId}/projects/{projectId}/memberships:
    get:
      operationId: listProjectMemberships
      tags:
      - Projects
      summary: List project memberships
      description: 'Returns active and retained project membership/role assignments after organization authority and project
        `admin`-or-stronger authority are independently established.


        **Authority:** organization admin-or-stronger plus project admin-or-stronger.


        **Contract:** scope `project-memberships.read`.'
      responses:
        '200':
          description: Project membership assignments.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectMembershipListResponse'
              example:
                data:
                  items:
                  - schema: indwel.developer-control-plane.v1
                    membershipId: membership_user_42
                    organisationId: org_acme
                    projectId: project_vendor_risk
                    userId: user_42
                    role: owner
                    lifecycle: active
                    revision: 1
                    createdAt: '2026-09-01T15:00:00Z'
                    updatedAt: '2026-09-01T15:00:00Z'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          description: Forbidden
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                projectAuthorityRequired:
                  value:
                    type: https://api.indwel.ai/problems/project-authority-required
                    title: Forbidden
                    status: 403
                    detail: The principal lacks authority for this developer project
                    instance: /v1/organisations/org_acme/projects/project_risk/memberships
                    code: PROJECT_AUTHORITY_REQUIRED
                    traceId: trace_01J0EXAMPLE
                    retryable: false
        '404':
          $ref: '#/components/responses/Problem404'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - project-memberships.read
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/ProjectId'
      x-indwel-semantics:
        authority: organisation admin-or-stronger plus project admin-or-stronger
        custody: project membership authority
  /v1/organisations/{organisationId}/projects/{projectId}/memberships/{userId}:
    put:
      operationId: upsertProjectMembership
      tags:
      - Projects
      summary: Create or update project membership
      description: 'Creates or updates a project membership under organization owner and project owner authority. OAuth scope
        does not replace role checks, and an owner cannot use the operation to demote their own ownership.


        **Authority:** organization owner plus project owner.


        **Contract:** scope `project-memberships.write` · bounded write · receipt required · idempotency required.'
      responses:
        '200':
          description: Created or updated project membership.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectMembership'
              example:
                schema: indwel.developer-control-plane.v1
                membershipId: membership_user_42
                organisationId: org_acme
                projectId: project_vendor_risk
                userId: user_42
                role: owner
                lifecycle: active
                revision: 1
                createdAt: '2026-09-01T15:00:00Z'
                updatedAt: '2026-09-01T15:00:00Z'
        '400':
          description: Bad request
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                idempotencyKeyRequired:
                  value:
                    type: https://api.indwel.ai/problems/idempotency-key-required
                    title: Bad request
                    status: 400
                    detail: Idempotency-Key is required for this operation
                    instance: /v1/organisations/org_acme/projects/project_risk/memberships/user_42
                    code: IDEMPOTENCY_KEY_REQUIRED
                    traceId: trace_01J0EXAMPLE
                    retryable: false
                invalidProjectMembershipRole:
                  value:
                    type: https://api.indwel.ai/problems/invalid-project-membership-role
                    title: Bad request
                    status: 400
                    detail: Unsupported project membership role 'operator'
                    instance: /v1/organisations/org_acme/projects/project_risk/memberships/user_42
                    code: INVALID_PROJECT_MEMBERSHIP_ROLE
                    traceId: trace_01J0EXAMPLE
                    retryable: false
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          description: Forbidden
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                projectAuthorityRequired:
                  value:
                    type: https://api.indwel.ai/problems/project-authority-required
                    title: Forbidden
                    status: 403
                    detail: The principal lacks authority for this developer project
                    instance: /v1/organisations/org_acme/projects/project_risk/memberships/user_42
                    code: PROJECT_AUTHORITY_REQUIRED
                    traceId: trace_01J0EXAMPLE
                    retryable: false
        '404':
          description: Not found
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                projectNotFound:
                  value:
                    type: https://api.indwel.ai/problems/project-not-found
                    title: Not found
                    status: 404
                    detail: Project not found
                    instance: /v1/organisations/org_acme/projects/project_risk/memberships/user_42
                    code: PROJECT_NOT_FOUND
                    traceId: trace_01J0EXAMPLE
                    retryable: false
        '409':
          description: Conflict
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                ownerSelfDemotionForbidden:
                  value:
                    type: https://api.indwel.ai/problems/project-owner-self-demotion-forbidden
                    title: Conflict
                    status: 409
                    detail: The project owner cannot demote their own membership
                    instance: /v1/organisations/org_acme/projects/project_risk/memberships/user_42
                    code: PROJECT_OWNER_SELF_DEMOTION_FORBIDDEN
                    traceId: trace_01J0EXAMPLE
                    retryable: false
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - project-memberships.write
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/ProjectId'
      - name: userId
        in: path
        required: true
        schema:
          type: string
          minLength: 1
        description: Target user identifier.
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProjectMembershipUpsertRequest'
            example:
              role: owner
      x-indwel-semantics:
        authority: organisation owner plus project owner
        effect: bounded-write
        idempotency: required
        receipt: required
  /v1/organisations/{organisationId}/projects/{projectId}/clients/{clientId}:bind-issuer:
    post:
      operationId: bindClientToAuthorisedIssuer
      tags:
      - Clients
      summary: Bind a client to the authorized OAuth issuer
      description: 'Binds the selected developer client through Indwel’s configured authorized issuer adapter. The caller
        supplies no issuer and cannot choose or bootstrap a provider relationship. Confidential-client secret material, when
        issued, is returned only in the binding response.


        **Authority:** organization owner plus project owner plus authorized issuer adapter.


        **Contract:** scope `clients.issuer.write` · credential/trust binding · receipt required · idempotency required.'
      responses:
        '201':
          description: Authorized issuer binding receipt.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClientIssuerBindingResponse'
              example:
                data:
                  client:
                    clientId: clien_01J0EXAMPLE
                    organisationId: org_acme
                    projectId: project_vendor_risk
                    environmentId: env_production
                    name: Company Answers Service
                    applicationType: service
                    oauthClientType: confidential
                    grantTypes:
                    - client_credentials
                    tokenEndpointAuthMethod: client_secret_basic
                    redirectUris:
                    - https://example.invalid/resource
                    pkceRequired: true
                    issuerBindingStatus: pending
                    authorizationServerIssuer: https://example.invalid/resource
                    scopes:
                    - runs.read
                    status: pending
                    revision: 1
                    createdAt: '2026-09-01T15:00:00Z'
                    updatedAt: '2026-09-01T15:00:00Z'
                    lastRotatedAt: '2026-09-01T15:00:00Z'
                  credentialId: credential_vendor_portal
                  secret: secret-returned-once
                  issuer: https://example.invalid/resource
                  providerClientReference: issuer-client-vendor-portal
                  boundAt: '2026-09-01T15:00:00Z'
        '400':
          description: Bad request
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                idempotencyKeyRequired:
                  value:
                    type: https://api.indwel.ai/problems/idempotency-key-required
                    title: Bad request
                    status: 400
                    detail: Idempotency-Key is required for this operation
                    instance: /v1/organisations/org_acme/projects/project_risk/clients/client_01:bind-issuer
                    code: IDEMPOTENCY_KEY_REQUIRED
                    traceId: trace_01J0EXAMPLE
                    retryable: false
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          description: Forbidden
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                projectAuthorityRequired:
                  value:
                    type: https://api.indwel.ai/problems/project-authority-required
                    title: Forbidden
                    status: 403
                    detail: The principal lacks authority for this developer project
                    instance: /v1/organisations/org_acme/projects/project_risk/clients/client_01:bind-issuer
                    code: PROJECT_AUTHORITY_REQUIRED
                    traceId: trace_01J0EXAMPLE
                    retryable: false
        '404':
          description: Not found
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                clientNotFound:
                  value:
                    type: https://api.indwel.ai/problems/client-not-found
                    title: Not found
                    status: 404
                    detail: Client not found
                    instance: /v1/organisations/org_acme/projects/project_risk/clients/client_01:bind-issuer
                    code: CLIENT_NOT_FOUND
                    traceId: trace_01J0EXAMPLE
                    retryable: false
        '409':
          description: Conflict
          headers:
            X-Indwel-Trace-Id:
              description: Request correlation identifier.
              schema:
                type: string
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              examples:
                authorisedIssuerUnavailable:
                  value:
                    type: https://api.indwel.ai/problems/authorised-oauth-issuer-unavailable
                    title: Conflict
                    status: 409
                    detail: No authorized OAuth issuer adapter is configured
                    instance: /v1/organisations/org_acme/projects/project_risk/clients/client_01:bind-issuer
                    code: AUTHORISED_OAUTH_ISSUER_UNAVAILABLE
                    traceId: trace_01J0EXAMPLE
                    retryable: false
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - clients.issuer.write
      parameters:
      - $ref: '#/components/parameters/OrganisationId'
      - $ref: '#/components/parameters/ProjectId'
      - $ref: '#/components/parameters/ClientId'
      - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
            example: {}
      x-indwel-semantics:
        authority: organisation owner plus project owner plus authorised issuer adapter
        effect: credential/trust binding
        idempotency: required
        receipt: required
  /sessions:
    get:
      operationId: listSessions
      tags:
      - Conversation & Sessions
      summary: List Sessions
      description: 'Lists the authenticated principal’s customer-safe Session directory. A Session is a bounded interaction/continuity
        segment and is not synonymous with durable Work.


        **Authority:** authenticated human principal and server-persisted Session authority.


        **Contract:** scope `sessions.read`.'
      responses:
        '200':
          description: Authorized Session directory.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SessionDirectoryResponse'
              example:
                ok: true
                sessions:
                - sessionId: 11111111-1111-4111-8111-111111111111
                  createdAt: '2026-09-01T15:00:00Z'
                  updatedAt: '2026-09-01T15:00:00Z'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - sessions.read
      x-indwel-semantics:
        authority: authenticated human principal and server-persisted Session authority
        delegation: user-delegated only; client credentials are not eligible
    patch:
      operationId: updateSessionCompatibilityAlias
      tags:
      - Compatibility
      summary: Update Session metadata (compatibility alias)
      description: 'Compatibility alias for the path-addressed Session mutation. New integrations should use `PATCH /sessions/{sessionId}`.


        **Authority:** authenticated human principal.


        **Contract:** scope `sessions.write`.'
      responses:
        '200':
          description: Updated Session metadata.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SessionMutationResponse'
              example:
                ok: true
                sessionId: 11111111-1111-4111-8111-111111111111
                updatedAt: '2026-09-01T15:00:00Z'
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - sessions.write
      parameters:
      - name: sessionId
        in: query
        required: true
        schema:
          type: string
          format: uuid
        description: Session identity supplied outside the path for the retained alias.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SessionMutationRequest'
            example:
              name: Vendor risk review
      x-indwel-semantics:
        authority: authenticated human principal
        classification: compatibility/convenience; not canonical cognition ontology
      deprecated: true
    delete:
      operationId: deleteSessionCompatibilityAlias
      tags:
      - Compatibility
      summary: Delete a Session (compatibility alias)
      description: 'Compatibility alias for the path-addressed Session deletion. New integrations should use `DELETE /sessions/{sessionId}`.


        **Authority:** authenticated human principal.


        **Contract:** scope `sessions.write`.'
      responses:
        '200':
          description: Session deleted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SessionDeleteResponse'
              example:
                ok: true
                sessionId: 11111111-1111-4111-8111-111111111111
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - sessions.write
      parameters:
      - name: sessionId
        in: query
        required: true
        schema:
          type: string
          format: uuid
        description: Session identity supplied outside the path for the retained alias.
      x-indwel-semantics:
        authority: authenticated human principal
        classification: compatibility/convenience; not canonical cognition ontology
      deprecated: true
  /sessions/{sessionId}:
    patch:
      operationId: updateSession
      tags:
      - Conversation & Sessions
      summary: Update Session metadata
      description: 'Renames or pins/unpins an authorized Session. The source-retained `promote` and `relate` body actions
        are compatibility transitions pending canonical Work representation; they are not first-class SDK mutations.


        **Authority:** authenticated human principal and server-persisted Session authority.


        **Contract:** scope `sessions.write` · bounded metadata write.'
      responses:
        '200':
          description: Updated Session metadata.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SessionMutationResponse'
              example:
                ok: true
                sessionId: 11111111-1111-4111-8111-111111111111
                updatedAt: '2026-09-01T15:00:00Z'
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - sessions.write
      parameters:
      - name: sessionId
        in: path
        required: true
        schema:
          type: string
          format: uuid
        description: Server-issued Session identifier.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SessionMutationRequest'
            example:
              name: Vendor risk review
      x-indwel-semantics:
        authority: authenticated human principal and server-persisted Session authority
        delegation: user-delegated only; client credentials are not eligible
        effect: bounded-metadata-write
    delete:
      operationId: deleteSession
      tags:
      - Conversation & Sessions
      summary: Delete a Session
      description: 'Deletes the authenticated principal’s authorized Session state. Deleting a Session does not grant authority
        over any distinct durable Work resource.


        **Authority:** authenticated human principal and server-persisted Session authority.


        **Contract:** scope `sessions.write` · bounded delete.'
      responses:
        '200':
          description: Session deleted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SessionDeleteResponse'
              example:
                ok: true
                sessionId: 11111111-1111-4111-8111-111111111111
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - sessions.write
      parameters:
      - name: sessionId
        in: path
        required: true
        schema:
          type: string
          format: uuid
        description: Server-issued Session identifier.
      x-indwel-semantics:
        authority: authenticated human principal and server-persisted Session authority
        delegation: user-delegated only; client credentials are not eligible
        effect: bounded-delete
  /sessions/{sessionId}/continuity:
    post:
      operationId: getSessionContinuity
      tags:
      - Conversation & Sessions
      summary: Read settled Session Continuity
      description: 'Returns the already server-settled customer-safe Continuity projection for an authorized Session. Although
        expressed as POST by the current transport, the caller cannot manufacture or upload Continuity state; an optional
        packet identifier is only an identity check.


        **Authority:** authenticated human principal and server-persisted Session authority.


        **Contract:** scope `sessions.read`, `continuity.read`.'
      responses:
        '200':
          description: Customer-safe server-settled Continuity projection.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContinuityResponse'
              example:
                ok: true
                sessionId: 11111111-1111-4111-8111-111111111111
                continuity:
                  packetId: continuity_vendor_review_01
                  state: settled
                  parentSessionId: 11111111-1111-4111-8111-111111111111
                  reasonCodes:
                  - REPRESENTATIVE_REASON
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - sessions.read
        - continuity.read
      parameters:
      - name: sessionId
        in: path
        required: true
        schema:
          type: string
          format: uuid
        description: Server-issued Session identifier.
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ContinuityReadRequest'
            example: {}
      x-indwel-semantics:
        authority: authenticated human principal and server-persisted Session authority
        delegation: user-delegated only; client credentials are not eligible
        continuity: server-settled read projection
  /sessions/{sessionId}/continue:
    post:
      operationId: continueSession
      tags:
      - Conversation & Sessions
      summary: Continue a Session
      description: 'Creates or returns the canonical successor Session from server-settled Continuity authority. The client
        cannot choose the successor identifier or inject Continuity state; retries remain idempotent with respect to an already-established
        successor.


        **Authority:** authenticated human principal and server-persisted Session authority.


        **Contract:** scope `sessions.write`, `continuity.write`.'
      responses:
        '200':
          description: Successor Session and customer-safe Continuity projection.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ContinueSessionResponse'
              example:
                ok: true
                parentSessionId: 11111111-1111-4111-8111-111111111111
                successorSessionId: 11111111-1111-4111-8111-111111111111
                continuity:
                  packetId: continuity_vendor_review_01
                  state: settled
                  parentSessionId: 11111111-1111-4111-8111-111111111111
                  reasonCodes:
                  - REPRESENTATIVE_REASON
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - sessions.write
        - continuity.write
      parameters:
      - name: sessionId
        in: path
        required: true
        schema:
          type: string
          format: uuid
        description: Server-issued Session identifier.
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ContinueSessionRequest'
            example: {}
      x-indwel-semantics:
        authority: authenticated human principal and server-persisted Session authority
        delegation: user-delegated only; client credentials are not eligible
        continuity: server-governed successor transition
        idempotency: successor lineage
  /start:
    post:
      operationId: startSessionCompatibility
      tags:
      - Compatibility
      summary: Start a Conversation Session
      description: 'Launch-supported convenience operation that creates a server-issued Session and settles it as Conversation
        or Work posture. It does not replace canonical durable Work creation through the Work API.


        **Authority:** authenticated human principal.


        **Contract:** scope `sessions.write`.'
      responses:
        '200':
          description: Server-issued compatibility Session.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StartSessionCompatibilityResponse'
              example:
                ok: true
                sessionId: 11111111-1111-4111-8111-111111111111
                name: Vendor risk review
                workPosture: conversation
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - sessions.write
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StartSessionCompatibilityRequest'
            example: {}
      x-indwel-semantics:
        authority: authenticated human principal
        classification: compatibility/convenience; not canonical cognition ontology
  /chat:
    post:
      operationId: chatCompatibility
      tags:
      - Compatibility
      summary: Execute Conversation cognition
      description: 'Launch-supported compatibility cognition transport preserving the established `/chat` response shape while
        execution authority resides in the canonical cognition kernel. This operation does not define canonical Run, receipt,
        Continuity, or long-term developer cognition truth.


        **Authority:** authenticated human principal.


        **Contract:** scope `conversation-cognition.write`.'
      responses:
        '200':
          description: Compatibility Conversation response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConversationChatResponse'
              example:
                ok: true
                sessionId: 11111111-1111-4111-8111-111111111111
                messages:
                - role: user
                  content: The newly admitted evidence does not materially change the current vendor-risk posture.
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '409':
          $ref: '#/components/responses/Problem409'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - conversation-cognition.write
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConversationChatRequest'
            example:
              sessionId: 11111111-1111-4111-8111-111111111111
              prompt: Summarise the newly admitted vendor evidence and identify any material change.
      x-indwel-semantics:
        authority: authenticated human principal
        classification: compatibility/convenience; not canonical cognition ontology
        executionTruth: canonical Run and terminal receipts remain authoritative
  /history:
    get:
      operationId: getSessionHistoryCompatibility
      tags:
      - Compatibility
      summary: Read Session history
      description: 'Launch-supported compatibility projection of settled conversational transcript for a Session. History
        is not Continuity, Work state, Memory, or Run truth.


        **Authority:** authenticated human principal.


        **Contract:** scope `sessions.read`.'
      responses:
        '200':
          description: Canonical settled Session-history projection.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SessionHistoryResponse'
              example:
                ok: true
                contractVersion: indwel.cognitive_session_history_projection.v2
                sourceOfTruth: terminal_settlement_outbox_v2
                sessionId: 11111111-1111-4111-8111-111111111111
                messages:
                - role: user
                  content: The newly admitted evidence does not materially change the current vendor-risk posture.
                quarantinedAssistantCount: 1
        '400':
          $ref: '#/components/responses/Problem400'
        '401':
          $ref: '#/components/responses/Problem401'
        '403':
          $ref: '#/components/responses/Problem403'
        '404':
          $ref: '#/components/responses/Problem404'
        '429':
          $ref: '#/components/responses/Problem429'
        default:
          $ref: '#/components/responses/DefaultProblem'
      security:
      - IndwelOAuth:
        - sessions.read
      parameters:
      - name: sessionId
        in: query
        required: true
        schema:
          type: string
          format: uuid
        description: Server-issued Session identifier.
      x-indwel-semantics:
        authority: authenticated human principal
        classification: compatibility/convenience; not canonical cognition ontology
        sourceOfTruth: terminal settlement outbox projection
components:
  schemas:
    ProblemDetails:
      type: object
      description: RFC 9457-compatible problem details with Indwel extensions.
      required:
      - type
      - title
      - status
      - detail
      - code
      - traceId
      properties:
        type:
          type: string
          format: uri
          example: https://api.indwel.ai/problems/forbidden
        title:
          type: string
          example: Forbidden
        status:
          type: integer
          minimum: 400
          maximum: 599
          example: 403
        detail:
          type: string
          example: The principal lacks authority for this operation.
        instance:
          type: string
          example: /v1/app-templates
        code:
          type: string
          example: FORBIDDEN
        traceId:
          type: string
          example: trace_01J0EXAMPLE
        retryable:
          type: boolean
          default: false
        requiredActions:
          type: array
          items:
            type: object
            additionalProperties: true
      additionalProperties: true
    Service:
      type: object
      required:
      - serviceId
      - name
      - status
      - apiVersions
      properties:
        serviceId:
          type: string
          example: platform
        name:
          type: string
          example: Indwel Platform
        status:
          type: string
          enum:
          - operational
          - degraded
          - unavailable
          example: operational
        apiVersions:
          type: array
          items:
            type: string
          example:
          - v1
        governance:
          type: string
          example: evidence-first
        releaseId:
          type:
          - string
          - 'null'
      additionalProperties: false
    Capability:
      type: object
      required:
      - capabilityId
      - name
      - lifecycle
      - claimStatus
      properties:
        capabilityId:
          type: string
          example: governed-app-templates
        name:
          type: string
          example: Governed app templates
        domain:
          type: string
          example: apps
        lifecycle:
          type: string
          example: preview
        claimStatus:
          type: string
          enum:
          - qualified
          - claimable
          example: claimable
        limitations:
          type: array
          items:
            type: string
      additionalProperties: false
    PlatformRelease:
      type: object
      required:
      - releaseId
      - version
      - releasedAt
      - status
      properties:
        releaseId:
          type: string
          example: release_candidate_001
        version:
          type: string
          example: 0.1.0-design.1
        releasedAt:
          type: string
          format: date-time
          example: '2026-07-23T21:40:00Z'
        status:
          type: string
          enum:
          - candidate
          - released
          - withdrawn
          - superseded
          example: candidate
        summary:
          type: string
        breakingChanges:
          type: array
          items:
            type: string
      additionalProperties: false
    SubscriptionPlan:
      type: object
      required:
      - planKey
      - label
      - seatLimit
      - workspaceLimit
      - supportTier
      properties:
        planKey:
          type: string
          enum:
          - starter
          - team
          - enterprise
          example: team
        label:
          type: string
          example: Team
        seatLimit:
          type: integer
          minimum: 1
          example: 25
        workspaceLimit:
          type: integer
          minimum: 1
          example: 3
        storageBytesLimit:
          type: integer
          minimum: 0
        evidenceBytesLimit:
          type: integer
          minimum: 0
        monthlyRunsLimit:
          type: integer
          minimum: 0
        monthlyTokensLimit:
          type: integer
          minimum: 0
        connectorSyncsLimit:
          type: integer
          minimum: 0
        identityProviderModes:
          type: array
          items:
            type: string
        environments:
          type: array
          items:
            type: string
        auditRetentionDays:
          type: integer
          minimum: 0
        supportTier:
          type: string
          enum:
          - community
          - standard
          - priority
        commercialStatus:
          type: string
          enum:
          - design-candidate
          - available
          - retired
          example: design-candidate
      additionalProperties: false
    AppTemplateLinks:
      type: object
      required:
      - self
      - workflows
      - schemas
      - actionDefinitions
      - policies
      - capabilities
      properties:
        self:
          type: string
        workflows:
          type: string
        schemas:
          type: string
        actionDefinitions:
          type: string
        policies:
          type: string
        capabilities:
          type: string
      additionalProperties: false
    AppTemplate:
      type: object
      required:
      - appTemplateId
      - name
      - description
      - domain
      - lifecycle
      - version
      - links
      properties:
        appTemplateId:
          type: string
          example: contract-review
        name:
          type: string
          example: Contract Review
        description:
          type: string
        domain:
          type: string
          example: legal-operations
        lifecycle:
          type: string
          enum:
          - preview
          - active
          - deprecated
          example: preview
        version:
          type: string
          example: 1.0.0-preview
        defaultWorkflowId:
          type:
          - string
          - 'null'
        supportedRunFields:
          type: array
          items:
            type: string
        requiredArtifacts:
          type: array
          items:
            type: string
        links:
          $ref: '#/components/schemas/AppTemplateLinks'
      additionalProperties: false
    WorkflowDefinition:
      type: object
      required:
      - workflowId
      properties:
        workflowId:
          type: string
          example: review
        name:
          type: string
          example: Review
        description:
          type: string
        lifecycle:
          type: string
          example: preview
        steps:
          type: array
          items:
            type: object
            required:
            - stepId
            - kind
            properties:
              stepId:
                type: string
              kind:
                type: string
              description:
                type: string
            additionalProperties: true
        cognitiveContract:
          $ref: '#/components/schemas/CognitiveContract'
          description: Installed app-specific Cognitive Contract governing this workflow.
      additionalProperties: false
      description: Workflow definition. A Cognitive Contract makes the workflow organizationally governed rather than an unconstrained
        inference process.
    SchemaDefinition:
      type: object
      required:
      - schemaId
      - name
      - schema
      properties:
        schemaId:
          type: string
          example: contract-input
        name:
          type: string
        schema:
          type: object
          description: JSON Schema document
          additionalProperties: true
      additionalProperties: false
    ActionDefinition:
      type: object
      required:
      - actionId
      - effectLevel
      - reviewRequired
      properties:
        actionId:
          type: string
          example: approve-contract
        name:
          type: string
        effectLevel:
          type: string
          enum:
          - read
          - bounded-write
          - external-effect
          - irreversible-effect
        reviewRequired:
          type: boolean
        receiptRequired:
          type: boolean
        providerId:
          type:
          - string
          - 'null'
          description: Installed provider binding for an effectful action. Sandbox production-readiness applications use indwel.sandbox.
        humanAuthorityRequirementId:
          type:
          - string
          - 'null'
          description: Exact current Cognitive Contract human-authority requirement required before a review-gated effect
            may execute.
      additionalProperties: false
      description: Installed action definition. Effectful actions are resolved from the immutable app version and remain subordinate
        to the current Cognitive Contract stage and authority.
    PolicyCollection:
      type: object
      required:
      - appTemplateId
      - policies
      properties:
        appTemplateId:
          type: string
        policies:
          type: array
          items:
            type: object
            required:
            - policyId
            - kind
            - lifecycle
            properties:
              policyId:
                type: string
              kind:
                type: string
              lifecycle:
                type: string
            additionalProperties: true
      additionalProperties: false
    AppTemplateCapabilities:
      type: object
      required:
      - appTemplateId
      - workflowCount
      - schemaCount
      - actionCount
      - lifecycle
      properties:
        appTemplateId:
          type: string
        workflowCount:
          type: integer
          minimum: 0
        schemaCount:
          type: integer
          minimum: 0
        actionCount:
          type: integer
          minimum: 0
        policyCount:
          type: integer
          minimum: 0
        lifecycle:
          type: string
          example: preview
        limitations:
          type: array
          items:
            type: string
      additionalProperties: false
    UserPreferences:
      type: object
      properties:
        locale:
          type: string
          example: en-US
        timezone:
          type: string
          example: America/New_York
        defaultWorkspaceId:
          type:
          - string
          - 'null'
        reducedMotion:
          type: boolean
      additionalProperties: false
    UserAccount:
      type: object
      required:
      - userId
      - displayName
      - preferences
      - revision
      properties:
        userId:
          type: string
          example: user_01J0EXAMPLE
        displayName:
          type: string
          example: Developer
        email:
          type: string
          format: email
          example: developer@example.com
        preferences:
          $ref: '#/components/schemas/UserPreferences'
        revision:
          type: string
          example: rev_0001
      additionalProperties: false
    ServiceListResponse:
      type: object
      required:
      - data
      properties:
        data:
          type: object
          required:
          - items
          properties:
            items:
              type: array
              items:
                $ref: '#/components/schemas/Service'
            nextCursor:
              type:
              - string
              - 'null'
    CapabilityListResponse:
      type: object
      required:
      - data
      properties:
        data:
          type: object
          required:
          - items
          properties:
            items:
              type: array
              items:
                $ref: '#/components/schemas/Capability'
            nextCursor:
              type:
              - string
              - 'null'
    PlatformReleaseListResponse:
      type: object
      required:
      - data
      properties:
        data:
          type: object
          required:
          - items
          properties:
            items:
              type: array
              items:
                $ref: '#/components/schemas/PlatformRelease'
            nextCursor:
              type:
              - string
              - 'null'
    SubscriptionPlanListResponse:
      type: object
      required:
      - data
      properties:
        data:
          type: object
          required:
          - items
          properties:
            items:
              type: array
              items:
                $ref: '#/components/schemas/SubscriptionPlan'
            nextCursor:
              type:
              - string
              - 'null'
    AppTemplateListResponse:
      type: object
      required:
      - data
      properties:
        data:
          type: object
          required:
          - items
          properties:
            items:
              type: array
              items:
                $ref: '#/components/schemas/AppTemplate'
            nextCursor:
              type:
              - string
              - 'null'
    AppTemplateResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/AppTemplate'
    WorkflowListResponse:
      type: object
      required:
      - data
      properties:
        data:
          type: object
          required:
          - items
          properties:
            items:
              type: array
              items:
                $ref: '#/components/schemas/WorkflowDefinition'
            nextCursor:
              type:
              - string
              - 'null'
    WorkflowResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/WorkflowDefinition'
    SchemaDefinitionListResponse:
      type: object
      required:
      - data
      properties:
        data:
          type: object
          required:
          - items
          properties:
            items:
              type: array
              items:
                $ref: '#/components/schemas/SchemaDefinition'
            nextCursor:
              type:
              - string
              - 'null'
    ActionDefinitionListResponse:
      type: object
      required:
      - data
      properties:
        data:
          type: object
          required:
          - items
          properties:
            items:
              type: array
              items:
                $ref: '#/components/schemas/ActionDefinition'
            nextCursor:
              type:
              - string
              - 'null'
    PolicyCollectionResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/PolicyCollection'
    AppTemplateCapabilitiesResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/AppTemplateCapabilities'
    UserAccountResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/UserAccount'
    UserPreferencesResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/UserPreferences'
    Organisation:
      type: object
      required:
      - organisationId
      - name
      - slug
      - lifecycle
      - createdAt
      properties:
        organisationId:
          type: string
          example: organ_01J0EXAMPLE
        name:
          type: string
          example: Acme Holdings
        slug:
          type: string
          example: acme
        lifecycle:
          type: string
          enum:
          - active
          - suspended
          - closed
        createdAt:
          type: string
          format: date-time
      additionalProperties: false
    Workspace:
      type: object
      required:
      - workspaceId
      - organisationId
      - name
      - slug
      - lifecycle
      - createdAt
      properties:
        workspaceId:
          type: string
          example: works_01J0EXAMPLE
        organisationId:
          type: string
        name:
          type: string
          example: Operations
        slug:
          type: string
          example: operations
        lifecycle:
          type: string
          enum:
          - active
          - suspended
          - closed
        createdAt:
          type: string
          format: date-time
      additionalProperties: false
    Project:
      type: object
      required:
      - projectId
      - organisationId
      - name
      - slug
      - lifecycle
      - createdAt
      - updatedAt
      - revision
      properties:
        projectId:
          type: string
          example: proje_01J0EXAMPLE
        organisationId:
          type: string
        name:
          type: string
          example: Company Answers
        slug:
          type: string
          example: company-answers
        description:
          type:
          - string
          - 'null'
        lifecycle:
          type: string
          enum:
          - active
          - suspended
          - archived
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
        revision:
          type: integer
          minimum: 1
      additionalProperties: false
    CreateProjectRequest:
      type: object
      required:
      - name
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 120
        slug:
          type:
          - string
          - 'null'
          pattern: ^[a-z0-9]+(?:-[a-z0-9]+)*$
        description:
          type:
          - string
          - 'null'
          maxLength: 2000
      additionalProperties: false
    Environment:
      type: object
      required:
      - environmentId
      - projectId
      - name
      - slug
      - kind
      - effectMode
      - lifecycle
      - createdAt
      - organisationId
      - revision
      - updatedAt
      properties:
        environmentId:
          type: string
          example: envir_01J0EXAMPLE
        projectId:
          type: string
        name:
          type: string
          example: Reference Sandbox
        slug:
          type: string
          example: reference
        kind:
          type: string
          enum:
          - sandbox
          - development
          - staging
          - production
        effectMode:
          type: string
          enum:
          - simulated
          - controlled
          - live
        lifecycle:
          type: string
          enum:
          - active
          - suspended
          - archived
        createdAt:
          type: string
          format: date-time
        organisationId:
          type: string
        revision:
          type: integer
          minimum: 1
        updatedAt:
          type: string
          format: date-time
      additionalProperties: false
    CreateEnvironmentRequest:
      type: object
      required:
      - name
      - kind
      properties:
        name:
          type: string
          minLength: 1
        slug:
          type:
          - string
          - 'null'
        kind:
          type: string
          enum:
          - sandbox
          - development
          - staging
          - production
        effectMode:
          type: string
          enum:
          - simulated
          - controlled
          - live
          default: simulated
      additionalProperties: false
    Client:
      type: object
      required:
      - clientId
      - organisationId
      - projectId
      - environmentId
      - name
      - applicationType
      - oauthClientType
      - grantTypes
      - tokenEndpointAuthMethod
      - redirectUris
      - pkceRequired
      - issuerBindingStatus
      - authorizationServerIssuer
      - scopes
      - status
      - revision
      - createdAt
      - updatedAt
      - lastRotatedAt
      properties:
        clientId:
          type: string
          example: clien_01J0EXAMPLE
        organisationId:
          type: string
        projectId:
          type: string
        environmentId:
          type: string
        name:
          type: string
          example: Company Answers Service
        applicationType:
          type: string
          enum:
          - service
          - web
          - native
          - browser
        oauthClientType:
          type: string
          enum:
          - confidential
          - public
        grantTypes:
          type: array
          minItems: 1
          uniqueItems: true
          items:
            type: string
            enum:
            - client_credentials
            - authorization_code
        tokenEndpointAuthMethod:
          type: string
          enum:
          - client_secret_basic
          - none
        redirectUris:
          type: array
          uniqueItems: true
          maxItems: 10
          items:
            type: string
            format: uri
        pkceRequired:
          type: boolean
        issuerBindingStatus:
          type: string
          enum:
          - pending
          - active
          - suspended
        authorizationServerIssuer:
          type:
          - string
          - 'null'
          format: uri
        scopes:
          type: array
          items:
            type: string
        status:
          type: string
          enum:
          - pending
          - active
          - revoked
          - expired
        revision:
          type: integer
          minimum: 1
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
        lastRotatedAt:
          type:
          - string
          - 'null'
          format: date-time
      additionalProperties: false
      description: Developer client registration. New clients remain pending and unusable until bound to the authorized OAuth
        issuer.
    CreateClientRequest:
      type: object
      required:
      - name
      - environmentId
      - applicationType
      - scopes
      properties:
        name:
          type: string
          minLength: 1
        environmentId:
          type: string
        applicationType:
          type: string
          enum:
          - service
          - web
          - native
          - browser
        redirectUris:
          type: array
          uniqueItems: true
          maxItems: 10
          items:
            type: string
            format: uri
          description: Required for web, native, and browser clients; prohibited for service clients.
        scopes:
          type: array
          minItems: 1
          uniqueItems: true
          items:
            type: string
      additionalProperties: false
    App:
      type: object
      required:
      - appId
      - projectId
      - name
      - slug
      - lifecycle
      - createdAt
      properties:
        appId:
          type: string
          example: app_01J0EXAMPLE
        projectId:
          type: string
        name:
          type: string
          example: Company Answers
        slug:
          type: string
          example: company-answers
        description:
          type:
          - string
          - 'null'
        archetype:
          type:
          - string
          - 'null'
          example: authoritative-determination
        lifecycle:
          type: string
          enum:
          - active
          - suspended
          - archived
        createdAt:
          type: string
          format: date-time
      additionalProperties: false
    CreateAppRequest:
      type: object
      required:
      - name
      properties:
        name:
          type: string
          minLength: 1
        slug:
          type:
          - string
          - 'null'
        description:
          type:
          - string
          - 'null'
        archetype:
          type:
          - string
          - 'null'
      additionalProperties: false
    PolicyDefinition:
      type: object
      required:
      - policyId
      - kind
      - lifecycle
      properties:
        policyId:
          type: string
        kind:
          type: string
        lifecycle:
          type: string
        configuration:
          type: object
          additionalProperties: true
      additionalProperties: false
    AppManifest:
      type: object
      required:
      - workflows
      - schemas
      - policies
      - actionDefinitions
      properties:
        workflows:
          type: array
          items:
            $ref: '#/components/schemas/WorkflowDefinition'
        schemas:
          type: array
          items:
            $ref: '#/components/schemas/SchemaDefinition'
        policies:
          type: array
          items:
            $ref: '#/components/schemas/PolicyDefinition'
        actionDefinitions:
          type: array
          items:
            $ref: '#/components/schemas/ActionDefinition'
        cognitionProfileRef:
          type:
          - string
          - 'null'
          description: Opaque cognition-profile reference resolved by the platform for the application version.
      additionalProperties: false
      description: Versioned governed-app package. The cognition-profile reference is resolved by the platform under application-version
        authority.
    AppVersionValidationSummary:
      type: object
      required:
      - status
      - issueCount
      properties:
        status:
          type: string
          enum:
          - not-run
          - valid
          - invalid
          description: Persisted App Version validation state. `not-run` exists only before validation has been performed;
            completed validation is `valid` or `invalid`.
        issueCount:
          type: integer
          minimum: 0
      additionalProperties: false
    AppVersion:
      type: object
      required:
      - appVersionId
      - appId
      - version
      - status
      - revision
      - manifestDigest
      - validation
      - createdAt
      properties:
        appVersionId:
          type: string
          example: appve_01J0EXAMPLE
        appId:
          type: string
        version:
          type: string
          example: 1.0.0
        status:
          type: string
          enum:
          - draft
          - validated
          - published
          - rejected
        revision:
          type: string
          example: rev_0001
        manifestDigest:
          type: string
          example: sha256:...
        validation:
          $ref: '#/components/schemas/AppVersionValidationSummary'
        createdAt:
          type: string
          format: date-time
        publishedAt:
          type:
          - string
          - 'null'
          format: date-time
      additionalProperties: false
    CreateAppVersionRequest:
      type: object
      required:
      - version
      - manifest
      properties:
        version:
          type: string
          minLength: 1
        manifest:
          $ref: '#/components/schemas/AppManifest'
      additionalProperties: false
    ValidationIssue:
      type: object
      required:
      - code
      - severity
      - path
      - message
      properties:
        code:
          type: string
          description: Machine-readable validation issue code. Unresolved cognition-profile authority uses `COGNITION_PROFILE_AUTHORITY_UNAVAILABLE`.
        severity:
          type: string
          enum:
          - error
          - warning
          - information
        path:
          type: string
        message:
          type: string
      additionalProperties: false
    AppVersionValidationReport:
      type: object
      required:
      - appVersionId
      - status
      - issues
      - checkedAt
      properties:
        appVersionId:
          type: string
        status:
          type: string
          enum:
          - valid
          - invalid
          description: Completed App Version validation result. Missing or unresolved required authority fails closed as `invalid`.
        issues:
          type: array
          items:
            $ref: '#/components/schemas/ValidationIssue'
        checkedAt:
          type: string
          format: date-time
      additionalProperties: false
    Operation:
      type: object
      required:
      - operationId
      - kind
      - status
      - createdAt
      - updatedAt
      properties:
        operationId:
          type: string
          example: opera_01J0EXAMPLE
        kind:
          type: string
          example: deployment.create
        status:
          type: string
          enum:
          - queued
          - running
          - cancelling
          - succeeded
          - failed
          - cancelled
        targetResourceId:
          type:
          - string
          - 'null'
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
        terminalAt:
          type:
          - string
          - 'null'
          format: date-time
        problem:
          oneOf:
          - $ref: '#/components/schemas/ProblemDetails'
          - type: 'null'
        progressPercent:
          type:
          - number
          - 'null'
          minimum: 0
          maximum: 100
        cancellable:
          type: boolean
        resultResourceId:
          type:
          - string
          - 'null'
        receiptId:
          type:
          - string
          - 'null'
      additionalProperties: false
    CreateDeploymentRequest:
      type: object
      required:
      - appVersionId
      properties:
        appVersionId:
          type: string
        description:
          type:
          - string
          - 'null'
      additionalProperties: false
    Installation:
      type: object
      required:
      - installationId
      - organisationId
      - workspaceId
      - deploymentId
      - permissions
      - status
      - createdAt
      properties:
        installationId:
          type: string
          example: insta_01J0EXAMPLE
        organisationId:
          type: string
        workspaceId:
          type: string
        deploymentId:
          type: string
        permissions:
          type: array
          items:
            type: string
        status:
          type: string
          enum:
          - active
          - suspended
          - removed
        createdAt:
          type: string
          format: date-time
      additionalProperties: false
    CreateInstallationRequest:
      type: object
      required:
      - deploymentId
      - permissions
      properties:
        deploymentId:
          type: string
        permissions:
          type: array
          minItems: 1
          uniqueItems: true
          items:
            type: string
        policyOverrides:
          type: object
          additionalProperties: true
      additionalProperties: false
    Collection:
      type: object
      required:
      - collectionId
      - workspaceId
      - name
      - status
      - createdAt
      properties:
        collectionId:
          type: string
          example: colle_01J0EXAMPLE
        workspaceId:
          type: string
        name:
          type: string
        description:
          type:
          - string
          - 'null'
        status:
          type: string
          enum:
          - active
          - suspended
          - archived
        custodyPolicyId:
          type:
          - string
          - 'null'
        createdAt:
          type: string
          format: date-time
      additionalProperties: false
    CreateCollectionRequest:
      type: object
      required:
      - name
      properties:
        name:
          type: string
          minLength: 1
        description:
          type:
          - string
          - 'null'
        custodyPolicyId:
          type:
          - string
          - 'null'
      additionalProperties: false
    SourceCustody:
      type: object
      required:
      - classification
      - authorityClass
      properties:
        classification:
          type: string
          example: internal-policy
        authorityClass:
          type: string
          example: governing-policy
        effectiveAt:
          type:
          - string
          - 'null'
          format: date-time
        retentionPolicyId:
          type:
          - string
          - 'null'
      additionalProperties: false
    UploadInstructions:
      type: object
      required:
      - method
      - url
      - headers
      - expiresAt
      properties:
        method:
          type: string
          enum:
          - PUT
        url:
          type: string
          format: uri
        headers:
          type: object
          additionalProperties:
            type: string
        expiresAt:
          type: string
          format: date-time
      additionalProperties: false
      description: Short-lived direct-upload instructions. The URL is sensitive and omitted from ordinary Source reads.
    Source:
      type: object
      required:
      - sourceId
      - collectionId
      - name
      - mediaType
      - status
      - custody
      - createdAt
      properties:
        sourceId:
          type: string
          example: sourc_01J0EXAMPLE
        collectionId:
          type: string
        name:
          type: string
        mediaType:
          type: string
          example: application/pdf
        sizeBytes:
          type:
          - integer
          - 'null'
          minimum: 0
        sha256:
          type:
          - string
          - 'null'
        status:
          type: string
          enum:
          - awaiting-upload
          - uploaded
          - ingesting
          - ready
          - failed
        custody:
          $ref: '#/components/schemas/SourceCustody'
        createdAt:
          type: string
          format: date-time
      additionalProperties: false
    CreateSourceRequest:
      type: object
      required:
      - name
      - mediaType
      - custody
      properties:
        name:
          type: string
          minLength: 1
        mediaType:
          type: string
        sizeBytes:
          type:
          - integer
          - 'null'
          minimum: 0
        sha256:
          type:
          - string
          - 'null'
        custody:
          $ref: '#/components/schemas/SourceCustody'
      additionalProperties: false
    SourceCreateResult:
      type: object
      required:
      - source
      - upload
      properties:
        source:
          $ref: '#/components/schemas/Source'
        upload:
          $ref: '#/components/schemas/UploadInstructions'
      additionalProperties: false
    Ingestion:
      type: object
      required:
      - ingestionId
      - sourceId
      - status
      - evidenceReady
      - createdAt
      properties:
        ingestionId:
          type: string
          example: inges_01J0EXAMPLE
        sourceId:
          type: string
        status:
          type: string
          enum:
          - queued
          - processing
          - ready
          - failed
          - cancelled
        operationId:
          type:
          - string
          - 'null'
        evidenceReady:
          type: boolean
        createdAt:
          type: string
          format: date-time
        completedAt:
          type:
          - string
          - 'null'
          format: date-time
        problem:
          oneOf:
          - $ref: '#/components/schemas/ProblemDetails'
          - type: 'null'
      additionalProperties: false
    CreateIngestionRequest:
      type: object
      required: []
      properties:
        parserProfile:
          type:
          - string
          - 'null'
        language:
          type:
          - string
          - 'null'
        options:
          type: object
          additionalProperties: true
      additionalProperties: false
    Case:
      type: object
      required:
      - caseId
      - workspaceId
      - installationId
      - workflowId
      - status
      - input
      - revision
      - createdAt
      properties:
        caseId:
          type: string
          example: case_01J0EXAMPLE
        workspaceId:
          type: string
        installationId:
          type: string
        workflowId:
          type: string
        title:
          type:
          - string
          - 'null'
        externalReference:
          type:
          - string
          - 'null'
        status:
          type: string
          enum:
          - open
          - closed
          - cancelled
        input:
          type: object
          additionalProperties: true
        revision:
          type: string
        createdAt:
          type: string
          format: date-time
      additionalProperties: false
    CreateCaseRequest:
      type: object
      required:
      - installationId
      - workflowId
      - input
      properties:
        installationId:
          type: string
        workflowId:
          type: string
        title:
          type:
          - string
          - 'null'
        externalReference:
          type:
          - string
          - 'null'
        input:
          type: object
          additionalProperties: true
      additionalProperties: false
    OrganisationListResponse:
      type: object
      required:
      - data
      properties:
        data:
          type: object
          required:
          - items
          properties:
            items:
              type: array
              items:
                $ref: '#/components/schemas/Organisation'
            nextCursor:
              type:
              - string
              - 'null'
          additionalProperties: false
      additionalProperties: false
    WorkspaceListResponse:
      type: object
      required:
      - data
      properties:
        data:
          type: object
          required:
          - items
          properties:
            items:
              type: array
              items:
                $ref: '#/components/schemas/Workspace'
            nextCursor:
              type:
              - string
              - 'null'
          additionalProperties: false
      additionalProperties: false
    ProjectResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/Project'
      additionalProperties: false
    EnvironmentResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/Environment'
      additionalProperties: false
    AppResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/App'
      additionalProperties: false
    AppVersionResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/AppVersion'
      additionalProperties: false
    AppVersionValidationReportResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/AppVersionValidationReport'
      additionalProperties: false
    OperationResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/Operation'
      additionalProperties: false
    InstallationResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/Installation'
      additionalProperties: false
    CollectionResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/Collection'
      additionalProperties: false
    SourceCreateResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/SourceCreateResult'
      additionalProperties: false
    IngestionResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/Ingestion'
      additionalProperties: false
    CaseResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/Case'
      additionalProperties: false
    EventDestination:
      type: object
      required:
      - eventDestinationId
      - projectId
      - environmentId
      - url
      - eventTypes
      - status
      - signingAlgorithm
      - createdAt
      properties:
        eventDestinationId:
          type: string
          example: event_01J0EXAMPLE
        projectId:
          type: string
        environmentId:
          type: string
        url:
          type: string
          format: uri
        eventTypes:
          type: array
          minItems: 1
          items:
            type: string
        apiVersion:
          type: string
          example: '2026-07-23'
        status:
          enum:
          - active
          - paused
          - failing
          - disabled
        signingAlgorithm:
          enum:
          - hmac-sha256
        secretLastRotatedAt:
          type:
          - string
          - 'null'
          format: date-time
        createdAt:
          type: string
          format: date-time
      additionalProperties: false
    CreateEventDestinationRequest:
      type: object
      required:
      - environmentId
      - url
      - eventTypes
      properties:
        environmentId:
          type: string
        url:
          type: string
          format: uri
        eventTypes:
          type: array
          minItems: 1
          items:
            type: string
        apiVersion:
          type: string
        description:
          type:
          - string
          - 'null'
      additionalProperties: false
    EventDestinationResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/EventDestination'
      additionalProperties: false
    SendTestEventRequest:
      type: object
      required:
      - eventType
      properties:
        eventType:
          type: string
          example: indwel.test.v1
        payload:
          type: object
          additionalProperties: true
      additionalProperties: false
    Delivery:
      type: object
      required:
      - deliveryId
      - eventDestinationId
      - eventId
      - attemptNumber
      - status
      - createdAt
      properties:
        deliveryId:
          type: string
          example: deliv_01J0EXAMPLE
        eventDestinationId:
          type: string
        eventId:
          type: string
        originalDeliveryId:
          type:
          - string
          - 'null'
        attemptNumber:
          type: integer
          minimum: 1
        status:
          enum:
          - queued
          - delivering
          - succeeded
          - failed
          - dead-lettered
        responseStatus:
          type:
          - integer
          - 'null'
          minimum: 100
          maximum: 599
        latencyMs:
          type:
          - integer
          - 'null'
          minimum: 0
        nextAttemptAt:
          type:
          - string
          - 'null'
          format: date-time
        createdAt:
          type: string
          format: date-time
      additionalProperties: false
    DeliveryResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/Delivery'
      additionalProperties: false
    DeliveryListResponse:
      type: object
      required:
      - data
      properties:
        data:
          type: object
          required:
          - items
          properties:
            items:
              type: array
              items:
                $ref: '#/components/schemas/Delivery'
            nextCursor:
              type:
              - string
              - 'null'
          additionalProperties: false
      additionalProperties: false
    ReplayDeliveryRequest:
      type: object
      required: []
      properties:
        reason:
          type:
          - string
          - 'null'
      additionalProperties: false
    Quota:
      type: object
      required:
      - quotaId
      - metric
      - limit
      - used
      - reserved
      - remaining
      - periodStart
      - periodEnd
      properties:
        quotaId:
          type: string
        metric:
          type: string
          example: governed_runs
        limit:
          type: number
          minimum: 0
        used:
          type: number
          minimum: 0
        reserved:
          type: number
          minimum: 0
        remaining:
          type: number
          minimum: 0
        unit:
          type: string
          example: runs
        periodStart:
          type: string
          format: date-time
        periodEnd:
          type: string
          format: date-time
      additionalProperties: false
    QuotaSetResponse:
      type: object
      required:
      - data
      properties:
        data:
          type: object
          required:
          - items
          properties:
            items:
              type: array
              items:
                $ref: '#/components/schemas/Quota'
            nextCursor:
              type:
              - string
              - 'null'
          additionalProperties: false
      additionalProperties: false
    UsageRecord:
      type: object
      required:
      - usageRecordId
      - projectId
      - metric
      - quantity
      - unit
      - occurredAt
      properties:
        usageRecordId:
          type: string
        projectId:
          type: string
        environmentId:
          type:
          - string
          - 'null'
        metric:
          type: string
        quantity:
          type: number
          minimum: 0
        unit:
          type: string
        costClass:
          type:
          - string
          - 'null'
        releaseId:
          type:
          - string
          - 'null'
        occurredAt:
          type: string
          format: date-time
      additionalProperties: false
    UsageRecordListResponse:
      type: object
      required:
      - data
      properties:
        data:
          type: object
          required:
          - items
          properties:
            items:
              type: array
              items:
                $ref: '#/components/schemas/UsageRecord'
            nextCursor:
              type:
              - string
              - 'null'
          additionalProperties: false
      additionalProperties: false
    ActivityEvent:
      type: object
      required:
      - activityEventId
      - projectId
      - type
      - summary
      - occurredAt
      properties:
        activityEventId:
          type: string
        projectId:
          type: string
        type:
          type: string
        actor:
          type:
          - string
          - 'null'
        resourceId:
          type:
          - string
          - 'null'
        summary:
          type: string
        occurredAt:
          type: string
          format: date-time
      additionalProperties: false
    ActivityEventListResponse:
      type: object
      required:
      - data
      properties:
        data:
          type: object
          required:
          - items
          properties:
            items:
              type: array
              items:
                $ref: '#/components/schemas/ActivityEvent'
            nextCursor:
              type:
              - string
              - 'null'
          additionalProperties: false
      additionalProperties: false
    CancelOperationRequest:
      type: object
      required: []
      properties:
        reason:
          type:
          - string
          - 'null'
      additionalProperties: false
    RollbackDeploymentRequest:
      type: object
      required: []
      properties:
        targetDeploymentId:
          type:
          - string
          - 'null'
        reason:
          type:
          - string
          - 'null'
      additionalProperties: false
    RotateCredentialRequest:
      type: object
      required: []
      properties:
        overlapSeconds:
          type: integer
          minimum: 0
          maximum: 86400
        expiresAt:
          type:
          - string
          - 'null'
          format: date-time
      additionalProperties: false
    CredentialRotationReceipt:
      type: object
      required:
      - credentialId
      - clientId
      - secret
      - rotatedAt
      properties:
        credentialId:
          type: string
        clientId:
          type: string
        secret:
          type: string
          writeOnly: true
        rotatedAt:
          type: string
          format: date-time
        previousCredentialValidUntil:
          type:
          - string
          - 'null'
          format: date-time
        expiresAt:
          type:
          - string
          - 'null'
          format: date-time
      additionalProperties: false
    CredentialRotationReceiptResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/CredentialRotationReceipt'
      additionalProperties: false
    RotateEventDestinationSecretRequest:
      type: object
      required: []
      properties:
        overlapSeconds:
          type: integer
          minimum: 0
          maximum: 86400
      additionalProperties: false
    EventDestinationSecretRotationReceipt:
      type: object
      required:
      - eventDestinationId
      - signingSecret
      - rotatedAt
      properties:
        eventDestinationId:
          type: string
        signingSecret:
          type: string
          writeOnly: true
        rotatedAt:
          type: string
          format: date-time
        previousSecretValidUntil:
          type:
          - string
          - 'null'
          format: date-time
      additionalProperties: false
    EventDestinationSecretRotationReceiptResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/EventDestinationSecretRotationReceipt'
      additionalProperties: false
    ServiceResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/Service'
      additionalProperties: false
    Credential:
      type: object
      required:
      - credentialId
      - organisationId
      - projectId
      - clientId
      - status
      - revision
      - createdAt
      - updatedAt
      - expiresAt
      - validUntil
      properties:
        credentialId:
          type: string
        organisationId:
          type: string
        projectId:
          type: string
        clientId:
          type: string
        status:
          type: string
          enum:
          - active
          - overlap
          - revoked
          - expired
        revision:
          type: integer
          minimum: 1
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
        expiresAt:
          type:
          - string
          - 'null'
          format: date-time
        validUntil:
          type:
          - string
          - 'null'
          format: date-time
      additionalProperties: false
      description: Credential metadata. Secret hashes and plaintext material are never exposed.
    ProjectList:
      type: object
      required:
      - items
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/Project'
        nextCursor:
          type:
          - string
          - 'null'
      additionalProperties: false
    ProjectListResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/ProjectList'
      additionalProperties: false
    EnvironmentList:
      type: object
      required:
      - items
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/Environment'
        nextCursor:
          type:
          - string
          - 'null'
      additionalProperties: false
    EnvironmentListResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/EnvironmentList'
      additionalProperties: false
    ClientList:
      type: object
      required:
      - items
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/Client'
        nextCursor:
          type:
          - string
          - 'null'
      additionalProperties: false
    ClientListResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/ClientList'
      additionalProperties: false
    CredentialList:
      type: object
      required:
      - items
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/Credential'
        nextCursor:
          type:
          - string
          - 'null'
      additionalProperties: false
    CredentialListResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/CredentialList'
      additionalProperties: false
    ClientResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/Client'
      additionalProperties: false
    CredentialResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/Credential'
      additionalProperties: false
    ClientRegistrationReceipt:
      type: object
      required:
      - client
      - secret
      - secretDisplay
      - registeredAt
      - credentialId
      - pkceRequired
      - issuerBindingStatus
      properties:
        client:
          $ref: '#/components/schemas/Client'
        secret:
          type: 'null'
          readOnly: true
          description: No OAuth credential is issued before provider binding.
        secretDisplay:
          type: string
          enum:
          - not-issued-pending-issuer-binding
        registeredAt:
          type: string
          format: date-time
        credentialId:
          type: 'null'
          readOnly: true
        pkceRequired:
          type: boolean
        issuerBindingStatus:
          type: string
          enum:
          - pending
      additionalProperties: false
      description: Client registration receipt. The client cannot authenticate until an authorized OAuth issuer binding is
        completed.
    ClientRegistrationReceiptResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/ClientRegistrationReceipt'
      additionalProperties: false
    CreateRunPlanRequest:
      type: object
      additionalProperties: false
      required:
      - sessionId
      - prompt
      - mode
      - routeTemplateId
      properties:
        sessionId:
          type: string
          minLength: 1
        prompt:
          type: string
          minLength: 1
          maxLength: 100000
        history:
          type: array
          maxItems: 200
          items:
            type: object
        mode:
          type: string
          minLength: 1
        routeTemplateId:
          type: string
          minLength: 1
    RunPlan:
      type: object
      required:
      - planId
      - caseId
      - caseRevision
      - installationId
      - workflowId
      - sessionId
      - promptDigest
      - requestedModeId
      - routeTemplateId
      - previewContractHash
      - previewAdmissionSnapshotDigest
      - executionBasisDigest
      - status
      - createdAt
      properties:
        planId:
          type: string
        caseId:
          type: string
        caseRevision:
          type: integer
          minimum: 1
        installationId:
          type: string
        workflowId:
          type: string
        sessionId:
          type: string
        promptDigest:
          type: string
        requestedModeId:
          type: string
        routeTemplateId:
          type: string
        previewContractHash:
          type: string
        previewAdmissionSnapshotDigest:
          type: string
        executionBasisDigest:
          type: string
        status:
          type: string
          const: admitted
        createdAt:
          type: string
          format: date-time
    RunPlanResponse:
      type: object
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/RunPlan'
    CreateRunRequest:
      type: object
      additionalProperties: false
      required:
      - planId
      - prompt
      properties:
        planId:
          type: string
          minLength: 1
        prompt:
          type: string
          minLength: 1
          maxLength: 100000
        history:
          type: array
          maxItems: 200
          items:
            type: object
    RunEvidenceItem:
      type: object
      required:
      - evidenceId
      - disposition
      properties:
        evidenceId:
          type: string
        disposition:
          type: string
          enum:
          - admitted
          - suppressed
          - unsupported
        canonicalIdentity:
          type: string
        provenanceReference:
          type: string
        reasonCode:
          type: string
    RunEvidenceListResponse:
      type: object
      required:
      - data
      properties:
        data:
          type: object
          required:
          - runId
          - caseId
          - sourceOfTruth
          - renderManifestId
          - renderManifestDigest
          - items
          properties:
            runId:
              type: string
            caseId:
              type: string
            sourceOfTruth:
              type: string
            renderManifestId:
              type: string
            renderManifestDigest:
              type: string
            items:
              type: array
              items:
                $ref: '#/components/schemas/RunEvidenceItem'
    CognitiveContractEvidenceRequirement:
      type: object
      required:
      - requirementId
      - acceptedSources
      properties:
        requirementId:
          type: string
          minLength: 1
          description: Stable requirement identity within the installed Cognitive Contract.
        acceptedSources:
          type: array
          minItems: 1
          uniqueItems: true
          items:
            type: string
            enum:
            - evidence-firewall
            - awa
            - rag
            - deterministic-evaluator
            - operator-evidence
          description: Evidence evaluator classes admitted by this exact requirement.
      additionalProperties: false
    CognitiveContractHumanAuthorityRequirement:
      type: object
      required:
      - requirementId
      - authorityClass
      properties:
        requirementId:
          type: string
          minLength: 1
        authorityClass:
          type: string
          minLength: 1
          description: Organization-defined authority class required for this business transition.
        eligibleTenantRoles:
          type: array
          uniqueItems: true
          items:
            type: string
            enum:
            - viewer
            - auditor
            - analyst
            - developer
            - operator
            - admin
            - owner
          description: Tenant roles eligible to satisfy this authority requirement; runtime still evaluates the exact actor
            and current Case authority.
        decisionPolicy:
          type: string
          enum:
          - single-authority
          description: Supported settlement policy for the human authority requirement.
      additionalProperties: false
    CognitiveContractTransition:
      type: object
      required:
      - transitionId
      - fromStage
      - toStage
      - evidenceRequirements
      - humanAuthorityRequirements
      properties:
        transitionId:
          type: string
          minLength: 1
        fromStage:
          type: string
          minLength: 1
        toStage:
          type: string
          minLength: 1
        evidenceRequirements:
          type: array
          items:
            $ref: '#/components/schemas/CognitiveContractEvidenceRequirement'
        humanAuthorityRequirements:
          type: array
          items:
            $ref: '#/components/schemas/CognitiveContractHumanAuthorityRequirement'
      additionalProperties: false
    CognitiveContract:
      type: object
      required:
      - schema
      - contractId
      - version
      - initialStage
      - transitions
      properties:
        schema:
          type: string
          enum:
          - indwel.cognitive-contract.v1
        contractId:
          type: string
          minLength: 1
          description: Immutable application-specific Cognitive Contract identity.
        version:
          type: string
          minLength: 1
          description: Contract version retained by Cases created from the installed app version.
        initialStage:
          type: string
          minLength: 1
          description: Initial governed business stage for Cases using this workflow.
        transitions:
          type: array
          minItems: 1
          items:
            $ref: '#/components/schemas/CognitiveContractTransition'
          description: Stage transitions whose evidence and human-authority requirements govern settlement.
      additionalProperties: false
      description: Application-specific organizational law installed inside Indwel's non-negotiable Cognitive Constitution.
        It constrains what evidence, human authority and business transitions may settle the workflow.
    ReferenceEnvelope:
      type: object
      additionalProperties: true
      description: Authenticated Indwel API response envelope. Individual resources define the data projection.
    WorkDocketProjection:
      type: object
      additionalProperties: false
      required:
      - workId
      - title
      - lifecycle
      - tenantId
      - workspaceId
      properties:
        workId:
          type: string
        title:
          type: string
        lifecycle:
          type: string
        posture:
          type: string
        sensitivity:
          type: string
        tenantId:
          type: string
        workspaceId:
          type: string
        portfolioId:
          type: string
        teamIds:
          type: array
          items:
            type: string
        updatedAt:
          type: string
          format: date-time
        relationship:
          type: string
          enum:
          - depends_on
          - blocks
          - supersedes
          - related
          - derived_from
          - portfolio_peer
      description: Least-privilege Work docket projection returned only after backend tenant/workspace authority is applied.
    WorkListResponse:
      type: object
      additionalProperties: false
      required:
      - data
      properties:
        data:
          type: object
          additionalProperties: false
          required:
          - items
          - count
          properties:
            items:
              type: array
              items:
                $ref: '#/components/schemas/WorkDocketProjection'
            count:
              type: integer
              minimum: 0
    WorkResidualState:
      type: object
      additionalProperties: false
      required:
      - unsatisfiedCriterionIds
      - unresolvedQuestionIds
      - blockerIds
      - frontierItemIds
      properties:
        unsatisfiedCriterionIds:
          type: array
          items:
            type: string
        unresolvedQuestionIds:
          type: array
          items:
            type: string
        blockerIds:
          type: array
          items:
            type: string
        frontierItemIds:
          type: array
          items:
            type: string
    WorkStatusProjection:
      type: object
      additionalProperties: false
      required:
      - schema
      - workId
      - title
      - tenantId
      - workspaceId
      - lifecycle
      - posture
      - docketRevision
      - progressRevision
      - residuals
      - settlementCandidate
      - settlementReasonCodes
      - legalNextActions
      - updatedAt
      properties:
        schema:
          type: string
          const: indwel.work_status_projection.v1
        workId:
          type: string
        title:
          type: string
        tenantId:
          type: string
        workspaceId:
          type: string
        portfolioId:
          type: string
        lifecycle:
          type: string
          enum:
          - proposed
          - active
          - paused
          - review
          - closed
        posture:
          type: string
        docketRevision:
          type: integer
          minimum: 1
        progressRevision:
          type: integer
          minimum: 1
        residuals:
          $ref: '#/components/schemas/WorkResidualState'
        settlementCandidate:
          type: boolean
        settlementReasonCodes:
          type: array
          items:
            type: string
        legalNextActions:
          type: array
          items:
            type: string
        updatedAt:
          type: string
          format: date-time
    WorkSettlementReceipt:
      type: object
      additionalProperties: false
      required:
      - schema
      - receiptId
      - workId
      - disposition
      - closedAt
      - closedBy
      - docketRevision
      - progressRevision
      - residuals
      - evidenceRefs
      - decisionRefs
      - sourceReceiptIds
      - status
      - reasonCodes
      - digest
      properties:
        schema:
          type: string
          const: indwel.work_settlement_receipt.v1
        receiptId:
          type: string
        workId:
          type: string
        disposition:
          type: string
          enum:
          - satisfied
          - best_effort
          - blocked
          - exhausted
          - abandoned
          - superseded
        closedAt:
          type: string
          format: date-time
        closedBy:
          type: string
        docketRevision:
          type: integer
          minimum: 1
        progressRevision:
          type: integer
          minimum: 1
        residuals:
          $ref: '#/components/schemas/WorkResidualState'
        evidenceRefs:
          type: array
          items:
            type: string
        decisionRefs:
          type: array
          items:
            type: string
        sourceReceiptIds:
          type: array
          items:
            type: string
        residualRisk:
          type: string
          enum:
          - none
          - low
          - medium
          - high
        status:
          type: string
          enum:
          - settled
          - settled_with_residuals
        reasonCodes:
          type: array
          items:
            type: string
        digest:
          type: string
    WorkStatusResponse:
      type: object
      additionalProperties: false
      required:
      - data
      properties:
        data:
          type: object
          additionalProperties: false
          required:
          - status
          - settlementReceipt
          properties:
            status:
              $ref: '#/components/schemas/WorkStatusProjection'
            settlementReceipt:
              oneOf:
              - $ref: '#/components/schemas/WorkSettlementReceipt'
              - type: 'null'
    WorkProjectionResponse:
      type: object
      additionalProperties: false
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/WorkStatusProjection'
    WorkSettlementResponse:
      type: object
      additionalProperties: false
      required:
      - data
      properties:
        data:
          type: object
          additionalProperties: false
          required:
          - status
          - receipt
          properties:
            status:
              $ref: '#/components/schemas/WorkStatusProjection'
            receipt:
              $ref: '#/components/schemas/WorkSettlementReceipt'
    WorkPortfolioSummary:
      type: object
      additionalProperties: false
      required:
      - portfolioId
      - workCount
      - lifecycleCounts
      - postureCounts
      - blockedWorkIds
      - settlementCandidateWorkIds
      - lastUpdatedAt
      - workIds
      properties:
        portfolioId:
          type: string
        workCount:
          type: integer
          minimum: 0
        lifecycleCounts:
          type: object
          additionalProperties:
            type: integer
            minimum: 0
        postureCounts:
          type: object
          additionalProperties:
            type: integer
            minimum: 0
        blockedWorkIds:
          type: array
          items:
            type: string
        settlementCandidateWorkIds:
          type: array
          items:
            type: string
        lastUpdatedAt:
          oneOf:
          - type: string
            format: date-time
          - type: 'null'
        workIds:
          type: array
          items:
            type: string
    WorkPortfolioProjection:
      type: object
      additionalProperties: false
      required:
      - schema
      - tenantId
      - principalId
      - visibleWorkCount
      - portfolios
      - reasonCodes
      properties:
        schema:
          type: string
          const: indwel.work_portfolio_projection.v1
        tenantId:
          type: string
        principalId:
          type: string
        visibleWorkCount:
          type: integer
          minimum: 0
        portfolios:
          type: array
          items:
            $ref: '#/components/schemas/WorkPortfolioSummary'
        reasonCodes:
          type: array
          items:
            type: string
    WorkPortfolioResponse:
      type: object
      additionalProperties: false
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/WorkPortfolioProjection'
    WorkEconomicAttributionLine:
      type: object
      additionalProperties: false
      required:
      - id
      - machineCostMicros
      - terminalInferenceRuns
      - unpricedTerminalRuns
      - unpricedPhysicalAttempts
      - humanEngagementEvents
      properties:
        id:
          type: string
        machineCostMicros:
          type: integer
          minimum: 0
        terminalInferenceRuns:
          type: integer
          minimum: 0
        unpricedTerminalRuns:
          type: integer
          minimum: 0
        unpricedPhysicalAttempts:
          type: integer
          minimum: 0
        humanEngagementEvents:
          type: integer
          minimum: 0
    WorkEconomicsProjection:
      type: object
      additionalProperties: false
      required:
      - schema
      - tenantId
      - workId
      - workspaceIds
      - currency
      - truthClass
      - machineCostMicros
      - terminalInferenceRuns
      - unpricedTerminalRuns
      - unpricedPhysicalAttempts
      - humanEngagementEvents
      - byUser
      - byTeam
      - unallocatedUserMachineCostMicros
      - unallocatedTeamMachineCostMicros
      - sourceEventIds
      - reasonCodes
      properties:
        schema:
          type: string
          const: indwel.work_economics_projection.v1
        tenantId:
          type: string
        workId:
          type: string
        workspaceIds:
          type: array
          items:
            type: string
        currency:
          type: string
          const: USD
        truthClass:
          type: string
          enum:
          - provider_priced_settlement
          - unavailable
        machineCostMicros:
          oneOf:
          - type: integer
            minimum: 0
          - type: 'null'
        terminalInferenceRuns:
          type: integer
          minimum: 0
        unpricedTerminalRuns:
          type: integer
          minimum: 0
        unpricedPhysicalAttempts:
          type: integer
          minimum: 0
        humanEngagementEvents:
          type: integer
          minimum: 0
        byUser:
          type: array
          items:
            $ref: '#/components/schemas/WorkEconomicAttributionLine'
        byTeam:
          type: array
          items:
            $ref: '#/components/schemas/WorkEconomicAttributionLine'
        unallocatedUserMachineCostMicros:
          type: integer
          minimum: 0
        unallocatedTeamMachineCostMicros:
          type: integer
          minimum: 0
        sourceEventIds:
          type: array
          items:
            type: string
        reasonCodes:
          type: array
          items:
            type: string
    WorkEconomicsProvenance:
      type: object
      additionalProperties: false
      description: Customer-safe provenance for Work economics. Storage topology remains behind the API boundary.
      required:
      - schemaVersion
      - authority
      - complete
      - eventCount
      - reasonCodes
      properties:
        schemaVersion:
          type: string
          const: indwel.work_economics_provenance.v1
        authority:
          type: string
          const: unified-system-ledger
        complete:
          type: boolean
        eventCount:
          type: integer
          minimum: 0
        reasonCodes:
          type: array
          items:
            type: string
    WorkEconomicsResponse:
      type: object
      additionalProperties: false
      required:
      - data
      properties:
        data:
          type: object
          additionalProperties: false
          required:
          - projection
          - provenance
          properties:
            projection:
              $ref: '#/components/schemas/WorkEconomicsProjection'
            provenance:
              $ref: '#/components/schemas/WorkEconomicsProvenance'
    WorkCreateRequest:
      type: object
      additionalProperties: false
      required:
      - title
      - workspaceId
      properties:
        workId:
          type: string
          description: Optional caller-supplied durable Work identifier; when omitted the backend creates one.
        title:
          type: string
          minLength: 1
        displayName:
          type: string
        description:
          type: string
        workspaceId:
          type: string
          minLength: 1
        portfolioId:
          type: string
        contractIds:
          type: array
          items:
            type: string
        teamIds:
          type: array
          items:
            type: string
        objectiveIds:
          type: array
          items:
            type: string
        successCriterionIds:
          type: array
          items:
            type: string
        materialQuestionIds:
          type: array
          items:
            type: string
    WorkUpdateRequest:
      type: object
      additionalProperties: false
      required:
      - expectedRevision
      properties:
        expectedRevision:
          type: integer
          minimum: 1
        title:
          type: string
        displayName:
          type: string
        description:
          type: string
        portfolioId:
          type: string
        addTeamIds:
          type: array
          items:
            type: string
        addParticipantPrincipalIds:
          type: array
          items:
            type: string
        addConversationIds:
          type: array
          items:
            type: string
        addSessionIds:
          type: array
          items:
            type: string
        addContractIds:
          type: array
          items:
            type: string
        addObjectiveIds:
          type: array
          items:
            type: string
        lifecycle:
          type: string
          enum:
          - proposed
          - active
          - paused
          - review
    WorkAdvanceRequest:
      type: object
      additionalProperties: false
      required:
      - expectedProgressRevision
      - kind
      - summary
      properties:
        expectedProgressRevision:
          type: integer
          minimum: 1
        actId:
          type: string
        at:
          type: string
          format: date-time
        kind:
          type: string
          enum:
          - criterion_satisfied
          - question_resolved
          - evidence_admitted
          - decision_settled
          - step_completed
          - blocker_removed
          - deliverable_changed
          - approval_granted
          - frontier_changed
        summary:
          type: string
          minLength: 1
        receiptIds:
          type: array
          items:
            type: string
        satisfiedCriterionIds:
          type: array
          items:
            type: string
        resolvedQuestionIds:
          type: array
          items:
            type: string
        blockerIds:
          type: array
          items:
            type: string
        removeBlockerIds:
          type: array
          items:
            type: string
        decisionIds:
          type: array
          items:
            type: string
        settledDecisionIds:
          type: array
          items:
            type: string
        frontierItemIds:
          type: array
          items:
            type: string
        posture:
          type: string
          enum:
          - advancing
          - steady
          - blocked
          - decision_ready
          - settlement_candidate
    WorkSettleRequest:
      type: object
      additionalProperties: false
      required:
      - expectedDocketRevision
      - disposition
      - summary
      properties:
        expectedDocketRevision:
          type: integer
          minimum: 1
        disposition:
          type: string
          enum:
          - satisfied
          - best_effort
          - blocked
          - exhausted
          - abandoned
          - superseded
        summary:
          type: string
          minLength: 1
        objectiveId:
          type: string
        satisfiedCriterionIds:
          type: array
          items:
            type: string
        unsatisfiedCriterionIds:
          type: array
          items:
            type: string
        unresolvedItemIds:
          type: array
          items:
            type: string
        evidenceRefs:
          type: array
          items:
            type: string
        decisionRefs:
          type: array
          items:
            type: string
        receiptIds:
          type: array
          items:
            type: string
        blockingReasons:
          type: array
          items:
            type: string
        residualRisk:
          type: string
          enum:
          - none
          - low
          - medium
          - high
        supersededByWorkId:
          type: string
        userAccepted:
          type: boolean
    MemoryCreateRequest:
      type: object
      additionalProperties: false
      required:
      - title
      properties:
        title:
          type: string
          maxLength: 240
        content:
          type: string
          maxLength: 12000
        category:
          type: string
          maxLength: 100
        structuredPayload:
          type: object
        sourceSessionId:
          type: string
          maxLength: 200
        importance:
          type: string
          enum:
          - ordinary
          - important
        sensitivity:
          type: string
          maxLength: 80
        retentionClass:
          type: string
          maxLength: 80
        tags:
          type: array
          items:
            type: string
    MemoryVersionedActionRequest:
      type: object
      additionalProperties: false
      required:
      - expectedVersion
      properties:
        expectedVersion:
          type: integer
          minimum: 1
    MemoryEditRequest:
      type: object
      additionalProperties: false
      required:
      - expectedVersion
      properties:
        expectedVersion:
          type: integer
          minimum: 1
        title:
          type: string
          maxLength: 240
        content:
          type: string
          maxLength: 12000
        category:
          type: string
          maxLength: 100
        tags:
          type: array
          items:
            type: string
        structuredPayload:
          type: object
    MemoryImportanceRequest:
      type: object
      additionalProperties: false
      required:
      - expectedVersion
      - importance
      properties:
        expectedVersion:
          type: integer
          minimum: 1
        importance:
          type: string
          enum:
          - ordinary
          - important
    MemoryProposalResolutionRequest:
      type: object
      additionalProperties: false
      required:
      - expectedVersion
      - action
      properties:
        expectedVersion:
          type: integer
          minimum: 1
        action:
          type: string
          enum:
          - approve
          - edit_and_approve
          - dismiss
        title:
          type: string
          maxLength: 240
        content:
          type: string
          maxLength: 12000
        category:
          type: string
          maxLength: 100
        tags:
          type: array
          items:
            type: string
        structuredPayload:
          type: object
        importance:
          type: string
          enum:
          - ordinary
          - important
    MemoryPreferencesUpdateRequest:
      type: object
      additionalProperties: false
      required:
      - expectedVersion
      properties:
        expectedVersion:
          type: integer
          minimum: 0
        useSavedMemory:
          type: boolean
        formationMode:
          type: string
          enum:
          - explicit_only
          - ask_before_saving
        showSaveNotices:
          type: boolean
        showAnswerImpact:
          type: boolean
    MemoryExportRequest:
      type: object
      additionalProperties: false
      properties:
        variant:
          type: string
          enum:
          - safe_current_inventory
          - complete_personal_archive
          default: safe_current_inventory
        query:
          type: object
          description: Optional Memory query for the safe current inventory export.
    MemoryWorkPostureUpdateRequest:
      type: object
      additionalProperties: false
      required:
      - requestedPosture
      - expectedVersion
      properties:
        requestedPosture:
          type: string
        expectedVersion:
          type: integer
          minimum: 0
    ScheduledWorkProposalRequest:
      type: object
      additionalProperties: false
      required:
      - workspaceId
      - request
      properties:
        workspaceId:
          type: string
          minLength: 1
        request:
          type: string
          minLength: 1
        defaultTimeZone:
          type: string
    ScheduledWorkCreateRequest:
      type: object
      additionalProperties: false
      required:
      - proposal
      - acceptedByPrincipalId
      properties:
        proposal:
          $ref: '#/components/schemas/ScheduledWorkCharterProposal'
        acceptedByPrincipalId:
          type: string
          minLength: 1
          description: Must equal the authenticated principal; the backend verifies this authority.
    ScheduledWorkEditRequest:
      type: object
      additionalProperties: false
      required:
      - expectedCharterVersion
      - proposal
      - acceptedByPrincipalId
      properties:
        expectedCharterVersion:
          type: integer
          minimum: 1
        proposal:
          $ref: '#/components/schemas/ScheduledWorkCharterProposal'
        acceptedByPrincipalId:
          type: string
          minLength: 1
          description: Must equal the authenticated principal; the backend verifies this authority.
    ScheduledWorkTransitionRequest:
      type: object
      additionalProperties: false
      required:
      - expectedCharterVersion
      properties:
        expectedCharterVersion:
          type: integer
          minimum: 1
    ScheduledWorkTestRequest:
      type: object
      additionalProperties: false
      required:
      - expectedCharterVersion
      properties:
        expectedCharterVersion:
          type: integer
          minimum: 1
        idempotenceKey:
          type: string
    ParallelCognitionProgrammeProjection:
      type: object
      additionalProperties: true
      description: Work-bound program projection. Backend-derived fields include program posture, branch denominator, branch
        settlement, cumulative economics, stopping posture, and fan-in/parent-synthesis posture.
    MemoryProjectionFreshness:
      type: object
      additionalProperties: false
      required:
      - schemaVersion
      - state
      - readAvailable
      - mutationAvailable
      - observedAt
      - explanation
      - reasonCodes
      properties:
        schemaVersion:
          type: string
          const: memory_projection_freshness.v1
        state:
          type: string
          enum:
          - complete
          - delayed
          - partial
          - unavailable
        readAvailable:
          type: boolean
        mutationAvailable:
          type: boolean
        observedAt:
          type: string
          format: date-time
        explanation:
          type: string
        reasonCodes:
          type: array
          items:
            type: string
    PersonalMemoryItem:
      type: object
      additionalProperties: false
      required:
      - schemaVersion
      - memoryRef
      - version
      - title
      - content
      - category
      - state
      - importance
      - authority
      - origin
      - scope
      - influence
      - createdAt
      - updatedAt
      - capabilities
      properties:
        schemaVersion:
          type: string
          const: personal_memory_view.v2
        memoryRef:
          type: string
        version:
          type: integer
          minimum: 1
        title:
          type: string
        content:
          type: string
        category:
          type: string
          enum:
          - preference
          - personal_fact
          - boundary
          - directive
          - brief
        state:
          type: string
          enum:
          - active
          - needs_review
          - paused
          - stopped
          - replaced
        importance:
          type: string
          enum:
          - ordinary
          - important
        authority:
          type: string
          enum:
          - user_authored
          - user_approved
          - current_user_correction
          - system_suggested
        origin:
          type: object
          additionalProperties: false
          required:
          - kind
          - label
          properties:
            kind:
              type: string
            label:
              type: string
        scope:
          type: object
          additionalProperties: false
          required:
          - mode
          - label
          properties:
            mode:
              type: string
              enum:
              - account
              - work
            label:
              type: string
        influence:
          type: object
          additionalProperties: false
          required:
          - eligible
          - explanation
          properties:
            eligible:
              type: boolean
            explanation:
              type: string
            lastHelpedAt:
              type: string
              format: date-time
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
        replacement:
          type: object
          additionalProperties: false
          required:
          - replacementRef
          - label
          properties:
            replacementRef:
              type: string
            label:
              type: string
        capabilities:
          type: object
          additionalProperties: false
          required:
          - edit
          - correct
          - makeImportant
          - pause
          - restore
          - stop
          - useAgain
          - delete
          - versions
          - proof
          properties:
            edit:
              type: boolean
            correct:
              type: boolean
            makeImportant:
              type: boolean
            pause:
              type: boolean
            restore:
              type: boolean
            stop:
              type: boolean
            useAgain:
              type: boolean
            delete:
              type: boolean
            versions:
              type: boolean
            proof:
              type: boolean
    MemoryPage:
      type: object
      additionalProperties: false
      required:
      - hasMore
      properties:
        hasMore:
          type: boolean
        nextCursor:
          type: string
    MemoryLifecycleReceipt:
      type: object
      additionalProperties: false
      required:
      - schemaVersion
      - action
      - memoryRef
      - expectedVersion
      - resultingVersion
      - stateBefore
      - stateAfter
      - importanceBefore
      - importanceAfter
      - occurredAt
      - idempotentReplay
      properties:
        schemaVersion:
          type: string
          const: memory_lifecycle_mutation.v2
        action:
          type: string
          enum:
          - keep
          - pause
          - restore
          - stop
          - use_again
          - importance
          - edit
          - correct
        memoryRef:
          type: string
        expectedVersion:
          type: integer
          minimum: 1
        resultingVersion:
          type: integer
          minimum: 1
        stateBefore:
          type: string
          enum:
          - active
          - needs_review
          - paused
          - stopped
          - replaced
        stateAfter:
          type: string
          enum:
          - active
          - needs_review
          - paused
          - stopped
          - replaced
        importanceBefore:
          type: string
          enum:
          - ordinary
          - important
        importanceAfter:
          type: string
          enum:
          - ordinary
          - important
        occurredAt:
          type: string
          format: date-time
        idempotentReplay:
          type: boolean
    MemoryCorrectionReceipt:
      type: object
      additionalProperties: false
      required:
      - schemaVersion
      - correctedMemoryRef
      - replacementMemoryRef
      - expectedVersion
      - resultingSourceVersion
      - replacementVersion
      - occurredAt
      - idempotentReplay
      properties:
        schemaVersion:
          type: string
          const: memory_correction_receipt.v2
        correctedMemoryRef:
          type: string
        replacementMemoryRef:
          type: string
        expectedVersion:
          type: integer
          minimum: 1
        resultingSourceVersion:
          type: integer
          minimum: 1
        replacementVersion:
          type: integer
          minimum: 1
        occurredAt:
          type: string
          format: date-time
        idempotentReplay:
          type: boolean
    MemoryProposal:
      type: object
      additionalProperties: false
      required:
      - schemaVersion
      - proposalRef
      - version
      - title
      - content
      - category
      - suggestedImportance
      - inert
      - sourceType
      - reasonCodes
      - origin
      - scope
      - createdAt
      - updatedAt
      properties:
        schemaVersion:
          type: string
          const: memory_proposal_view.v2
        proposalRef:
          type: string
        version:
          type: integer
          minimum: 1
        title:
          type: string
        content:
          type: string
        category:
          type: string
        suggestedImportance:
          type: string
          enum:
          - ordinary
          - important
        inert:
          type: boolean
          const: true
        sourceType:
          type: string
        reasonCodes:
          type: array
          items:
            type: string
        origin:
          type: object
          additionalProperties: false
          required:
          - label
          - sourceType
          - authorisedRunBound
          - authorisedSessionBound
          properties:
            label:
              type: string
            sourceType:
              type: string
            authorisedRunBound:
              type: boolean
            authorisedSessionBound:
              type: boolean
        scope:
          type: object
          additionalProperties: false
          required:
          - kind
          - label
          properties:
            kind:
              type: string
              const: account
            label:
              type: string
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
    MemoryPreferences:
      type: object
      additionalProperties: false
      required:
      - useSavedMemory
      - formationMode
      - showSaveNotices
      - showAnswerImpact
      - version
      - createdAt
      - updatedAt
      properties:
        useSavedMemory:
          type: boolean
        formationMode:
          type: string
          enum:
          - explicit_only
          - ask_before_saving
        showSaveNotices:
          type: boolean
        showAnswerImpact:
          type: boolean
        version:
          type: integer
          minimum: 0
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
    MemoryWorkPosture:
      type: object
      additionalProperties: false
      required:
      - schemaVersion
      - source
      - workRef
      - requestedPosture
      - version
      - createdAt
      - updatedAt
      properties:
        schemaVersion:
          type: integer
          const: 2
        source:
          type: string
          const: memory_work_posture.v2
        workRef:
          type: string
        requestedPosture:
          type: string
          enum:
          - account_default
          - temporary
          - read_only
          - review_gated
        version:
          type: integer
          minimum: 0
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
    MemoryAnswerImpactReceipt:
      type: object
      additionalProperties: false
      required:
      - schemaVersion
      - source
      - answerRef
      - terminalEffectId
      - terminalOutboxEventId
      - settlement
      - requestedPosture
      - effectivePosture
      - outcome
      - helpedShape
      - consideredNotUsed
      - heldBack
      - suggestions
      - completeness
      - nonClaims
      properties:
        schemaVersion:
          type: integer
          const: 2
        source:
          type: string
          const: memory_answer_impact_receipt.v2
        answerRef:
          type: string
        terminalEffectId:
          type: string
        terminalOutboxEventId:
          type: string
        workRef:
          type: string
        settlement:
          type: object
          additionalProperties: false
          required:
          - state
          - settledAt
          properties:
            state:
              type: string
              const: settled
            settledAt:
              type: string
              format: date-time
        requestedPosture:
          type: string
          enum:
          - account_default
          - temporary
          - read_only
          - review_gated
        effectivePosture:
          type: string
          enum:
          - account_default
          - temporary
          - read_only
          - review_gated
        outcome:
          type: string
          enum:
          - memory_helped
          - no_memory_helped
        helpedShape:
          type: array
          items:
            type: object
            additionalProperties: false
            required:
            - memoryRef
            properties:
              memoryRef:
                type: string
              version:
                type: integer
                minimum: 1
              title:
                type: string
              state:
                type: string
                enum:
                - active
                - paused
                - needs_review
                - stopped
                - replaced
                - deleted
              scope:
                type: object
                additionalProperties: false
                properties:
                  mode:
                    type: string
                    enum:
                    - account
                    - work
                  label:
                    type: string
                  workRef:
                    type: string
              influence:
                type: object
                additionalProperties: false
                properties:
                  eligible:
                    type: boolean
                  explanation:
                    type: string
                  lastHelpedAt:
                    type: string
                    format: date-time
        consideredNotUsed:
          type: array
          items:
            type: object
            additionalProperties: false
            required:
            - memoryRef
            - title
            - explanation
            properties:
              memoryRef:
                type: string
              title:
                type: string
              explanation:
                type: string
        heldBack:
          type: array
          items:
            type: object
            additionalProperties: false
            required:
            - label
            - reason
            properties:
              label:
                type: string
              reason:
                type: string
        suggestions:
          type: array
          items:
            type: object
            additionalProperties: false
            required:
            - proposalRef
            - title
            - state
            properties:
              proposalRef:
                type: string
              title:
                type: string
              state:
                type: string
                const: awaiting_approval
        completeness:
          type: string
          enum:
          - complete
          - partial
        nonClaims:
          type: array
          prefixItems:
          - const: retrieval_or_admission_alone_does_not_prove_answer_influence
          - const: suggestions_are_inert_until_explicit_approval
          minItems: 2
          maxItems: 2
    MemoryProposalResolutionReceipt:
      type: object
      additionalProperties: false
      required:
      - schemaVersion
      - authority
      - action
      - proposalRef
      - expectedVersion
      - proposalResultingVersion
      - proposalStateBefore
      - proposalStateAfter
      - consequence
      - occurredAt
      - idempotentReplay
      - nonClaim
      properties:
        schemaVersion:
          type: string
          const: memory_proposal_resolution_receipt.v2
        authority:
          type: string
          const: personal_memory_proposal_resolution
        action:
          type: string
          enum:
          - approve
          - edit_and_approve
          - dismiss
        proposalRef:
          type: string
        expectedVersion:
          type: integer
          minimum: 1
        proposalResultingVersion:
          type: integer
          minimum: 1
        proposalStateBefore:
          type: string
          const: awaiting_approval
        proposalStateAfter:
          type: string
          enum:
          - resolved
          - dismissed
        consequence:
          type: string
          enum:
          - active_memory_created
          - no_active_memory_created
        memoryRef:
          type: string
        memoryVersion:
          type: integer
          minimum: 1
        occurredAt:
          type: string
          format: date-time
        idempotentReplay:
          type: boolean
        nonClaim:
          type: string
          const: This receipt records the Memory consequence only; it does not settle wider Work.
    MemoryProposalBatchDismissalReceipt:
      type: object
      additionalProperties: false
      required:
      - schemaVersion
      - authority
      - action
      - proposalRefs
      - count
      - consequence
      - occurredAt
      - idempotentReplay
      - nonClaim
      properties:
        schemaVersion:
          type: string
          const: memory_proposal_batch_dismissal_receipt.v2
        authority:
          type: string
          const: personal_memory_proposal_batch_resolution
        action:
          type: string
          const: dismiss
        proposalRefs:
          type: array
          items:
            type: string
        count:
          type: integer
          minimum: 0
        consequence:
          type: string
          const: no_active_memory_created
        occurredAt:
          type: string
          format: date-time
        idempotentReplay:
          type: boolean
        nonClaim:
          type: string
          const: This receipt records the selected proposal dismissals only; it does not settle wider Work.
    MemoryListResponse:
      type: object
      additionalProperties: false
      required:
      - ok
      - items
      - page
      - query
      - freshness
      properties:
        ok:
          type: boolean
          const: true
        items:
          type: array
          items:
            $ref: '#/components/schemas/PersonalMemoryItem'
        page:
          $ref: '#/components/schemas/MemoryPage'
        query:
          type: object
          additionalProperties: true
        freshness:
          $ref: '#/components/schemas/MemoryProjectionFreshness'
    MemoryItemResponse:
      type: object
      additionalProperties: false
      required:
      - ok
      - item
      - freshness
      properties:
        ok:
          type: boolean
          const: true
        item:
          $ref: '#/components/schemas/PersonalMemoryItem'
        freshness:
          $ref: '#/components/schemas/MemoryProjectionFreshness'
    MemoryItemCreateResponse:
      type: object
      additionalProperties: false
      required:
      - ok
      - item
      - created
      - idempotentReplay
      - freshness
      properties:
        ok:
          type: boolean
          const: true
        item:
          $ref: '#/components/schemas/PersonalMemoryItem'
        created:
          type: boolean
        idempotentReplay:
          type: boolean
        freshness:
          $ref: '#/components/schemas/MemoryProjectionFreshness'
    MemoryMutationResponse:
      type: object
      additionalProperties: false
      required:
      - ok
      - item
      - receipt
      - freshness
      properties:
        ok:
          type: boolean
          const: true
        item:
          $ref: '#/components/schemas/PersonalMemoryItem'
        receipt:
          $ref: '#/components/schemas/MemoryLifecycleReceipt'
        freshness:
          $ref: '#/components/schemas/MemoryProjectionFreshness'
    MemoryCorrectionResponse:
      type: object
      additionalProperties: false
      required:
      - ok
      - item
      - replacedItem
      - receipt
      - freshness
      properties:
        ok:
          type: boolean
          const: true
        item:
          $ref: '#/components/schemas/PersonalMemoryItem'
        replacedItem:
          $ref: '#/components/schemas/PersonalMemoryItem'
        receipt:
          $ref: '#/components/schemas/MemoryCorrectionReceipt'
        freshness:
          $ref: '#/components/schemas/MemoryProjectionFreshness'
    MemoryDeleteResponse:
      type: object
      additionalProperties: false
      required:
      - ok
      - memoryRef
      - deleted
      - deletedAt
      - idempotentReplay
      - freshness
      properties:
        ok:
          type: boolean
          const: true
        memoryRef:
          type: string
        deleted:
          type: boolean
        deletedAt:
          type: string
          format: date-time
        idempotentReplay:
          type: boolean
        freshness:
          $ref: '#/components/schemas/MemoryProjectionFreshness'
    MemoryVersionsResponse:
      type: object
      additionalProperties: false
      required:
      - ok
      - memoryRef
      - versions
      - page
      - freshness
      properties:
        ok:
          type: boolean
          const: true
        memoryRef:
          type: string
        versions:
          type: array
          items:
            type: object
            additionalProperties: false
            required:
            - version
            - createdAt
            - mutationEventId
            - item
            properties:
              version:
                type: integer
                minimum: 1
              createdAt:
                type: string
                format: date-time
              mutationEventId:
                type: string
              item:
                $ref: '#/components/schemas/PersonalMemoryItem'
        page:
          $ref: '#/components/schemas/MemoryPage'
        freshness:
          $ref: '#/components/schemas/MemoryProjectionFreshness'
    MemoryLinkCreateResponse:
      type: object
      additionalProperties: false
      required:
      - ok
      - linkToken
      - createdAt
      properties:
        ok:
          type: boolean
          const: true
        linkToken:
          type: string
        createdAt:
          type: string
          format: date-time
        freshness:
          $ref: '#/components/schemas/MemoryProjectionFreshness'
    MemoryProposalListResponse:
      type: object
      additionalProperties: false
      required:
      - ok
      - proposals
      - page
      - query
      - freshness
      properties:
        ok:
          type: boolean
          const: true
        proposals:
          type: array
          items:
            $ref: '#/components/schemas/MemoryProposal'
        page:
          $ref: '#/components/schemas/MemoryPage'
        query:
          type: object
          additionalProperties: true
        freshness:
          $ref: '#/components/schemas/MemoryProjectionFreshness'
    MemoryProposalBatchDismissalResponse:
      type: object
      additionalProperties: false
      required:
      - ok
      - dismissed
      - receipt
      - freshness
      properties:
        ok:
          type: boolean
          const: true
        dismissed:
          type: array
          items:
            type: object
            additionalProperties: false
            required:
            - proposalRef
            - version
            - state
            properties:
              proposalRef:
                type: string
              version:
                type: integer
                minimum: 1
              state:
                type: string
                const: dismissed
        receipt:
          $ref: '#/components/schemas/MemoryProposalBatchDismissalReceipt'
        freshness:
          $ref: '#/components/schemas/MemoryProjectionFreshness'
    MemoryProposalResolutionResponse:
      type: object
      additionalProperties: false
      required:
      - ok
      - resolution
      - receipt
      - freshness
      properties:
        ok:
          type: boolean
          const: true
        resolution:
          type: object
          additionalProperties: false
          required:
          - schemaVersion
          - action
          - proposalRef
          - proposalVersion
          - resolvedState
          - idempotentReplay
          properties:
            schemaVersion:
              type: string
              const: memory_proposal_resolution.v2
            action:
              type: string
              enum:
              - approve
              - edit_and_approve
              - dismiss
            proposalRef:
              type: string
            proposalVersion:
              type: integer
              minimum: 1
            resolvedState:
              type: string
              enum:
              - active
              - needs_review
              - paused
              - stopped
              - replaced
            idempotentReplay:
              type: boolean
        item:
          $ref: '#/components/schemas/PersonalMemoryItem'
        receipt:
          $ref: '#/components/schemas/MemoryProposalResolutionReceipt'
        freshness:
          $ref: '#/components/schemas/MemoryProjectionFreshness'
    MemoryPreferencesResponse:
      type: object
      additionalProperties: false
      required:
      - ok
      - preferences
      - freshness
      properties:
        ok:
          type: boolean
          const: true
        preferences:
          $ref: '#/components/schemas/MemoryPreferences'
        created:
          type: boolean
        idempotentReplay:
          type: boolean
        freshness:
          $ref: '#/components/schemas/MemoryProjectionFreshness'
    MemoryExportResponse:
      type: object
      additionalProperties: false
      required:
      - ok
      - schemaVersion
      - variant
      - exportedAt
      - count
      - query
      - items
      - freshness
      properties:
        ok:
          type: boolean
          const: true
        schemaVersion:
          type: string
          const: memory_export_packet.v2
        variant:
          type: string
          enum:
          - safe_current_inventory
          - complete_personal_archive
        exportedAt:
          type: string
          format: date-time
        count:
          type: integer
          minimum: 0
        query:
          type: object
          additionalProperties: true
        items:
          type: array
          items:
            $ref: '#/components/schemas/PersonalMemoryItem'
        proposals:
          type: array
          items:
            $ref: '#/components/schemas/MemoryProposal'
        freshness:
          $ref: '#/components/schemas/MemoryProjectionFreshness'
    MemoryWorkPostureGetResponse:
      type: object
      additionalProperties: false
      required:
      - ok
      - posture
      - persisted
      - freshness
      properties:
        ok:
          type: boolean
          const: true
        posture:
          $ref: '#/components/schemas/MemoryWorkPosture'
        persisted:
          type: boolean
        freshness:
          $ref: '#/components/schemas/MemoryProjectionFreshness'
    MemoryWorkPosturePutResponse:
      type: object
      additionalProperties: false
      required:
      - ok
      - posture
      - created
      - idempotentReplay
      properties:
        ok:
          type: boolean
          const: true
        posture:
          $ref: '#/components/schemas/MemoryWorkPosture'
        created:
          type: boolean
        idempotentReplay:
          type: boolean
    MemoryAnswerImpactResponse:
      type: object
      additionalProperties: false
      required:
      - ok
      - answerRef
      - receipt
      - freshness
      properties:
        ok:
          type: boolean
          const: true
        answerRef:
          type: string
        receipt:
          $ref: '#/components/schemas/MemoryAnswerImpactReceipt'
        freshness:
          $ref: '#/components/schemas/MemoryProjectionFreshness'
    ProjectMembership:
      type: object
      additionalProperties: false
      required:
      - schema
      - membershipId
      - organisationId
      - projectId
      - userId
      - role
      - lifecycle
      - revision
      - createdAt
      - updatedAt
      properties:
        schema:
          type: string
          const: indwel.developer-control-plane.v1
        membershipId:
          type: string
        organisationId:
          type: string
        projectId:
          type: string
        userId:
          type: string
        role:
          type: string
          enum:
          - owner
          - admin
          - developer
          - viewer
        lifecycle:
          type: string
          enum:
          - active
          - suspended
          - removed
        revision:
          type: integer
          minimum: 1
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
    ProjectMembershipListResponse:
      type: object
      additionalProperties: false
      required:
      - data
      properties:
        data:
          type: object
          additionalProperties: false
          required:
          - items
          properties:
            items:
              type: array
              items:
                $ref: '#/components/schemas/ProjectMembership'
    ProjectMembershipUpsertRequest:
      type: object
      additionalProperties: false
      required:
      - role
      properties:
        role:
          type: string
          enum:
          - owner
          - admin
          - developer
          - viewer
    ClientIssuerBindingReceipt:
      type: object
      additionalProperties: false
      required:
      - client
      - credentialId
      - secret
      - issuer
      - providerClientReference
      - boundAt
      properties:
        client:
          $ref: '#/components/schemas/Client'
        credentialId:
          type:
          - string
          - 'null'
        secret:
          type:
          - string
          - 'null'
          readOnly: true
          description: Returned only when the authorized issuer creates a confidential-client credential. Treat as write-only
            secret material after receipt.
        issuer:
          type: string
          format: uri
          readOnly: true
          description: Authorized issuer selected by the backend adapter. The caller cannot supply or choose this value.
        providerClientReference:
          type: string
          readOnly: true
        boundAt:
          type: string
          format: date-time
    ClientIssuerBindingResponse:
      type: object
      additionalProperties: false
      required:
      - data
      properties:
        data:
          $ref: '#/components/schemas/ClientIssuerBindingReceipt'
    ScheduledWorkSchedule:
      oneOf:
      - type: object
        additionalProperties: false
        required:
        - kind
        properties:
          kind:
            type: string
            const: manual
      - type: object
        additionalProperties: false
        required:
        - kind
        - executeAt
        - timeZone
        properties:
          kind:
            type: string
            const: once
          executeAt:
            type: string
            format: date-time
          timeZone:
            type: string
      - type: object
        additionalProperties: false
        required:
        - kind
        - rrule
        - timeZone
        properties:
          kind:
            type: string
            const: recurring
          rrule:
            type: string
          timeZone:
            type: string
      - type: object
        additionalProperties: false
        required:
        - kind
        - conditionSummary
        - evaluationCadence
        - timeZone
        properties:
          kind:
            type: string
            const: condition
          conditionSummary:
            type: string
          evaluationCadence:
            type: string
            enum:
            - hourly
            - daily
            - weekly
          timeZone:
            type: string
    ScheduledWorkBudget:
      type: object
      additionalProperties: false
      required:
      - maxRunsPerWindow
      - windowMinutes
      - maxAcquisitionsPerRun
      - maxWallClockMsPerRun
      - maxCostUnitsPerRun
      properties:
        maxRunsPerWindow:
          type: number
          minimum: 0
        windowMinutes:
          type: number
          minimum: 0
        maxAcquisitionsPerRun:
          type: number
          minimum: 0
        maxWallClockMsPerRun:
          type: number
          minimum: 0
        maxCostUnitsPerRun:
          type: number
          minimum: 0
    ScheduledWorkSourcePolicy:
      type: object
      additionalProperties: false
      required:
      - requiredAuthority
      - sourceSelectionPolicy
      - namedSourceIds
      - permittedDomains
      - openWebFallback
      properties:
        requiredAuthority:
          type: string
        sourceSelectionPolicy:
          type: string
        namedSourceIds:
          type: array
          items:
            type: string
        permittedDomains:
          type: array
          items:
            type: string
        openWebFallback:
          type: string
          enum:
          - deny
          - allow_after_named_sources_exhausted
    ScheduledWorkCharter:
      type: object
      additionalProperties: true
      required:
      - objective
      - mission
      - sourcePolicy
      - stoppingRule
      - ordinaryCognitionPolicy
      - mutationPolicy
      properties:
        objective:
          type: string
        mission:
          type: string
        sourcePolicy:
          $ref: '#/components/schemas/ScheduledWorkSourcePolicy'
        taskProgram:
          type: object
          description: Pre-authorized cognitive program when present.
        stoppingRule:
          type: string
        ordinaryCognitionPolicy:
          type: string
          enum:
          - eligible_when_admitted_and_fresh
          - never_eligible
        mutationPolicy:
          type: string
          const: read_only
    ScheduledWorkCharterProposal:
      type: object
      additionalProperties: false
      required:
      - schemaVersion
      - proposalId
      - principalId
      - tenantId
      - workspaceId
      - request
      - title
      - kind
      - charter
      - schedule
      - scheduleTimeZoneAssumed
      - requiresUserReview
      - reviewReasonCodes
      - reasonCodes
      - compiledAt
      - digest
      properties:
        schemaVersion:
          type: string
          description: Canonical public identity is `indwel.scheduled_work_charter_proposal.v1`; underlying source migration
            is main-lane-owned.
        proposalId:
          type: string
        principalId:
          type: string
        tenantId:
          type: string
        workspaceId:
          type: string
        request:
          type: string
        title:
          type: string
        kind:
          type: string
          enum:
          - scheduled_observation
          - condition_watch
          - research_cycle
          - manual_continuation
        charter:
          $ref: '#/components/schemas/ScheduledWorkCharter'
        schedule:
          $ref: '#/components/schemas/ScheduledWorkSchedule'
        scheduleTimeZoneAssumed:
          type: boolean
        requiresUserReview:
          type: boolean
          const: true
        reviewReasonCodes:
          type: array
          items:
            type: string
        reasonCodes:
          type: array
          items:
            type: string
        compiledAt:
          type: string
          format: date-time
        digest:
          type: string
    ScheduledWorkReadModel:
      type: object
      additionalProperties: false
      required:
      - schemaVersion
      - watchpointId
      - title
      - status
      - ownership
      - charter
      - schedule
      - capabilities
      - reasonCodes
      properties:
        schemaVersion:
          type: string
          description: Canonical public identity is `indwel.scheduled_work_read_model.v1`; underlying source migration is
            main-lane-owned.
        watchpointId:
          type: string
        title:
          type: string
        status:
          type: string
          enum:
          - draft
          - testing
          - active
          - paused
          - needs_attention
          - awaiting_approval
          - archived
        ownership:
          type: object
          additionalProperties: false
          required:
          - workspaceId
          - ownerPrincipalId
          - visibility
          properties:
            workspaceId:
              type: string
            ownerPrincipalId:
              type: string
            visibility:
              type: string
              enum:
              - private
              - workspace
        charter:
          type: object
          additionalProperties: false
          required:
          - mission
          - requiredAuthority
          - ordinaryCognitionPolicy
          - readOnly
          properties:
            mission:
              type: string
            requiredAuthority:
              type: string
            ordinaryCognitionPolicy:
              type: string
            readOnly:
              type: boolean
              const: true
        schedule:
          $ref: '#/components/schemas/ScheduledWorkSchedule'
        lastRun:
          type: object
          additionalProperties: false
          required:
          - runId
          - outcome
          - settledAt
          properties:
            runId:
              type: string
            outcome:
              type: string
            settledAt:
              type: string
              format: date-time
        latestObservation:
          type: object
          additionalProperties: false
          required:
          - observationId
          - sourceId
          - freshness
          - admitted
          - eligibleForOrdinaryCognition
          properties:
            observationId:
              type: string
            sourceId:
              type: string
            freshness:
              type: string
            admitted:
              type: boolean
            eligibleForOrdinaryCognition:
              type: boolean
        nextScheduledAt:
          type: string
          format: date-time
        capabilities:
          type: object
          additionalProperties: false
          required:
          - canView
          - canEdit
          - canRunTest
          - canPause
          - canResume
          - canArchive
          properties:
            canView:
              type: boolean
            canEdit:
              type: boolean
            canRunTest:
              type: boolean
            canPause:
              type: boolean
            canResume:
              type: boolean
            canArchive:
              type: boolean
        reasonCodes:
          type: array
          items:
            type: string
    ScheduledWorkListProjection:
      type: object
      additionalProperties: false
      required:
      - schemaVersion
      - items
      - reasonCodes
      - digest
      properties:
        schemaVersion:
          type: string
          description: Canonical public identity is `indwel.scheduled_work_list_projection.v1`; underlying source migration
            is main-lane-owned.
        items:
          type: array
          items:
            $ref: '#/components/schemas/ScheduledWorkReadModel'
        reasonCodes:
          type: array
          items:
            type: string
        digest:
          type: string
    ScheduledWorkRunSummary:
      type: object
      additionalProperties: false
      required:
      - runId
      - invocation
      - outcome
      - startedAt
      - settledAt
      - sourceObservationCount
      - artifactCount
      - reportCount
      - reasonCodes
      properties:
        runId:
          type: string
        invocation:
          type: string
          enum:
          - manual_test
          - manual_run
          - scheduled
          - condition_evaluation
        outcome:
          type: string
          enum:
          - completed
          - no_material_change
          - authority_unmet
          - source_unavailable
          - stale
          - budget_exhausted
          - failed
          - cancelled
        startedAt:
          type: string
          format: date-time
        settledAt:
          type: string
          format: date-time
        sourceObservationCount:
          type: integer
          minimum: 0
        artifactCount:
          type: integer
          minimum: 0
        reportCount:
          type: integer
          minimum: 0
        reasonCodes:
          type: array
          items:
            type: string
    ScheduledWorkReportSummary:
      type: object
      additionalProperties: false
      required:
      - reportId
      - artifactId
      - runId
      - title
      - abstract
      - createdAt
      - observedAsOf
      - sourceObservationCount
      - retentionClass
      - contentDigest
      - reasonCodes
      properties:
        reportId:
          type: string
        artifactId:
          type: string
        runId:
          type: string
        title:
          type: string
        abstract:
          type: string
        createdAt:
          type: string
          format: date-time
        observedAsOf:
          type: string
          format: date-time
        sourceObservationCount:
          type: integer
          minimum: 0
        retentionClass:
          type: string
          enum:
          - standard
          - preserve_evidence
          - ephemeral
        contentDigest:
          type: string
        reasonCodes:
          type: array
          items:
            type: string
    ScheduledWorkObservation:
      type: object
      additionalProperties: true
      required:
      - observationId
      - runId
      - sourceId
      - sourceLocator
      - contentDigest
      - observedAt
      - reasonCodes
      properties:
        observationId:
          type: string
        runId:
          type: string
        sourceId:
          type: string
        sourceLocator:
          type: string
        contentDigest:
          type: string
        observedAt:
          type: string
          format: date-time
        expiresAt:
          type: string
          format: date-time
        authority:
          type: string
        admission:
          type: string
        freshness:
          type: string
        reasonCodes:
          type: array
          items:
            type: string
    ScheduledWorkDetailProjection:
      type: object
      additionalProperties: true
      required:
      - schemaVersion
      - watchpoint
      - readModel
      - lifecycleControls
      - runHistory
      - observationJournal
      - reports
      - reasonCodes
      - digest
      properties:
        schemaVersion:
          type: string
          description: Canonical public identity is `indwel.scheduled_work_detail_projection.v1`; underlying source migration
            is main-lane-owned.
        watchpoint:
          type: object
          additionalProperties: true
          required:
          - watchpointId
          - title
          - kind
          - status
          - charterVersion
          - charter
          - schedule
          - budget
          - notificationPolicy
          - retentionPolicy
          - createdAt
          - updatedAt
          - reasonCodes
          properties:
            watchpointId:
              type: string
            title:
              type: string
            kind:
              type: string
            status:
              type: string
            charterVersion:
              type: integer
              minimum: 1
            charter:
              $ref: '#/components/schemas/ScheduledWorkCharter'
            schedule:
              $ref: '#/components/schemas/ScheduledWorkSchedule'
            budget:
              $ref: '#/components/schemas/ScheduledWorkBudget'
            notificationPolicy:
              type: object
              additionalProperties: true
            retentionPolicy:
              type: object
              additionalProperties: true
            createdAt:
              type: string
              format: date-time
            updatedAt:
              type: string
              format: date-time
            reasonCodes:
              type: array
              items:
                type: string
        readModel:
          $ref: '#/components/schemas/ScheduledWorkReadModel'
        lifecycleControls:
          type: object
          additionalProperties: true
        runHistory:
          type: array
          items:
            $ref: '#/components/schemas/ScheduledWorkRunSummary'
        observationJournal:
          type: array
          items:
            $ref: '#/components/schemas/ScheduledWorkObservation'
        artifactIndex:
          type: object
          additionalProperties: true
        reports:
          type: array
          items:
            $ref: '#/components/schemas/ScheduledWorkReportSummary'
        chronicle:
          type: array
          items:
            type: object
            additionalProperties: true
        ordinaryCognitionContribution:
          type: object
          additionalProperties: true
        reasonCodes:
          type: array
          items:
            type: string
        digest:
          type: string
    ScheduledWorkProposalProjection:
      type: object
      additionalProperties: false
      required:
      - schemaVersion
      - proposal
      - reasonCodes
      - digest
      properties:
        schemaVersion:
          type: string
          description: Canonical public identity is `indwel.scheduled_work_charter_proposal_projection.v1`; underlying source
            migration is main-lane-owned.
        proposal:
          $ref: '#/components/schemas/ScheduledWorkCharterProposal'
        reasonCodes:
          type: array
          items:
            type: string
        digest:
          type: string
    ScheduledWorkArchiveResponse:
      type: object
      additionalProperties: false
      required:
      - ok
      - watchpointId
      - status
      - charterVersion
      properties:
        ok:
          type: boolean
          const: true
        watchpointId:
          type: string
        status:
          type: string
          const: archived
        charterVersion:
          type: integer
          minimum: 1
    ScheduledWorkTestResponse:
      type: object
      additionalProperties: false
      required:
      - ok
      - watchpointId
      - runId
      - outcome
      - reportIds
      - charterVersion
      - activationEligible
      properties:
        ok:
          type: boolean
          const: true
        watchpointId:
          type: string
        runId:
          type: string
        outcome:
          type: string
        reportIds:
          type: array
          items:
            type: string
        charterVersion:
          type: integer
          minimum: 1
        activationEligible:
          type: boolean
    ScheduledWorkReportListResponse:
      type: object
      additionalProperties: false
      required:
      - watchpointId
      - reports
      properties:
        watchpointId:
          type: string
        reports:
          type: array
          items:
            $ref: '#/components/schemas/ScheduledWorkReportSummary'
    ScheduledWorkReportCitation:
      type: object
      additionalProperties: false
      required:
      - sourceId
      - sourceLocator
      - observedAt
      - contentDigest
      properties:
        sourceId:
          type: string
        sourceLocator:
          type: string
        observedAt:
          type: string
          format: date-time
        contentDigest:
          type: string
    ScheduledWorkReport:
      type: object
      additionalProperties: false
      required:
      - schemaVersion
      - reportId
      - artifactId
      - watchpointId
      - runId
      - title
      - bodyMarkdown
      - abstract
      - createdAt
      - observedAsOf
      - sourceObservationIds
      - citationItems
      - evidentiaryPosture
      - retentionClass
      - contentDigest
      - reasonCodes
      - digest
      properties:
        schemaVersion:
          type: string
        reportId:
          type: string
        artifactId:
          type: string
        watchpointId:
          type: string
        runId:
          type: string
        title:
          type: string
        bodyMarkdown:
          type: string
        abstract:
          type: string
        createdAt:
          type: string
          format: date-time
        observedAsOf:
          type: string
          format: date-time
        sourceObservationIds:
          type: array
          items:
            type: string
        citationItems:
          type: array
          items:
            $ref: '#/components/schemas/ScheduledWorkReportCitation'
        evidentiaryPosture:
          type: string
          const: advisory_synthesis
        retentionClass:
          type: string
          enum:
          - standard
          - preserve_evidence
          - ephemeral
        contentDigest:
          type: string
        reasonCodes:
          type: array
          items:
            type: string
        digest:
          type: string
    ScheduledWorkReportProjection:
      type: object
      additionalProperties: false
      required:
      - schemaVersion
      - report
      - reasonCodes
      - digest
      properties:
        schemaVersion:
          type: string
        report:
          $ref: '#/components/schemas/ScheduledWorkReport'
        reasonCodes:
          type: array
          items:
            type: string
        digest:
          type: string
    SessionSummary:
      type: object
      additionalProperties: false
      required:
      - sessionId
      - createdAt
      - updatedAt
      properties:
        sessionId:
          type: string
          format: uuid
        name:
          type: string
        pinned:
          type: boolean
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
        workspaceId:
          type: string
        missionId:
          type: string
        workPosture:
          type: string
          enum:
          - conversation
          - work
        parentSessionId:
          type: string
          format: uuid
        successorSessionIds:
          type: array
          items:
            type: string
            format: uuid
        continuityStatus:
          type: string
          enum:
          - none
          - prepared
          - continued
          - imported
      description: Customer-safe Session metadata. Raw Memory profile, Cognitive Act/Epoch, packet-storage, and Objective
        authority fields are not public Session schema.
    SessionDirectoryResponse:
      type: object
      additionalProperties: false
      required:
      - ok
      - sessions
      properties:
        ok:
          type: boolean
          const: true
        sessions:
          type: array
          items:
            $ref: '#/components/schemas/SessionSummary'
    SessionRenameRequest:
      type: object
      additionalProperties: false
      required:
      - name
      properties:
        name:
          type: string
          minLength: 1
    SessionPinRequest:
      type: object
      additionalProperties: false
      required:
      - action
      - pinned
      properties:
        action:
          type: string
          const: pin
        pinned:
          type: boolean
    SessionMutationRequest:
      oneOf:
      - $ref: '#/components/schemas/SessionRenameRequest'
      - $ref: '#/components/schemas/SessionPinRequest'
      description: Canonical public Session mutations are rename and pin/unpin. Source-retained `promote` and `relate` action
        variants are compatibility transitions pending canonical Work representation and are not first-class SDK request variants.
    SessionMutationResponse:
      type: object
      additionalProperties: true
      required:
      - ok
      - sessionId
      - updatedAt
      properties:
        ok:
          type: boolean
          const: true
        sessionId:
          type: string
          format: uuid
        name:
          type: string
        pinned:
          type: boolean
        updatedAt:
          type: string
          format: date-time
    SessionDeleteResponse:
      type: object
      additionalProperties: false
      required:
      - ok
      - sessionId
      properties:
        ok:
          type: boolean
          const: true
        sessionId:
          type: string
          format: uuid
    ContinuityProjection:
      type: object
      additionalProperties: false
      required:
      - packetId
      - state
      - parentSessionId
      - reasonCodes
      properties:
        packetId:
          type: string
        state:
          type: string
        parentSessionId:
          type: string
          format: uuid
        successorSessionId:
          type: string
          format: uuid
        objective:
          type: object
          additionalProperties: true
          description: Customer-safe Objective and revision projection.
        frontier:
          type: object
          additionalProperties: true
        decisions:
          type: array
          items:
            type: object
            additionalProperties: true
        constraints:
          type: array
          items:
            type: object
            additionalProperties: true
        openLoops:
          type: array
          items:
            type: object
            additionalProperties: true
        commitments:
          type: array
          items:
            type: object
            additionalProperties: true
        evidencePosture:
          type: object
          additionalProperties: true
        validationPosture:
          type: object
          additionalProperties: true
        activeSourceRefs:
          type: array
          items:
            type: string
        revalidationQueue:
          type: array
          items:
            type: object
            additionalProperties: true
        receiptStatus:
          type: string
        reasonCodes:
          type: array
          items:
            type: string
      description: Customer-safe projection from server-settled Continuity authority. Raw prompt projections, constitutional
        patches, graph-node identities, Cognitive Act/Epoch structures, and settlement chronicles are excluded from the public
        schema.
    ContinuityReadRequest:
      type: object
      additionalProperties: false
      properties:
        packetId:
          type: string
          description: Optional identity check against the server-settled packet. Supplying a packet never establishes Continuity
            authority.
    ContinuityResponse:
      type: object
      additionalProperties: false
      required:
      - ok
      - sessionId
      - continuity
      properties:
        ok:
          type: boolean
          const: true
        sessionId:
          type: string
          format: uuid
        continuity:
          $ref: '#/components/schemas/ContinuityProjection'
    ContinueSessionRequest:
      type: object
      additionalProperties: false
      properties:
        packetId:
          type: string
          description: Optional identity check only; Continuity state remains server-settled.
        name:
          type: string
          description: Optional display name for a newly created successor Session.
    ContinueSessionResponse:
      type: object
      additionalProperties: false
      required:
      - ok
      - parentSessionId
      - successorSessionId
      - continuity
      properties:
        ok:
          type: boolean
          const: true
        parentSessionId:
          type: string
          format: uuid
        successorSessionId:
          type: string
          format: uuid
        continuity:
          $ref: '#/components/schemas/ContinuityProjection'
    StartSessionCompatibilityRequest:
      type: object
      additionalProperties: true
      properties:
        name:
          type: string
        title:
          type: string
        workPosture:
          type: string
          enum:
          - conversation
          - work
          - auto
        tenantId:
          type: string
          description: Scope proposal only. Backend principal authority remains decisive.
        workspaceId:
          type: string
          description: Scope proposal only.
        missionId:
          type: string
          description: Scope proposal only.
    StartSessionCompatibilityResponse:
      type: object
      additionalProperties: false
      required:
      - ok
      - sessionId
      - name
      - workPosture
      properties:
        ok:
          type: boolean
          const: true
        sessionId:
          type: string
          format: uuid
        name:
          type: string
        workPosture:
          type: string
          enum:
          - conversation
          - work
        workspaceId:
          type: string
        missionId:
          type: string
    ConversationChatRequest:
      type: object
      additionalProperties: true
      required:
      - sessionId
      - prompt
      properties:
        sessionId:
          type: string
          format: uuid
        prompt:
          type: string
          minLength: 1
        attachmentIds:
          type: array
          maxItems: 8
          items:
            type: string
        idempotencyKey:
          type: string
          description: Compatibility body form; the `Idempotency-Key` header is also accepted by the current transport.
    ConversationMessage:
      type: object
      additionalProperties: true
      required:
      - role
      - content
      properties:
        role:
          type: string
          enum:
          - user
          - assistant
          - system
        content:
          type: string
        meta:
          type: object
          additionalProperties: true
    ConversationChatResponse:
      type: object
      additionalProperties: true
      required:
      - ok
      - sessionId
      - messages
      properties:
        ok:
          type: boolean
          const: true
        sessionId:
          type: string
          format: uuid
        messages:
          type: array
          items:
            $ref: '#/components/schemas/ConversationMessage'
        meta:
          type: object
          additionalProperties: true
          description: Compatibility transport metadata. Canonical Run/receipt truth is documented under the Run API.
    SessionHistoryResponse:
      type: object
      additionalProperties: false
      required:
      - ok
      - contractVersion
      - sourceOfTruth
      - sessionId
      - messages
      - quarantinedAssistantCount
      properties:
        ok:
          type: boolean
          const: true
        contractVersion:
          type: string
          const: indwel.cognitive_session_history_projection.v2
        sourceOfTruth:
          type: string
          const: terminal_settlement_outbox_v2
        sessionId:
          type: string
          format: uuid
        messages:
          type: array
          items:
            $ref: '#/components/schemas/ConversationMessage'
        quarantinedAssistantCount:
          type: integer
          minimum: 0
    CaseRunProjection:
      type: object
      required:
      - runId
      - contractHash
      - lifecycleState
      - status
      - renderManifest
      - createdAt
      properties:
        runId:
          type: string
        contractHash:
          type: string
        lifecycleState:
          type: string
          enum:
          - settled_success
          - settled_failure
          - settled_timeout
          - settled_cancelled
        status:
          type: string
          enum:
          - complete
          - failed
          - timed_out
          - cancelled
        answer:
          type: string
        renderManifest:
          type: object
          required:
          - renderManifestId
          - renderManifestDigest
          - evidenceBindingCount
          - suppressedEvidenceCount
          properties:
            renderManifestId:
              type: string
            renderManifestDigest:
              type: string
            evidenceBindingCount:
              type: integer
              minimum: 0
            suppressedEvidenceCount:
              type: integer
              minimum: 0
        createdAt:
          type: string
          format: date-time
    CaseRunResponse:
      type: object
      required:
      - data
      properties:
        data:
          type: object
          required:
          - caseId
          - planId
          - sourceOfTruth
          - projection
          properties:
            caseId:
              type: string
            planId:
              type: string
            sourceOfTruth:
              type: string
              description: Backend-owned terminal projection source identifier. Canonical public value is supplied by the
                main-lane machine-contract migration.
            projection:
              $ref: '#/components/schemas/CaseRunProjection'
  responses:
    Problem400:
      description: Bad request
      headers:
        X-Indwel-Trace-Id:
          description: Request correlation identifier.
          schema:
            type: string
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
          example:
            type: https://api.indwel.ai/problems/bad-request
            title: Bad request
            status: 400
            detail: Bad request
            instance: /v1/example
            code: BAD_REQUEST
            traceId: trace_01J0EXAMPLE
            retryable: false
    Problem401:
      description: Unauthorised
      headers:
        X-Indwel-Trace-Id:
          description: Request correlation identifier.
          schema:
            type: string
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
          example:
            type: https://api.indwel.ai/problems/unauthorised
            title: Unauthorised
            status: 401
            detail: Unauthorised
            instance: /v1/example
            code: UNAUTHORISED
            traceId: trace_01J0EXAMPLE
            retryable: false
    Problem403:
      description: Forbidden
      headers:
        X-Indwel-Trace-Id:
          description: Request correlation identifier.
          schema:
            type: string
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
          example:
            type: https://api.indwel.ai/problems/forbidden
            title: Forbidden
            status: 403
            detail: Forbidden
            instance: /v1/example
            code: FORBIDDEN
            traceId: trace_01J0EXAMPLE
            retryable: false
    Problem404:
      description: Not found
      headers:
        X-Indwel-Trace-Id:
          description: Request correlation identifier.
          schema:
            type: string
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
          example:
            type: https://api.indwel.ai/problems/not-found
            title: Not found
            status: 404
            detail: Not found
            instance: /v1/example
            code: NOT_FOUND
            traceId: trace_01J0EXAMPLE
            retryable: false
    Problem409:
      description: Conflict
      headers:
        X-Indwel-Trace-Id:
          description: Request correlation identifier.
          schema:
            type: string
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
          example:
            type: https://api.indwel.ai/problems/conflict
            title: Conflict
            status: 409
            detail: Conflict
            instance: /v1/example
            code: CONFLICT
            traceId: trace_01J0EXAMPLE
            retryable: false
    Problem428:
      description: Precondition required
      headers:
        X-Indwel-Trace-Id:
          description: Request correlation identifier.
          schema:
            type: string
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
          example:
            type: https://api.indwel.ai/problems/precondition-required
            title: Precondition required
            status: 428
            detail: Precondition required
            instance: /v1/example
            code: PRECONDITION_REQUIRED
            traceId: trace_01J0EXAMPLE
            retryable: false
    Problem429:
      description: Too many requests
      headers:
        X-Indwel-Trace-Id:
          description: Request correlation identifier.
          schema:
            type: string
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
          example:
            type: https://api.indwel.ai/problems/rate-limited
            title: Too many requests
            status: 429
            detail: Too many requests
            instance: /v1/example
            code: RATE_LIMITED
            traceId: trace_01J0EXAMPLE
            retryable: true
    DefaultProblem:
      description: Problem response
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ProblemDetails'
          example:
            type: https://api.indwel.ai/problems/request-failed
            title: Request failed
            status: 500
            detail: Request failed
            instance: /v1/example
            code: REQUEST_FAILED
            traceId: trace_01J0EXAMPLE
            retryable: false
  parameters:
    AppTemplateId:
      name: appTemplateId
      in: path
      required: true
      description: Stable governed-app template identifier.
      schema:
        type: string
        minLength: 1
      example: contract-review
    WorkflowId:
      name: workflowId
      in: path
      required: true
      description: Stable workflow identifier within an app template.
      schema:
        type: string
        minLength: 1
      example: review
    IfMatch:
      name: If-Match
      in: header
      required: true
      description: Current resource revision used for optimistic concurrency.
      schema:
        type: string
      example: '"rev_0001"'
    Limit:
      name: limit
      in: query
      required: false
      schema:
        type: integer
        minimum: 1
        maximum: 100
        default: 25
    Cursor:
      name: cursor
      in: query
      required: false
      schema:
        type: string
    OrganisationId:
      name: organisationId
      in: path
      required: true
      description: Organization identifier.
      schema:
        type: string
        minLength: 1
      example: organ_01J0EXAMPLE
    WorkspaceId:
      name: workspaceId
      in: path
      required: true
      description: Workspace identifier.
      schema:
        type: string
        minLength: 1
      example: works_01J0EXAMPLE
    ProjectId:
      name: projectId
      in: path
      required: true
      description: Developer project identifier.
      schema:
        type: string
        minLength: 1
      example: proje_01J0EXAMPLE
    EnvironmentId:
      name: environmentId
      in: path
      required: true
      description: Project environment identifier.
      schema:
        type: string
        minLength: 1
      example: envir_01J0EXAMPLE
    AppId:
      name: appId
      in: path
      required: true
      description: Project-owned governed app identifier.
      schema:
        type: string
        minLength: 1
      example: app_01J0EXAMPLE
    AppVersionId:
      name: appVersionId
      in: path
      required: true
      description: Immutable app-version identifier.
      schema:
        type: string
        minLength: 1
      example: appve_01J0EXAMPLE
    CollectionId:
      name: collectionId
      in: path
      required: true
      description: Evidence collection identifier.
      schema:
        type: string
        minLength: 1
      example: colle_01J0EXAMPLE
    SourceId:
      name: sourceId
      in: path
      required: true
      description: Custody-bearing source identifier.
      schema:
        type: string
        minLength: 1
      example: sourc_01J0EXAMPLE
    IngestionId:
      name: ingestionId
      in: path
      required: true
      description: Durable ingestion-attempt identifier.
      schema:
        type: string
        minLength: 1
      example: inges_01J0EXAMPLE
    IdempotencyKey:
      name: Idempotency-Key
      in: header
      required: true
      description: Client-generated key binding a retryable mutation to one canonical request fingerprint. Semantics remain
        versioned while the IETF field is a draft.
      schema:
        type: string
        minLength: 8
        maxLength: 255
      example: company-answers-project-v1
    ServiceId:
      name: serviceId
      in: path
      required: true
      description: Service identifier.
      schema:
        type: string
        minLength: 1
      example: platform
    EventDestinationId:
      name: eventDestinationId
      in: path
      required: true
      description: Event destination identifier.
      schema:
        type: string
        minLength: 1
      example: event_01J0EXAMPLE
    DeliveryId:
      name: deliveryId
      in: path
      required: true
      description: Delivery attempt identifier.
      schema:
        type: string
        minLength: 1
      example: deliv_01J0EXAMPLE
    OperationId:
      name: operationId
      in: path
      required: true
      description: Long-running operation identifier.
      schema:
        type: string
        minLength: 1
      example: opera_01J0EXAMPLE
    DeploymentId:
      name: deploymentId
      in: path
      required: true
      description: Deployment identifier.
      schema:
        type: string
        minLength: 1
      example: deplo_01J0EXAMPLE
    ClientId:
      name: clientId
      in: path
      required: true
      description: Developer client identifier.
      schema:
        type: string
        minLength: 1
      example: clien_01J0EXAMPLE
    CredentialId:
      name: credentialId
      in: path
      required: true
      description: Credential metadata identifier.
      schema:
        type: string
        minLength: 1
      example: crede_01J0EXAMPLE
    MemoryIdempotencyKey:
      name: Idempotency-Key
      in: header
      required: true
      description: Required for Memory mutations so retries cannot create or apply a distinct mutation.
      schema:
        type: string
        minLength: 1
        maxLength: 200
  securitySchemes:
    IndwelOAuth:
      type: oauth2
      description: OAuth 2.0 authority for the Indwel API. Authorization Code clients use PKCE; service clients use bounded
        client credentials. Individual operations state any required scope.
      flows:
        authorizationCode:
          authorizationUrl: https://identity.indwel.ai/oauth2/authorize
          tokenUrl: https://identity.indwel.ai/oauth2/token
          scopes:
            platform.read: Read platform metadata and releases.
            catalog.read: Read catalogs and capabilities.
            account.read: Read the current account.
            account.write: Update the current account.
            organisations.read: List organizations accessible to the principal.
            workspaces.read: List workspaces accessible within an organization.
            projects.write: Create and administer developer projects.
            environments.write: Create and administer project environments.
            clients.write: Create and rotate bounded developer clients.
            apps.write: Create apps and manage immutable app versions.
            deployments.write: Deploy published app versions into environments.
            installations.write: Install deployed apps into workspaces.
            collections.write: Create collections, sources and ingestion jobs.
            collections.read: Read collection and ingestion state.
            cases.read: Read governed Case state and receipt-backed Attention projections.
            cases.write: Create and administer governed business cases.
            case-transitions.write: Attempt a Cognitive Contract-governed Case business transition; this scope never constitutes
              organizational approval.
            case-participation.write: Record a Cognitive Contract-bound human participation decision; this scope does not
              appoint authority class or participant identity.
            events.read: Read event destinations and delivery history.
            events.write: Create event destinations, test delivery, replay and rotate signing secrets.
            operations.read: Read long-running control-plane operations.
            operations.write: Request cancellation of permitted long-running operations.
            usage.read: Read effective quotas and metered usage records.
            activity.read: Read customer-safe project activity.
            runs.write: Plan and execute governed Case-bound Runs through an installed app.
            runs.read: Read authorized Case-bound Run projections and terminal evidence.
            work.read: Read authorized durable Work and backend-owned Work projections.
            work.write: Create or change authorized durable Work through governed Work transitions.
            memory.read: Read the authenticated user's personal Memory V2 and Memory-derived projections.
            memory.write: Create or change the authenticated user's personal Memory V2 under governed lifecycle authority.
            scheduled-work.read: Read authorized Scheduled Work and its reports.
            scheduled-work.write: Propose, create, test, or change authorized Scheduled Work.
            parallel-cognition.read: Read Work-bound Parallel Cognition program projections.
            parallel-cognition.write: Request governed program-level Parallel Cognition cancellation.
            project-memberships.read: Read project membership and role assignments.
            project-memberships.write: Create or update project membership and role assignments.
            clients.issuer.write: Bind a developer client to Indwel’s authorized OAuth issuer.
            sessions.read: Read Sessions, their customer-safe metadata, and authorized transcript/session projections.
            sessions.write: Create, update, or delete principal-bound Sessions.
            continuity.read: Read a server-settled Continuity projection for an authorized Session.
            continuity.write: Continue an authorized Session through a server-governed continuity transition.
            conversation-cognition.write: Execute governed interactive cognition in an authorized Session.
        clientCredentials:
          tokenUrl: https://identity.indwel.ai/oauth2/token
          scopes:
            platform.read: Read platform metadata and releases.
            catalog.read: Read catalogs and capabilities.
            organisations.read: List organizations accessible to the principal.
            workspaces.read: List workspaces accessible within an organization.
            projects.write: Create and administer developer projects.
            environments.write: Create and administer project environments.
            clients.write: Create and rotate bounded developer clients.
            apps.write: Create apps and manage immutable app versions.
            deployments.write: Deploy published app versions into environments.
            installations.write: Install deployed apps into workspaces.
            collections.write: Create collections, sources and ingestion jobs.
            collections.read: Read collection and ingestion state.
            cases.read: Read governed Case state and receipt-backed Attention projections.
            cases.write: Create and administer governed business cases.
            case-transitions.write: Attempt a Cognitive Contract-governed Case business transition; this scope never constitutes
              organizational approval.
            case-participation.write: Record a Cognitive Contract-bound human participation decision; this scope does not
              appoint authority class or participant identity.
            events.read: Read event destinations and delivery history.
            events.write: Create event destinations, test delivery, replay and rotate signing secrets.
            operations.read: Read long-running control-plane operations.
            operations.write: Request cancellation of permitted long-running operations.
            usage.read: Read effective quotas and metered usage records.
            activity.read: Read customer-safe project activity.
            projects.read: Read developer projects and their lifecycle metadata.
            environments.read: Read project environments and effect boundaries.
            clients.read: Read developer clients without credential material.
            credentials.read: Read credential metadata without secret hashes or plaintext.
            credentials.write: Rotate and revoke bounded client credentials.
            runs.write: Plan and execute governed Case-bound Runs through an installed app.
            runs.read: Read authorized Case-bound Run projections and terminal evidence.
            work.read: Read authorized durable Work and backend-owned Work projections.
            work.write: Create or change authorized durable Work through governed Work transitions.
            scheduled-work.read: Read authorized Scheduled Work and its reports.
            scheduled-work.write: Propose, create, test, or change authorized Scheduled Work.
            parallel-cognition.read: Read Work-bound Parallel Cognition program projections.
            parallel-cognition.write: Request governed program-level Parallel Cognition cancellation.
x-indwel-contract-class: design-candidate
x-indwel-runtime-inventory-authority: packages/indwel-api-developer-platform-constitution/evidence/route-product-map.v1.json
x-indwel-contract-admission-authority: packages/indwel-api-developer-platform-constitution/registers/contract-admission-register.v1.json
x-indwel-release-claims-allowed: false
x-indwel-edition: customer
x-tagGroups:
- name: API Essentials
  tags:
  - Platform
  - Account
- name: Developer Control Plane
  tags:
  - Organizations
  - Projects
  - Environments
  - Clients
  - Credentials
- name: Apps & Business App Engine
  tags:
  - App Templates
  - Apps
  - Collections
  - Cases
  - Runs
- name: Work & Cognition
  tags:
  - Work
  - Conversation & Sessions
  - Memory
  - Scheduled Work
  - Parallel Cognition
- name: Operations & Integration
  tags:
  - Operations
  - Events
  - Activity
  - Usage
  - Commercial
- name: Compatibility
  tags:
  - Compatibility
x-indwel-reference:
  kind: launch-reference-projection-r12
  logicalApiOrigin: https://api.indwel.ai
  physicalRouteOwnershipHidden: true
  compatibilitySurfacesClassifiedSeparately: true
  underlyingApisModified: false
  defaultDocumentationLocale: en-US
  wireVocabularyLocaleInvariant: true
