> ## Documentation Index
> Fetch the complete documentation index at: https://ravion-b90c0359-changelog-week-2026-10-12.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Describe a Ravion resource ID with frontend links

> Resolve a Ravion resource ID into its resource type, payload, and canonical frontend links. Returns 404 when the ID cannot be resolved.



## OpenAPI

````yaml https://api.ravion.com/openapi.yaml get /describe/{id}
openapi: 3.0.0
info:
  title: Ravion
  version: 0.0.0
servers:
  - url: https://api.ravion.com
security:
  - BearerAuth: []
tags:
  - name: Projects
  - name: Environments
  - name: FeatureFlags
  - name: Pipelines
  - name: PipelineRuns
  - name: TerraformResources
  - name: TerraformExecutionSummaries
  - name: PipelineStepExecutions
  - name: AwsCloudWatch
  - name: PipelineVersions
  - name: Organizations
  - name: Stacks
  - name: StackWorkspaces
  - name: Auth
  - name: OAuth
  - name: User
  - name: Health
  - name: Memberships
  - name: ServiceAccounts
  - name: AwsDefaultNetworks
  - name: AwsAccounts
  - name: ApiKeys
  - name: AwsAmp
  - name: EksPrometheus
  - name: EksLoki
  - name: ExecutionEnvironments
  - name: ModuleDefinitions
  - name: ModuleCategories
  - name: ModuleVersions
  - name: ModuleInstances
  - name: DefaultValueDefinitions
  - name: DefaultValues
  - name: CodeSources
  - name: Github
  - name: GitHub Actions
  - name: Gitlab
  - name: Git
  - name: Values
  - name: Deployments
  - name: DeploymentResources
  - name: InfrastructureEvents
  - name: WebSocket
  - name: Domains
  - name: AcmCertificates
  - name: Describe
  - name: Reports
  - name: BillingPlans
  - name: BillingAccounts
  - name: BillingCycles
  - name: BillingUsageSummaries
  - name: BillingAddOns
  - name: BillingInvoices
  - name: Authorization
paths:
  /describe/{id}:
    get:
      tags:
        - Describe
      summary: Describe a Ravion resource ID with frontend links
      description: >-
        Resolve a Ravion resource ID into its resource type, payload, and
        canonical frontend links. Returns 404 when the ID cannot be resolved.
      operationId: DescribeResource
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                additionalProperties: false
                properties:
                  data:
                    $ref: '#/components/schemas/LinkModel'
                required:
                  - data
                type: object
          description: The request has succeeded.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Errors.UserFacingErrorData'
          description: The request is invalid or malformed.
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Errors.UserFacingErrorData'
          description: You are not authenticated
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Errors.UserFacingErrorData'
          description: You do not have permission to access this resource.
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Errors.UserFacingErrorData'
          description: The server cannot find the requested resource.
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Errors.UserFacingErrorData'
          description: Server error
components:
  schemas:
    LinkModel:
      discriminator:
        mapping:
          ApiKey: '#/components/schemas/LinkApiKey'
          AwsAccount: '#/components/schemas/LinkAwsAccount'
          CodeSource: '#/components/schemas/LinkCodeSource'
          DefaultValueDefinition: '#/components/schemas/LinkDefaultValueDefinition'
          DeploymentResource: '#/components/schemas/LinkDeploymentResource'
          Environment: '#/components/schemas/LinkEnvironment'
          ExecutionEnvironment: '#/components/schemas/LinkExecutionEnvironment'
          Membership: '#/components/schemas/LinkMembership'
          ModuleCategory: '#/components/schemas/LinkModuleCategory'
          ModuleDefinition: '#/components/schemas/LinkModuleDefinition'
          ModuleDeployment: '#/components/schemas/LinkModuleDeployment'
          ModuleInstance: '#/components/schemas/LinkModuleInstance'
          Organization: '#/components/schemas/LinkOrganization'
          Pipeline: '#/components/schemas/LinkPipeline'
          PipelineRun: '#/components/schemas/LinkPipelineRun'
          Project: '#/components/schemas/LinkProject'
          ServiceAccount: '#/components/schemas/LinkServiceAccount'
          Stack: '#/components/schemas/LinkStack'
          StepExecution: '#/components/schemas/LinkStepExecution'
        propertyName: resourceType
      oneOf:
        - $ref: '#/components/schemas/LinkOrganization'
        - $ref: '#/components/schemas/LinkProject'
        - $ref: '#/components/schemas/LinkEnvironment'
        - $ref: '#/components/schemas/LinkPipeline'
        - $ref: '#/components/schemas/LinkPipelineRun'
        - $ref: '#/components/schemas/LinkModuleDefinition'
        - $ref: '#/components/schemas/LinkModuleInstance'
        - $ref: '#/components/schemas/LinkStack'
        - $ref: '#/components/schemas/LinkModuleDeployment'
        - $ref: '#/components/schemas/LinkStepExecution'
        - $ref: '#/components/schemas/LinkServiceAccount'
        - $ref: '#/components/schemas/LinkApiKey'
        - $ref: '#/components/schemas/LinkMembership'
        - $ref: '#/components/schemas/LinkAwsAccount'
        - $ref: '#/components/schemas/LinkExecutionEnvironment'
        - $ref: '#/components/schemas/LinkModuleCategory'
        - $ref: '#/components/schemas/LinkDefaultValueDefinition'
        - $ref: '#/components/schemas/LinkDeploymentResource'
        - $ref: '#/components/schemas/LinkCodeSource'
      type: object
    Errors.UserFacingErrorData:
      additionalProperties: false
      description: |-
        User-facing error presentation data.
        This is what the API returns to the frontend after formatting ErrorData
        using CEL templates from the error registry.

        Used for both:
        - Error fields on domain models (e.g., PipelineRun.error)
        - API error response bodies (HTTP 4xx/5xx responses)
      properties:
        action:
          allOf:
            - $ref: '#/components/schemas/Errors.Action'
          description: Optional action to help resolve the error
        code:
          description: Full error code, e.g., "Ravion:Pipeline:NOT_FOUND"
          type: string
        description:
          description: Additional description with more details
          type: string
        details:
          description: Structured details rendered as user-facing sections.
          items:
            $ref: '#/components/schemas/Errors.UserFacingErrorDetailSection'
          type: array
        isInternal:
          description: >-
            Indicates whether this error is internal (only set when
            ShowInternal=true).

            This allows SUPERADMINs to identify internal errors while viewing
            full details.
          type: boolean
        message:
          description: Main error message (required)
          type: string
        metadata:
          additionalProperties: {}
          description: >-
            Error params/metadata. Stripped for internal errors unless
            superadmin.
          type: object
        requestId:
          description: Request ID for correlating errors with server logs.
          type: string
      required:
        - code
        - message
      type: object
    LinkApiKey:
      additionalProperties: false
      allOf:
        - properties:
            id:
              description: Resource ID that was resolved.
              type: string
            links:
              additionalProperties:
                type: string
              description: Canonical and contextual frontend links for the resource.
              type: object
            resource:
              allOf:
                - $ref: '#/components/schemas/ApiKey'
              description: The resolved resource payload.
            resourceType:
              description: Resolved resource type, based on the generated ID prefix.
              enum:
                - ApiKey
              type: string
          required:
            - id
            - resourceType
            - links
            - resource
          type: object
      properties:
        id: {}
        links: {}
        resource: {}
        resourceType: {}
      type: object
    LinkAwsAccount:
      additionalProperties: false
      allOf:
        - properties:
            id:
              description: Resource ID that was resolved.
              type: string
            links:
              additionalProperties:
                type: string
              description: Canonical and contextual frontend links for the resource.
              type: object
            resource:
              allOf:
                - $ref: '#/components/schemas/AwsAccount'
              description: The resolved resource payload.
            resourceType:
              description: Resolved resource type, based on the generated ID prefix.
              enum:
                - AwsAccount
              type: string
          required:
            - id
            - resourceType
            - links
            - resource
          type: object
      properties:
        id: {}
        links: {}
        resource: {}
        resourceType: {}
      type: object
    LinkCodeSource:
      additionalProperties: false
      allOf:
        - properties:
            id:
              description: Resource ID that was resolved.
              type: string
            links:
              additionalProperties:
                type: string
              description: Canonical and contextual frontend links for the resource.
              type: object
            resource:
              allOf:
                - $ref: '#/components/schemas/CodeSource'
              description: The resolved resource payload.
            resourceType:
              description: Resolved resource type, based on the generated ID prefix.
              enum:
                - CodeSource
              type: string
          required:
            - id
            - resourceType
            - links
            - resource
          type: object
      properties:
        id: {}
        links: {}
        resource: {}
        resourceType: {}
      type: object
    LinkDefaultValueDefinition:
      additionalProperties: false
      allOf:
        - properties:
            id:
              description: Resource ID that was resolved.
              type: string
            links:
              additionalProperties:
                type: string
              description: Canonical and contextual frontend links for the resource.
              type: object
            resource:
              allOf:
                - $ref: '#/components/schemas/DefaultValueDefinition'
              description: The resolved resource payload.
            resourceType:
              description: Resolved resource type, based on the generated ID prefix.
              enum:
                - DefaultValueDefinition
              type: string
          required:
            - id
            - resourceType
            - links
            - resource
          type: object
      properties:
        id: {}
        links: {}
        resource: {}
        resourceType: {}
      type: object
    LinkDeploymentResource:
      additionalProperties: false
      allOf:
        - properties:
            id:
              description: Resource ID that was resolved.
              type: string
            links:
              additionalProperties:
                type: string
              description: Canonical and contextual frontend links for the resource.
              type: object
            resource:
              allOf:
                - $ref: '#/components/schemas/DeploymentResource.Summary'
              description: The resolved resource payload.
            resourceType:
              description: Resolved resource type, based on the generated ID prefix.
              enum:
                - DeploymentResource
              type: string
          required:
            - id
            - resourceType
            - links
            - resource
          type: object
      properties:
        id: {}
        links: {}
        resource: {}
        resourceType: {}
      type: object
    LinkEnvironment:
      additionalProperties: false
      allOf:
        - properties:
            id:
              description: Resource ID that was resolved.
              type: string
            links:
              additionalProperties:
                type: string
              description: Canonical and contextual frontend links for the resource.
              type: object
            resource:
              allOf:
                - $ref: '#/components/schemas/Environment'
              description: The resolved resource payload.
            resourceType:
              description: Resolved resource type, based on the generated ID prefix.
              enum:
                - Environment
              type: string
          required:
            - id
            - resourceType
            - links
            - resource
          type: object
      properties:
        id: {}
        links: {}
        resource: {}
        resourceType: {}
      type: object
    LinkExecutionEnvironment:
      additionalProperties: false
      allOf:
        - properties:
            id:
              description: Resource ID that was resolved.
              type: string
            links:
              additionalProperties:
                type: string
              description: Canonical and contextual frontend links for the resource.
              type: object
            resource:
              allOf:
                - $ref: '#/components/schemas/ExecutionEnvironment.Union'
              description: The resolved resource payload.
            resourceType:
              description: Resolved resource type, based on the generated ID prefix.
              enum:
                - ExecutionEnvironment
              type: string
          required:
            - id
            - resourceType
            - links
            - resource
          type: object
      properties:
        id: {}
        links: {}
        resource: {}
        resourceType: {}
      type: object
    LinkMembership:
      additionalProperties: false
      allOf:
        - properties:
            id:
              description: Resource ID that was resolved.
              type: string
            links:
              additionalProperties:
                type: string
              description: Canonical and contextual frontend links for the resource.
              type: object
            resource:
              allOf:
                - $ref: '#/components/schemas/Membership'
              description: The resolved resource payload.
            resourceType:
              description: Resolved resource type, based on the generated ID prefix.
              enum:
                - Membership
              type: string
          required:
            - id
            - resourceType
            - links
            - resource
          type: object
      properties:
        id: {}
        links: {}
        resource: {}
        resourceType: {}
      type: object
    LinkModuleCategory:
      additionalProperties: false
      allOf:
        - properties:
            id:
              description: Resource ID that was resolved.
              type: string
            links:
              additionalProperties:
                type: string
              description: Canonical and contextual frontend links for the resource.
              type: object
            resource:
              allOf:
                - $ref: '#/components/schemas/ModuleCategory'
              description: The resolved resource payload.
            resourceType:
              description: Resolved resource type, based on the generated ID prefix.
              enum:
                - ModuleCategory
              type: string
          required:
            - id
            - resourceType
            - links
            - resource
          type: object
      properties:
        id: {}
        links: {}
        resource: {}
        resourceType: {}
      type: object
    LinkModuleDefinition:
      additionalProperties: false
      allOf:
        - properties:
            id:
              description: Resource ID that was resolved.
              type: string
            links:
              additionalProperties:
                type: string
              description: Canonical and contextual frontend links for the resource.
              type: object
            resource:
              allOf:
                - $ref: '#/components/schemas/ModuleDefinition'
              description: The resolved resource payload.
            resourceType:
              description: Resolved resource type, based on the generated ID prefix.
              enum:
                - ModuleDefinition
              type: string
          required:
            - id
            - resourceType
            - links
            - resource
          type: object
      properties:
        id: {}
        links: {}
        resource: {}
        resourceType: {}
      type: object
    LinkModuleDeployment:
      additionalProperties: false
      allOf:
        - properties:
            id:
              description: Resource ID that was resolved.
              type: string
            links:
              additionalProperties:
                type: string
              description: Canonical and contextual frontend links for the resource.
              type: object
            resource:
              allOf:
                - $ref: '#/components/schemas/Deployment.Model'
              description: The resolved resource payload.
            resourceType:
              description: Resolved resource type, based on the generated ID prefix.
              enum:
                - ModuleDeployment
              type: string
          required:
            - id
            - resourceType
            - links
            - resource
          type: object
      properties:
        id: {}
        links: {}
        resource: {}
        resourceType: {}
      type: object
    LinkModuleInstance:
      additionalProperties: false
      allOf:
        - properties:
            id:
              description: Resource ID that was resolved.
              type: string
            links:
              additionalProperties:
                type: string
              description: Canonical and contextual frontend links for the resource.
              type: object
            resource:
              allOf:
                - $ref: '#/components/schemas/ModuleInstance'
              description: The resolved resource payload.
            resourceType:
              description: Resolved resource type, based on the generated ID prefix.
              enum:
                - ModuleInstance
              type: string
          required:
            - id
            - resourceType
            - links
            - resource
          type: object
      properties:
        id: {}
        links: {}
        resource: {}
        resourceType: {}
      type: object
    LinkOrganization:
      additionalProperties: false
      allOf:
        - properties:
            id:
              description: Resource ID that was resolved.
              type: string
            links:
              additionalProperties:
                type: string
              description: Canonical and contextual frontend links for the resource.
              type: object
            resource:
              allOf:
                - $ref: '#/components/schemas/Organization'
              description: The resolved resource payload.
            resourceType:
              description: Resolved resource type, based on the generated ID prefix.
              enum:
                - Organization
              type: string
          required:
            - id
            - resourceType
            - links
            - resource
          type: object
      properties:
        id: {}
        links: {}
        resource: {}
        resourceType: {}
      type: object
    LinkPipeline:
      additionalProperties: false
      allOf:
        - properties:
            id:
              description: Resource ID that was resolved.
              type: string
            links:
              additionalProperties:
                type: string
              description: Canonical and contextual frontend links for the resource.
              type: object
            resource:
              allOf:
                - $ref: '#/components/schemas/Pipeline'
              description: The resolved resource payload.
            resourceType:
              description: Resolved resource type, based on the generated ID prefix.
              enum:
                - Pipeline
              type: string
          required:
            - id
            - resourceType
            - links
            - resource
          type: object
      properties:
        id: {}
        links: {}
        resource: {}
        resourceType: {}
      type: object
    LinkPipelineRun:
      additionalProperties: false
      allOf:
        - properties:
            id:
              description: Resource ID that was resolved.
              type: string
            links:
              additionalProperties:
                type: string
              description: Canonical and contextual frontend links for the resource.
              type: object
            resource:
              allOf:
                - $ref: '#/components/schemas/PipelineRun'
              description: The resolved resource payload.
            resourceType:
              description: Resolved resource type, based on the generated ID prefix.
              enum:
                - PipelineRun
              type: string
          required:
            - id
            - resourceType
            - links
            - resource
          type: object
      properties:
        id: {}
        links: {}
        resource: {}
        resourceType: {}
      type: object
    LinkProject:
      additionalProperties: false
      allOf:
        - properties:
            id:
              description: Resource ID that was resolved.
              type: string
            links:
              additionalProperties:
                type: string
              description: Canonical and contextual frontend links for the resource.
              type: object
            resource:
              allOf:
                - $ref: '#/components/schemas/Project'
              description: The resolved resource payload.
            resourceType:
              description: Resolved resource type, based on the generated ID prefix.
              enum:
                - Project
              type: string
          required:
            - id
            - resourceType
            - links
            - resource
          type: object
      properties:
        id: {}
        links: {}
        resource: {}
        resourceType: {}
      type: object
    LinkServiceAccount:
      additionalProperties: false
      allOf:
        - properties:
            id:
              description: Resource ID that was resolved.
              type: string
            links:
              additionalProperties:
                type: string
              description: Canonical and contextual frontend links for the resource.
              type: object
            resource:
              allOf:
                - $ref: '#/components/schemas/ServiceAccount'
              description: The resolved resource payload.
            resourceType:
              description: Resolved resource type, based on the generated ID prefix.
              enum:
                - ServiceAccount
              type: string
          required:
            - id
            - resourceType
            - links
            - resource
          type: object
      properties:
        id: {}
        links: {}
        resource: {}
        resourceType: {}
      type: object
    LinkStack:
      additionalProperties: false
      allOf:
        - properties:
            id:
              description: Resource ID that was resolved.
              type: string
            links:
              additionalProperties:
                type: string
              description: Canonical and contextual frontend links for the resource.
              type: object
            resource:
              allOf:
                - $ref: '#/components/schemas/Stack.Union'
              description: The resolved resource payload.
            resourceType:
              description: Resolved resource type, based on the generated ID prefix.
              enum:
                - Stack
              type: string
          required:
            - id
            - resourceType
            - links
            - resource
          type: object
      properties:
        id: {}
        links: {}
        resource: {}
        resourceType: {}
      type: object
    LinkStepExecution:
      additionalProperties: false
      allOf:
        - properties:
            id:
              description: Resource ID that was resolved.
              type: string
            links:
              additionalProperties:
                type: string
              description: Canonical and contextual frontend links for the resource.
              type: object
            resource:
              allOf:
                - $ref: '#/components/schemas/PipelineStepExecution'
              description: The resolved resource payload.
            resourceType:
              description: Resolved resource type, based on the generated ID prefix.
              enum:
                - StepExecution
              type: string
          required:
            - id
            - resourceType
            - links
            - resource
          type: object
      properties:
        id: {}
        links: {}
        resource: {}
        resourceType: {}
      type: object
    Errors.Action:
      additionalProperties: false
      description: Action to help user resolve the error
      properties:
        label:
          description: Button/link label text
          type: string
        url:
          description: URL to navigate to for resolution
          type: string
      required:
        - label
        - url
      type: object
    Errors.UserFacingErrorDetailSection:
      additionalProperties: false
      description: Structured user-facing error detail section.
      properties:
        items:
          description: List of detail values for this section.
          items:
            type: string
          type: array
        object:
          additionalProperties: {}
          description: Structured detail payload for object rendering.
          type: object
        render:
          description: Rendering hint for clients. Valid values are list or object.
          type: string
        title:
          description: Detail section title shown in the UI.
          type: string
      required:
        - title
        - render
      type: object
    ApiKey:
      additionalProperties: false
      properties:
        createdAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        createdById:
          description: Audit-only user id for the member who created the key.
          readOnly: true
          type: string
        description:
          description: Optional context for where or why this API key is used.
          type: string
        expiresAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          description: >-
            Optional expiration timestamp. Null or omitted means the key does
            not expire.
          nullable: true
          type: string
        id:
          readOnly: true
          type: string
        keySuffix:
          description: >-
            Last visible characters of the API key token for safe
            identification.
          readOnly: true
          type: string
        lastUsedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          description: Last successful authentication timestamp for this API key.
          nullable: true
          readOnly: true
          type: string
        name:
          description: User-facing label for the API key.
          minLength: 1
          type: string
        organizationId:
          readOnly: true
          type: string
        ownerId:
          description: >-
            ID of the membership or service account this API key authenticates
            as.
          type: string
        ownerType:
          allOf:
            - $ref: '#/components/schemas/ApiKey.OwnerType'
          description: Type of principal this API key authenticates as.
        permissions:
          description: >-
            The most the key may do, as `type:action` pairs from the
            authorization

            catalog, for example `project:read` or `pipelineRun:create`. The key
            may

            do something only when its owner may too, so it can narrow its
            owner's

            permissions but never widen them. Null means everything its owner
            may do.

            Omitting this field on create uses the owner's permissions; omitting
            it

            on update preserves the current limit. Limits apply only in
            organizations

            with authorization enforcement enabled. Limited keys cannot access
            the

            Terraform Cloud API or personal-account operations, and cannot
            select

            another organization. Only a member signed in to the dashboard or
            the

            CLI can change it, never an API key.
          items:
            type: string
          maxItems: 200
          minItems: 1
          nullable: true
          type: array
          x-go-type: nullable.Nullable[[]string]
          x-go-type-skip-optional-pointer: true
        updatedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
      required:
        - id
        - createdAt
        - updatedAt
        - organizationId
        - name
        - ownerType
        - ownerId
        - keySuffix
        - createdById
      type: object
    AwsAccount:
      additionalProperties: false
      properties:
        awsArn:
          description: AWS IAM role ARN for cross-account access
          readOnly: true
          type: string
        awsId:
          description: AWS account ID (12-digit number)
          readOnly: true
          type: string
        cfnStackId:
          description: >-
            CloudFormation stack ARN (set by ravion-lambda; used to generate
            upgrade URLs)
          readOnly: true
          type: string
        createdAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        givenId:
          allOf:
            - $ref: '#/components/schemas/GivenId'
          description: >-
            User-provided AWS account identifier. Must be unique within
            organization.
          maxLength: 60
          minLength: 1
        id:
          readOnly: true
          type: string
        latestRoleVersion:
          description: Latest available role policy version (from server-side registry)
          readOnly: true
          type: string
        latestRoleVersionDescription:
          description: Description of the latest role policy version
          readOnly: true
          type: string
        name:
          description: Name of the AWS account
          minLength: 1
          type: string
        organizationId:
          readOnly: true
          type: string
        roleVersion:
          description: >-
            PolicyVersion of the deployed CloudFormation stack (set by
            ravion-lambda on Create/Update)
          readOnly: true
          type: string
        status:
          allOf:
            - $ref: '#/components/schemas/AwsAccount.AwsAccountStatus'
          description: Current status of the AWS account
          readOnly: true
        updatedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
      required:
        - id
        - createdAt
        - updatedAt
        - organizationId
        - givenId
        - name
        - status
      type: object
    CodeSource:
      discriminator:
        mapping:
          GITHUB: '#/components/schemas/CodeSource.Github'
          GITLAB: '#/components/schemas/CodeSource.Gitlab'
          GITLAB_SELF_HOSTED: '#/components/schemas/CodeSource.GitlabSelfHosted'
        propertyName: type
      oneOf:
        - $ref: '#/components/schemas/CodeSource.Github'
        - $ref: '#/components/schemas/CodeSource.Gitlab'
        - $ref: '#/components/schemas/CodeSource.GitlabSelfHosted'
      type: object
    DefaultValueDefinition:
      additionalProperties: false
      properties:
        createdAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        createdByType:
          allOf:
            - $ref: '#/components/schemas/DefaultValueDefinition.CreatedByType'
          default: USER
          description: Whether this definition was created by the system or a user.
          readOnly: true
        description:
          type: string
        givenId:
          allOf:
            - $ref: '#/components/schemas/GivenId'
          description: User-provided identifier. Must be unique within organization.
          maxLength: 60
          minLength: 1
        id:
          readOnly: true
          type: string
        name:
          minLength: 1
          type: string
        organizationId:
          readOnly: true
          type: string
        schema:
          allOf:
            - $ref: '#/components/schemas/Module.InputProperty'
          description: Schema describing the value this default accepts.
        updatedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
      required:
        - id
        - createdAt
        - updatedAt
        - organizationId
        - givenId
        - name
        - schema
        - createdByType
      type: object
    DeploymentResource.Summary:
      additionalProperties: false
      description: |-
        Summary shape returned on list endpoints. The generic fields
        (type, lifecycleType, lastStatus, timestamps) are SQL columns on
        DeploymentResource; `data` is the typed JSON column.
      properties:
        data:
          $ref: '#/components/schemas/DeploymentResourceData'
        desiredStatus:
          type: string
        error:
          $ref: '#/components/schemas/Errors.UserFacingErrorData'
        externalId:
          description: |-
            AWS identity for this resource. Task ARN for ECS tasks,
            request ID for Lambda invocations (future), distribution ID
            for CloudFront distributions under a static deploy (future).
          type: string
        firstSeenAt:
          $ref: '#/components/schemas/UtcDateTime'
        id:
          type: string
        lastEventAt:
          $ref: '#/components/schemas/UtcDateTime'
        lastStatus:
          description: >-
            Generic status string. Kind-specific ladders:

            ECS_TASK → PROVISIONING | PENDING | RUNNING | DEPROVISIONING |
            STOPPED

            EC2_INSTANCE → PENDING | IN_SERVICE | TERMINATING | TERMINATED |
            DETACHING | DETACHED | STANDBY

            AMI_IMAGE → WAITING | BUILDING | TESTING | COPYING | PRIVATE |
            PUBLIC | FAILED | DEREGISTERED

            LAMBDA_INVOCATION (future) → INIT | RUNNING | SUCCESS | ERROR |
            TIMEOUT

            STATIC_CLOUDFRONT_DISTRIBUTION (future) → PENDING_UPDATE |
            IN_PROGRESS | DEPLOYED | FAILED
          type: string
        lifecycleType:
          allOf:
            - $ref: '#/components/schemas/Deployments.DeploymentResourceLifecycleType'
          description: |-
            Lifecycle type within the parent deployment — RUNTIME for the
            long-lived service-managed task, PRE_DEPLOY / POST_DEPLOY for
            the optional hook tasks.
        moduleDeploymentId:
          description: |-
            Parent ModuleDeployment id — the deploy that spawned this
            resource.
          type: string
        moduleInstanceId:
          description: |-
            Optional linkage to the module instance (denormalized from
            the deploy so same-resource-across-deploys queries are cheap).
          type: string
        startedAt:
          $ref: '#/components/schemas/UtcDateTime'
        stoppedAt:
          $ref: '#/components/schemas/UtcDateTime'
        type:
          allOf:
            - $ref: '#/components/schemas/Deployments.DeploymentResourceType'
          description: Runtime kind of the resource — drives the shape of `data`.
      required:
        - id
        - type
        - lifecycleType
        - moduleDeploymentId
        - externalId
        - firstSeenAt
        - lastEventAt
        - data
      type: object
    Environment:
      additionalProperties: false
      properties:
        canvas:
          allOf:
            - $ref: '#/components/schemas/Canvas'
          description: >-
            The saved module canvas: where each card sits, how cards are
            grouped, and which metrics they chart. Presentation only — it never
            affects deployments. Patching replaces the whole canvas; an
            environment that has never been arranged has an empty one.
        createdAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        description:
          type: string
        error:
          allOf:
            - $ref: '#/components/schemas/Errors.UserFacingErrorData'
          description: >-
            Structured error from the last failed delete; set only when status
            is ERROR_DELETING (read-only).
          readOnly: true
        givenId:
          allOf:
            - $ref: '#/components/schemas/GivenId'
          description: User-provided environment identifier. Must be unique within project.
          maxLength: 60
          minLength: 1
        id:
          readOnly: true
          type: string
        name:
          minLength: 1
          type: string
        organizationId:
          readOnly: true
          type: string
        projectId:
          type: string
        status:
          allOf:
            - $ref: '#/components/schemas/Environment.Status'
          description: Lifecycle status (read-only).
          readOnly: true
        updatedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
      required:
        - id
        - createdAt
        - updatedAt
        - organizationId
        - givenId
        - name
        - projectId
        - status
        - canvas
      type: object
    ExecutionEnvironment.Union:
      discriminator:
        mapping:
          AWS: '#/components/schemas/ExecutionEnvironment.Aws'
        propertyName: type
      oneOf:
        - $ref: '#/components/schemas/ExecutionEnvironment.Aws'
      type: object
    Membership:
      additionalProperties: false
      properties:
        createdAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        email:
          format: email
          type: string
        fullName:
          readOnly: true
          type: string
        id:
          readOnly: true
          type: string
        invitationId:
          readOnly: true
          type: string
        invitedEmail:
          readOnly: true
          type: string
        organizationId:
          readOnly: true
          type: string
        role:
          description: >-
            Deprecated: use `roles`. Writing it sets `roles` to this one role;
            it cannot be sent

            with `roles`. `OWNER` is accepted as `owner`. Reads return the
            member's role with the

            most access, or its first custom role.
          type: string
        roleName:
          description: 'Deprecated: use `roleNames`. Display name of `role`.'
          readOnly: true
          type: string
        roleNames:
          description: Display names of `roles`, in the same order.
          items:
            type: string
          readOnly: true
          type: array
        roles:
          description: >-
            The roles the member holds across the organization, each a
            system-managed role key

            (`owner`, `platform-admin`, `operator`, `manager`, `read-only` or
            `billing`) or a custom

            role ID. A member holds at least one. Reads list system-managed
            roles in that order, then

            custom roles by name. Setting `roles` replaces the whole set. Roles
            other than

            `owner` require policy administration to be enabled for the
            organization, and the caller

            can add or remove only roles whose permissions it already holds.
          items:
            type: string
          type: array
        shortName:
          readOnly: true
          type: string
        updatedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        userId:
          readOnly: true
          type: string
      required:
        - id
        - createdAt
        - updatedAt
        - organizationId
        - email
      type: object
    ModuleCategory:
      additionalProperties: false
      properties:
        createdAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        description:
          maxLength: 10000
          type: string
        givenId:
          allOf:
            - $ref: '#/components/schemas/GivenId'
          description: User-provided stable identifier.
        icon:
          description: Lucide icon name.
          maxLength: 64
          type: string
        id:
          readOnly: true
          type: string
        name:
          maxLength: 64
          minLength: 1
          type: string
        organizationId:
          description: Organization ID, null for global categories.
          readOnly: true
          type: string
        sortOrder:
          default: 0
          format: int32
          type: integer
        updatedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
      required:
        - id
        - createdAt
        - updatedAt
        - givenId
        - name
        - sortOrder
      type: object
    ModuleDefinition:
      additionalProperties: false
      properties:
        createdAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        description:
          description: Short description displayed in the catalog.
          minLength: 1
          type: string
        id:
          readOnly: true
          type: string
        latestVersion:
          description: >-
            Latest published module version number. Included only when
            requested.
          readOnly: true
          type: string
        latestVersionId:
          description: Latest published module version ID. Included only when requested.
          readOnly: true
          type: string
        moduleCategoryIds:
          description: Categories assigned to this module definition.
          items:
            type: string
          type: array
        name:
          minLength: 1
          type: string
        organizationId:
          description: Organization ID, null for global modules
          readOnly: true
          type: string
        status:
          allOf:
            - $ref: '#/components/schemas/ModuleDefinition.Status'
          readOnly: true
        type:
          description: >-
            Module type identifier, e.g. "aws-network". Must be unique within
            organization.
          maxLength: 100
          minLength: 1
          pattern: ^[a-z][a-z0-9-]*$
          type: string
        updatedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
      required:
        - id
        - createdAt
        - updatedAt
        - name
        - description
        - type
        - status
      type: object
    Deployment.Model:
      additionalProperties: false
      properties:
        completedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          description: Timestamp when the deployment completed
          readOnly: true
        createdAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        data:
          allOf:
            - $ref: '#/components/schemas/DeploymentData'
          description: |-
            Typed deployment-type-specific metadata (clusterArn /
            serviceArn / TD snapshots for ECS; functionArn / aliasName /
            version for Lambda; etc.). Stored as a JSON column on the
            ModuleDeployment row; payload shape is defined in
            `@fc/schemas/deployments/tsp`.
          readOnly: true
        deploymentType:
          description: Deployment type (e.g., "aws:ecs")
          type: string
        description:
          description: User-provided description
          type: string
        environmentId:
          description: Environment ID
          type: string
        error:
          allOf:
            - $ref: '#/components/schemas/Errors.UserFacingErrorData'
          description: User-facing error data, formatted from raw ErrorData stored in DB
          readOnly: true
        externalDeploymentId:
          description: |-
            Cloud-assigned deployment identity. ECS uses values like
            `ecs-svc/9124318887254438708`; the deployment list uses this to
            match ECS service-revision ARNs back to Ravion deployment rows.
          readOnly: true
          type: string
        id:
          readOnly: true
          type: string
        moduleInstanceId:
          description: Module instance ID this deployment targets
          type: string
        organizationId:
          readOnly: true
          type: string
        pipelineRunId:
          description: Pipeline run ID executing this deployment
          type: string
        projectId:
          description: Project ID
          type: string
        redeployOfDeploymentId:
          description: |-
            Populated on redeploy deployments — references the source
            deployment whose task definition revision was redeployed.
          readOnly: true
          type: string
        resourceArn:
          description: |-
            Hot-path correlation key for event ingestion. ECS →
            serviceArn; Lambda → functionArn; Static →
            primary CloudFront distribution id. Indexed on the DB row so
            event ingesters can resolve an incoming event to a deploy
            without JSON_EXTRACT.
          readOnly: true
          type: string
        resourceName:
          description: Human-readable name derived from the resource ARN.
          readOnly: true
          type: string
        rollbackToDeploymentId:
          description: |-
            Populated on rollback deployments — references the deployment
            that was rolled back to.
          readOnly: true
          type: string
        startedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          description: Timestamp when the deployment started executing
          readOnly: true
        status:
          description: >-
            Deployment status.


            `CANCELLING` is not terminal: it is the window between an operator

            asking for a cancel and the deploy settling. For `aws:eks` a cancel

            cannot be immediate — Helm holds a lock on the release and cannot be

            interrupted mid-upgrade — so the in-flight attempt concludes and the

            release is then rolled back, which is why such a deploy usually ends
            in

            `ROLLED_BACK` rather than `CANCELLED`.
          enum:
            - PENDING
            - IN_PROGRESS
            - CANCELLING
            - SUCCESS
            - ERROR
            - CANCELLED
            - ROLLING_BACK
            - ROLLED_BACK
          readOnly: true
          type: string
        stepExecutionId:
          description: |-
            Step execution that produced this deployment. Set when
            triggerSource=PIPELINE — points at the exact `deploy`/`deploy-swap`
            step inside `pipelineRunId` so the UI can deep-link without
            guessing by stepType.
          type: string
        triggerSource:
          description: How the deployment was triggered
          type: string
        updatedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
      required:
        - id
        - createdAt
        - updatedAt
        - organizationId
        - moduleInstanceId
        - projectId
        - environmentId
        - description
        - status
        - deploymentType
        - triggerSource
      type: object
    ModuleInstance:
      additionalProperties: false
      properties:
        createdAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        description:
          description: Optional description of the module instance.
          maxLength: 1000
          type: string
        environmentId:
          description: Environment ID where this instance is deployed
          minLength: 1
          type: string
        error:
          allOf:
            - $ref: '#/components/schemas/Errors.UserFacingErrorData'
          description: >-
            Structured error from the last failed delete; set only when status
            is ERROR_DELETING (read-only).
          readOnly: true
        givenId:
          allOf:
            - $ref: '#/components/schemas/GivenId'
          description: User-provided unique identifier. Must be unique within environment.
          maxLength: 255
          minLength: 1
        id:
          readOnly: true
          type: string
        input:
          additionalProperties:
            nullable: true
          description: Configuration input object for the module instance
          type: object
        inputRefs:
          description: >-
            Cross-module value-reference bindings derived from `<< … >>`
            templates in `input` (read-only).
          items:
            $ref: '#/components/schemas/ModuleInstance.ValueReferenceBinding'
          readOnly: true
          type: array
        moduleDefinitionId:
          description: Module definition ID
          minLength: 1
          type: string
        moduleVersionId:
          description: Module version ID for the current configuration
          minLength: 1
          type: string
        name:
          description: User-provided instance name.
          maxLength: 255
          minLength: 1
          type: string
        organizationId:
          readOnly: true
          type: string
        projectId:
          description: Project ID this instance belongs to.
          readOnly: true
          type: string
        releasesSandboxHosts:
          description: >-
            True when this module's aws:ami deployments release the images
            Ravion's sandbox hosts boot. Such a module cannot be deleted, and
            neither can its environment or project. Absent on every other module
            instance.
          readOnly: true
          type: boolean
        stackId:
          description: Stack ID for the associated Terraform/OpenTofu stack
          readOnly: true
          type: string
        status:
          allOf:
            - $ref: '#/components/schemas/ModuleInstance.Status'
          description: Lifecycle status (read-only).
          readOnly: true
        type:
          description: >-
            Module type identifier, copied from the module definition at
            creation time.
          readOnly: true
          type: string
        ui:
          allOf:
            - $ref: '#/components/schemas/ModuleInstance.ResolvedModuleUI'
          description: >-
            Module UI configuration with template expressions resolved.
            Populated

            server-side at write time (create/patch + after every stack apply

            alongside `Stack.output`). Every field is optional and nullable
            because

            a freshly-created module instance has no stack output yet — fields
            that

            references `<< module.output.* >>` (or legacy `<< stack.output.*
            >>`)

            stay null until the first apply.
          readOnly: true
        updatedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
      required:
        - id
        - createdAt
        - updatedAt
        - organizationId
        - name
        - givenId
        - type
        - moduleDefinitionId
        - moduleVersionId
        - environmentId
        - projectId
        - status
        - input
      type: object
    Organization:
      additionalProperties: false
      properties:
        billingEmail:
          minLength: 1
          type: string
        createdAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        id:
          readOnly: true
          type: string
        name:
          minLength: 2
          type: string
        updatedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
      required:
        - id
        - createdAt
        - updatedAt
        - name
        - billingEmail
      type: object
    Pipeline:
      additionalProperties: false
      properties:
        createdAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        description:
          type: string
        givenId:
          allOf:
            - $ref: '#/components/schemas/GivenId'
          description: User-provided pipeline identifier. Must be unique within project.
          maxLength: 60
          minLength: 1
        id:
          readOnly: true
          type: string
        latestRunId:
          description: >-
            Id of the newest non-cancelled run for this pipeline. Always null
            for system pipelines (shared across organizations) — use the stack's
            latestRunId for module/infrastructure run status.
          readOnly: true
          type: string
        latestRunStatus:
          allOf:
            - $ref: '#/components/schemas/PipelineRun.Status'
          description: >-
            Status of the newest non-cancelled run for this pipeline. Always
            null for system pipelines (shared across organizations) — use the
            stack's latestRunStatus for module/infrastructure run status.
          readOnly: true
        name:
          minLength: 1
          type: string
        organizationId:
          description: Organization ID, null for global system pipelines
          readOnly: true
          type: string
        projectId:
          type: string
        updatedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        usage:
          allOf:
            - $ref: '#/components/schemas/Pipeline.Usage'
          description: >-
            Internal pipelines are managed by Ravion and must not be offered as
            defaults or module input choices. They remain readable for run
            history.
          readOnly: true
      required:
        - id
        - createdAt
        - updatedAt
        - usage
        - givenId
        - name
        - projectId
      type: object
    PipelineRun:
      additionalProperties: false
      properties:
        attachedEntityId:
          description: ID of the entity (e.g. Stack) that this run is associated with
          type: string
        attemptEpoch:
          description: >-
            Zero-based run attempt number. Advances even when no step row
            exists.
          format: int32
          readOnly: true
          type: integer
        completedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        createdAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        createdById:
          description: >-
            ID of the acting credential that created this run: a membership id
            or a

            service account API key id.
          readOnly: true
          type: string
        data:
          allOf:
            - $ref: '#/components/schemas/Pipeline.PipelineRunSnapshot'
          description: >-
            State of the run's attached entity captured when the run was
            created;

            for stack runs, the module version and module input values in
            effect.
          readOnly: true
        description:
          description: User-provided description of this pipeline run.
          minLength: 1
          type: string
        error:
          allOf:
            - $ref: '#/components/schemas/Errors.UserFacingErrorData'
          description: User-facing error data, formatted from raw ErrorData stored in DB
          readOnly: true
        id:
          readOnly: true
          type: string
        input:
          additionalProperties: {}
          description: |-
            Manual pipeline input values keyed by input definition key.
            Example: {"image_tag": "v1.2.3", "enable_debug": true}.
          type: object
        isCancellable:
          readOnly: true
          type: boolean
        lastAttemptStartedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          description: Start time of the currently active or most recent retry attempt.
          readOnly: true
        organizationId:
          readOnly: true
          type: string
        pipelineId:
          type: string
        pipelineVersionId:
          type: string
        queueConditionKey:
          description: >-
            Condition key currently blocking this run, when queued on an
            external condition.
          nullable: true
          readOnly: true
          type: string
        queueReason:
          description: Human-readable reason shown while this run is queued.
          nullable: true
          readOnly: true
          type: string
        queueState:
          allOf:
            - $ref: '#/components/schemas/PipelineRun.QueueState'
          description: Typed queue display state for frontend rendering and linking.
          nullable: true
          readOnly: true
          type: object
        startedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        status:
          allOf:
            - $ref: '#/components/schemas/PipelineRun.Status'
          readOnly: true
        temporalRunId:
          readOnly: true
          type: string
        temporalWorkflowId:
          readOnly: true
          type: string
        triggerMetadata:
          allOf:
            - $ref: '#/components/schemas/Pipeline.TriggerMetadata'
          description: Metadata about the trigger that started this run
          readOnly: true
        updatedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        variantId:
          description: ID of the variant to execute.
          type: string
        variantName:
          readOnly: true
          type: string
      required:
        - id
        - createdAt
        - updatedAt
        - organizationId
        - status
        - attemptEpoch
        - isCancellable
        - pipelineId
        - pipelineVersionId
        - description
        - variantId
        - variantName
        - queueReason
        - queueConditionKey
        - queueState
        - temporalWorkflowId
      type: object
    Project:
      additionalProperties: false
      properties:
        createdAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        description:
          type: string
        error:
          allOf:
            - $ref: '#/components/schemas/Errors.UserFacingErrorData'
          description: >-
            Structured error from the last failed delete; set only when status
            is ERROR_DELETING (read-only).
          readOnly: true
        givenId:
          allOf:
            - $ref: '#/components/schemas/GivenId'
          description: >-
            User-provided project identifier. Must be unique within
            organization.
          maxLength: 60
          minLength: 1
        id:
          readOnly: true
          type: string
        name:
          minLength: 1
          type: string
        organizationId:
          readOnly: true
          type: string
        status:
          allOf:
            - $ref: '#/components/schemas/Project.Status'
          description: Lifecycle status (read-only).
          readOnly: true
        updatedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
      required:
        - id
        - createdAt
        - updatedAt
        - organizationId
        - givenId
        - name
        - status
      type: object
    ServiceAccount:
      additionalProperties: false
      properties:
        createdAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        createdById:
          description: Audit-only user id for the member who created the service account.
          readOnly: true
          type: string
        createdByName:
          description: >-
            Audit-only display name for the member who created the service
            account.
          readOnly: true
          type: string
        description:
          description: Optional context for what this service account is used for.
          type: string
        id:
          readOnly: true
          type: string
        name:
          description: User-facing service account name.
          minLength: 1
          type: string
        organizationId:
          readOnly: true
          type: string
        role:
          description: >-
            Deprecated: use `roles`. Writing it sets `roles` to this one role;
            it cannot be sent

            with `roles`. `OWNER` is accepted and sets `platform-admin` and
            `operator`. Reads return

            the service account's role with the most access, or its first custom
            role.
          type: string
        roleName:
          description: 'Deprecated: use `roleNames`. Display name of `role`.'
          readOnly: true
          type: string
        roleNames:
          description: Display names of `roles`, in the same order.
          items:
            type: string
          readOnly: true
          type: array
        roles:
          description: >-
            The roles the service account holds across the organization, each a
            system-managed role

            key (`platform-admin`, `operator`, `manager`, `read-only` or
            `billing`) or a custom role

            ID. It holds at least one, and cannot hold `owner` or a role that
            can delete the

            organization. Reads list system-managed roles in that order, then
            custom roles by name.

            Setting `roles` replaces the whole set. Roles other than
            `platform-admin` and `operator`

            require policy administration to be enabled for the organization,
            and the caller can add

            or remove only roles whose permissions it already holds.
          items:
            type: string
          type: array
        updatedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
      required:
        - id
        - createdAt
        - updatedAt
        - organizationId
        - name
        - createdById
        - createdByName
      type: object
    Stack.Union:
      discriminator:
        mapping:
          OPENTOFU: '#/components/schemas/Stack.OpenTofu'
          TERRAFORM: '#/components/schemas/Stack.Terraform'
        propertyName: type
      oneOf:
        - $ref: '#/components/schemas/Stack.OpenTofu'
        - $ref: '#/components/schemas/Stack.Terraform'
      type: object
    PipelineStepExecution:
      additionalProperties: false
      properties:
        attemptEpoch:
          description: >-
            Run-level attempt that produced this execution: 0 for the run's
            first

            execution, incremented each time the run's failed steps are retried.

            Group step executions by this value to view one attempt in
            isolation.
          format: int32
          readOnly: true
          type: integer
        completedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        createdAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        error:
          allOf:
            - $ref: '#/components/schemas/Errors.UserFacingErrorData'
          description: User-facing error data, formatted from raw ErrorData stored in DB
          readOnly: true
        id:
          readOnly: true
          type: string
        inputData:
          additionalProperties: {}
          description: Input data passed to this step execution
          readOnly: true
          type: object
        isLastRetry:
          readOnly: true
          type: boolean
        logs:
          allOf:
            - $ref: '#/components/schemas/PipelineStepExecution.LogsStreamParams'
          description: CloudWatch log stream parameters for this step's logs
          readOnly: true
        moduleInstanceId:
          description: >-
            Module instance this step acts on. Set for build and deploy steps;
            absent for

            infrastructure, approval and custom steps, and for steps whose
            module reference

            is a template that only resolves while the run executes.
          readOnly: true
          type: string
        organizationId:
          readOnly: true
          type: string
        outputData:
          additionalProperties: {}
          description: Output data produced by this step execution
          readOnly: true
          type: object
        pipelineRunId:
          readOnly: true
          type: string
        queueMetadata:
          additionalProperties: {}
          description: >-
            Structured queue metadata, including reason key and lock/deployment
            context
          nullable: true
          readOnly: true
          type: object
        queueReason:
          description: >-
            User-facing reason this step execution is queued, when status is
            QUEUED
          nullable: true
          readOnly: true
          type: string
        retryAttempt:
          format: int32
          readOnly: true
          type: integer
        startedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        status:
          allOf:
            - $ref: '#/components/schemas/PipelineStepExecution.Status'
          readOnly: true
        statusDetail:
          additionalProperties: {}
          description: >-
            Why the step reached a terminal skipped/cancelled/timeout status:

            a cause code plus context such as the blocking upstream steps or the

            superseding run. Absent for executions recorded before cause
            tracking

            or for statuses that need no explanation.
          readOnly: true
          type: object
        stepId:
          readOnly: true
          type: string
        stepName:
          readOnly: true
          type: string
        stepType:
          readOnly: true
          type: string
        temporalRunId:
          readOnly: true
          type: string
        temporalWorkflowId:
          readOnly: true
          type: string
        updatedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
      required:
        - id
        - createdAt
        - updatedAt
        - organizationId
        - stepId
        - stepName
        - stepType
        - status
        - retryAttempt
        - attemptEpoch
        - isLastRetry
        - pipelineRunId
        - temporalWorkflowId
        - temporalRunId
        - queueReason
        - queueMetadata
      type: object
    UtcDateTime:
      description: UTC RFC3339 timestamp with a required Z suffix
      format: date-time
      pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,9})?Z$
      type: string
      x-go-type: apitypes.UTCDateTime
      x-go-type-import:
        name: apitypes
        path: ravion/api-go/pkg/apitypes
    ApiKey.OwnerType:
      enum:
        - MEMBERSHIP
        - SERVICE_ACCOUNT
      type: string
    GivenId:
      description: User-provided identifier pattern used by all givenId fields
      maxLength: 60
      pattern: ^[a-zA-Z0-9][a-zA-Z0-9_-]*$
      type: string
    AwsAccount.AwsAccountStatus:
      description: Status of the AWS account connection
      enum:
        - AWAITING_CONNECTION
        - CONNECTED
        - DISCONNECTED
        - ERROR_REMOVING
        - REMOVING
      type: string
    CodeSource.Github:
      additionalProperties: false
      description: GitHub code source
      properties:
        accessLost:
          description: Whether sync found the auth no longer has access to this repository
          readOnly: true
          type: boolean
        auth:
          allOf:
            - $ref: '#/components/schemas/CodeSourceGithubAuth'
          description: Authentication details
          readOnly: true
        createdAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        defaultBranch:
          readOnly: true
          type: string
        gitRepositoryId:
          readOnly: true
          type: string
        id:
          readOnly: true
          type: string
        organizationId:
          readOnly: true
          type: string
        repoName:
          readOnly: true
          type: string
        repoUrl:
          readOnly: true
          type: string
        type:
          enum:
            - GITHUB
          type: string
        updatedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        visibility:
          allOf:
            - $ref: '#/components/schemas/GitRepositoryVisibility'
          description: Repository visibility (public, private, or internal)
          readOnly: true
      required:
        - id
        - createdAt
        - updatedAt
        - organizationId
        - gitRepositoryId
        - repoUrl
        - repoName
        - defaultBranch
        - visibility
        - accessLost
        - type
        - auth
      type: object
    CodeSource.Gitlab:
      additionalProperties: false
      description: GitLab.com code source
      properties:
        accessLost:
          description: Whether sync found the auth no longer has access to this repository
          readOnly: true
          type: boolean
        auth:
          allOf:
            - $ref: '#/components/schemas/CodeSourceGitlabAuth'
          description: Authentication details
          readOnly: true
        createdAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        defaultBranch:
          readOnly: true
          type: string
        gitRepositoryId:
          readOnly: true
          type: string
        id:
          readOnly: true
          type: string
        organizationId:
          readOnly: true
          type: string
        repoName:
          readOnly: true
          type: string
        repoUrl:
          readOnly: true
          type: string
        type:
          enum:
            - GITLAB
          type: string
        updatedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        visibility:
          allOf:
            - $ref: '#/components/schemas/GitRepositoryVisibility'
          description: Repository visibility (public, private, or internal)
          readOnly: true
      required:
        - id
        - createdAt
        - updatedAt
        - organizationId
        - gitRepositoryId
        - repoUrl
        - repoName
        - defaultBranch
        - visibility
        - accessLost
        - type
        - auth
      type: object
    CodeSource.GitlabSelfHosted:
      additionalProperties: false
      description: GitLab self-hosted code source
      properties:
        accessLost:
          description: Whether sync found the auth no longer has access to this repository
          readOnly: true
          type: boolean
        auth:
          allOf:
            - $ref: '#/components/schemas/CodeSourceGitlabSelfHostedAuth'
          description: Authentication details
          readOnly: true
        createdAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        defaultBranch:
          readOnly: true
          type: string
        gitRepositoryId:
          readOnly: true
          type: string
        id:
          readOnly: true
          type: string
        organizationId:
          readOnly: true
          type: string
        repoName:
          readOnly: true
          type: string
        repoUrl:
          readOnly: true
          type: string
        type:
          enum:
            - GITLAB_SELF_HOSTED
          type: string
        updatedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        visibility:
          allOf:
            - $ref: '#/components/schemas/GitRepositoryVisibility'
          description: Repository visibility (public, private, or internal)
          readOnly: true
      required:
        - id
        - createdAt
        - updatedAt
        - organizationId
        - gitRepositoryId
        - repoUrl
        - repoName
        - defaultBranch
        - visibility
        - accessLost
        - type
        - auth
      type: object
    DefaultValueDefinition.CreatedByType:
      enum:
        - SYSTEM
        - USER
      type: string
    Module.InputProperty:
      description: |-
        Union of all input property types.
        Discriminated by the `type` field on each property model.
        Each variant has a literal `type` property for TypeScript narrowing.
      oneOf:
        - $ref: '#/components/schemas/Module.StringInputProperty'
        - $ref: '#/components/schemas/Module.TextInputProperty'
        - $ref: '#/components/schemas/Module.ObjectInputProperty'
        - $ref: '#/components/schemas/Module.ObjectMapInputProperty'
        - $ref: '#/components/schemas/Module.ObjectArrayInputProperty'
        - $ref: '#/components/schemas/Module.ArrayInputProperty'
        - $ref: '#/components/schemas/Module.ArrayStringInputProperty'
        - $ref: '#/components/schemas/Module.NumberInputProperty'
        - $ref: '#/components/schemas/Module.BooleanInputProperty'
        - $ref: '#/components/schemas/Module.SectionInputProperty'
        - $ref: '#/components/schemas/Module.CompoundInputProperty'
        - $ref: '#/components/schemas/Module.RefInputProperty'
        - $ref: '#/components/schemas/Module.GitRepoInputProperty'
        - $ref: '#/components/schemas/Module.KeyValueInputProperty'
    DeploymentResourceData:
      description: |-
        Discriminated union over `data` payloads for the resource envelope.
        Variants live in `@fc/schemas/deployments/tsp/aws-ecs.tsp`; the union
        here only wires them up with the shared `type` discriminator so
        JSON decodes unambiguously. Adding a new deployment kind adds
        one variant here + one enum value on `Type`.
      discriminator:
        mapping:
          AMI_IMAGE: '#/components/schemas/Deployments.AwsAmiImageData'
          EC2_INSTANCE: '#/components/schemas/Deployments.AwsEc2InstanceData'
          ECS_TASK: '#/components/schemas/Deployments.EcsTaskData'
          K8S_WORKLOAD: '#/components/schemas/Deployments.EksWorkloadResourceData'
        propertyName: type
      oneOf:
        - $ref: '#/components/schemas/Deployments.EcsTaskData'
        - $ref: '#/components/schemas/Deployments.AwsEc2InstanceData'
        - $ref: '#/components/schemas/Deployments.AwsAmiImageData'
        - $ref: '#/components/schemas/Deployments.EksWorkloadResourceData'
      type: object
    Deployments.DeploymentResourceLifecycleType:
      description: |-
        Which lifecycle role a DeploymentResource plays within its
        ModuleDeployment. RUNTIME is the long-lived service-managed task;
        PRE_DEPLOY / POST_DEPLOY are the optional hook tasks.
      enum:
        - RUNTIME
        - PRE_DEPLOY
        - POST_DEPLOY
      type: string
    Deployments.DeploymentResourceType:
      description: |-
        Which runtime type a DeploymentResource row represents. Drives the
        shape of its `data` JSON column. Mirrors the `type` discriminator on
        the JSON payload variants (EcsTaskData.type = "ECS_TASK", …) so the
        column and the JSON tag carry the same value.
      enum:
        - ECS_TASK
        - EC2_INSTANCE
        - K8S_WORKLOAD
        - AMI_IMAGE
      type: string
    Canvas:
      additionalProperties: false
      description: >-
        The saved canvas for an environment: where each module card sits and how
        cards are grouped. This is presentation only and never affects
        deployments. An environment that has never been arranged returns an
        empty canvas.
      properties:
        anchors:
          additionalProperties:
            $ref: '#/components/schemas/CanvasConnectionAnchors'
          description: >-
            Where individual connections attach to their module cards, keyed by
            connection id. Only connections with an end the user has moved
            appear here; every other connection attaches automatically.
          type: object
        connectionEndpoint:
          allOf:
            - $ref: '#/components/schemas/CanvasConnectionEndpoint'
          description: >-
            Marker drawn where a connection meets the module it points at.
            Applies to every connection on the canvas.
        groups:
          description: Groups of module cards.
          items:
            $ref: '#/components/schemas/CanvasGroup'
          type: array
        metrics:
          additionalProperties:
            items:
              type: string
            type: array
          description: >-
            Which metrics each module card charts, keyed by module instance id.
            Only cards whose selection has been changed appear here; the rest
            chart the module's first metric.
          type: object
        pins:
          additionalProperties:
            $ref: '#/components/schemas/CanvasPin'
          description: >-
            Card positions, keyed by module instance id. Only cards the user has
            moved appear here.
          type: object
        waypoints:
          additionalProperties:
            items:
              $ref: '#/components/schemas/CanvasPin'
            type: array
          description: >-
            Bends the user placed on individual connections, keyed by connection
            id and ordered from the source module to the target. A connection
            that is absent is drawn on the automatic route, which is how every
            connection starts. Only the line's shape is stored — a connection
            itself comes from the modules' inputs and cannot be added, removed,
            or re-attached here.
          type: object
      required:
        - pins
        - groups
        - metrics
        - waypoints
        - anchors
      type: object
    Environment.Status:
      description: >-
        Environment lifecycle status. DELETING while a delete workflow runs,
        ERROR_DELETING if it fails.
      enum:
        - ACTIVE
        - DELETING
        - ERROR_DELETING
        - DELETED
      type: string
    ExecutionEnvironment.Aws:
      additionalProperties: false
      properties:
        awsAccountId:
          minLength: 1
          type: string
        createdAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        givenId:
          allOf:
            - $ref: '#/components/schemas/GivenId'
          description: >-
            User-provided execution environment identifier. Must be unique
            within organization.
          maxLength: 60
          minLength: 1
        id:
          readOnly: true
          type: string
        name:
          minLength: 1
          type: string
        organizationId:
          readOnly: true
          type: string
        region:
          minLength: 1
          type: string
        sandboxDefaults:
          allOf:
            - $ref: '#/components/schemas/ExecutionEnvironment.SandboxPoolDefaults'
          description: >-
            Current global sandbox-pool defaults, separate from the
            environment's sparse overrides.
          readOnly: true
        sandboxes:
          allOf:
            - $ref: '#/components/schemas/ExecutionEnvironment.SandboxPoolConfig'
          description: >-
            Sparse overrides for the sandbox defaults. Send `{}` to enable a
            pool that inherits global defaults, `null` to remove it, or omit it
            on a patch to leave the pool as it is.
          nullable: true
          type: object
          x-go-type: nullable.Nullable[ExecutionEnvironmentSandboxPoolConfig]
          x-go-type-skip-optional-pointer: true
        securityGroupId:
          minLength: 1
          type: string
        subnetId:
          minLength: 1
          type: string
        type:
          enum:
            - AWS
          type: string
        updatedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        vpcId:
          minLength: 1
          type: string
      required:
        - id
        - createdAt
        - updatedAt
        - organizationId
        - givenId
        - name
        - region
        - type
        - sandboxDefaults
        - vpcId
        - subnetId
        - securityGroupId
        - awsAccountId
      type: object
    ModuleDefinition.Status:
      enum:
        - DRAFT
        - ACTIVE
      type: string
    DeploymentData:
      description: |-
        Discriminated union over deployment-type metadata. Variants are
        added as deployment types land:
        `aws:ecs`    → `Deployments.EcsDeploymentData`
        `aws:ec2`    → `Deployments.AwsEc2DeploymentData`
        `aws:ami`    → `Deployments.AwsAmiDeploymentData`
        `aws:eks`    → `Deployments.EksDeploymentData`
        `aws:static` → `Deployments.AwsStaticDeploymentData`
        `aws:lambda` → `Deployments.AwsLambdaDeploymentData`
        Variants live in `@fc/schemas/deployments/tsp/aws-ecs.tsp` and
        `aws-eks.tsp` / `aws-static.tsp` / `aws-lambda.tsp`; this union
        wires them up with the shared `type` discriminator so consumers
        can narrow on `data.type` without parsing opaque JSON.
      discriminator:
        mapping:
          aws:ami: '#/components/schemas/Deployments.AwsAmiDeploymentData'
          aws:ec2: '#/components/schemas/Deployments.AwsEc2DeploymentData'
          aws:ecs: '#/components/schemas/Deployments.EcsDeploymentData'
          aws:eks: '#/components/schemas/Deployments.EksDeploymentData'
          aws:lambda: '#/components/schemas/Deployments.AwsLambdaDeploymentData'
          aws:static: '#/components/schemas/Deployments.AwsStaticDeploymentData'
        propertyName: type
      oneOf:
        - $ref: '#/components/schemas/Deployments.EcsDeploymentData'
        - $ref: '#/components/schemas/Deployments.AwsEc2DeploymentData'
        - $ref: '#/components/schemas/Deployments.AwsAmiDeploymentData'
        - $ref: '#/components/schemas/Deployments.EksDeploymentData'
        - $ref: '#/components/schemas/Deployments.AwsStaticDeploymentData'
        - $ref: '#/components/schemas/Deployments.AwsLambdaDeploymentData'
      type: object
    ModuleInstance.ValueReferenceBinding:
      additionalProperties: false
      description: >-
        Cross-module value-reference bindings derived from `<< … >>` templates
        in `input` (read-only).
      properties:
        authoredAddress:
          description: >-
            Authored producer address, e.g. `modules.vpc` or
            `environments.staging.modules.vpc`
          type: string
        outputKeys:
          description: Producer stack output keys the template consumes
          items:
            type: string
          type: array
        path:
          description: RFC 6901 path of the input holding the template
          type: string
        producerInstanceId:
          type: string
        producerStackId:
          type: string
        resolved:
          description: >-
            Whether the referenced outputs were available at last write; false
            means the value is deferred until the producer applies
          type: boolean
        status:
          allOf:
            - $ref: '#/components/schemas/ModuleInstance.ValueReferenceStatus'
          description: >-
            How the value this module last resolved compares with the producer's
            current outputs
      required:
        - path
        - authoredAddress
        - producerInstanceId
        - outputKeys
        - resolved
        - status
      type: object
    ModuleInstance.Status:
      description: >-
        Module instance lifecycle status. STACK_DESTROYED after a successful
        stack destroy leaves no infrastructure deployed; a later successful
        apply returns it to ACTIVE. DELETING while a delete workflow runs,
        ERROR_DELETING if it fails.
      enum:
        - ACTIVE
        - STACK_DESTROYED
        - DELETING
        - ERROR_DELETING
        - DELETED
      type: string
    ModuleInstance.ResolvedModuleUI:
      additionalProperties: false
      description: |-
        Resolved module UI configuration. Mirrors `Module.ModuleUI` but with all
        fields optional and nullable: the resolver writes this column at create
        time (before stack apply) and after every successful stack apply, and
        any field that depends on stack output stays null between create and the
        first apply.
      properties:
        links:
          items:
            $ref: '#/components/schemas/ModuleInstance.ResolvedUILink'
          nullable: true
          type: array
        logs:
          items:
            $ref: '#/components/schemas/ModuleInstance.ResolvedUILog'
          nullable: true
          type: array
        metrics:
          items:
            $ref: '#/components/schemas/ModuleInstance.ResolvedUIMetric'
          nullable: true
          type: array
      type: object
    PipelineRun.Status:
      enum:
        - QUEUED
        - IN_PROGRESS
        - PENDING_APPROVAL
        - CANCELLING
        - SUCCESS
        - ERROR
        - CANCELLED
        - SKIPPED
        - TIMEOUT
      type: string
    Pipeline.Usage:
      enum:
        - user
        - internal
      type: string
    Pipeline.PipelineRunSnapshot:
      description: >-
        Snapshot of the state of a pipeline run's attached entity, captured when
        the run

        was created. Discriminated by `kind` so future run-attached entity types
        can add

        variants without changing existing consumers.
      discriminator:
        mapping:
          stack: '#/components/schemas/Pipeline.StackRunSnapshot'
        propertyName: kind
      oneOf:
        - $ref: '#/components/schemas/Pipeline.StackRunSnapshot'
      type: object
    PipelineRun.QueueState:
      additionalProperties: false
      properties:
        blockingEntityId:
          description: ID of the entity currently blocking this run.
          type: string
        blockingEntityType:
          allOf:
            - $ref: '#/components/schemas/PipelineRun.QueueBlockingEntityType'
          description: Type of entity currently blocking this run.
        blockingModuleInstanceId:
          description: Blocking module instance ID for stack-output condition queues.
          type: string
        blockingModuleName:
          description: Blocking module display name for stack-output condition queues.
          type: string
        conditionKey:
          description: >-
            Condition key currently blocking this run, when queued on an
            external condition.
          type: string
        conditionKind:
          allOf:
            - $ref: '#/components/schemas/PipelineRun.QueueConditionKind'
          description: >-
            Condition kind currently blocking this run, such as
            STACK_RUN_SUCCEEDED.
        environmentId:
          description: Environment context for constructing frontend links.
          type: string
        preflightBlockedByAdmissionCondition:
          description: >-
            Whether stack-run preflight is currently blocked by an admission
            condition.
          type: boolean
        projectId:
          description: Project context for constructing frontend links.
          type: string
        reason:
          description: Human-readable reason shown while this run is queued.
          type: string
        reasonKey:
          allOf:
            - $ref: '#/components/schemas/PipelineRun.QueueReasonKey'
          description: >-
            Stable machine-readable queue reason key, when persisted in queue
            metadata.
        stackRunPreflightPending:
          description: >-
            Whether final stack config and input resolution is deferred until
            stack-run preflight.
          type: boolean
      required:
        - reason
        - stackRunPreflightPending
        - preflightBlockedByAdmissionCondition
      type: object
    Pipeline.TriggerMetadata:
      additionalProperties: false
      description: Metadata about the pipeline trigger and webhook event
      properties:
        trigger_given_id:
          description: |-
            User-defined trigger ID from config
            Example:
            trigger_given_id: deploy-on-push
            Optional
          type: string
        trigger_source:
          allOf:
            - $ref: '#/components/schemas/Pipeline.TriggerSource'
          description: |-
            Source of the trigger — webhook, api, dashboard, or stack:destroy
            Example:
            trigger_source: webhook:github
            Required
        webhook_event:
          description: |-
            Webhook event type — push, pull_request, merge_request, etc
            Example:
            webhook_event: push
            Optional
          type: string
      required:
        - trigger_source
      type: object
    Project.Status:
      description: >-
        Project lifecycle status. DELETING while a delete workflow runs,
        ERROR_DELETING if it fails.
      enum:
        - ACTIVE
        - DELETING
        - ERROR_DELETING
        - DELETED
      type: string
    Stack.OpenTofu:
      additionalProperties: false
      properties:
        changePipelineId:
          description: Pipeline to run on stack change
          minLength: 1
          readOnly: true
          type: string
        createdAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        destroyPipelineId:
          description: Pipeline to run on stack destroy
          minLength: 1
          readOnly: true
          type: string
        environmentId:
          type: string
        firstAppliedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          description: Timestamp of the first successful apply for this stack
          readOnly: true
        id:
          readOnly: true
          type: string
        latestRunId:
          description: Id of the newest non-cancelled run for this stack
          readOnly: true
          type: string
        latestRunStatus:
          allOf:
            - $ref: '#/components/schemas/PipelineRun.Status'
          description: Status of the newest non-cancelled run for this stack
          readOnly: true
        organizationId:
          readOnly: true
          type: string
        output:
          additionalProperties: {}
          description: Terraform/OpenTofu output values from the latest apply
          readOnly: true
          type: object
        projectId:
          type: string
        ravionStateBackendWorkspace:
          description: The Ravion Cloud workspace name to use for state storage
          type: string
        type:
          enum:
            - OPENTOFU
          type: string
        updatedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
      required:
        - id
        - createdAt
        - updatedAt
        - organizationId
        - projectId
        - environmentId
        - changePipelineId
        - destroyPipelineId
        - type
      type: object
    Stack.Terraform:
      additionalProperties: false
      properties:
        changePipelineId:
          description: Pipeline to run on stack change
          minLength: 1
          readOnly: true
          type: string
        createdAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
        destroyPipelineId:
          description: Pipeline to run on stack destroy
          minLength: 1
          readOnly: true
          type: string
        environmentId:
          type: string
        firstAppliedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          description: Timestamp of the first successful apply for this stack
          readOnly: true
        id:
          readOnly: true
          type: string
        latestRunId:
          description: Id of the newest non-cancelled run for this stack
          readOnly: true
          type: string
        latestRunStatus:
          allOf:
            - $ref: '#/components/schemas/PipelineRun.Status'
          description: Status of the newest non-cancelled run for this stack
          readOnly: true
        organizationId:
          readOnly: true
          type: string
        output:
          additionalProperties: {}
          description: Terraform/OpenTofu output values from the latest apply
          readOnly: true
          type: object
        projectId:
          type: string
        ravionStateBackendWorkspace:
          description: The Ravion Cloud workspace name to use for state storage
          type: string
        type:
          enum:
            - TERRAFORM
          type: string
        updatedAt:
          allOf:
            - $ref: '#/components/schemas/UtcDateTime'
          readOnly: true
      required:
        - id
        - createdAt
        - updatedAt
        - organizationId
        - projectId
        - environmentId
        - changePipelineId
        - destroyPipelineId
        - type
      type: object
    PipelineStepExecution.LogsStreamParams:
      additionalProperties: false
      description: CloudWatch log stream parameters for fetching step logs
      properties:
        awsAccountId:
          description: AWS Account database ID for credentials
          type: string
        logGroupName:
          description: CloudWatch log group name (e.g., /flightcontrol/runner)
          type: string
        logStreamPrefix:
          description: Log stream prefix to filter by
          type: string
        region:
          description: AWS region where logs are stored
          type: string
      required:
        - awsAccountId
        - region
        - logGroupName
        - logStreamPrefix
      type: object
    PipelineStepExecution.Status:
      enum:
        - QUEUED
        - IN_PROGRESS
        - PENDING_APPROVAL
        - SUCCESS
        - ERROR
        - CANCELLED
        - SKIPPED
        - TIMEOUT
      type: string
    CodeSourceGithubAuth:
      description: GitHub auth — either installation or public
      discriminator:
        mapping:
          installation: '#/components/schemas/CodeSourceGithubInstallationAuth'
          public: '#/components/schemas/CodeSourcePublicAuth'
        propertyName: kind
      oneOf:
        - $ref: '#/components/schemas/CodeSourceGithubInstallationAuth'
        - $ref: '#/components/schemas/CodeSourcePublicAuth'
      type: object
    GitRepositoryVisibility:
      description: Repository visibility
      enum:
        - PUBLIC
        - PRIVATE
        - INTERNAL
      type: string
    CodeSourceGitlabAuth:
      description: GitLab auth — either OAuth or public
      discriminator:
        mapping:
          oauth: '#/components/schemas/CodeSourceGitlabOAuthAuth'
          public: '#/components/schemas/CodeSourcePublicAuth'
        propertyName: kind
      oneOf:
        - $ref: '#/components/schemas/CodeSourceGitlabOAuthAuth'
        - $ref: '#/components/schemas/CodeSourcePublicAuth'
      type: object
    CodeSourceGitlabSelfHostedAuth:
      description: GitLab self-hosted auth — either OAuth or public
      discriminator:
        mapping:
          oauth: '#/components/schemas/CodeSourceGitlabSelfHostedOAuthAuth'
          public: '#/components/schemas/CodeSourcePublicAuth'
        propertyName: kind
      oneOf:
        - $ref: '#/components/schemas/CodeSourceGitlabSelfHostedOAuthAuth'
        - $ref: '#/components/schemas/CodeSourcePublicAuth'
      type: object
    Module.StringInputProperty:
      additionalProperties: false
      description: >-
        Single-line text input property.

        Can be a free-form text field or a dropdown/select when values are
        provided.
      properties:
        collapsible:
          description: >-
            Render this field as collapsible (tag when collapsed, full field
            when expanded)


            Supported for all value-producing input types.

            Consecutive collapsible fields are automatically grouped together.

            Divider inputs break collapsible groups.


            Example:

            collapsible: true

            Optional — defaults to false
          type: boolean
        default:
          anyOf:
            - type: string
            - $ref: '#/components/schemas/Module.DefaultValueRef'
          description: |-
            Default value for the field
            Example:
            default: us-east-1
            default: $values:first
            Optional
          x-templateable: true
        description:
          description: |-
            Help text shown below the label
            Example:
            description: Select the AWS region for your resources
            Optional
          type: string
        id:
          description: |-
            Unique identifier for this input.
            Example:
            id: region
            Required
          minLength: 1
          type: string
        immutable:
          description: >-
            Lock this field after first deploy — prevents changes to destructive
            settings

            Example:

            immutable: true

            Optional — defaults to false
          type: boolean
        label:
          description: |-
            Text shown above the form field
            Example:
            label: Region
            Required
          minLength: 1
          type: string
        min_current_value:
          description: |-
            Use the current deployed value as the minimum allowed value
            Example:
            min_current_value: true
            Optional — defaults to false
          type: boolean
        moved_from:
          description: >-
            Input IDs from earlier module versions whose values this input now
            holds.

            Upgrading an existing instance to this version does not trip the
            immutable

            input check for the listed inputs or for this one, so a module
            version can

            rename or merge immutable inputs without forcing a destroy and
            recreate.

            Example:

            moved_from:

            - domain_name

            - subject_alternative_names

            Optional
          items:
            type: string
          type: array
        no_options_message:
          description: |-
            Message shown when the dropdown has no available options
            Example:
            no_options_message: No regions available for this account
            Optional
          type: string
        patterns:
          description: |-
            Regex patterns to validate against
            Example:
            patterns:
            - pattern: ^[a-z0-9-]+$
            message: Must be lowercase alphanumeric
            Optional
          items:
            $ref: '#/components/schemas/Module.ValidationPattern'
          type: array
        placeholder:
          description: |-
            Placeholder text when the field is empty
            Example:
            placeholder: Enter a value
            Optional
          type: string
        prefix:
          description: >-
            Static, non-editable text shown as an adornment before the input
            (left

            side). Use to frame the value, e.g. a wildcard prefix. May contain a

            << ... >> template resolved against the form context.

            Example:

            prefix: "*."

            Optional
          type: string
        required:
          description: |-
            Whether the field must be filled in
            Example:
            required: true
            Optional — defaults to false
          type: boolean
        show_when:
          allOf:
            - $ref: '#/components/schemas/Module.ShowWhen'
          description: |-
            Only show this field when another field has a specific value
            Example:
            show_when:
            advanced_mode: true
            Optional
        suffix:
          description: >-
            Static, non-editable text shown as an adornment after the input
            (right

            side). May contain a << ... >> template resolved against the form
            context

            (e.g. the platform domain apex). An unresolved/empty template
            renders no

            suffix.

            Example:

            suffix: .<< platform.apex >>

            Optional
          type: string
        type:
          description: |-
            Input type for single-line text fields
            Example:
            type: string
            Required
          enum:
            - string
          type: string
        values:
          allOf:
            - $ref: '#/components/schemas/Module.StringValues'
          description: >-
            Allowed values — static array of options or dynamic reference for a
            dropdown

            Example:

            values:

            - value: us-east-1

            label: US East

            - value: eu-west-1

            label: EU West

            Optional
      required:
        - id
        - label
        - type
      type: object
    Module.TextInputProperty:
      additionalProperties: false
      description: >-
        Multi-line text area input property.

        Used for longer text content like descriptions, commands, or
        configuration.
      properties:
        collapsible:
          description: >-
            Render this field as collapsible (tag when collapsed, full field
            when expanded)


            Supported for all value-producing input types.

            Consecutive collapsible fields are automatically grouped together.

            Divider inputs break collapsible groups.


            Example:

            collapsible: true

            Optional — defaults to false
          type: boolean
        default:
          description: |-
            Default value for the field
            Example:
            default: "# Default config"
            Optional
          type: string
          x-templateable: true
        description:
          description: |-
            Help text shown below the label
            Example:
            description: Select the AWS region for your resources
            Optional
          type: string
        id:
          description: |-
            Unique identifier for this input.
            Example:
            id: region
            Required
          minLength: 1
          type: string
        immutable:
          description: >-
            Lock this field after first deploy — prevents changes to destructive
            settings

            Example:

            immutable: true

            Optional — defaults to false
          type: boolean
        label:
          description: |-
            Text shown above the form field
            Example:
            label: Region
            Required
          minLength: 1
          type: string
        moved_from:
          description: >-
            Input IDs from earlier module versions whose values this input now
            holds.

            Upgrading an existing instance to this version does not trip the
            immutable

            input check for the listed inputs or for this one, so a module
            version can

            rename or merge immutable inputs without forcing a destroy and
            recreate.

            Example:

            moved_from:

            - domain_name

            - subject_alternative_names

            Optional
          items:
            type: string
          type: array
        patterns:
          description: |-
            Regex patterns to validate against
            Example:
            patterns:
            - pattern: ^[^\x00]+$
            message: Must not contain null bytes
            Optional
          items:
            $ref: '#/components/schemas/Module.ValidationPattern'
          type: array
        placeholder:
          description: |-
            Placeholder text when the field is empty
            Example:
            placeholder: Enter your configuration
            Optional
          type: string
        required:
          description: |-
            Whether the field must be filled in
            Example:
            required: true
            Optional — defaults to false
          type: boolean
        show_when:
          allOf:
            - $ref: '#/components/schemas/Module.ShowWhen'
          description: |-
            Only show this field when another field has a specific value
            Example:
            show_when:
            advanced_mode: true
            Optional
        type:
          description: |-
            Input type for multi-line text areas
            Example:
            type: text
            Required
          enum:
            - text
          type: string
      required:
        - id
        - label
        - type
      type: object
    Module.ObjectInputProperty:
      additionalProperties: false
      description: >-
        Object editor input property.

        Allows users to enter arbitrary object data with syntax highlighting and
        validation.

        Supports both YAML and JSON formats in the UI.
      properties:
        collapsible:
          description: >-
            Render this field as collapsible (tag when collapsed, full field
            when expanded)


            Supported for all value-producing input types.

            Consecutive collapsible fields are automatically grouped together.

            Divider inputs break collapsible groups.


            Example:

            collapsible: true

            Optional — defaults to false
          type: boolean
        default:
          description: |-
            Default object value for the field
            Example:
            default:
            key: value
            Optional
          x-templateable: true
        description:
          description: |-
            Help text shown below the label
            Example:
            description: Select the AWS region for your resources
            Optional
          type: string
        id:
          description: |-
            Unique identifier for this input.
            Example:
            id: region
            Required
          minLength: 1
          type: string
        immutable:
          description: >-
            Lock this field after first deploy — prevents changes to destructive
            settings

            Example:

            immutable: true

            Optional — defaults to false
          type: boolean
        label:
          description: |-
            Text shown above the form field
            Example:
            label: Region
            Required
          minLength: 1
          type: string
        moved_from:
          description: >-
            Input IDs from earlier module versions whose values this input now
            holds.

            Upgrading an existing instance to this version does not trip the
            immutable

            input check for the listed inputs or for this one, so a module
            version can

            rename or merge immutable inputs without forcing a destroy and
            recreate.

            Example:

            moved_from:

            - domain_name

            - subject_alternative_names

            Optional
          items:
            type: string
          type: array
        placeholder:
          description: |-
            Placeholder text when the field is empty
            Example:
            placeholder:
            key: value
            Optional
          type: string
        required:
          description: |-
            Whether the field must be filled in
            Example:
            required: true
            Optional — defaults to false
          type: boolean
        show_when:
          allOf:
            - $ref: '#/components/schemas/Module.ShowWhen'
          description: |-
            Only show this field when another field has a specific value
            Example:
            show_when:
            advanced_mode: true
            Optional
        type:
          description: |-
            Input type for object editor fields
            Example:
            type: object
            Required
          enum:
            - object
          type: string
      required:
        - id
        - label
        - type
      type: object
    Module.ObjectMapInputProperty:
      additionalProperties: false
      properties:
        collapsible:
          description: >-
            Render this field as collapsible (tag when collapsed, full field
            when expanded)


            Supported for all value-producing input types.

            Consecutive collapsible fields are automatically grouped together.

            Divider inputs break collapsible groups.


            Example:

            collapsible: true

            Optional — defaults to false
          type: boolean
        default:
          additionalProperties: {}
          description: |-
            Default map value for the field
            Example:
            default:
            prod-to-shared:
            peer_vpc_id: vpc-123
            Optional
          type: object
          x-templateable: true
        description:
          description: |-
            Help text shown below the label
            Example:
            description: Select the AWS region for your resources
            Optional
          type: string
        id:
          description: |-
            Unique identifier for this input.
            Example:
            id: region
            Required
          minLength: 1
          type: string
        immutable:
          description: >-
            Lock this field after first deploy — prevents changes to destructive
            settings

            Example:

            immutable: true

            Optional — defaults to false
          type: boolean
        item_inputs:
          description: Input definitions for each object value in the map.
          items:
            $ref: '#/components/schemas/Module.InputProperty'
          minItems: 1
          type: array
        item_label:
          description: |-
            Label for each map item, used in add buttons and editor headers
            Example:
            item_label: Connection
            Optional
          type: string
        item_title:
          allOf:
            - $ref: '#/components/schemas/Module.ObjectCollectionItemTitleConfig'
          description: User-facing title template for each map item.
        key:
          allOf:
            - $ref: '#/components/schemas/Module.MapKeyConfig'
          description: Metadata for the map entry key field.
        label:
          description: |-
            Text shown above the form field
            Example:
            label: Region
            Required
          minLength: 1
          type: string
        moved_from:
          description: >-
            Input IDs from earlier module versions whose values this input now
            holds.

            Upgrading an existing instance to this version does not trip the
            immutable

            input check for the listed inputs or for this one, so a module
            version can

            rename or merge immutable inputs without forcing a destroy and
            recreate.

            Example:

            moved_from:

            - domain_name

            - subject_alternative_names

            Optional
          items:
            type: string
          type: array
        required:
          description: |-
            Whether the field must contain at least one entry
            Example:
            required: true
            Optional — defaults to false
          type: boolean
        show_when:
          allOf:
            - $ref: '#/components/schemas/Module.ShowWhen'
          description: |-
            Only show this field when another field has a specific value
            Example:
            show_when:
            advanced_mode: true
            Optional
        type:
          description: |-
            Input type for structured object maps
            Example:
            type: object_map
            Required
          enum:
            - object_map
          type: string
      required:
        - id
        - label
        - type
        - item_inputs
      type: object
    Module.ObjectArrayInputProperty:
      additionalProperties: false
      properties:
        collapsible:
          description: >-
            Render this field as collapsible (tag when collapsed, full field
            when expanded)


            Supported for all value-producing input types.

            Consecutive collapsible fields are automatically grouped together.

            Divider inputs break collapsible groups.


            Example:

            collapsible: true

            Optional — defaults to false
          type: boolean
        default:
          description: |-
            Default array value for the field
            Example:
            default:
            - name: web
            port: 80
            Optional
          items:
            $ref: '#/components/schemas/Module.ObjectArrayDefaultItem'
          type: array
          x-templateable: true
        description:
          description: |-
            Help text shown below the label
            Example:
            description: Select the AWS region for your resources
            Optional
          type: string
        id:
          description: |-
            Unique identifier for this input.
            Example:
            id: region
            Required
          minLength: 1
          type: string
        immutable:
          description: >-
            Lock this field after first deploy — prevents changes to destructive
            settings

            Example:

            immutable: true

            Optional — defaults to false
          type: boolean
        item_description:
          description: >-
            User-facing description template shown as a secondary line for each
            array item.

            Supports placeholders like {field_id}.

            Example:

            item_description: "Timeout after {timeout_in_minutes} minutes"

            Optional
          type: string
          x-templateable: true
        item_inputs:
          description: Input definitions for each object value in the array.
          items:
            $ref: '#/components/schemas/Module.InputProperty'
          minItems: 1
          type: array
        item_label:
          description: |-
            Label for each array item, used in add buttons and editor headers
            Example:
            item_label: Service
            Optional
          type: string
        item_title:
          allOf:
            - $ref: '#/components/schemas/Module.ObjectCollectionItemTitleConfig'
          description: User-facing title template for each array item.
        label:
          description: |-
            Text shown above the form field
            Example:
            label: Region
            Required
          minLength: 1
          type: string
        moved_from:
          description: >-
            Input IDs from earlier module versions whose values this input now
            holds.

            Upgrading an existing instance to this version does not trip the
            immutable

            input check for the listed inputs or for this one, so a module
            version can

            rename or merge immutable inputs without forcing a destroy and
            recreate.

            Example:

            moved_from:

            - domain_name

            - subject_alternative_names

            Optional
          items:
            type: string
          type: array
        required:
          description: |-
            Whether the field must contain at least one item
            Example:
            required: true
            Optional — defaults to false
          type: boolean
        show_when:
          allOf:
            - $ref: '#/components/schemas/Module.ShowWhen'
          description: |-
            Only show this field when another field has a specific value
            Example:
            show_when:
            advanced_mode: true
            Optional
        type:
          description: |-
            Input type for structured object arrays
            Example:
            type: object_array
            Required
          enum:
            - object_array
          type: string
      required:
        - id
        - label
        - type
        - item_inputs
      type: object
    Module.ArrayInputProperty:
      additionalProperties: false
      description: >-
        Array editor input property.

        Allows users to enter an arbitrary JSON array with syntax highlighting
        and validation.

        Supports both YAML and JSON formats in the UI.
      properties:
        collapsible:
          description: >-
            Render this field as collapsible (tag when collapsed, full field
            when expanded)


            Supported for all value-producing input types.

            Consecutive collapsible fields are automatically grouped together.

            Divider inputs break collapsible groups.


            Example:

            collapsible: true

            Optional — defaults to false
          type: boolean
        default:
          description: |-
            Default array value for the field
            Example:
            default:
            - item1
            - item2
            Optional
          items: {}
          type: array
          x-templateable: true
        description:
          description: |-
            Help text shown below the label
            Example:
            description: Select the AWS region for your resources
            Optional
          type: string
        id:
          description: |-
            Unique identifier for this input.
            Example:
            id: region
            Required
          minLength: 1
          type: string
        immutable:
          description: >-
            Lock this field after first deploy — prevents changes to destructive
            settings

            Example:

            immutable: true

            Optional — defaults to false
          type: boolean
        label:
          description: |-
            Text shown above the form field
            Example:
            label: Region
            Required
          minLength: 1
          type: string
        moved_from:
          description: >-
            Input IDs from earlier module versions whose values this input now
            holds.

            Upgrading an existing instance to this version does not trip the
            immutable

            input check for the listed inputs or for this one, so a module
            version can

            rename or merge immutable inputs without forcing a destroy and
            recreate.

            Example:

            moved_from:

            - domain_name

            - subject_alternative_names

            Optional
          items:
            type: string
          type: array
        placeholder:
          description: |-
            Placeholder text when the field is empty
            Example:
            placeholder: |
            - item1
            - item2
            Optional
          type: string
        required:
          description: |-
            Whether the field must be filled in
            Example:
            required: true
            Optional — defaults to false
          type: boolean
        show_when:
          allOf:
            - $ref: '#/components/schemas/Module.ShowWhen'
          description: |-
            Only show this field when another field has a specific value
            Example:
            show_when:
            advanced_mode: true
            Optional
        type:
          description: |-
            Input type for array editor fields
            Example:
            type: array
            Required
          enum:
            - array
          type: string
      required:
        - id
        - label
        - type
      type: object
    Module.ArrayStringInputProperty:
      additionalProperties: false
      description: |-
        Array of strings input property.
        Allows users to add/remove multiple string values.
      properties:
        add_button_label:
          description: |-
            Label for the "Add" button below the list
            Example:
            add_button_label: Add Region
            Optional
          type: string
        collapsible:
          description: >-
            Render this field as collapsible (tag when collapsed, full field
            when expanded)


            Supported for all value-producing input types.

            Consecutive collapsible fields are automatically grouped together.

            Divider inputs break collapsible groups.


            Example:

            collapsible: true

            Optional — defaults to false
          type: boolean
        default:
          description: |-
            Default array of values
            Example:
            default: [us-east-1, eu-west-1]
            Optional
          items:
            type: string
          type: array
          x-templateable: true
        description:
          description: |-
            Help text shown below the label
            Example:
            description: Select the AWS region for your resources
            Optional
          type: string
        id:
          description: |-
            Unique identifier for this input.
            Example:
            id: region
            Required
          minLength: 1
          type: string
        immutable:
          description: >-
            Lock this field after first deploy — prevents changes to destructive
            settings

            Example:

            immutable: true

            Optional — defaults to false
          type: boolean
        label:
          description: |-
            Text shown above the form field
            Example:
            label: Region
            Required
          minLength: 1
          type: string
        max_length:
          description: |-
            Maximum number of items in the list. Enforces an upper bound at
            form-validation time and on submit. Used by cert-group domains
            fields (capped at 10 to match ACM's default SAN limit).
            Optional.
          format: int32
          type: integer
        moved_from:
          description: >-
            Input IDs from earlier module versions whose values this input now
            holds.

            Upgrading an existing instance to this version does not trip the
            immutable

            input check for the listed inputs or for this one, so a module
            version can

            rename or merge immutable inputs without forcing a destroy and
            recreate.

            Example:

            moved_from:

            - domain_name

            - subject_alternative_names

            Optional
          items:
            type: string
          type: array
        no_options_message:
          description: |-
            Message shown when the dropdown has no available options
            Example:
            no_options_message: No regions available for this account
            Optional
          type: string
        patterns:
          description: |-
            Regex patterns to validate each array item against
            Example:
            patterns:
            - pattern: ^[a-z]{2}-[a-z]+-\d$
            message: Must be a valid AWS region
            Optional
          items:
            $ref: '#/components/schemas/Module.ValidationPattern'
          type: array
        placeholder:
          description: |-
            Placeholder text for each input field in the array
            Example:
            placeholder: Enter a value
            Optional
          type: string
        required:
          description: |-
            Whether at least one item is required
            Example:
            required: true
            Optional — defaults to false
          type: boolean
        show_when:
          allOf:
            - $ref: '#/components/schemas/Module.ShowWhen'
          description: |-
            Only show this field when another field has a specific value
            Example:
            show_when:
            advanced_mode: true
            Optional
        type:
          description: |-
            Input type for dynamic string arrays
            Example:
            type: string_array
            Required
          enum:
            - string_array
          type: string
        values:
          allOf:
            - $ref: '#/components/schemas/Module.StringValues'
          description: >-
            Allowed values — static array of options or dynamic reference for a
            multi-select dropdown

            Example:

            values:

            - value: us-east-1

            label: US East

            - value: eu-west-1

            label: EU West

            Optional
      required:
        - id
        - label
        - type
      type: object
    Module.NumberInputProperty:
      additionalProperties: false
      description: >-
        Numeric input property.

        Can be a free-form number field or a dropdown/select when values are
        provided.


        Note: CEL validation ensures min <= max when both are specified.
      properties:
        collapsible:
          description: >-
            Render this field as collapsible (tag when collapsed, full field
            when expanded)


            Supported for all value-producing input types.

            Consecutive collapsible fields are automatically grouped together.

            Divider inputs break collapsible groups.


            Example:

            collapsible: true

            Optional — defaults to false
          type: boolean
        default:
          anyOf:
            - format: int32
              type: integer
            - $ref: '#/components/schemas/Module.DefaultValueRef'
          description: |-
            Default numeric value
            Example:
            default: 1
            default: $values:first
            Optional
          x-templateable: true
        description:
          description: |-
            Help text shown below the label
            Example:
            description: Select the AWS region for your resources
            Optional
          type: string
        id:
          description: |-
            Unique identifier for this input.
            Example:
            id: region
            Required
          minLength: 1
          type: string
        immutable:
          description: >-
            Lock this field after first deploy — prevents changes to destructive
            settings

            Example:

            immutable: true

            Optional — defaults to false
          type: boolean
        label:
          description: |-
            Text shown above the form field
            Example:
            label: Region
            Required
          minLength: 1
          type: string
        max:
          description: |-
            Maximum allowed value
            Example:
            max: 100
            Optional
          format: int32
          type: integer
        min:
          description: >-
            Minimum allowed value, or a full template reference to another
            number input

            in the same input list: <<
            module.input.deployment_minimum_healthy_percent >>.

            Referenced inputs use their effective values, including resolved
            defaults.

            Hidden inputs do not participate. Values are validated, never
            clamped.

            Example:

            min: 1

            Optional
          format: int32
          type: integer
          x-templateable: true
        min_current_value:
          description: |-
            Use the current deployed value as the minimum allowed value
            Example:
            min_current_value: true
            Optional — defaults to false
          type: boolean
        moved_from:
          description: >-
            Input IDs from earlier module versions whose values this input now
            holds.

            Upgrading an existing instance to this version does not trip the
            immutable

            input check for the listed inputs or for this one, so a module
            version can

            rename or merge immutable inputs without forcing a destroy and
            recreate.

            Example:

            moved_from:

            - domain_name

            - subject_alternative_names

            Optional
          items:
            type: string
          type: array
        no_options_message:
          description: |-
            Message shown when the dropdown has no available options
            Example:
            no_options_message: No sizes available for this region
            Optional
          type: string
        placeholder:
          description: |-
            Placeholder text when the field is empty
            Example:
            placeholder: Enter a number
            Optional
          type: string
        required:
          description: |-
            Whether the field must be filled in
            Example:
            required: true
            Optional — defaults to false
          type: boolean
        show_when:
          allOf:
            - $ref: '#/components/schemas/Module.ShowWhen'
          description: |-
            Only show this field when another field has a specific value
            Example:
            show_when:
            advanced_mode: true
            Optional
        type:
          description: |-
            Input type for numeric fields
            Example:
            type: number
            Required
          enum:
            - number
          type: string
        values:
          allOf:
            - $ref: '#/components/schemas/Module.NumberValues'
          description: >-
            Allowed values — static array of options or dynamic reference for a
            dropdown

            Example:

            values:

            - value: 1

            label: Small

            - value: 2

            label: Medium

            - value: 4

            label: Large

            Optional
      required:
        - id
        - label
        - type
      type: object
    Module.BooleanInputProperty:
      additionalProperties: false
      description: |-
        Boolean toggle/checkbox input property.
        Renders as a toggle switch or checkbox in the UI.
      properties:
        collapsible:
          description: >-
            Render this field as collapsible (tag when collapsed, full field
            when expanded)


            Supported for all value-producing input types.

            Consecutive collapsible fields are automatically grouped together.

            Divider inputs break collapsible groups.


            Example:

            collapsible: true

            Optional — defaults to false
          type: boolean
        default:
          description: |-
            Default boolean value
            Example:
            default: false
            Required
          type: boolean
          x-templateable: true
        description:
          description: |-
            Help text shown below the label
            Example:
            description: Select the AWS region for your resources
            Optional
          type: string
        id:
          description: |-
            Unique identifier for this input.
            Example:
            id: region
            Required
          minLength: 1
          type: string
        immutable:
          description: >-
            Lock this field after first deploy — prevents changes to destructive
            settings

            Example:

            immutable: true

            Optional — defaults to false
          type: boolean
        label:
          description: |-
            Text shown above the form field
            Example:
            label: Region
            Required
          minLength: 1
          type: string
        moved_from:
          description: >-
            Input IDs from earlier module versions whose values this input now
            holds.

            Upgrading an existing instance to this version does not trip the
            immutable

            input check for the listed inputs or for this one, so a module
            version can

            rename or merge immutable inputs without forcing a destroy and
            recreate.

            Example:

            moved_from:

            - domain_name

            - subject_alternative_names

            Optional
          items:
            type: string
          type: array
        show_when:
          allOf:
            - $ref: '#/components/schemas/Module.ShowWhen'
          description: |-
            Only show this field when another field has a specific value
            Example:
            show_when:
            advanced_mode: true
            Optional
        type:
          description: |-
            Input type for boolean toggle fields
            Example:
            type: boolean
            Required
          enum:
            - boolean
          type: string
      required:
        - id
        - label
        - type
        - default
      type: object
    Module.SectionInputProperty:
      additionalProperties: false
      description: |-
        Visual section separator property.
        Used to separate sections in the module form.
        Does not produce any input value - purely for visual organization.
      properties:
        description:
          description: |-
            Help text shown below the label
            Example:
            description: Select the AWS region for your resources
            Optional
          type: string
        id:
          description: |-
            Unique identifier for this input.
            Example:
            id: region
            Required
          minLength: 1
          type: string
        label:
          description: |-
            Text shown above the form field
            Example:
            label: Region
            Required
          minLength: 1
          type: string
        show_when:
          allOf:
            - $ref: '#/components/schemas/Module.ShowWhen'
          description: |-
            Only show this field when another field has a specific value
            Example:
            show_when:
            advanced_mode: true
            Optional
        type:
          description: |-
            Input type for visual section separators — produces no value
            Example:
            type: section
            Required
          enum:
            - section
          type: string
      required:
        - id
        - label
        - type
      type: object
      x-value-schema: none
    Module.CompoundInputProperty:
      additionalProperties: false
      description: >-
        Compound select input property.

        Allows selecting from options where each option contains multiple
        fields.

        The `fields` array specifies which fields from the selected value to
        expose.


        Note: CEL validation ensures values is always provided for compound
        inputs.
      properties:
        collapsible:
          description: >-
            Render this field as collapsible (tag when collapsed, full field
            when expanded)


            Supported for all value-producing input types.

            Consecutive collapsible fields are automatically grouped together.

            Divider inputs break collapsible groups.


            Example:

            collapsible: true

            Optional — defaults to false
          type: boolean
        default:
          anyOf:
            - additionalProperties:
                $ref: '#/components/schemas/Module.CompoundFieldValue'
              type: object
            - $ref: '#/components/schemas/Module.DefaultValueRef'
          description: |-
            Default value — a record with the field values
            Example:
            default:
            instance_type: t3.medium
            vcpu: 2
            memory_gb: 4
            default: $values:first
            Optional
          x-templateable: true
        description:
          description: |-
            Help text shown below the label
            Example:
            description: Select the AWS region for your resources
            Optional
          type: string
        fields:
          description: |-
            List of field names to expose from the selected compound value
            Example:
            fields: [instance_type, vcpu, memory_gb]
            Required — at least one field
          items:
            type: string
          minItems: 1
          type: array
        id:
          description: |-
            Unique identifier for this input.
            Example:
            id: region
            Required
          minLength: 1
          type: string
        immutable:
          description: >-
            Lock this field after first deploy — prevents changes to destructive
            settings

            Example:

            immutable: true

            Optional — defaults to false
          type: boolean
        label:
          description: |-
            Text shown above the form field
            Example:
            label: Region
            Required
          minLength: 1
          type: string
        min_current_value:
          description: |-
            Use the current deployed value as the minimum allowed value
            Example:
            min_current_value: true
            Optional — defaults to false
          type: boolean
        moved_from:
          description: >-
            Input IDs from earlier module versions whose values this input now
            holds.

            Upgrading an existing instance to this version does not trip the
            immutable

            input check for the listed inputs or for this one, so a module
            version can

            rename or merge immutable inputs without forcing a destroy and
            recreate.

            Example:

            moved_from:

            - domain_name

            - subject_alternative_names

            Optional
          items:
            type: string
          type: array
        no_options_message:
          description: |-
            Message shown when the dropdown has no available options
            Example:
            no_options_message: No instance types available for this region
            Optional
          type: string
        required:
          description: |-
            Whether the field must be filled in
            Example:
            required: true
            Optional — defaults to false
          type: boolean
        show_when:
          allOf:
            - $ref: '#/components/schemas/Module.ShowWhen'
          description: |-
            Only show this field when another field has a specific value
            Example:
            show_when:
            advanced_mode: true
            Optional
        type:
          description: |-
            Input type for compound select dropdowns
            Example:
            type: compound
            Required
          enum:
            - compound
          type: string
        values:
          allOf:
            - $ref: '#/components/schemas/Module.CompoundValues'
          description: >-
            Allowed values — static array of options or dynamic reference
            (required for compound)

            Example:

            values:

            - instance_type: t3.small

            vcpu: 2

            memory_gb: 2

            label: Small

            Optional
      required:
        - id
        - label
        - type
        - fields
      type: object
    Module.RefInputProperty:
      additionalProperties: false
      description: >-
        Module reference input property.

        Allows selecting another module instance or manually entering fallback
        inputs.


        Example:

        ```json

        {
          "type": "$ref:ravion-aws-vpc",
          "label": "VPC Configuration",
          "mapped_inputs": [
            {
              "id": "vpc_id",
              "type": "string",
              "label": "VPC ID",
              "default": "<< ref.output.vpc_id >>"
            }
          ]
        }

        ```


        Nested input defaults may use normal creation-time template namespaces
        plus

        ref-scoped selected instance references such as "<< ref.input.region >>"

        and "<< ref.output.vpc_id >>".


        The legacy "<< ref.stack.output.vpc_id >>" spelling remains supported.
      properties:
        collapsible:
          description: >-
            Render this field as collapsible (tag when collapsed, full field
            when expanded)


            Supported for all value-producing input types.

            Consecutive collapsible fields are automatically grouped together.

            Divider inputs break collapsible groups.


            Example:

            collapsible: true

            Optional — defaults to false
          type: boolean
        description:
          description: |-
            Help text shown below the label
            Example:
            description: Select the AWS region for your resources
            Optional
          type: string
        id:
          description: |-
            Unique identifier for this input.
            Example:
            id: region
            Required
          minLength: 1
          type: string
        immutable:
          description: >-
            Lock this field after first deploy — prevents changes to destructive
            settings

            Example:

            immutable: true

            Optional — defaults to false
          type: boolean
        label:
          description: |-
            Text shown above the form field
            Example:
            label: Region
            Required
          minLength: 1
          type: string
        mapped_inputs:
          description: >-
            Input definitions that copy values from the selected referenced
            module into

            this module's input values. Each mapped input is saved as a normal
            input on

            the current module. When users do not select a module instance,
            these same

            fields are shown for manual entry.

            Nested module references are not allowed in mapped inputs.

            Example:

            mapped_inputs:

            - id: vpc_id

            type: string

            label: VPC ID

            default: << ref.output.vpc_id >>

            Legacy: << ref.stack.output.vpc_id >> remains supported.

            Optional
          items:
            $ref: '#/components/schemas/Module.RefFallbackInputProperty'
          type: array
        moved_from:
          description: >-
            Input IDs from earlier module versions whose values this input now
            holds.

            Upgrading an existing instance to this version does not trip the
            immutable

            input check for the listed inputs or for this one, so a module
            version can

            rename or merge immutable inputs without forcing a destroy and
            recreate.

            Example:

            moved_from:

            - domain_name

            - subject_alternative_names

            Optional
          items:
            type: string
          type: array
        required:
          description: |-
            Whether the module reference is required
            Example:
            required: true
            Optional — defaults to false
          type: boolean
        show_when:
          allOf:
            - $ref: '#/components/schemas/Module.ShowWhen'
          description: |-
            Only show this field when another field has a specific value
            Example:
            show_when:
            advanced_mode: true
            Optional
        type:
          allOf:
            - $ref: '#/components/schemas/Module.RefTypeDiscriminator'
          description: |-
            Reference to another module type — format is "$ref:<module-type>"
            Example:
            type: $ref:ravion-aws-vpc
            Required
      required:
        - id
        - label
        - type
      type: object
      x-value-schema:
        type: string
    Module.GitRepoInputProperty:
      additionalProperties: false
      description: |-
        Git repository input property.
        Renders a repository selector that stores the full repo URL.
      properties:
        collapsible:
          description: >-
            Render this field as collapsible (tag when collapsed, full field
            when expanded)


            Supported for all value-producing input types.

            Consecutive collapsible fields are automatically grouped together.

            Divider inputs break collapsible groups.


            Example:

            collapsible: true

            Optional — defaults to false
          type: boolean
        default:
          allOf:
            - $ref: '#/components/schemas/Pipeline.GitRepoUrl'
          description: |-
            Default repository URL
            Example:
            default: https://github.com/myorg/myrepo
            Optional
        description:
          description: |-
            Help text shown below the label
            Example:
            description: Select the AWS region for your resources
            Optional
          type: string
        id:
          description: |-
            Unique identifier for this input.
            Example:
            id: region
            Required
          minLength: 1
          type: string
        immutable:
          description: >-
            Lock this field after first deploy — prevents changes to destructive
            settings

            Example:

            immutable: true

            Optional — defaults to false
          type: boolean
        label:
          description: |-
            Text shown above the form field
            Example:
            label: Region
            Required
          minLength: 1
          type: string
        moved_from:
          description: >-
            Input IDs from earlier module versions whose values this input now
            holds.

            Upgrading an existing instance to this version does not trip the
            immutable

            input check for the listed inputs or for this one, so a module
            version can

            rename or merge immutable inputs without forcing a destroy and
            recreate.

            Example:

            moved_from:

            - domain_name

            - subject_alternative_names

            Optional
          items:
            type: string
          type: array
        placeholder:
          description: |-
            Placeholder text when the field is empty
            Example:
            placeholder: Select a repository
            Optional
          type: string
        required:
          description: |-
            Whether the field must be filled in
            Example:
            required: true
            Optional — defaults to false
          type: boolean
        show_when:
          allOf:
            - $ref: '#/components/schemas/Module.ShowWhen'
          description: |-
            Only show this field when another field has a specific value
            Example:
            show_when:
            advanced_mode: true
            Optional
        type:
          description: |-
            Input type for git repository selector
            Example:
            type: gitrepo
            Required
          enum:
            - gitrepo
          type: string
      required:
        - id
        - label
        - type
      type: object
    Module.KeyValueInputProperty:
      additionalProperties: false
      description: |-
        Key-value pairs input property.
        Allows users to enter a flat map of string keys to string values.
        Renders a dynamic key-value editor with add/remove buttons.
      properties:
        collapsible:
          description: >-
            Render this field as collapsible (tag when collapsed, full field
            when expanded)


            Supported for all value-producing input types.

            Consecutive collapsible fields are automatically grouped together.

            Divider inputs break collapsible groups.


            Example:

            collapsible: true

            Optional — defaults to false
          type: boolean
        default:
          additionalProperties:
            type: string
          description: |-
            Default key-value pairs for the field
            Example:
            default:
            FOO: bar
            Optional
          type: object
          x-templateable: true
        description:
          description: |-
            Help text shown below the label
            Example:
            description: Select the AWS region for your resources
            Optional
          type: string
        id:
          description: |-
            Unique identifier for this input.
            Example:
            id: region
            Required
          minLength: 1
          type: string
        immutable:
          description: >-
            Lock this field after first deploy — prevents changes to destructive
            settings

            Example:

            immutable: true

            Optional — defaults to false
          type: boolean
        label:
          description: |-
            Text shown above the form field
            Example:
            label: Region
            Required
          minLength: 1
          type: string
        moved_from:
          description: >-
            Input IDs from earlier module versions whose values this input now
            holds.

            Upgrading an existing instance to this version does not trip the
            immutable

            input check for the listed inputs or for this one, so a module
            version can

            rename or merge immutable inputs without forcing a destroy and
            recreate.

            Example:

            moved_from:

            - domain_name

            - subject_alternative_names

            Optional
          items:
            type: string
          type: array
        required:
          description: |-
            Whether the field must have at least one key-value pair
            Example:
            required: true
            Optional — defaults to false
          type: boolean
        show_when:
          allOf:
            - $ref: '#/components/schemas/Module.ShowWhen'
          description: |-
            Only show this field when another field has a specific value
            Example:
            show_when:
            advanced_mode: true
            Optional
        type:
          description: |-
            Input type for key-value editor fields
            Example:
            type: keyvalue
            Required
          enum:
            - keyvalue
          type: string
      required:
        - id
        - label
        - type
      type: object
    Deployments.AwsAmiImageData:
      additionalProperties: false
      description: |-
        One AMI in one region that a deployment built or copied. The row's
        `lastStatus` holds its `AwsAmiImageStatus`.
      properties:
        amiId:
          description: Absent until the build or the copy creates the image.
          type: string
        amiName:
          type: string
        availableAt:
          format: date-time
          type: string
        builtByDeploymentId:
          description: Deployment that built the image.
          type: string
        copyProgressPercent:
          description: Copy progress while COPYING, from snapshot progress.
          format: int32
          maximum: 100
          minimum: 0
          type: integer
        deregisteredAt:
          format: date-time
          type: string
        failureReason:
          type: string
        imageBuildVersionArn:
          type: string
        isSourceImage:
          description: True for the home-region image the build created.
          type: boolean
        madePrivateAt:
          format: date-time
          type: string
        madePublicAt:
          format: date-time
          type: string
        region:
          type: string
        retiredByDeploymentId:
          description: >-
            Deployment whose retirement last made the image private or
            deregistered it.
          type: string
        rootDeviceName:
          description: >-
            Device name of the image's root volume, as EC2 reports it once the
            image is available.
          type: string
        rootVolumeGiB:
          description: >-
            Size of the volume on `rootDeviceName`, as EC2 reports it once the
            image is available.
          format: int32
          type: integer
        sizeGiB:
          description: Total size of the image's volumes.
          format: int32
          type: integer
        snapshotIds:
          description: EBS snapshots behind the image.
          items:
            type: string
          type: array
        sourceAmiId:
          description: Home-region AMI a copy was made from. Absent on the source image.
          type: string
        sourceRegion:
          description: Home region a copy was made from. Absent on the source image.
          type: string
        tags:
          additionalProperties:
            type: string
          type: object
        type:
          enum:
            - AMI_IMAGE
          type: string
      required:
        - type
        - region
        - isSourceImage
        - builtByDeploymentId
        - snapshotIds
        - tags
      type: object
    Deployments.AwsEc2InstanceData:
      additionalProperties: false
      description: Current state for one EC2 instance belonging to the module's ASG.
      properties:
        autoScalingGroupName:
          type: string
        availabilityZone:
          type: string
        awsAccountNumber:
          type: string
        instanceArn:
          description: Full account- and region-qualified EC2 instance ARN.
          type: string
        instanceId:
          description: Human-readable EC2 instance id (`i-…`).
          type: string
        outputTail:
          description: >-
            Tail of the latest SSM command output, bounded by the activity
            before

            persistence. Failed releases use this for diagnostics; successful

            releases expose it in the instance drawer's deploy-output tab.
          type: string
        region:
          type: string
        releaseCommandId:
          description: |-
            SSM command that most recently attempted this release on this
            concrete instance. Catch-up commands for replacement instances have
            their own command id, distinct from the original deployment command.
          type: string
        releaseCompletedAt:
          format: date-time
          type: string
        releaseExecutionStartedAt:
          description: Earliest time an SSM document step began executing on the instance.
          format: date-time
          type: string
        releaseGate:
          allOf:
            - $ref: '#/components/schemas/Deployments.AwsEc2InstanceReleaseGate'
          description: >-
            Present only for instances launched behind the versioned Ravion
            release gate.
        releaseRequestedAt:
          description: Time Systems Manager sent the invocation to this managed instance.
          format: date-time
          type: string
        releaseResponseCode:
          description: >-
            Exit code retained from the invocation's failed or final document
            step.
          format: int32
          type: integer
        releaseStartedAt:
          description: |-
            First time the current release entered an active SSM state on this
            instance. This is recorded when SendCommand is accepted.
          format: date-time
          type: string
        releaseStatus:
          allOf:
            - $ref: '#/components/schemas/Deployments.AwsEc2InstanceReleaseStatus'
          description: |-
            Release application state for the deployment referenced by the
            DeploymentResource envelope's `moduleDeploymentId`.
        releaseStatusDetails:
          description: >-
            Detailed AWS invocation status retained for actionable timeline
            copy.
          type: string
        subnetId:
          type: string
        type:
          enum:
            - EC2_INSTANCE
          type: string
      required:
        - type
        - instanceId
        - instanceArn
        - autoScalingGroupName
        - awsAccountNumber
        - region
        - releaseStatus
      type: object
    Deployments.EcsTaskData:
      additionalProperties: false
      description: |-
        Typed payload for DeploymentResource.data when type == ECS_TASK.
        Carries every ECS-specific field the old EcsTask table held as
        typed columns.

        The generic DeploymentResource envelope owns the fields merge
        needs to reason about across types (lastStatus, desiredStatus,
        startedAt, stoppedAt, firstSeenAt, lastEventAt, externalId) as
        real SQL columns. Everything else — ECS-specific descriptors and
        phase timestamps — lives in this JSON.
      properties:
        availabilityZone:
          type: string
        capacityProviderName:
          type: string
        clusterArn:
          type: string
        connectivity:
          type: string
        containerInstanceArn:
          type: string
        deprovisioningAt:
          format: date-time
          type: string
        exitCode:
          description: |-
            Exit code of the essential container that ended the task. Set
            once when the task reaches STOPPED with a non-null `exitCode` on
            any of its containers.
          format: int32
          type: integer
        healthStatus:
          type: string
        launchType:
          type: string
        pendingAt:
          format: date-time
          type: string
        platformVersion:
          type: string
        provisioningAt:
          format: date-time
          type: string
        pullStartedAt:
          format: date-time
          type: string
        pullStoppedAt:
          format: date-time
          type: string
        runTaskOverrides:
          allOf:
            - $ref: '#/components/schemas/Module.EcsRunTaskOverrides'
          description: |-
            Snapshot of the AWS RunTask `TaskOverride` payload the deploy
            step passed when launching this task. Only populated for
            PRE_DEPLOY / POST_DEPLOY hook tasks — the long-lived RUNTIME
            service task inherits the task definition verbatim and never
            carries an override payload.

            Reuses `Module.EcsRunTaskOverrides` directly — the same model
            the user authors in their YAML under `pre_deploy:` /
            `post_deploy:` — so config and runtime snapshot share one type
            with no parallel struct and no drift when AWS adds a new
            override field.
        runningAt:
          format: date-time
          type: string
        startedBy:
          type: string
        stopCode:
          type: string
        stoppedReason:
          type: string
        targetGroupSnapshot:
          allOf:
            - $ref: '#/components/schemas/Deployments.EcsTaskTargetGroupSnapshot'
          description: |-
            Frozen target-group evidence captured at task-stop. The event
            ingester runs the selector once against a fresh AWS fetch,
            picks the single most diagnostic TG, and persists the result
            here. Absent while the task is running, for workers without a
            load balancer, or when the task stopped before any TG
            registration was observed. The read path is a pure unmarshal —
            no runtime selection.
        taskArn:
          type: string
        taskDefinitionArn:
          type: string
        taskDefinitionFamily:
          type: string
        taskDefinitionRevision:
          format: int32
          type: integer
        taskGroup:
          type: string
        taskTargetId:
          description: |-
            Normalized target-group registration key for this task.
            awsvpc: private IPv4 extracted from the ENI attachment snapshot.
            EC2 bridge/host: the containerInstanceArn (ECS registers the
            instance in the target group rather than a per-task IP). Used by
            the drawer to filter target-health rows to exactly this task.
          type: string
        type:
          enum:
            - ECS_TASK
          type: string
      required:
        - type
        - taskArn
        - clusterArn
        - taskDefinitionArn
      type: object
    Deployments.EksWorkloadResourceData:
      additionalProperties: false
      description: |-
        Typed payload for `DeploymentResource.data` when type == K8S_WORKLOAD.

        The generic DeploymentResource envelope owns what the platform reasons
        about across kinds — `externalId` (the composite workload key),
        `lastStatus` (Operator's rollout classification), `moduleDeploymentId`,
        `moduleInstanceId`, `lastEventAt`. Everything Kubernetes-specific lives
        here.
      properties:
        availableReplicas:
          format: int32
          type: integer
        currentReplicas:
          format: int32
          type: integer
        desiredReplicas:
          format: int32
          type: integer
        diagnoses:
          description: >-
            What Operator has concluded is wrong with this workload's pods,
            newest

            first, bounded — a workload that has been failing all week must not
            grow

            an unbounded payload.


            Unlike `regression` and `drift` this is a LIST rather than a single

            object, because a workload really can have several unrelated
            findings at

            once (an image that will not pull on one container while another is

            OOM-killed), and collapsing them would hide whichever one Ravion
            happened

            to rank lower. Each entry is guarded by its own timestamps rather
            than by

            a shared stream sequence — see the note on `EksWorkloadDiagnosis`.
          items:
            $ref: '#/components/schemas/Deployments.EksWorkloadDiagnosis'
          type: array
        drift:
          allOf:
            - $ref: '#/components/schemas/Deployments.EksWorkloadDrift'
          description: |-
            Current drift finding, absent while the agent has never reported on
            this workload's drift. Guarded by its own `drift.sequence`.
        everReady:
          description: |-
            False means no replica of the current generation has ever become
            ready — the difference between a deploy that never came up and one
            that came up and later degraded.
          type: boolean
        generation:
          format: int64
          type: integer
        kind:
          description: Deployment / StatefulSet / DaemonSet / …
          type: string
        message:
          type: string
        name:
          type: string
        namespace:
          type: string
        observedGeneration:
          format: int64
          type: integer
        pods:
          description: >-
            The workload's pods as the agent last saw them, so a log view can
            list

            replicas and show one at a time. Pod names are structured metadata
            on

            the cluster's log lines, not stream labels, so this list is the only

            place a replica can be enumerated from. Capped by the agent; a
            workload

            with more pods than the cap reports the first of them by name.
            Absent

            from rows written before pods were reported.
          items:
            $ref: '#/components/schemas/Deployments.EksWorkloadPod'
          type: array
        readyReplicas:
          format: int32
          type: integer
        reason:
          type: string
        regression:
          allOf:
            - $ref: '#/components/schemas/Deployments.EksWorkloadRegression'
          description: |-
            Current regression episode, absent while the workload has never
            regressed. Guarded by its own `regression.sequence`.
        releaseName:
          description: >-
            Helm attribution, verbatim from the cluster. These are what the
            agent

            reports; `moduleDeploymentId` on the envelope is what the control

            plane resolved them to.
          type: string
        releaseNamespace:
          type: string
        sequence:
          description: >-
            The agent's monotonic ordering key for the ROLLOUT stream, seeded

            from a nanosecond wall-clock reading so it keeps increasing across
            an

            agent restart. A report whose sequence is not strictly greater than

            the stored one is a silent no-op.
          format: int64
          type: integer
        stalledForSeconds:
          format: int32
          type: integer
        stuckReason:
          type: string
        type:
          enum:
            - K8S_WORKLOAD
          type: string
        updatedReplicas:
          format: int32
          type: integer
        workloadUid:
          type: string
      required:
        - type
        - kind
        - namespace
        - name
        - releaseName
        - releaseNamespace
        - sequence
      type: object
    CanvasConnectionAnchors:
      additionalProperties: false
      description: >-
        Where a connection attaches to its module cards, for ends the user has
        moved. An absent end attaches automatically.
      properties:
        source:
          allOf:
            - $ref: '#/components/schemas/CanvasAnchor'
          description: >-
            Where the connection leaves the source module's card. Absent for the
            automatic attachment point.
        target:
          allOf:
            - $ref: '#/components/schemas/CanvasAnchor'
          description: >-
            Where the connection meets the target module's card. Absent for the
            automatic attachment point.
      type: object
    CanvasConnectionEndpoint:
      description: Marker drawn where a connection meets the module it points at.
      enum:
        - none
        - arrow
      type: string
    CanvasGroup:
      additionalProperties: false
      description: >-
        A named group of module cards drawn as one labelled region on the
        canvas.
      properties:
        id:
          description: Stable group identifier, unique within the canvas.
          minLength: 1
          type: string
        memberIds:
          description: >-
            Module instance ids belonging to this group. A module belongs to at
            most one group.
          items:
            type: string
          type: array
        name:
          description: Group name shown on the group's label.
          type: string
        parentId:
          description: >-
            The enclosing group, when this group is nested inside another.
            Absent for a top-level group.
          type: string
      required:
        - id
        - name
        - memberIds
      type: object
    CanvasPin:
      additionalProperties: false
      description: >-
        A module card's position on the canvas, in canvas coordinates. Cards
        without a position are placed automatically.
      properties:
        x:
          description: Horizontal position in canvas coordinates.
          format: double
          type: number
        'y':
          description: Vertical position in canvas coordinates.
          format: double
          type: number
      required:
        - x
        - 'y'
      type: object
    ExecutionEnvironment.SandboxPoolDefaults:
      additionalProperties: false
      properties:
        capacityTypes:
          items:
            enum:
              - ON_DEMAND
              - SPOT
            type: string
          type: array
        hostStorage:
          enum:
            - PERSISTENT
            - EPHEMERAL
          type: string
        idleShutdownSeconds:
          format: int32
          type: integer
        instanceTypes:
          items:
            $ref: '#/components/schemas/ExecutionEnvironment.SandboxInstanceType'
          type: array
        maxHostAgeHours:
          format: int32
          type: integer
        reservePolicy:
          $ref: '#/components/schemas/ExecutionEnvironment.SandboxReservePolicy'
        unusedTerminateMinutes:
          format: int32
          type: integer
      required:
        - idleShutdownSeconds
        - unusedTerminateMinutes
        - maxHostAgeHours
        - reservePolicy
        - hostStorage
        - capacityTypes
        - instanceTypes
      type: object
    ExecutionEnvironment.SandboxPoolConfig:
      additionalProperties: false
      description: >-
        Sparse overrides for the global sandbox-pool defaults. An empty object
        enables a pool that inherits the current defaults.
      properties:
        allowPublicRepositories:
          description: >-
            Allow GitHub Actions jobs from public repositories and forks to use
            this sandbox pool. Disabled when omitted.
          type: boolean
        capacityTypes:
          description: >-
            The markets the pool buys hosts in. `ON_DEMAND` is required: a step
            whose `infrastructure.interruptible` is false or omitted runs only
            on an on-demand host. With `SPOT`, an interruptible step that finds
            no on-demand room already running is placed on a spot host, billed
            at the Spot price; AWS can reclaim a spot host with two minutes'
            notice, and the step is then run again on another host, the last of
            three attempts on on-demand. Omitted, it uses the current global
            default.
          items:
            enum:
              - ON_DEMAND
              - SPOT
            type: string
          type: array
        hostStorage:
          description: >-
            What happens to an on-demand host's disks when it falls idle.
            `PERSISTENT` stops the host and keeps its EBS volume, so the
            snapshot chunks cached on it are there when a step wakes it.
            `EPHEMERAL` terminates the host and deletes its volume: nothing
            outlives a host except the pool's chunk store in S3, which the next
            host restores from, and a host whose type has instance store keeps
            its cache and its sandboxes there. Spot hosts are always terminated
            when idle. Omitted, it uses the current global default.
          enum:
            - PERSISTENT
            - EPHEMERAL
          type: string
        idleShutdownSeconds:
          description: >-
            How many seconds a host with no sandboxes waits before it stops.
            Omitted, it uses the current global default.
          format: int32
          maximum: 86400
          minimum: 1
          type: integer
        instanceTypes:
          description: >-
            Instance types the pool may launch. The pool launches the type that
            holds the sandboxes it must place on the fewest hosts, with the
            fewest spare vCPUs and then the least spare memory. List order
            settles an exact tie. Ravion chooses the hosts of a pool that lists
            none from the region's c8id, m8id, r8id, i7i, and i7ie types that
            support nested virtualization and have NVMe instance store.
          items:
            $ref: '#/components/schemas/ExecutionEnvironment.SandboxInstanceType'
          type: array
        maxHostAgeHours:
          description: >-
            The oldest a running host may get before it is drained for a fresh
            one, whatever template it launched from. Omitted, it defaults to 168
            hours (a week).
          format: int32
          maximum: 8760
          minimum: 1
          type: integer
        reservePolicy:
          allOf:
            - $ref: '#/components/schemas/ExecutionEnvironment.SandboxReservePolicy'
          description: >-
            How many hosts the pool keeps ready. Omitted, it uses the current
            global default.
        unusedTerminateMinutes:
          description: >-
            How long a stopped host above the reserve is kept before it is
            terminated and its volume released. Omitted, it uses the current
            global default.
          format: int32
          maximum: 43200
          minimum: 1
          type: integer
      type: object
    Deployments.AwsAmiDeploymentData:
      additionalProperties: false
      description: |-
        Typed payload for `ModuleDeployment.deploymentData` when
        `deploymentType == AWS_AMI`.

        Indexed columns the workflow also denormalizes onto
        `ModuleDeployment`:
        - `resourceArn`          ← `imageBuildVersionArn` (when known)
        - `resourceName`         ← the image recipe name
        - `externalDeploymentId` ← `sourceAmiId`.
      properties:
        awsAccountId:
          description: Ravion AWS account ID (`awsact_…`) that builds and owns the images.
          type: string
        awsAccountNumber:
          description: |-
            Twelve-digit AWS account number of `awsAccountId`. Prefixes every
            AMI_IMAGE row's `externalId`.
          type: string
        build:
          $ref: '#/components/schemas/Deployments.AwsAmiBuild'
        builtByDeploymentId:
          description: |-
            Deployment that built the images this deployment releases. Its own
            id when it built them; the source deployment's for a redeploy or
            rollback.
          type: string
        componentParameters:
          additionalProperties:
            additionalProperties:
              type: string
            type: object
          description: Parameters per component, keyed by component name.
          type: object
        deployedDefinition:
          $ref: '#/components/schemas/Deployments.AwsAmiDeploymentDefinition'
        imageBuildVersionArn:
          description: Image Builder image build version ARN of the released image.
          type: string
        imageRecipeArn:
          description: >-
            Image recipe this deployment created. Absent for a redeploy or
            rollback.
          type: string
        parentImageId:
          description: Parent AMI the build started from, after a `lookup` resolved.
          type: string
        phase:
          $ref: '#/components/schemas/Deployments.AwsAmiDeployPhase'
        previousDefinition:
          allOf:
            - $ref: '#/components/schemas/Deployments.AwsAmiDeploymentDefinition'
          description: >-
            `deployedDefinition` of the module instance's newest successful AMI

            deployment when this deployment was created. Absent when there was
            none.
        publish:
          description: Whether the deployment grants launch permission `all` on its images.
          type: boolean
        region:
          description: 'Home region: where the image is built.'
          type: string
        retention:
          $ref: '#/components/schemas/Deployments.AwsAmiRetention'
        sourceAmiId:
          description: AMI id of the released image in the home region.
          type: string
        tags:
          additionalProperties:
            type: string
          description: Tags on every AMI and snapshot, the `ravion:*` tags included.
          type: object
        targetRegions:
          description: >-
            Every region the release lands in, the home region first. A redeploy

            or rollback lands in every region its source reached and every
            region

            the module targets when it runs.
          items:
            type: string
          type: array
        type:
          enum:
            - aws:ami
          type: string
      required:
        - type
        - awsAccountId
        - region
        - targetRegions
        - phase
        - publish
        - build
        - retention
        - tags
        - componentParameters
        - deployedDefinition
      type: object
    Deployments.AwsEc2DeploymentData:
      additionalProperties: false
      description: |-
        Typed payload for `ModuleDeployment.deploymentData` when
        `deploymentType == AWS_EC2`.

        Mirrors `AwsLambdaDeploymentData` — all per-deploy state folded into
        this JSON column so adding a deployment type costs zero new SQL
        tables.

        Indexed columns the workflow also denormalizes onto
        `ModuleDeployment` (`resourceArn`, `resourceName`,
        `externalDeploymentId`):
        - `resourceArn`          ← Auto Scaling Group ARN (when known)
        - `resourceName`         ← `autoScalingGroupName`
        - `externalDeploymentId` ← SSM `commandId` (commit identity).
      properties:
        autoScalingGroupName:
          description: Name of the Auto Scaling Group the deploy targets.
          type: string
        automaticRollback:
          allOf:
            - $ref: '#/components/schemas/Deployments.AwsEc2AutomaticRollback'
          description: >-
            Present when a terminal invocation failure triggered or considered
            an

            automatic rollback. The parent deployment remains failed.
        awsAccountNumber:
          description: |-
            Twelve-digit AWS account number that owns the Auto Scaling Group.
            Combined with region and ASG name for unambiguous EventBridge
            correlation when the group ARN is not present. Always written by
            the create paths; absent only on deployments that predate this
            field.
          type: string
        commandCompletedAt:
          description: Set when `commandStatus` reaches `SUCCESS` or `FAILED`.
          format: date-time
          type: string
        commandFailureReason:
          description: |-
            AWS error message if `commandStatus == FAILED` before any
            invocation ran (SendCommand itself failed). Per-instance failures
            land on `instanceResults[].outputTail` instead.
          type: string
        commandId:
          description: |-
            SSM command ID returned by SendCommand. Acts as the deploy's
            commit identity for downstream tooling.
          type: string
        commandStatus:
          $ref: '#/components/schemas/Deployments.AwsEc2CommandStatus'
        deployedDefinition:
          allOf:
            - $ref: '#/components/schemas/Deployments.AwsEc2DeploymentDefinition'
          description: Snapshot of the resolved definition this deploy applied.
        instanceResults:
          description: |-
            The InService instance snapshot the command was sent to, with each
            instance's terminal invocation status.
          items:
            $ref: '#/components/schemas/Deployments.AwsEc2InstanceResult'
          type: array
        logGroupName:
          description: >-
            CloudWatch log group for this deploy's instances. It carries two
            stream

            families written by two different agents: the app's own output,
            which the

            CloudWatch agent writes to
            `deployment/<moduleDeploymentId>/instance/<instanceId>`

            and `ui.logs` surfaces, and the deploy's SSM command output, which
            the SSM

            agent writes to
            `<commandId>/<instanceId>/<documentName>/<stdout|stderr>`

            because SendCommand sets `CloudWatchOutputConfig` to this group.
            Absent for

            deployments created from module versions that predate runtime logs.
          type: string
        maxConcurrency:
          description: MaxConcurrency the command was sent with (count or percentage).
          type: string
        maxErrors:
          description: MaxErrors the command was sent with (count or percentage).
          type: string
        previousDefinition:
          allOf:
            - $ref: '#/components/schemas/Deployments.AwsEc2DeploymentDefinition'
          description: |-
            Snapshot of the resolved definition from the last SUCCESS-status
            EC2 deploy on this module instance, if any. Null on the very
            first EC2 deploy.
        previousDeploymentId:
          description: >-
            Exact deployment row that supplied previousDefinition. Used by

            automatic rollback so a mutable "latest successful" query is never
            the

            rollback identity.
          type: string
        region:
          description: AWS region of the group and document.
          type: string
        source:
          allOf:
            - $ref: '#/components/schemas/Pipeline.GitSource'
          description: >-
            Optional deploy.source used by a manual deploy. The stored ref is
            the

            immutable commit resolved before SSM dispatch.
        ssmDocumentName:
          description: |-
            Name of the SSM command document the deploy ran: the
            convention-derived `<asg-name>-deploy` (both runtimes).
          type: string
        targetGroupArn:
          description: |-
            ARN of the service target group, when the service is
            load-balanced. Informational — the document owns drain and
            re-register.
          type: string
        type:
          enum:
            - aws:ec2
          type: string
      required:
        - type
        - autoScalingGroupName
        - ssmDocumentName
        - region
        - commandStatus
      type: object
    Deployments.EcsDeploymentData:
      additionalProperties: false
      description: |-
        Typed payload for ModuleDeployment.deploymentData when
        deploymentType == AWS_ECS. Merged in from the old
        EcsModuleDeployment table.

        clusterArn + serviceArn live here in the JSON; the serviceArn is
        also denormalized onto the indexed ModuleDeployment.resourceArn
        column so the event-ingestion hot path (aws.ecs events) can
        resolve a deploy by service ARN without JSON_EXTRACT.
      properties:
        acceptedPauseControl:
          allOf:
            - $ref: >-
                #/components/schemas/Deployments.EcsDeploymentAcceptedPauseControl
          description: |-
            Latest PAUSED lifecycle hook control accepted by the API. This is
            cleared implicitly by mismatch: when a newer PAUSED event becomes
            latest, its hook/stage/timestamp no longer matches this object and
            the UI shows controls again.
        clusterArn:
          type: string
        deployedTaskDefinition:
          allOf:
            - $ref: '#/components/schemas/Deployments.EcsTaskDefinitionSnapshot'
          description: |-
            Snapshot of the task definition this deploy registered. Populated
            once RegisterTaskDefinition succeeds.
        detectedVia:
          description: >-
            How Ravion found out about an `EXTERNAL` deployment. `EVENTBRIDGE`
            means an

            AWS event told us. Separate from initiationType because it names the

            transport, not the cause: Ravion's own deployments also emit
            EventBridge

            events. Absent on `RAVION` deployments.
          enum:
            - EVENTBRIDGE
          type: string
        ecsModuleDeploymentId:
          description: |-
            Preserved during migration from the old EcsModuleDeployment
            table so legacy log / ticket / Temporal-payload references can
            still be traced. New code should use the parent
            ModuleDeployment.id as the deploy identifier.
          type: string
        elbListenerState:
          description: |-
            ALB listener topology, one entry per load balancer the service
            is attached to. Written by the deploy workflow's
            `CaptureEcsServiceListeners` activity at phase-start only
            (topology rarely changes mid-deploy). Replaces the old
            `ECS_SERVICE_LISTENERS` snapshot kind.
          items:
            $ref: '#/components/schemas/Deployments.EcsElbListenerState'
          type: array
        events:
          description: |-
            Append-only progress timeline. The deploy workflow writes one
            entry per phase transition via JSON_ARRAY_APPEND so the row
            update fires the existing ModuleDeployment WebSocket broadcast.
            The frontend reads the last entry as the current phase to drive
            the deploy progress bar
          items:
            $ref: '#/components/schemas/Deployments.EcsDeploymentEvent'
          type: array
        initiationType:
          description: >-
            Who started this deployment. `RAVION` is a deployment the deploy
            manager

            ran; `EXTERNAL` is one somebody made against AWS directly — an ECS
            force

            deployment from a Terraform apply, the AWS console, or the AWS CLI —
            which

            Ravion recorded after the fact. Absent on rows written before the
            field

            existed; treat absent as `RAVION`.
          enum:
            - RAVION
            - EXTERNAL
          type: string
        postDeployEnabled:
          description: |-
            True when the resolved deploy config carried a non-empty
            `post_deploy` hook. Symmetric to preDeployEnabled.
          type: boolean
        preDeployEnabled:
          description: |-
            True when the resolved deploy config carried a non-empty
            `pre_deploy` hook. Written once at deploy-start, before any
            hook task runs. Drives the UI's pre-deploy phase slot
            rendering. Reads default to `false` when absent (legacy
            deployments that predate the hook feature).
          type: boolean
        previousTaskDefinition:
          allOf:
            - $ref: '#/components/schemas/Deployments.EcsTaskDefinitionSnapshot'
          description: |-
            Snapshot of the task definition that was running before this
            deploy registered a new one. Null on the very first deploy of a
            module instance.
        revertExternalDeploymentId:
          description: |-
            AWS deployment id (`ecs-svc/<rev>`) of the rollback UpdateService
            issued by the rolling revert path. Distinct from
            ModuleDeployment.externalDeploymentId, which stays bound to the
            failed deploy's own AWS deployment.
          type: string
        revertRequestedAt:
          description: |-
            Stamped by the rolling-strategy failure path just before its
            snapshot-revert UpdateService call. The revert starts a brand-new
            AWS service deployment whose id isn't known until UpdateService
            returns, so this flag lets event ingestion attribute that
            deployment's first events to this deploy (as its rollback) even
            when they beat the identity write below — instead of minting a
            phantom "external" deployment row.
          format: date-time
          type: string
        revertServiceDeploymentArn:
          description: |-
            Service-deployment ARN of the rollback deployment started by the
            rolling revert path. Companion to revertExternalDeploymentId for
            events that only carry the ARN.
          type: string
        serviceArn:
          type: string
        serviceDeploymentArn:
          description: |-
            ARN of the AWS service deployment
            (arn:aws:ecs:…:service-deployment/cluster/service/id) driving
            this deploy. Populated for non-rolling strategies once the
            UpdateService call resolves it via ListServiceDeployments; used
            by StopServiceDeployment / ContinueServiceDeployment and for
            EventBridge correlation.
          type: string
        serviceDeploymentState:
          allOf:
            - $ref: '#/components/schemas/Deployments.EcsServiceDeploymentState'
          description: |-
            Latest ECS service-deployment state captured from
            DescribeServiceDeployments. This mirrors ECS's target/source service
            revisions and drives Live / Standby badges without inferring traffic
            roles from row order or old Ravion phase events.
        strategy:
          allOf:
            - $ref: '#/components/schemas/Deployments.EcsDeployStrategy'
          description: |-
            Deployment strategy this deploy ran with. Absent on legacy rows
            (which predate native-strategy support and were always rolling
            or dual-service blue/green).
        triggerChannel:
          description: >-
            Where an `EXTERNAL` deployment was made from — `AWS CLI`, `AWS
            Console`,

            `Terraform`, `AWS SDK`, or `AWS API` when the caller is
            unrecognised.

            Absent on deployments Ravion started.
          type: string
        triggeredBy:
          description: >-
            Who made the change, for an `EXTERNAL` deployment: an IAM user name,
            or the

            person's identifier from their single sign-on session. Absent when
            Ravion

            started the deployment, and when the caller could not be identified.
          type: string
        type:
          enum:
            - aws:ecs
          type: string
      required:
        - type
        - clusterArn
        - serviceArn
      type: object
    Deployments.EksDeploymentData:
      additionalProperties: false
      description: >-
        Typed payload for `ModuleDeployment.deploymentData` when

        `deploymentType == AWS_EKS`.


        Mirrors `AwsLambdaDeploymentData` / `AwsEc2DeploymentData` — all

        per-deploy state folded into this JSON column so adding a deployment

        type costs zero new SQL tables.


        Indexed columns the workflow also denormalizes onto

        `ModuleDeployment` (`resourceArn`, `resourceName`,

        `externalDeploymentId`):

        - `resourceArn`          ← `clusterArn`

        - `resourceName`         ← `<releaseNamespace>/<releaseName>`

        - `externalDeploymentId` ←
        `<releaseNamespace>/<releaseName>@<releaseRevision>`

        (Helm release revision is the deploy's

        commit identity).
      properties:
        atomicRollbackPerformed:
          description: |-
            True when a failed `--atomic` upgrade was reverted by Helm itself
            to `previousReleaseRevision`. False (or absent) means the failure
            left the release in whatever state Helm reported — the deploy
            fails either way.
          type: boolean
        awsAccountNumber:
          description: |-
            Twelve-digit AWS account number that owns the cluster, parsed
            from `clusterArn` at resolve time.
          type: string
        clusterArn:
          description: |-
            Full ARN of the EKS cluster the deploy targets, e.g.
            `arn:aws:eks:us-east-1:123456789012:cluster/prod`. Denormalized
            onto the indexed `ModuleDeployment.resourceArn` column.
          type: string
        clusterEndpoint:
          description: |-
            HTTPS endpoint of the cluster's Kubernetes API server. May be a
            private-only endpoint — the runner executes inside the cluster
            VPC. Identifier only; the credential used to talk to it is never
            persisted.
          type: string
        clusterName:
          description: |-
            Short cluster name. Duplicated from the ARN tail so consumers
            don't string-split the ARN.
          type: string
        deployedDefinition:
          allOf:
            - $ref: '#/components/schemas/Deployments.EksHelmReleaseDefinition'
          description: |-
            Snapshot of the resolved definition this deploy applied.
            Populated once the workflow finishes resolving inputs (before the
            upgrade).
        detectedVia:
          description: |-
            How Ravion found out about an `EXTERNAL` deployment.

            `OPERATOR_HELM_INVENTORY` is a Helm revision in the cluster that
            matches no generation Ravion ever committed — a real `helm upgrade`
            someone else ran, which therefore HAS a revision and can be rolled
            back to.

            `OPERATOR_ROLLOUT` is a pod-template change observed through rollout
            and drift tracking with no Helm revision behind it: a kubectl image
            set, a kubectl edit, a mutating controller. Helm never saw it, so
            there is nothing to roll back TO and the rollback affordance is
            withheld for these.

            Separate from `initiationType` because it names the transport, not
            the cause. Absent on `RAVION` deployments.
          enum:
            - OPERATOR_HELM_INVENTORY
            - OPERATOR_ROLLOUT
          type: string
        events:
          description: |-
            Append-only progress timeline. The deploy workflow writes one
            entry per phase transition via JSON_ARRAY_APPEND so the row
            update fires the existing ModuleDeployment WebSocket broadcast.
            The frontend reads the last entry as the current phase to drive
            the deploy progress bar.
          items:
            $ref: '#/components/schemas/Deployments.EksDeploymentEvent'
          type: array
        externalChangeSummary:
          description: |-
            One-line description of the external change, e.g.
            `helm upgrade to revision 7 (chart web-1.5.0)`.
          type: string
        externalChanges:
          description: |-
            What actually changed, for an `EXTERNAL` deployment. One line per
            changed field, in the same `previous` → `current` orientation the
            workload drift payload uses (`previous` is always what Ravion
            deployed). Empty for a Helm-revision divergence the agent could not
            diff, where `externalChangeSummary` carries the whole story.
          items:
            $ref: '#/components/schemas/Deployments.EksExternalChange'
          type: array
        helmStatus:
          description: |-
            Helm's own status string for the release after the upgrade
            (`deployed`, `failed`, `superseded`, `pending-upgrade`, …), kept
            verbatim so the drawer can surface what Helm reported rather than
            only Ravion's classification.
          type: string
        initiationType:
          description: |-
            Who started this deployment. `RAVION` is one the deploy manager ran;
            `EXTERNAL` is one somebody made against the cluster directly — a
            `helm upgrade` from a laptop, a `kubectl set image`, a GitOps
            controller — which Ravion recorded after the fact. Absent on rows
            written before the field existed; treat absent as `RAVION`.
          enum:
            - RAVION
            - EXTERNAL
          type: string
        previousDefinition:
          allOf:
            - $ref: '#/components/schemas/Deployments.EksHelmReleaseDefinition'
          description: |-
            Snapshot of the resolved definition from the last SUCCESS-status
            EKS deploy on this module instance, if any. Null on the very
            first EKS deploy. Used by the deploy detail drawer to render the
            definition diff.
        previousDeploymentId:
          description: |-
            Exact deployment row that supplied `previousDefinition`. Recorded
            so rollback targets an immutable identity rather than re-running
            a mutable "latest successful" query.
          type: string
        previousReleaseRevision:
          description: |-
            Helm release revision that was live *before* this deploy — the
            rollback target an explicit `helm rollback` reverts to. Null when
            this deploy created the release.
          format: int32
          type: integer
        ravionRunnerRoleArn:
          description: |-
            ARN of the stable `<cluster>-ravion-runner` IAM role the runner
            assumes to mint a cluster token (`aws eks get-token --role-arn`).
            An identifier, not a credential — assumed credentials exist only
            inside the runner's token call and are never persisted.
          type: string
        region:
          description: AWS region of the cluster.
          type: string
        releaseCompletedAt:
          description: Set when `releaseStatus` transitions to `SUCCESS` or `FAILED`.
          format: date-time
          type: string
        releaseFailureReason:
          description: |-
            Failure message when `releaseStatus == FAILED`. Runner-redacted
            `helm` output.
          type: string
        releaseRevision:
          description: |-
            Helm release revision this deploy produced (the `REVISION`
            column of `helm history`). Acts as the deploy's commit identity
            for downstream tooling. Set once the upgrade succeeds.
          format: int32
          type: integer
        releaseStatus:
          $ref: '#/components/schemas/Deployments.EksHelmReleaseStatus'
        syncBlocked:
          allOf:
            - $ref: '#/components/schemas/Deployments.EksSyncBlocked'
          description: |-
            The cluster agent's report that it cannot make progress on this
            deploy, written by operator ingest (MarkEksSyncBlocked) and removed
            once the agent moves again. Shown while the deploy is waiting so the
            reader sees what it is waiting on — for example, another generation
            still holding the release.
        triggerChannel:
          description: |-
            Where the change came from, in the same slot the ECS path uses for
            the AWS console / CLI / Terraform distinction.
          type: string
        triggeredBy:
          description: |-
            Best-effort attribution of who made the change, when the cluster
            offered one. Kubernetes rarely does, so this is usually absent —
            which is itself the honest answer, unlike a placeholder.
          type: string
        type:
          enum:
            - aws:eks
          type: string
      required:
        - type
        - clusterArn
        - clusterName
        - region
        - releaseStatus
      type: object
    Deployments.AwsLambdaDeploymentData:
      additionalProperties: false
      description: |-
        Typed payload for `ModuleDeployment.deploymentData` when
        `deploymentType == AWS_LAMBDA`.

        Mirrors `AwsStaticDeploymentData` — all per-deploy state folded into
        this JSON column so adding a deployment type costs zero new SQL
        tables.

        Indexed columns the workflow also denormalizes onto
        `ModuleDeployment` (`resourceArn`, `resourceName`,
        `externalDeploymentId`):
        - `resourceArn`         ← `functionArn`
        - `resourceName`        ← `functionName`
        - `externalDeploymentId` ← `<functionArn>:<publishedVersion>`
        (commit identity for the deploy).
      properties:
        aliasArn:
          description: Alias ARN after the successful UpdateAlias call.
          type: string
        aliasFailureReason:
          description: |-
            AWS error message if `aliasUpdateStatus == FAILED`. Most common
            cause is RevisionId mismatch from a racing deploy.
          type: string
        aliasName:
          description: |-
            Alias the deploy flips after publishing the new version. Defaults
            to `live` when the module YAML omits it.
          type: string
        aliasNewRevisionId:
          description: RevisionId returned by the successful UpdateAlias call.
          type: string
        aliasPreviousRevisionId:
          description: |-
            RevisionId observed on the alias *before* the UpdateAlias call —
            the value passed as `RevisionId` precondition so concurrent
            deploys can't silently clobber each other.
          type: string
        aliasUpdateCompletedAt:
          description: Set when `aliasUpdateStatus` transitions to `SUCCESS` or `FAILED`.
          format: date-time
          type: string
        aliasUpdateStatus:
          $ref: '#/components/schemas/Deployments.AwsLambdaAliasUpdateStatus'
        deployedDefinition:
          allOf:
            - $ref: '#/components/schemas/Deployments.AwsLambdaDeploymentDefinition'
          description: |-
            Snapshot of the resolved definition this deploy applied. Populated
            once the workflow finishes resolving inputs (before
            UpdateFunctionCode).
        functionArn:
          description: Full ARN of the Lambda function the deploy targets.
          type: string
        functionName:
          description: Short function name parsed from the ARN.
          type: string
        previousDefinition:
          allOf:
            - $ref: '#/components/schemas/Deployments.AwsLambdaDeploymentDefinition'
          description: |-
            Snapshot of the resolved definition from the last SUCCESS-status
            Lambda deploy on this module instance, if any. Null on the very
            first Lambda deploy. Used by the deploy detail drawer to render
            the definition diff.
        previousPublishedVersion:
          description: |-
            Function version the alias was pointing at *before* this deploy —
            the rollback target. Captured by the `CaptureLambdaPreviousAlias`
            activity. Null when this is the first deploy that created the
            alias.
          type: string
        publishFailureReason:
          description: AWS error message if `publishStatus == FAILED`.
          type: string
        publishStatus:
          $ref: '#/components/schemas/Deployments.AwsLambdaPublishStatus'
        publishedVersion:
          description: |-
            Numeric version produced by PublishVersion (e.g. `"42"`). Acts as
            the deploy's commit identity for downstream tooling.
          type: string
        publishedVersionArn:
          description: |-
            Qualified ARN of the published version
            (`<functionArn>:<publishedVersion>`). Denormalized for the UI.
          type: string
        region:
          description: AWS region of the function.
          type: string
        s3ArtifactBucket:
          description: |-
            Optional S3 bucket the build step uploads the zip artifact into.
            Captured for audit even when the deploy itself targets an
            IMAGE-packaged function (a single module may switch between
            packaging modes across deploys).
          type: string
        type:
          enum:
            - aws:lambda
          type: string
        updateCompletedAt:
          description: Set when `updateStatus` transitions to `SUCCESS` or `FAILED`.
          format: date-time
          type: string
        updateFailureReason:
          description: AWS error message if `updateStatus == FAILED`.
          type: string
        updateRevisionId:
          description: |-
            RevisionId returned by UpdateFunctionCode — captures the function
            configuration revision the deploy actually wrote. Useful for
            cross-correlating with Lambda's own audit log.
          type: string
        updateStatus:
          $ref: '#/components/schemas/Deployments.AwsLambdaUpdateStatus'
      required:
        - type
        - functionArn
        - functionName
        - region
        - aliasName
        - updateStatus
        - publishStatus
        - aliasUpdateStatus
      type: object
    Deployments.AwsStaticDeploymentData:
      additionalProperties: false
      description: |-
        Typed payload for `ModuleDeployment.deploymentData` when
        `deploymentType == AWS_STATIC`.

        Replaces the originally-planned per-deploy `AwsStaticModuleDeployment`
        child table — the deployment-manager refactor folded all per-type
        data into this JSON column so adding a deployment type costs zero
        new SQL tables.

        Indexed columns the workflow also denormalizes onto
        `ModuleDeployment` (`resourceArn`, `resourceName`,
        `externalDeploymentId`):
        - `resourceArn`         ← `kvsArn`         (so KVS-event ingesters
        can resolve a deploy
        by KVS arn without
        JSON_EXTRACT)
        - `resourceName`        ← `s3Bucket`       (UI breadcrumb)
        - `externalDeploymentId` ← `kvsETag`       (commit identity, audit
        trail for promotion).
      properties:
        deployedDefinition:
          allOf:
            - $ref: '#/components/schemas/Deployments.AwsStaticDeploymentDefinition'
          description: |-
            Snapshot of the resolved definition this deploy promoted.
            Populated once the workflow finishes resolving inputs (before
            KVS write).
        deployedKvsState:
          additionalProperties:
            type: string
          description: |-
            KVS contents this deploy promoted, captured directly by the PutKey
            activity from the same `(key, value)` pair it wrote to CloudFront.
            This is the source of truth for the "after" side of the deploy
            detail diff — the renderer doesn't synthesize it from the resolved
            definition's directory field. Populated when `kvsStatus`
            transitions to SUCCESS.
          type: object
        distributions:
          description: |-
            Distributions whose CloudFront function reads from `kvsArn`.
            Captured at deploy phase-start by the
            `CaptureStaticDistributions` activity, mirroring how
            `CaptureEcsServiceListeners` works for ECS. Drives the deploy
            detail UI's domains list.
          items:
            $ref: '#/components/schemas/Deployments.AwsCloudfrontDistributionInfo'
          type: array
        invalidations:
          description: |-
            One entry per distribution the deploy was asked to invalidate.
            Empty / omitted when the deploy's definition specified no
            `cloudfront_invalidation_paths`. Updated incrementally by the
            background invalidation activity — the deploy itself completes
            the moment KVS PutKey succeeds, regardless of invalidation
            state.
          items:
            $ref: '#/components/schemas/Deployments.AwsCloudfrontInvalidationRecord'
          type: array
        kvsArn:
          description: ARN of the CloudFront KeyValueStore holding the `active` key.
          type: string
        kvsCompletedAt:
          description: Set when `kvsStatus` transitions to `SUCCESS` or `FAILED`.
          format: date-time
          type: string
        kvsETag:
          description: |-
            ETag returned by the successful `PutKey` call (the `ETag`
            response header). Acts as the deploy's commit identity and is
            the value the *next* deploy's `If-Match` header must carry to
            satisfy KVS optimistic concurrency. Also denormalized to
            `ModuleDeployment.externalDeploymentId` for indexed lookups.
          type: string
        kvsFailureReason:
          description: |-
            AWS error message if `kvsStatus == FAILED`. Most common cause is
            ETag mismatch from a racing deploy.
          type: string
        kvsPreviousETag:
          description: |-
            ETag observed on the `active` key immediately before this
            deploy's PutKey attempt. Captured for audit so post-mortem
            tooling can reconstruct the optimistic-concurrency chain across
            concurrent deploys.
          type: string
        kvsStatus:
          $ref: '#/components/schemas/Deployments.AwsStaticKvsWriteStatus'
        previousDefinition:
          allOf:
            - $ref: '#/components/schemas/Deployments.AwsStaticDeploymentDefinition'
          description: |-
            Snapshot of the resolved definition from the last SUCCESS-status
            static deploy on this module instance, if any. Null on the very
            first static deploy. Used by the deploy detail drawer to render
            the definition diff in lieu of a task-definition diff.
        previousKvsState:
          additionalProperties:
            type: string
          description: |-
            KVS contents *before* this deploy's PutKey, copied at create time
            from the prior successful deploy's `deployedKvsState`. Today this
            is a single-key map (`{[active]: <prior directory>}`) — modeled as
            a Record so the diff viewer doesn't have to know which keys the
            workflow promotes, and so multi-key promotions land without a UI
            rework. Null on the very first static deploy for a module instance.
          type: object
        prunedDirectories:
          description: |-
            Directories the prune activity removed from the hosting bucket
            for this deploy. Bounded by `keepLatestSuccessfulDeployCount` on
            the resolved definition. Empty when the count threshold wasn't
            exceeded.
          items:
            type: string
          type: array
        s3Bucket:
          description: Hosting bucket name (resolved `s3_bucket`).
          type: string
        s3Region:
          description: |-
            Hosting bucket region — needed by the prune activity to talk to
            the right S3 endpoint.
          type: string
        type:
          enum:
            - aws:static
          type: string
      required:
        - type
        - kvsArn
        - s3Bucket
        - s3Region
        - kvsStatus
      type: object
    ModuleInstance.ValueReferenceStatus:
      description: How a value reference compares with its producer's current outputs.
      enum:
        - UP_TO_DATE
        - STALE
        - UNKNOWN
      type: string
    ModuleInstance.ResolvedUILink:
      additionalProperties: false
      description: |-
        Resolved UI link. All fields optional and nullable because the resolver
        leaves stack-output-dependent fields unresolved until a successful stack
        apply re-resolves them.
      properties:
        href:
          nullable: true
          type: string
        name:
          nullable: true
          type: string
      type: object
    ModuleInstance.ResolvedUILog:
      additionalProperties: false
      description: >-
        Resolved UI log. All fields optional and nullable so a log source can be

        displayed only after its source has concrete stack outputs.
        Discriminated

        on `source.type`: `cloudwatch` for ECS and EC2, `eks_loki` for EKS.
      properties:
        enabled:
          nullable: true
          type: boolean
        id:
          nullable: true
          type: string
        name:
          nullable: true
          type: string
        source:
          allOf:
            - $ref: '#/components/schemas/ModuleInstance.ResolvedLogSource'
          nullable: true
      type: object
    ModuleInstance.ResolvedUIMetric:
      additionalProperties: false
      description: |-
        Resolved UI metric. All fields optional and nullable so a metric can be
        displayed even when its source still points at unresolved stack outputs.
      properties:
        enabled:
          nullable: true
          type: boolean
        id:
          nullable: true
          type: string
        name:
          nullable: true
          type: string
        source:
          allOf:
            - $ref: '#/components/schemas/ModuleInstance.ResolvedMetricSource'
          nullable: true
        type:
          allOf:
            - $ref: '#/components/schemas/Module.MetricType'
          nullable: true
      type: object
    Pipeline.StackRunSnapshot:
      additionalProperties: false
      description: Configuration values captured for a stack run's module instance
      properties:
        kind:
          description: Identifies this snapshot as belonging to a stack run
          enum:
            - stack
          type: string
        module_input:
          additionalProperties: {}
          description: >-
            The module's input values in effect when this run was created, keyed
            by input field ID

            Required
          type: object
        module_version_id:
          description: >-
            ID of the module version that was in effect when this run was
            created

            Example:

            module_version_id: cljk3x9p10000356rk5z8h2mq

            Required
          type: string
        previous_module_input:
          additionalProperties: {}
          description: >-
            The module's input values BEFORE the change that created this run,
            keyed by input

            field ID. Only present when the change carried a known prior state.
          type: object
        previous_module_version_id:
          description: >-
            ID of the module version that was in effect BEFORE the change that
            created this run.

            Only present when the change carried a known prior state (e.g. a
            dashboard config

            update); older runs are compared via their predecessor's snapshot
            instead.
          type: string
      required:
        - kind
        - module_version_id
        - module_input
      type: object
    PipelineRun.QueueBlockingEntityType:
      enum:
        - STACK
      type: string
    PipelineRun.QueueConditionKind:
      enum:
        - STACK_OUTPUT_UPDATED
        - STACK_RUN_SUCCEEDED
      type: string
    PipelineRun.QueueReasonKey:
      enum:
        - PIPELINE_WORKFLOW_STARTING
        - STACK_RUN_PREPARING
        - STACK_PIPELINE_WORKFLOW_STARTING
        - CHILD_PIPELINE_WORKFLOW_STARTING
        - RETRY_WORKFLOW_STARTING
        - STACK_OUTPUT_UPDATE
        - STACK_RUN_SUCCESS
        - CONDITION_QUEUE_WAIT
        - TRIGGER_CONCURRENCY
      type: string
    Pipeline.TriggerSource:
      description: All possible trigger sources (user-facing webhooks + system-generated)
      enum:
        - webhook:github
        - webhook:gitlab
        - webhook
        - schedule
        - api
        - dashboard
        - config:change
        - project-config:change
        - stack:destroy
        - system
      type: string
    CodeSourceGithubInstallationAuth:
      additionalProperties: false
      description: GitHub App installation auth
      properties:
        githubInstallationId:
          description: GitHub installation ID
          type: string
        kind:
          enum:
            - installation
          type: string
      required:
        - kind
        - githubInstallationId
      type: object
    CodeSourcePublicAuth:
      additionalProperties: false
      description: Public (unauthenticated) access
      properties:
        kind:
          enum:
            - public
          type: string
      required:
        - kind
      type: object
    CodeSourceGitlabOAuthAuth:
      additionalProperties: false
      description: GitLab OAuth auth
      properties:
        gitlabThirdPartyAccountId:
          description: GitLab third-party account ID for OAuth
          type: string
        kind:
          enum:
            - oauth
          type: string
      required:
        - kind
        - gitlabThirdPartyAccountId
      type: object
    CodeSourceGitlabSelfHostedOAuthAuth:
      additionalProperties: false
      description: GitLab self-hosted OAuth auth
      properties:
        gitSelfHostedServerId:
          description: Git self-hosted server ID
          type: string
        gitlabThirdPartyAccountId:
          description: GitLab third-party account ID for OAuth
          type: string
        kind:
          enum:
            - oauth
          type: string
      required:
        - kind
        - gitlabThirdPartyAccountId
        - gitSelfHostedServerId
      type: object
    Module.DefaultValueRef:
      description: Special default references derived from the field's values list.
      enum:
        - $values:first
      type: string
    Module.ValidationPattern:
      additionalProperties: false
      description: A regex pattern with an error message for validation
      properties:
        message:
          description: |-
            Error shown to the user when validation fails
            Example:
            message: Must contain only lowercase letters, numbers, and hyphens
            Required
          type: string
        pattern:
          description: |-
            JavaScript regex the input must match
            Example:
            pattern: ^[a-z0-9-]+$
            Required
          type: string
      required:
        - pattern
        - message
      type: object
    Module.ShowWhen:
      additionalProperties:
        $ref: '#/components/schemas/Module.ShowWhenCondition'
      description: >-
        Conditional visibility mapping; array source values support contains and
        contains-all matching.

        Keys are property names, values are the expected values or conditions.

        The property is shown only when all conditions are met.


        Example:

        region: us-east-1

        advanced: true

        build_type:

        not: disabled
      type: object
    Module.StringValues:
      anyOf:
        - items:
            $ref: '#/components/schemas/Module.StringValueItem'
          type: array
        - $ref: '#/components/schemas/Module.DynamicValuesRef'
      description: String values - either a static array of options or a dynamic reference.
    Module.ObjectCollectionItemTitleConfig:
      additionalProperties: false
      description: >-
        Configuration for the title shown for each structured collection item in
        the form.
      properties:
        fallback:
          description: >-
            Fallback title template used when the primary template cannot be
            resolved.
          type: string
        template:
          description: >-
            Template for the item title. Supports placeholders like {key} for
            maps and {field_id}.
          type: string
      required:
        - template
      type: object
    Module.MapKeyConfig:
      additionalProperties: false
      description: Configuration for the string key of an object_map entry.
      properties:
        description:
          description: Help text shown below the map key field.
          type: string
        from_fields:
          description: >-
            Item input fields used to compute the map key instead of asking for
            one. Empty/null entries are ignored.
          items:
            nullable: true
            type: string
          type: array
        label:
          description: Text shown for the map key field.
          type: string
        patterns:
          description: Regex patterns to validate map keys against.
          items:
            $ref: '#/components/schemas/Module.ValidationPattern'
          type: array
        placeholder:
          description: Placeholder text for a new map key.
          type: string
        separator:
          description: String used to join computed key field values. Defaults to "-".
          type: string
      type: object
    Module.ObjectArrayDefaultItem:
      additionalProperties: {}
      description: |-
        Default value item for structured object arrays.
        Each array element must be an object keyed by the nested item input ids.
      type: object
    Module.NumberValues:
      anyOf:
        - items:
            $ref: '#/components/schemas/Module.NumberValueItem'
          type: array
        - $ref: '#/components/schemas/Module.DynamicValuesRef'
      description: Number values - either a static array of options or a dynamic reference.
    Module.CompoundFieldValue:
      anyOf:
        - type: string
        - format: double
          type: number
        - format: int32
          type: integer
        - type: boolean
        - items:
            type: string
          type: array
      description: |-
        Allowed value types within a compound value item.
        Supports primitive types plus string arrays.
    Module.CompoundValues:
      anyOf:
        - items:
            $ref: '#/components/schemas/Module.CompoundValueItem'
          type: array
        - $ref: '#/components/schemas/Module.DynamicValuesRef'
      description: >-
        Compound values - either a static array of options or a dynamic
        reference.


        Note: CEL validation ensures values is provided (compound requires
        values).
    Module.RefFallbackInputProperty:
      description: >-
        Input properties allowed inside module reference fallback inputs.

        Nested module references are intentionally excluded to prevent
        references from

        recursively declaring more references through their mapped inputs.

        Keep this union in sync with InputProperty except for the ref member and
        the

        collection variants, which recursively use this fallback union.
      oneOf:
        - $ref: '#/components/schemas/Module.StringInputProperty'
        - $ref: '#/components/schemas/Module.TextInputProperty'
        - $ref: '#/components/schemas/Module.ObjectInputProperty'
        - $ref: '#/components/schemas/Module.RefFallbackObjectMapInputProperty'
        - $ref: '#/components/schemas/Module.RefFallbackObjectArrayInputProperty'
        - $ref: '#/components/schemas/Module.ArrayInputProperty'
        - $ref: '#/components/schemas/Module.ArrayStringInputProperty'
        - $ref: '#/components/schemas/Module.NumberInputProperty'
        - $ref: '#/components/schemas/Module.BooleanInputProperty'
        - $ref: '#/components/schemas/Module.SectionInputProperty'
        - $ref: '#/components/schemas/Module.CompoundInputProperty'
        - $ref: '#/components/schemas/Module.GitRepoInputProperty'
        - $ref: '#/components/schemas/Module.KeyValueInputProperty'
    Module.RefTypeDiscriminator:
      description: |-
        Type discriminator for module references.
        Format: "$ref:<module-type>" (e.g., "$ref:ravion-aws-vpc")
        The module type is extracted by removing the "$ref:" prefix.
      minLength: 6
      pattern: ^\$ref:.+$
      type: string
    Pipeline.GitRepoUrl:
      description: |-
        Full git repository URL including host.
        Examples:
        - https://github.com/my-org/my-repo
        - github.com/my-org/my-repo
        - https://github.com/my-org/my-repo.git
        - git
      minLength: 1
      pattern: >-
        ^((https?://)?[a-zA-Z0-9][a-zA-Z0-9.-]*\.[a-zA-Z]{2,}/[a-zA-Z0-9._-]+(/[a-zA-Z0-9._-]+)+|git@[a-zA-Z0-9][a-zA-Z0-9.-]*\.[a-zA-Z]{2,}:[a-zA-Z0-9._-]+(/[a-zA-Z0-9._-]+)+)(\.git)?$
      type: string
    Deployments.AwsEc2InstanceReleaseGate:
      additionalProperties: false
      description: Persisted state for a versioned Ravion Auto Scaling launch gate.
      properties:
        commandId:
          description: SSM command applying the selected release.
          type: string
        completedAt:
          format: date-time
          type: string
        eventId:
          description: EventBridge event that created this gate.
          type: string
        failureReason:
          type: string
        lifecycleHookName:
          description: Auto Scaling lifecycle hook used for heartbeat and completion calls.
          type: string
        releaseDeploymentId:
          description: >-
            Successful deployment selected after acquiring the
            deployment-manager lock.
          type: string
        startedAt:
          format: date-time
          type: string
        status:
          $ref: '#/components/schemas/Deployments.AwsEc2InstanceReleaseGateStatus'
      required:
        - eventId
        - lifecycleHookName
        - status
      type: object
    Deployments.AwsEc2InstanceReleaseStatus:
      description: Whether the current release has been applied to a live EC2 instance.
      enum:
        - UNKNOWN
        - PENDING
        - IN_PROGRESS
        - SUCCESS
        - FAILED
      type: string
    Module.EcsRunTaskOverrides:
      additionalProperties: false
      description: >-
        Full AWS ECS RunTask request payload — both the `TaskOverride`

        fields and the top-level RunTask parameters that aren't part of

        `TaskOverride` (launchType, networkConfiguration, …). Flattened

        into one model so users can express any RunTask shape in one

        YAML block.


        Used as:


        • the user-authored hook config in the module YAML (under

        `pre_deploy:` / `post_deploy:`),

        • the runtime snapshot persisted onto

        `DeploymentResource.data.runTaskOverrides` so the task drawer

        can show operators exactly what was sent to AWS.


        Deploy-managed RunTask fields (`cluster`, `taskDefinition`,

        `count`, `clientToken`) are intentionally not exposed — the

        deploy step controls them.


        https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html

        https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_TaskOverride.html
      properties:
        capacity_provider_strategy:
          description: |-
            Capacity-provider strategy — overrides `launch_type` when set.
            Inherits from the parent service when omitted.
          items:
            $ref: '#/components/schemas/Module.EcsCapacityProviderStrategyItem'
          type: array
          x-templateable: true
        container_overrides:
          description: |-
            Per-container overrides. Each entry's `name` matches a container
            in the task definition. AWS RunTask supports overriding any
            subset of containers; the array can be empty when only
            task-level overrides are needed.
          items:
            $ref: '#/components/schemas/Module.EcsContainerOverride'
          type: array
          x-templateable: true
        cpu:
          description: |-
            Task-level CPU override (string for AWS compatibility — same
            format as task-definition `cpu`, e.g. `"256"`, `"1024"`).
          type: string
          x-templateable: true
        enable_ecs_managed_tags:
          description: Whether to enable AWS-managed `aws:ecs:` tags on the task.
          type: boolean
          x-templateable: true
        enable_execute_command:
          description: >-
            Whether to enable ECS Exec on the task (for `aws ecs
            execute-command`).
          type: boolean
          x-templateable: true
        ephemeral_storage:
          allOf:
            - $ref: '#/components/schemas/Module.EcsEphemeralStorage'
          description: Fargate ephemeral storage size override (20–200 GiB).
          x-templateable: true
        execution_role_arn:
          description: |-
            IAM execution role ARN override — what ECS uses to pull the
            image, push logs, and read secrets at task launch.
          type: string
          x-templateable: true
        group:
          description: |-
            Logical group name — used for placement constraints
            (`memberOf(group:<group>)`). Defaults to `family:<task-def-family>`
            when AWS picks.
          type: string
          x-templateable: true
        launch_type:
          description: |-
            Launch type: FARGATE, EC2, or EXTERNAL. When omitted the hook
            inherits the parent service's launch type. Mutually exclusive
            with `capacity_provider_strategy` — set one or the other.
          enum:
            - FARGATE
            - EC2
            - EXTERNAL
          type: string
          x-templateable: true
        memory:
          description: Task-level memory override (MiB, string format).
          type: string
          x-templateable: true
        network_configuration:
          allOf:
            - $ref: '#/components/schemas/Module.EcsNetworkConfiguration'
          description: |-
            VPC / subnet / security-group config. Required for `awsvpc`
            network-mode task definitions; inherited from the parent
            service when omitted.
          x-templateable: true
        placement_constraints:
          description: |-
            Placement constraints — limits which container instances can
            run the task. EC2/EXTERNAL launch types only.
          items:
            $ref: '#/components/schemas/Module.EcsPlacementConstraint'
          type: array
          x-templateable: true
        placement_strategy:
          description: |-
            Placement strategy — how tasks get distributed across instances.
            EC2/EXTERNAL launch types only.
          items:
            $ref: '#/components/schemas/Module.EcsPlacementStrategy'
          type: array
          x-templateable: true
        platform_version:
          description: |-
            Fargate platform version (e.g. `"1.4.0"`, `"LATEST"`).
            Inherits from the parent service when omitted.
          type: string
          x-templateable: true
        propagate_tags:
          description: How tags propagate from task definition / service onto the task.
          enum:
            - TASK_DEFINITION
            - SERVICE
            - NONE
          type: string
          x-templateable: true
        reference_id:
          description: |-
            Caller-supplied reference id (UUID-shaped). Echoed back on the
            resulting Task and useful for client-side correlation.
          type: string
          x-templateable: true
        tags:
          description: Metadata tags applied to the task.
          items:
            $ref: '#/components/schemas/Module.EcsTag'
          type: array
          x-templateable: true
        task_role_arn:
          description: |-
            IAM task role ARN override — what the container assumes when
            calling AWS APIs from inside the task.
          type: string
          x-templateable: true
        timeout:
          description: |-
            Wall-clock timeout in seconds before the task is stopped and
            the deployment fails. Only meaningful when used as a pre/post
            deploy hook config — ignored on the runtime snapshot.

            Default: 1800 (30 minutes).
          format: int32
          minimum: 1
          type: integer
          x-templateable: true
        volume_configurations:
          description: |-
            Per-task volume bindings — name must match a volume in the task
            definition. Used for Fargate-managed ephemeral EBS volumes.
          items:
            $ref: '#/components/schemas/Module.EcsTaskVolumeConfiguration'
          type: array
          x-templateable: true
      type: object
    Deployments.EcsTaskTargetGroupSnapshot:
      additionalProperties: false
      description: |-
        Frozen target-group evidence for a single task, computed once at
        task-stop by the selector and persisted on
        `EcsTaskData.targetGroupSnapshot`. Singular — the selector picks
        the single best TG (state tier → source priority → proximity) at
        write time. The read path is a plain unmarshal; no runtime
        ranking. Only persisted when the task's own target was observed
        in the TG; otherwise the drawer collapses the Targets column.
      properties:
        capturedAt:
          format: date-time
          type: string
        evidenceQuality:
          $ref: '#/components/schemas/Deployments.EcsEvidenceQuality'
        healthCheck:
          $ref: '#/components/schemas/Deployments.EcsTargetHealthCheckConfig'
        source:
          $ref: '#/components/schemas/Deployments.EcsTargetHealthSource'
        targetGroupArn:
          type: string
        targetGroupName:
          type: string
        taskTarget:
          allOf:
            - $ref: '#/components/schemas/Deployments.EcsTaskTargetObservation'
          description: |-
            This task's own target in the TG. Always populated — the
            selector only writes a snapshot when the task's target was
            observed.
      required:
        - targetGroupArn
        - taskTarget
        - capturedAt
        - source
        - evidenceQuality
      type: object
    Deployments.EksWorkloadDiagnosis:
      additionalProperties: false
      description: >-
        One thing Operator concluded is wrong with this workload, in Ravion's
        words

        alongside the cluster's own.


        IDENTITY IS `(code, reason)`, and the pod is deliberately not part of
        it.

        That is the agent's own deduplication key minus the workload, which is
        the

        row: three replicas failing identically is ONE problem, and keying on
        the

        pod would turn a rollout of a broken image into a wall of identical

        findings. `podName` records which pod the finding was last seen on, as

        evidence, not as identity.


        Both the raw Kubernetes facts (`reason`, `message`) and Ravion's reading
        of

        them (`cause`, `suggestedAction`) are kept. A user who suspects Ravion
        has

        misread their cluster must be able to check, and it is what makes an

        `UNKNOWN` code useful rather than embarrassing.


        ORDERED BY `observedAt`, NOT BY A SEQUENCE. The diagnosis stream carries
        no

        monotonic counter — findings are independent of one another, and one
        shared

        counter would let a crash loop's report order against an unrelated

        image-pull failure. Each finding is guarded by its own timestamps
        instead:

        a report older than what is stored for the same `(code, reason)` is a

        silent no-op, which is what stops a redelivered raise from resurrecting
        a

        finding the user was already told had cleared.
      properties:
        cause:
          description: >-
            What the failure means, in Ravion's language. Prose — nothing may
            parse

            it.
          type: string
        code:
          description: >-
            CRASH_LOOP_BACKOFF | IMAGE_PULL_FAILED | OOM_KILLED | … Free-form
            for the

            same version-skew reason every other agent-reported classification
            is: an

            agent newer than the control plane will report codes this schema has

            never heard of, and refusing them would fail closed on exactly the

            clusters running the newest code.
          type: string
        container:
          description: >-
            The container the finding concerns, absent when it is about the pod
            as a

            whole (a scheduling failure has no container).
          type: string
        crashLog:
          allOf:
            - $ref: '#/components/schemas/Deployments.EksWorkloadDiagnosisLog'
          description: >-
            What the container printed before it died, when Operator captured
            it.

            ABSENT means no capture was attempted — a scheduling failure has no

            container to read. A capture that was attempted and failed is
            present

            with `available: false`, which is a different statement and must
            stay

            one.
        details:
          additionalProperties:
            type: string
          description: >-
            The structured facts behind `cause` and `suggestedAction`, keyed by
            the

            agent's detail names (`exit_code`, `image`, `probe`, …). Every value
            is a

            string even when it is a number: which keys are present varies by
            code,

            and one map with one value type is far easier to render generically
            than

            a union.
          type: object
        firstObservedAt:
          description: >-
            When this occurrence was FIRST seen. A recurrence after a resolution
            is a

            new occurrence with a new `firstObservedAt`, so a finding standing
            since

            Tuesday does not read as something happening now.
          format: date-time
          type: string
        message:
          description: The Kubernetes message, verbatim.
          type: string
        observations:
          description: >-
            How many times the agent confirmed the condition still held,
            including

            the observation that raised it.
          format: int32
          type: integer
        observedAt:
          description: |-
            When the finding was last confirmed. This is the value staleness is
            judged against.
          format: date-time
          type: string
        podName:
          description: >-
            The pod the finding was last observed on. Evidence, not identity —
            see

            the note above — and frequently a pod that no longer exists.
          type: string
        podNamespace:
          type: string
        reason:
          description: >-
            The Kubernetes reason, verbatim — never rewritten, never normalised.
            It

            is the thing a user will search for, and the second half of the
            finding's

            identity.
          type: string
        resolved:
          description: >-
            True once the agent reported the condition no longer holds. The
            finding

            is kept rather than deleted, for two reasons: a user who saw a
            banner

            deserves to see that it cleared, and the tombstone is what makes a

            redelivered raise a no-op instead of a resurrection.
          type: boolean
        resolvedAt:
          description: >-
            When the agent reported the condition had cleared. Set only
            alongside

            `resolved`.
          format: date-time
          type: string
        severity:
          description: >-
            error | warning. Two values on purpose — a third would invite
            arguments

            about which bucket a failure belongs in without changing what
            anybody

            does about it. Free-form all the same.
          type: string
        suggestedAction:
          description: |-
            What to do next. It names a specific thing to look at or change;
            restating the failure is not an action. Prose.
          type: string
        title:
          description: |-
            The agent's short human label for the code, so a UI has something to
            render for a code it does not recognise.
          type: string
      required:
        - code
      type: object
    Deployments.EksWorkloadDrift:
      additionalProperties: false
      description: |-
        The drift half of an EKS workload's live state: where the live object no
        longer matches the spec Ravion deployed. Report-only — Ravion never
        reverts drift, and the base agent RBAC has no write verb to do it with.

        `drifted: false` is NOT an absence of news. It is the clear that takes a
        drift banner down, and a consumer that treats it as "nothing to report"
        leaves a stale banner up after someone put the field back.

        A pod-template change is categorically different from the rest: in
        Kubernetes it CYCLES PODS, which makes it a deployment somebody made
        outside Ravion rather than a config edit. Those mint an `EXTERNAL`
        ModuleDeployment row; everything else stays here as report-only detail,
        because minting a deployment for an HPA scaling event would bury the
        deployment history under the cluster's ordinary breathing.
      properties:
        changeCount:
          description: >-
            How many changes the agent found, which can exceed `changes` when
            the

            list was truncated.
          format: int32
          type: integer
        changes:
          items:
            $ref: '#/components/schemas/Deployments.EksWorkloadDriftChange'
          type: array
        changesTruncated:
          description: |-
            The agent bounds its change list; true means fields were dropped and
            the count below is the honest total.
          type: boolean
        drifted:
          description: >-
            False clears the finding. See the note above — this is a report, not
            a

            presence flag.
          type: boolean
        firstObservedAt:
          description: |-
            When this finding was FIRST observed, carried forward across every
            republish of the same finding. Without it a drift that has been
            standing for a week would read as new on every refresh.
          format: date-time
          type: string
        observedAt:
          description: When the stored finding was last refreshed by a report.
          format: date-time
          type: string
        referenceRevision:
          description: |-
            The Helm release revision whose stored manifest the comparison was
            made against (the agent reads it from the cluster's own release
            record), so a report against the spec a new deploy just installed is
            distinguishable from one against the revision before it.
          format: int64
          type: integer
        rolloutCausing:
          description: |-
            True when at least one changed path is under the pod template, i.e.
            the change cycled pods. Recorded here as well as on the minted
            EXTERNAL deployment so the workload row can be read on its own.
          type: boolean
        sequence:
          description: |-
            The agent's monotonic ordering key for the DRIFT stream, independent
            of the rollout and regression streams. A report that arrived late
            after a reconnect must not resurrect drift the user already saw
            cleared.
          format: int64
          type: integer
      required:
        - drifted
        - sequence
      type: object
    Deployments.EksWorkloadPod:
      additionalProperties: false
      description: One pod of a workload, as last observed by the agent.
      properties:
        name:
          type: string
        nodeName:
          type: string
        phase:
          description: |-
            Pending | Running | Succeeded | Failed | Unknown, verbatim from the
            pod's status. Free-form for the usual version-skew reason.
          type: string
        ready:
          description: Every container ready.
          type: boolean
        restarts:
          description: Container restarts summed across the pod.
          format: int32
          type: integer
        startedAt:
          description: When the pod started running (ISO 8601). Absent while pending.
          type: string
      required:
        - name
      type: object
    Deployments.EksWorkloadRegression:
      additionalProperties: false
      description: |-
        The regression half of an EKS workload's live state: the current answer
        to "was this workload healthy after its deploy and has it stopped being
        healthy". Absent on a workload that has never regressed.

        One object per workload, not one per episode. A flapping workload
        updates this object and raises `flaps` rather than accumulating
        episodes, which is what keeps the "one alert per episode, not one per
        flap cycle" guarantee alive past the control plane.
      properties:
        baselineAt:
          description: |-
            When the workload was last certified healthy — the "was previously
            healthy" half of the claim, stored so a user can check it.
          format: date-time
          type: string
        churnKinds:
          description: |-
            What the agent was tolerating when it decided to alert anyway — a
            node drain, a Karpenter consolidation, a scale event. Recorded
            because "we alerted despite a node drain" is materially different
            from "we alerted with nothing else going on", and because it is what
            makes a false positive diagnosable after the fact.
          type: string
        churnPodCount:
          format: int32
          type: integer
        degradedAt:
          description: >-
            When the episode began. Two transmissions sharing it are the same

            alert, which is how a flap is told from a new outage — and it is
            what

            the delivered notification's `uniqueId` is built from, so an episode

            collapses onto one event rather than producing one per cycle.
          format: date-time
          type: string
        flapping:
          type: boolean
        flaps:
          description: |-
            How many times the workload recovered and degraded again inside this
            episode, and whether that count crossed the agent's threshold.
          format: int32
          type: integer
        phase:
          description: >-
            opened | active | resolved. Free-form for the same version-skew

            reason every other agent-reported classification is: an agent newer

            than the control plane may report a phase this schema has never
            heard

            of, and a schema change is a far worse answer to that than a string.
          type: string
        resolution:
          description: |-
            recovered | superseded | workload_gone. Set only when phase is
            resolved — three different things to tell a user.
          type: string
        sequence:
          description: |-
            The agent's monotonic ordering key for the REGRESSION stream, which
            is independent of the rollout stream's `sequence`. A transmission
            that arrived late after a reconnect must be a silent no-op rather
            than a rollback — which for this object would mean re-raising an
            alert that had already resolved.
          format: int64
          type: integer
        suggestedRemediation:
          description: >-
            restart | rollback. Free-form for the same version-skew reason every

            other classification in this file is.


            Unlike every other field on this model, this is NOT something the

            agent sent. It is the CONTROL PLANE's reading of the agent's report:

            a crash loop on a spec that has not changed since the baseline says

            restart, a regression that followed a deploy says rollback. Derived

            here rather than in the agent so the rule can be corrected by

            shipping the control plane, without a fleet-wide agent rollout.


            It is a SUGGESTION a human acts on. Nothing executes it — there is
            no

            automatic remediation path, and the reasons there is not are written

            down where the policy lives.
          type: string
        summary:
          description: Prose to lead an alert with. Nothing should parse it.
          type: string
        symptoms:
          description: >-
            The unexcused degradations, comma-separated in the agent's
            precedence

            order so the first entry is the cause rather than one of its

            consequences.
          type: string
      required:
        - phase
        - sequence
      type: object
    CanvasAnchor:
      additionalProperties: false
      description: >-
        A point on a module card's border: a side and how far along it, as a
        fraction from that side's top or left end. Expressed relative to the
        border so the point stays on the card whatever size the card is drawn
        at.
      properties:
        position:
          description: >-
            How far along the side the point sits, from 0 at the side's top or
            left end to 1 at its bottom or right end.
          format: double
          maximum: 1
          minimum: 0
          type: number
        side:
          allOf:
            - $ref: '#/components/schemas/CanvasAnchorSide'
          description: Which side of the card's border the point sits on.
      required:
        - side
        - position
      type: object
    ExecutionEnvironment.SandboxInstanceType:
      additionalProperties: false
      description: >-
        One EC2 instance type the sandbox pool may launch, and the root volume
        its hosts get.
      properties:
        diskGiB:
          description: >-
            Size of each host's root volume in GiB. After 10 GiB for the system
            and a free-space floor, a third of it caches snapshot chunks and the
            rest holds the running sandboxes' overlays, so it bounds how many
            sandboxes the host takes: the 60 GiB default holds four sandboxes of
            the default 8 GiB reservation. On a type with instance store (such
            as `c8id` or `m8id`) the sandboxes run on the instance store
            instead, and on an `EPHEMERAL` pool so does the cache, which leaves
            the root volume only the system: 30 GiB is enough there.
          format: int32
          maximum: 16384
          minimum: 30
          type: integer
        diskIops:
          description: >-
            Provisioned IOPS for that volume. 3000 is gp3 baseline and included
            in the volume price; more is billed, including while the host is
            parked.
          format: int32
          maximum: 16000
          minimum: 3000
          type: integer
        diskThroughputMBps:
          description: >-
            Provisioned throughput for that volume in MB/s. 125 is gp3 baseline
            and included in the volume price; more is billed, including while
            the host is parked.
          format: int32
          maximum: 1000
          minimum: 125
          type: integer
        type:
          description: >-
            EC2 instance type, e.g. `c8i.4xlarge`. It must support nested
            virtualization.
          minLength: 1
          type: string
      required:
        - type
        - diskGiB
        - diskIops
        - diskThroughputMBps
      type: object
    ExecutionEnvironment.SandboxReservePolicy:
      additionalProperties: false
      description: How many hosts the pool keeps parked and ready for the next step.
      properties:
        type:
          description: >-
            `PEAK` keeps as many hosts as the busiest minute of the window used.
            `ROLLING_AVERAGE` keeps the mean of the window's daily peaks.
            `FIXED` keeps exactly `value` hosts. `NONE` keeps none, so every
            host goes when it falls idle.
          enum:
            - PEAK
            - ROLLING_AVERAGE
            - FIXED
            - NONE
          type: string
        value:
          description: How many hosts `FIXED` keeps. Ignored by the other types.
          format: int32
          minimum: 0
          type: integer
        windowDays:
          description: >-
            How many days of usage `PEAK` and `ROLLING_AVERAGE` look back over.
            Ignored by the other types.
          format: int32
          maximum: 90
          minimum: 1
          type: integer
      required:
        - type
        - windowDays
        - value
      type: object
    Deployments.AwsAmiBuild:
      additionalProperties: false
      description: The deployment's Image Builder build.
      properties:
        completedAt:
          format: date-time
          type: string
        failureReason:
          type: string
        logGroup:
          description: CloudWatch log group of the build's Image Builder workflow.
          type: string
        logStream:
          description: CloudWatch log stream of the build within `logGroup`.
          type: string
        startedAt:
          format: date-time
          type: string
        status:
          $ref: '#/components/schemas/Deployments.AwsAmiBuildStatus'
      required:
        - status
      type: object
    Deployments.AwsAmiDeploymentDefinition:
      additionalProperties: false
      description: |-
        Snapshot of the resolved `Module.AwsAmiModuleDeployment` infrastructure
        and definition captured at deploy time, so the detail view can show and
        diff what the deployment built.
      properties:
        blockDeviceMappings:
          items:
            $ref: '#/components/schemas/Deployments.AwsAmiBlockDeviceMappingRef'
          type: array
        componentParameters:
          additionalProperties:
            additionalProperties:
              type: string
            type: object
          type: object
        components:
          items:
            $ref: '#/components/schemas/Deployments.AwsAmiComponentRef'
          type: array
        distributionRegions:
          description: Regions besides the home region the image is copied to.
          items:
            type: string
          type: array
        imageBuilderDistributionConfigurationArn:
          type: string
        imageBuilderInfrastructureConfigurationArn:
          type: string
        name:
          description: Image recipe name prefix.
          type: string
        parentImage:
          $ref: '#/components/schemas/Deployments.AwsAmiParentImageRef'
        publish:
          type: boolean
        recipeName:
          description: Image recipe this deployment created (`<name>-<deploymentId>`).
          type: string
        tags:
          additionalProperties:
            type: string
          type: object
      required:
        - name
        - components
        - componentParameters
        - tags
        - publish
        - distributionRegions
        - imageBuilderInfrastructureConfigurationArn
        - imageBuilderDistributionConfigurationArn
      type: object
    Deployments.AwsAmiDeployPhase:
      description: The step an AMI deployment is on.
      enum:
        - CHECKING
        - BUILDING
        - COPYING
        - TAGGING
        - PUBLISHING
        - RETIRING
        - COMPLETE
      type: string
    Deployments.AwsAmiRetention:
      additionalProperties: false
      description: |-
        What retirement kept and changed across every region. The counts are
        the module's retention when the deployment ran.
      properties:
        deregistered:
          description: >-
            Private images past both windows that were deregistered, with their
            snapshots deleted.
          items:
            $ref: '#/components/schemas/Deployments.AwsAmiImageRef'
          type: array
        madePrivate:
          description: Published images past the window that were made private.
          items:
            $ref: '#/components/schemas/Deployments.AwsAmiImageRef'
          type: array
        privateImageCount:
          description: Private images kept past the published window per region.
          format: int32
          type: integer
        publishedImageCount:
          description: Newest published images kept published per region.
          format: int32
          type: integer
      required:
        - publishedImageCount
        - privateImageCount
        - madePrivate
        - deregistered
      type: object
    Deployments.AwsEc2AutomaticRollback:
      additionalProperties: false
      description: Automatic rollback performed inside the failed deployment workflow.
      properties:
        commandId:
          type: string
        completedAt:
          format: date-time
          type: string
        failureReason:
          description: Dispatch, execution, or eligibility failure. Also explains SKIPPED.
          type: string
        instanceResults:
          description: >-
            Only instances where the failed deployment command began execution
            are

            targeted and represented here.
          items:
            $ref: '#/components/schemas/Deployments.AwsEc2InstanceResult'
          type: array
        startedAt:
          format: date-time
          type: string
        status:
          $ref: '#/components/schemas/Deployments.AwsEc2AutomaticRollbackStatus'
        targetDeploymentId:
          description: Exact prior successful deployment whose release is being restored.
          type: string
      required:
        - status
      type: object
    Deployments.AwsEc2CommandStatus:
      description: |-
        Status of the SendCommand dispatch + ListCommandInvocations poll
        loop as a whole.
      enum:
        - PENDING
        - IN_PROGRESS
        - SUCCESS
        - FAILED
      type: string
    Deployments.AwsEc2DeploymentDefinition:
      additionalProperties: false
      description: |-
        Snapshot of the resolved `Module.Ec2ModuleDeployment.definition`
        (from `packages/schemas/modules/tsp/deployment.tsp`) captured at
        deploy time. Stored twice on `AwsEc2DeploymentData` (the prior
        successful deploy's snapshot + this deploy's snapshot) so the deploy
        detail drawer can render the definition diff.

        Open `raw` field — the underlying module-side definition schema can
        grow without forcing a schema migration here.
      properties:
        commands:
          description: Shell commands the deploy ran on each instance, in order.
          items:
            type: string
          type: array
        imageUri:
          description: |-
            Full image URI the deploy resolved (repository + tag or
            `@sha256:` digest). Renders as the deploy's UI tag for container
            deploys.
          type: string
        raw:
          additionalProperties: {}
          description: |-
            Raw resolved-definition JSON, kept verbatim so future fields
            surface in the diff viewer without a schema migration here.
          type: object
        runtime:
          allOf:
            - $ref: '#/components/schemas/Deployments.AwsEc2Runtime'
          description: |-
            Which runtime this deploy used. Drives which release fields below
            carry values.
        startCommand:
          description: Long-running foreground command installed for this manual release.
          type: string
      required:
        - runtime
        - raw
      type: object
    Deployments.AwsEc2InstanceResult:
      additionalProperties: false
      description: One instance's command invocation result.
      properties:
        completedAt:
          description: Set when the invocation reached a terminal status.
          format: date-time
          type: string
        executionStartedAt:
          description: Earliest time an SSM document step began executing on the instance.
          format: date-time
          type: string
        instanceId:
          description: EC2 instance ID the document ran on.
          type: string
        outputTail:
          description: |-
            Tail of the invocation's stdout/stderr, captured for failed
            invocations so the deploy error surfaces the on-instance cause
            without an extra AWS round trip.
          type: string
        requestedAt:
          description: Time Systems Manager sent this invocation to the managed instance.
          format: date-time
          type: string
        responseCode:
          description: |-
            Exit code from the failed SSM document step, or the final step on
            successful single-step documents.
          format: int32
          type: integer
        status:
          allOf:
            - $ref: '#/components/schemas/Deployments.AwsEc2InstanceInvocationStatus'
          description: Invocation status.
        statusDetails:
          description: |-
            Detailed AWS invocation status, such as `Delivery Timed Out` or
            `Execution Timed Out`.
          type: string
      required:
        - instanceId
        - status
      type: object
    Pipeline.GitSource:
      additionalProperties: false
      description: Git source configuration for fetching code
      properties:
        base_path:
          default: .
          description: |-
            Base path within the repository to use as the working root
            Example:
            base_path: packages/api
            Optional — defaults to "."
          type: string
          x-templateable: true
        branch:
          description: |-
            Branch to check out
            Example:
            branch: main
            Required
          minLength: 1
          type: string
          x-templateable: true
        ref:
          description: >-
            Git ref to check out — branch, commit SHA, tag, or other ref.
            Overrides branch HEAD if set.

            Example:

            ref: v1.2.3

            Optional
          type: string
          x-templateable: true
        repo:
          allOf:
            - $ref: '#/components/schemas/Pipeline.GitRepoUrl'
          description: |-
            Full repository URL including host
            Example:
            repo: https://gitlab.com/my-org/my-group/my-repo
            Required
          x-templateable: true
        type:
          description: Source type identifier
          enum:
            - git
          type: string
          x-templateable: true
      required:
        - type
        - repo
        - branch
      type: object
    Deployments.EcsDeploymentAcceptedPauseControl:
      additionalProperties: false
      properties:
        acceptedAt:
          description: When the API accepted and persisted this operator decision.
          format: date-time
          type: string
        action:
          allOf:
            - $ref: '#/components/schemas/Deployments.EcsDeploymentPauseControlAction'
          description: Accepted operator decision.
        eventStartedAt:
          description: |-
            `startedAt` from the PAUSED event that was resolved, when known.
            Lets consumers distinguish repeated pauses that use the same stage.
          format: date-time
          type: string
        hookId:
          description: |-
            Hook id the decision was sent for. Mirrors the PAUSED event's
            `hookId`; empty string when the event/API request omitted one.
          type: string
        labelKind:
          allOf:
            - $ref: >-
                #/components/schemas/Deployments.EcsDeploymentAcceptedPauseControlLabelKind
          description: Backend-derived label intent for the persisted operator decision.
        lifecycleStage:
          description: |-
            Lifecycle stage from the PAUSED event that was resolved, when
            known. Used by the UI to avoid hiding controls for a later pause.
          type: string
      required:
        - action
        - hookId
        - acceptedAt
      type: object
    Deployments.EcsTaskDefinitionSnapshot:
      additionalProperties: false
      description: |-
        Snapshot of an ECS task definition captured at deploy time. Carries
        AWS's assigned ARN + revision plus the raw task-definition payload
        AWS returned. Stored twice on EcsDeploymentData (before / after the
        deploy's RegisterTaskDefinition call) so the drawer can diff them.

        `definition` is an open-shape map of the `DescribeTaskDefinition`
        JSON AWS returned, keys normalized to the camelCase shape the AWS
        public API uses. We deliberately do NOT coerce into
        `Module.EcsTaskDefinition` (the user YAML schema) here — that
        schema is a subset of the AWS surface, so coercion would silently
        drop fields AWS includes but users don't get to set directly
        (registeredAt, status, requiresAttributes, revision, etc.).
      properties:
        arn:
          description: |-
            Full ARN returned by RegisterTaskDefinition, e.g.
            arn:aws:ecs:us-east-1:123:task-definition/my-svc:42
          type: string
        definition:
          additionalProperties: {}
          description: |-
            Raw AWS `DescribeTaskDefinition` response, keys normalized to
            camelCase. Every field AWS returns (containerDefinitions,
            networkMode, requiresCompatibilities, taskRoleArn, registeredAt,
            …) is present verbatim so the drawer's diff viewer can render
            the complete before / after.
          type: object
        revision:
          description: |-
            Revision number AWS assigned. Duplicated from the ARN tail so
            consumers that parse family:revision directly don't need to
            string-split the ARN.
          format: int32
          type: integer
      required:
        - arn
        - revision
        - definition
      type: object
    Deployments.EcsElbListenerState:
      additionalProperties: false
      description: |-
        Listener topology for one load balancer. Stored on
        `EcsDeploymentData.elbListenerState` as one entry per LB the
        service is attached to. Captured once at phase-start — listeners
        change when the user edits the module, not on every deploy tick.
      properties:
        capturedAt:
          description: When this topology was captured.
          format: date-time
          type: string
        loadBalancerArn:
          type: string
        loadBalancerDnsName:
          type: string
        rules:
          description: |-
            One entry per (listener, rule) pair on the load balancer. The
            drawer filters by targetGroupArn to surface only the rules that
            route to the task's TG.
          items:
            $ref: '#/components/schemas/Deployments.EcsListenerRule'
          type: array
      required:
        - loadBalancerArn
        - loadBalancerDnsName
        - rules
        - capturedAt
      type: object
    Deployments.EcsDeploymentEvent:
      additionalProperties: false
      description: |-
        One progress entry in `EcsDeploymentData.events`. Appended atomically
        via JSON_ARRAY_APPEND from the deploy workflow at every phase
        transition; the row update fires the existing ModuleDeployment
        WebSocket broadcast so the dashboard updates without polling.

        The array is append-only; consumers read the last entry as the
        current phase, and the full array as the deploy timeline.
      properties:
        blockingStepExecutionId:
          description: >-
            The stack pipeline's apply step execution that was holding the stack

            when this deploy queued (WAITING_FOR_STACK_APPLY events only), so
            the

            dashboard can link straight to the work the deploy is waiting on.
          type: string
        currentStep:
          description: 1-indexed current step. Used by the progress bar denominator.
          format: int32
          type: integer
        desiredCount:
          description: |-
            ECS service desiredCount once the snapshot phase has run. Used
            by the frontend to render "running tasks: N/M" during the
            WAIT_HEALTHY phase. Omitted on events fired before snapshot.
          format: int32
          type: integer
        hookId:
          description: |-
            Pending PAUSE hook id (PAUSED events only). The continue API
            echoes this back via `ContinueServiceDeployment`.
          type: string
        lifecycleStage:
          description: |-
            ECS lifecycle stage that produced this event, when known
            (TRAFFIC_SHIFT / BAKE / PAUSED events). AWS enum spelling, e.g.
            POST_TEST_TRAFFIC_SHIFT, PRE_PRODUCTION_TRAFFIC_SHIFT.
          type: string
        message:
          description: |-
            Free-form human message captured alongside terminal events
            (root-cause string on FAILED). Omitted on intermediate phases.
          type: string
        startedAt:
          description: When the workflow recorded this event.
          format: date-time
          type: string
        stepCode:
          allOf:
            - $ref: '#/components/schemas/Deployments.EcsDeployPhaseCode'
          description: Phase identifier — see EcsDeployPhaseCode.
        totalSteps:
          description: Total user-visible steps in the deploy. Constant per workflow.
          format: int32
          type: integer
        trafficPhase:
          allOf:
            - $ref: '#/components/schemas/Deployments.EcsDeploymentTrafficPhase'
          description: |-
            Backend-classified production/standby meaning for this event,
            derived from `stepCode` and `lifecycleStage`. Omitted when the event
            has no traffic-role implication.
      required:
        - stepCode
        - currentStep
        - totalSteps
        - startedAt
      type: object
    Deployments.EcsServiceDeploymentState:
      additionalProperties: false
      description: >-
        ECS service-deployment snapshot captured from
        DescribeServiceDeployments.

        After success, task counts are completion-time snapshots; use live
        service

        monitoring for remaining scale-out and source-task draining.
      properties:
        acceptsNativeStandbyRevert:
          description: |-
            True while ECS still accepts a native StopServiceDeployment call for
            reverting production traffic to the source revision.
          type: boolean
        earlySuccessCriteria:
          allOf:
            - $ref: '#/components/schemas/Deployments.EcsAppliedEarlySuccessCriteria'
          description: |-
            AWS success is authoritative when enabled, including during cleanup.
            Counts in a successful deployment are completion-time snapshots.
        lifecycleStage:
          description: |-
            AWS lifecycle stage, e.g. POST_TEST_TRAFFIC_SHIFT,
            PRODUCTION_TRAFFIC_SHIFT, BAKE_TIME, CLEAN_UP.
          type: string
        observedAt:
          format: date-time
          type: string
        serviceDeploymentArn:
          type: string
        sourceServiceRevisions:
          items:
            $ref: '#/components/schemas/Deployments.EcsServiceRevisionTrafficState'
          type: array
        status:
          description: |-
            AWS service deployment status, e.g. PENDING, IN_PROGRESS,
            SUCCESSFUL, ROLLBACK_IN_PROGRESS, STOPPED.
          type: string
        statusReason:
          type: string
        strategy:
          description: |-
            AWS deployment strategy spelling from deploymentConfiguration,
            e.g. ROLLING, BLUE_GREEN, LINEAR, CANARY.
          type: string
        succeededAt:
          description: >-
            AWS's completion timestamp, present only for a successful
            deployment.
          format: date-time
          type: string
        targetServiceRevision:
          $ref: '#/components/schemas/Deployments.EcsServiceRevisionTrafficState'
        trafficPhase:
          allOf:
            - $ref: '#/components/schemas/Deployments.EcsDeploymentTrafficPhase'
          description: |-
            Backend-classified traffic phase for the lifecycle stage. Omitted
            when ECS reports an unknown/empty stage and traffic weights are not
            enough by themselves to classify the snapshot.
      required:
        - serviceDeploymentArn
        - status
        - acceptsNativeStandbyRevert
        - observedAt
      type: object
    Deployments.EcsDeployStrategy:
      description: |-
        Deployment strategy executed by the native ECS deployment
        controller. Mirrors `Module.EcsDeploymentStrategyConfig.type` —
        the user-facing module YAML values, not the AWS enum spelling.
      enum:
        - rolling
        - blue_green
        - linear
        - canary
      type: string
    Deployments.EksHelmReleaseDefinition:
      additionalProperties: false
      description: |-
        Snapshot of the resolved `Module.EksDeploymentDefinition` captured
        at deploy time. Stored twice on `EksDeploymentData` (the prior
        successful deploy's snapshot + this deploy's snapshot) so the deploy
        detail drawer can render the definition diff, and so an explicit
        rollback knows exactly what it is reverting to.

        Unlike the ECS / Lambda / EC2 definition snapshots there is no open
        `raw` field here — see the secret-material note at the top of this
        file. New definition fields must be added explicitly, which is the
        point: it forces a decision about whether the field is safe to
        persist.
      properties:
        chart:
          allOf:
            - $ref: '#/components/schemas/Deployments.EksHelmChartRef'
          description: Resolved chart reference this deploy installed.
        createNamespace:
          description: Whether the deploy passed `--create-namespace`.
          type: boolean
        engine:
          allOf:
            - $ref: '#/components/schemas/Deployments.EksDeployEngine'
          description: Engine that applied this definition. `helm` in v1.
        releaseName:
          description: |-
            Helm release name the deploy upgraded. Explicit per module
            instance — rollback and history target this release.
          type: string
        releaseNamespace:
          description: Kubernetes namespace the release is installed into.
          type: string
        secrets:
          description: |-
            Secret references this deploy handed to the chart, in config
            order. Absent when the module config declared no `secrets` block.
            References only — see `EksSecretRef`.
          items:
            $ref: '#/components/schemas/Deployments.EksSecretRef'
          type: array
        valuesSummary:
          allOf:
            - $ref: '#/components/schemas/Deployments.EksHelmValuesSummary'
          description: |-
            Summary of the rendered values. Absent when the module config
            declared no `values` block. The document itself is fetched
            separately — see `EksHelmValuesSummary`.
      required:
        - engine
        - releaseName
        - releaseNamespace
        - chart
      type: object
    Deployments.EksDeploymentEvent:
      additionalProperties: false
      properties:
        currentStep:
          description: 1-indexed current step. Used by the progress bar numerator.
          format: int32
          type: integer
        message:
          description: |-
            Free-form human message captured alongside terminal events
            (root-cause string on FAILED, `helm` summary line on COMPLETE).
            Omitted on intermediate phases. Never carries command output that
            could include credentials — the runner redacts before reporting.
          type: string
        startedAt:
          description: When the workflow recorded this event.
          format: date-time
          type: string
        stepCode:
          allOf:
            - $ref: '#/components/schemas/Deployments.EksDeployPhaseCode'
          description: Phase identifier — see EksDeployPhaseCode.
        totalSteps:
          description: Total user-visible steps in the deploy. Constant per workflow.
          format: int32
          type: integer
      required:
        - stepCode
        - currentStep
        - totalSteps
        - startedAt
      type: object
    Deployments.EksExternalChange:
      additionalProperties: false
      description: >-
        One progress entry in `EksDeploymentData.events`. Appended

        atomically via JSON_ARRAY_APPEND from the deploy workflow at every

        phase transition; the row update fires the existing ModuleDeployment

        WebSocket broadcast so the dashboard updates without polling.


        The array is append-only; consumers read the last entry as the

        current phase, and the full array as the deploy timeline. Mirrors

        `EcsDeploymentEvent`.One field an external change moved, on an
        `EXTERNAL` deployment row.
      properties:
        change:
          description: changed | added | removed.
          type: string
        current:
          description: What the cluster has now.
          type: string
        path:
          description: Dotted path, list elements keyed by identity.
          type: string
        previous:
          description: What Ravion had deployed.
          type: string
      required:
        - path
        - change
      type: object
    Deployments.EksHelmReleaseStatus:
      description: |-
        Status of the `helm upgrade --install --atomic` call that commits
        the deploy. Mirrors `AwsLambdaUpdateStatus` — the release is live
        once this reaches `SUCCESS`.
      enum:
        - PENDING
        - IN_PROGRESS
        - SUCCESS
        - FAILED
      type: string
    Deployments.EksSyncBlocked:
      additionalProperties: false
      description: A block the cluster agent reported on one generation of a deploy.
      properties:
        at:
          description: 'When the block began, RFC 3339. Kept verbatim: it is written by SQL.'
          type: string
        generation:
          description: |-
            Generation the block is about. A block for another generation is not
            this deploy's news.
          format: int32
          type: integer
        reason:
          description: The agent's sentence, already redacted.
          type: string
        retryable:
          description: Whether waiting can still clear it.
          type: boolean
      type: object
    Deployments.AwsLambdaAliasUpdateStatus:
      description: |-
        Status of `UpdateAlias` — the commit point that flips traffic onto
        the newly published version.
      enum:
        - PENDING
        - SUCCESS
        - FAILED
      type: string
    Deployments.AwsLambdaDeploymentDefinition:
      additionalProperties: false
      description: |-
        Snapshot of the resolved `Module.LambdaModuleDeployment.definition`
        (from `packages/schemas/modules/tsp/deployment.tsp`) captured at
        deploy time. Stored twice on `AwsLambdaDeploymentData` (the prior
        successful deploy's snapshot + this deploy's snapshot) so the deploy
        detail drawer can render the definition diff.

        Open `raw` field — the underlying module-side definition schema can
        grow without forcing a schema migration here.
      properties:
        architectures:
          description: CPU architecture(s) — single-element array on AWS today.
          items:
            type: string
          type: array
        deadLetterTargetArn:
          description: Dead-letter target ARN (SQS queue or SNS topic).
          type: string
        description:
          description: Function description.
          type: string
        environment:
          additionalProperties:
            type: string
          description: |-
            Environment variables applied to the function. Replaces — Lambda
            doesn't merge.
          type: object
        ephemeralStorageSize:
          description: Ephemeral `/tmp` storage size in MiB.
          format: int32
          type: integer
        fileSystemConfigs:
          description: EFS file system mounts.
          items:
            $ref: '#/components/schemas/Deployments.AwsLambdaFileSystemConfigSnapshot'
          type: array
        handler:
          description: Handler entrypoint (e.g. `index.handler`) — Zip only.
          type: string
        imageConfig:
          allOf:
            - $ref: '#/components/schemas/Deployments.AwsLambdaImageConfigSnapshot'
          description: Image-config overrides — Image-packaged functions only.
        imageUri:
          description: |-
            Full ECR image URI (with `@sha256:` digest preferred over a
            mutable tag — the workflow records the resolved digest where
            possible so the deploy is reproducible).
          type: string
        kmsKeyArn:
          description: KMS key ARN for environment variable encryption.
          type: string
        layers:
          description: Lambda layer ARNs (versioned).
          items:
            type: string
          type: array
        loggingConfig:
          allOf:
            - $ref: '#/components/schemas/Deployments.AwsLambdaLoggingConfigSnapshot'
          description: CloudWatch logging configuration.
        memorySize:
          description: Memory size in MiB.
          format: int32
          type: integer
        packageType:
          allOf:
            - $ref: '#/components/schemas/Deployments.AwsLambdaPackageType'
          description: |-
            Which packaging mode this deploy used. Drives which of the
            zip- vs image-prefixed fields below carry values.
        raw:
          additionalProperties: {}
          description: |-
            Raw resolved-definition + configuration JSON, kept verbatim so
            future fields surface in the diff viewer without a schema
            migration here.
          type: object
        role:
          description: IAM execution role ARN.
          type: string
        runtime:
          description: Lambda runtime (e.g. `nodejs20.x`, `python3.12`) — Zip only.
          type: string
        s3Bucket:
          description: |-
            S3 bucket holding the zip artifact (resolved
            `infrastructure.s3_artifact_bucket`, denormalized into the
            per-deploy snapshot so each deploy's exact source is
            reconstructable from this JSON alone).
          type: string
        s3Key:
          description: |-
            S3 key the deploy uploaded into. Renders as the deploy's UI tag
            for Zip deploys.
          type: string
        snapStartApplyOn:
          description: SnapStart mode (`None` | `PublishedVersions`).
          type: string
        timeout:
          description: |-
            Wall-clock timeout in seconds (Lambda function-level, distinct
            from the deploy-level `timeout` on the module deployment).
          format: int32
          type: integer
        tracingMode:
          description: X-Ray tracing mode (`Active` | `PassThrough`).
          type: string
        vpcSecurityGroupIds:
          description: VPC security group IDs attached to the function's ENIs.
          items:
            type: string
          type: array
        vpcSubnetIds:
          description: VPC subnet IDs the function's ENIs are placed into.
          items:
            type: string
          type: array
      required:
        - packageType
        - raw
      type: object
    Deployments.AwsLambdaPublishStatus:
      description: |-
        Status of `PublishVersion` — mints a new immutable numbered version
        of the function pointing at the just-uploaded code + configuration.
      enum:
        - PENDING
        - SUCCESS
        - FAILED
      type: string
    Deployments.AwsLambdaUpdateStatus:
      description: |-
        Status of `UpdateFunctionCode` + the subsequent `WaitForLambdaUpdated`
        poll loop. UpdateFunctionCode itself returns synchronously, but
        `LastUpdateStatus` on the function config is what tells us the new
        package is actually live.
      enum:
        - PENDING
        - IN_PROGRESS
        - SUCCESS
        - FAILED
      type: string
    Deployments.AwsStaticDeploymentDefinition:
      additionalProperties: false
      description: |-
        Snapshot of the resolved `Module.AwsStaticDeploymentDefinition`
        (from `packages/schemas/modules/tsp/deployment.tsp`) captured at
        deploy time. Stored twice on `AwsStaticDeploymentData` (the prior
        successful deploy's snapshot + this deploy's snapshot) so the deploy
        detail drawer can render the definition diff the user requested.

        Open shape because the underlying module-side definition schema can
        grow — capturing the raw JSON keeps existing snapshots renderable
        when new optional fields land.
      properties:
        cloudfrontInvalidationPaths:
          description: |-
            Optional CloudFront invalidation paths the user requested for
            this deploy. Empty array means "no invalidation".
          items:
            type: string
          type: array
        directory:
          description: |-
            Resolved `s3_directory` value — the directory under the hosting
            bucket that holds this deploy's built artifacts. Pulled to a
            named field because it doubles as the deploy's UI tag.
          type: string
        keepLatestSuccessfulDeployCount:
          description: |-
            How many successful static deploys to retain in the hosting
            bucket before pruning older directories. Null means "keep all".
          format: int32
          type: integer
        raw:
          additionalProperties: {}
          description: |-
            Raw resolved-definition JSON, kept verbatim so future fields on
            `AwsStaticDeploymentDefinition` surface in the diff viewer without
            a schema migration here.
          type: object
      required:
        - directory
        - raw
      type: object
    Deployments.AwsCloudfrontDistributionInfo:
      additionalProperties: false
      description: |-
        One CloudFront distribution attached to this hosting bucket.
        Captured at deploy phase-start so the deploy detail's "details
        table" can list every domain alias without round-tripping
        CloudFront on render.
      properties:
        defaultDomain:
          description: |-
            AWS-assigned default CloudFront domain (e.g.
            `d111111abcdef8.cloudfront.net`). Always present — useful as a
            fallback when the user hasn't configured an alias.
          type: string
        distributionArn:
          description: |-
            Full ARN, e.g.
            arn:aws:cloudfront::123456789012:distribution/E1ABCDEF.
          type: string
        distributionId:
          description: |-
            Short id parsed from the ARN tail (e.g. `E1ABCDEF`). Duplicated
            so the UI can render the id without splitting the ARN.
          type: string
        domainAliases:
          description: |-
            All domain aliases configured on the distribution
            (`Aliases.Items` from `GetDistributionConfig`). Drives the
            "domains" row in the deploy detail UI.
          items:
            type: string
          type: array
      required:
        - distributionArn
        - distributionId
        - domainAliases
      type: object
    Deployments.AwsCloudfrontInvalidationRecord:
      additionalProperties: false
      description: |-
        One CloudFront invalidation issued by this deploy. Populated by
        the background invalidation activity, one entry per
        distribution-arn the deploy was asked to invalidate.
      properties:
        completedAt:
          description: Set when `status` transitions out of `IN_PROGRESS`.
          format: date-time
          type: string
        distributionArn:
          description: Distribution this invalidation targets.
          type: string
        failureReason:
          description: AWS error message if `status == FAILED`.
          type: string
        invalidationId:
          description: |-
            AWS invalidation id from `CreateInvalidation` (e.g.
            `I2J0MWVNIHERZJ`). Null if the call itself failed before AWS
            assigned an id.
          type: string
        paths:
          description: |-
            Paths submitted to CreateInvalidation — usually `["/*"]` but
            callers can scope narrower. Captured for audit.
          items:
            type: string
          type: array
        startedAt:
          format: date-time
          type: string
        status:
          $ref: '#/components/schemas/Deployments.AwsCloudfrontInvalidationStatus'
      required:
        - distributionArn
        - paths
        - status
        - startedAt
      type: object
    Deployments.AwsStaticKvsWriteStatus:
      description: |-
        Status of writing the resolved directory value to the CloudFront
        KeyValueStore `active` key. PutKey is the deploy's commit point —
        once `SUCCESS`, traffic flips to the promoted directory immediately.
      enum:
        - PENDING
        - SUCCESS
        - FAILED
      type: string
    ModuleInstance.ResolvedLogSource:
      oneOf:
        - $ref: '#/components/schemas/ModuleInstance.ResolvedCloudWatchLogSource'
        - $ref: '#/components/schemas/ModuleInstance.ResolvedEksLokiLogSource'
        - $ref: '#/components/schemas/ModuleInstance.ResolvedExternalLogSource'
    ModuleInstance.ResolvedMetricSource:
      oneOf:
        - $ref: '#/components/schemas/ModuleInstance.ResolvedCloudWatchMetricSource'
        - $ref: '#/components/schemas/ModuleInstance.ResolvedAmpMetricSource'
        - $ref: >-
            #/components/schemas/ModuleInstance.ResolvedEksPrometheusMetricSource
        - $ref: '#/components/schemas/ModuleInstance.ResolvedLinkMetricSource'
    Module.MetricType:
      description: Allowed metric chart types.
      enum:
        - line
        - bar
        - link
      type: string
    Module.ShowWhenCondition:
      anyOf:
        - $ref: '#/components/schemas/Module.ShowWhenComparableValue'
        - $ref: '#/components/schemas/Module.ShowWhenNotCondition'
      description: A show_when condition.
    Module.StringValueItem:
      additionalProperties: false
      description: |-
        A selectable option with a string value.
        Used in string input validation.values arrays.
      properties:
        description:
          description: |-
            Extra detail shown alongside the option
            Example:
            description: Recommended for US-based users
            Optional
          type: string
        group_label:
          description: |-
            Groups options under a shared heading in the dropdown
            Example:
            group_label: North America
            Optional
          type: string
        label:
          description: |-
            Text shown in the dropdown — defaults to value if omitted
            Example:
            label: US East (N. Virginia)
            Optional
          type: string
        show_when:
          allOf:
            - $ref: '#/components/schemas/Module.ShowWhen'
          description: |-
            Only show this option when another field has a specific value
            Example:
            show_when:
            package_type: Image
            Optional
        value:
          description: |-
            Actual value sent to Terraform when this option is selected
            Example:
            value: us-east-1
            Required
          type: string
      required:
        - value
      type: object
    Module.DynamicValuesRef:
      description: >-
        Dynamic values reference.

        References an external value source resolved at runtime. Query
        parameters may

        use module input templates, e.g.

        `$values:aws/ec2/instances?awsAccountId=<<module.input.aws_account_id>>&region=<<module.input.region>>`.
      minLength: 9
      pattern: >-
        ^\$values:[A-Za-z0-9_./-]+(\?[A-Za-z0-9_.~-]+=[^&=]+(&[A-Za-z0-9_.~-]+=[^&=]+)*)?$
      type: string
    Module.NumberValueItem:
      additionalProperties: false
      description: |-
        A selectable option with a numeric value.
        Used in number input validation.values arrays.
      properties:
        description:
          description: |-
            Extra detail shown alongside the option
            Example:
            description: Recommended for US-based users
            Optional
          type: string
        group_label:
          description: |-
            Groups options under a shared heading in the dropdown
            Example:
            group_label: North America
            Optional
          type: string
        label:
          description: |-
            Text shown in the dropdown — defaults to value if omitted
            Example:
            label: US East (N. Virginia)
            Optional
          type: string
        show_when:
          allOf:
            - $ref: '#/components/schemas/Module.ShowWhen'
          description: |-
            Only show this option when another field has a specific value
            Example:
            show_when:
            size_class: large
            Optional
        value:
          description: |-
            Actual number sent to Terraform when this option is selected
            Example:
            value: 4
            Required
          format: int32
          type: integer
      required:
        - value
      type: object
    Module.CompoundValueItem:
      additionalProperties:
        $ref: '#/components/schemas/Module.CompoundFieldValue'
      description: >-
        A compound value item - a record with arbitrary fields plus select
        metadata.

        Each key maps to a field value, and includes optional display fields.


        Note: The actual structure is a Record with dynamic keys for the data
        fields,

        plus the optional BaseSelectFields (label, description, group_label).
      properties:
        description:
          description: |-
            Extra detail shown alongside the option
            Example:
            description: Recommended for US-based users
            Optional
          type: string
        group_label:
          description: |-
            Groups options under a shared heading in the dropdown
            Example:
            group_label: North America
            Optional
          type: string
        label:
          description: |-
            Text shown in the dropdown — defaults to value if omitted
            Example:
            label: US East (N. Virginia)
            Optional
          type: string
      type: object
    Module.RefFallbackObjectMapInputProperty:
      additionalProperties: false
      properties:
        collapsible:
          description: >-
            Render this field as collapsible (tag when collapsed, full field
            when expanded)


            Supported for all value-producing input types.

            Consecutive collapsible fields are automatically grouped together.

            Divider inputs break collapsible groups.


            Example:

            collapsible: true

            Optional — defaults to false
          type: boolean
        default:
          additionalProperties: {}
          description: |-
            Default map value for the field
            Example:
            default:
            prod-to-shared:
            peer_vpc_id: vpc-123
            Optional
          type: object
          x-templateable: true
        description:
          description: |-
            Help text shown below the label
            Example:
            description: Select the AWS region for your resources
            Optional
          type: string
        id:
          description: |-
            Unique identifier for this input.
            Example:
            id: region
            Required
          minLength: 1
          type: string
        immutable:
          description: >-
            Lock this field after first deploy — prevents changes to destructive
            settings

            Example:

            immutable: true

            Optional — defaults to false
          type: boolean
        item_inputs:
          description: Input definitions allowed inside a module reference's mapped inputs.
          items:
            $ref: '#/components/schemas/Module.RefFallbackInputProperty'
          minItems: 1
          type: array
        item_label:
          description: |-
            Label for each map item, used in add buttons and editor headers
            Example:
            item_label: Connection
            Optional
          type: string
        item_title:
          allOf:
            - $ref: '#/components/schemas/Module.ObjectCollectionItemTitleConfig'
          description: User-facing title template for each map item.
        key:
          allOf:
            - $ref: '#/components/schemas/Module.MapKeyConfig'
          description: Metadata for the map entry key field.
        label:
          description: |-
            Text shown above the form field
            Example:
            label: Region
            Required
          minLength: 1
          type: string
        moved_from:
          description: >-
            Input IDs from earlier module versions whose values this input now
            holds.

            Upgrading an existing instance to this version does not trip the
            immutable

            input check for the listed inputs or for this one, so a module
            version can

            rename or merge immutable inputs without forcing a destroy and
            recreate.

            Example:

            moved_from:

            - domain_name

            - subject_alternative_names

            Optional
          items:
            type: string
          type: array
        required:
          description: |-
            Whether the field must contain at least one entry
            Example:
            required: true
            Optional — defaults to false
          type: boolean
        show_when:
          allOf:
            - $ref: '#/components/schemas/Module.ShowWhen'
          description: |-
            Only show this field when another field has a specific value
            Example:
            show_when:
            advanced_mode: true
            Optional
        type:
          description: |-
            Input type for structured object maps
            Example:
            type: object_map
            Required
          enum:
            - object_map
          type: string
      required:
        - id
        - label
        - type
        - item_inputs
      type: object
    Module.RefFallbackObjectArrayInputProperty:
      additionalProperties: false
      properties:
        collapsible:
          description: >-
            Render this field as collapsible (tag when collapsed, full field
            when expanded)


            Supported for all value-producing input types.

            Consecutive collapsible fields are automatically grouped together.

            Divider inputs break collapsible groups.


            Example:

            collapsible: true

            Optional — defaults to false
          type: boolean
        default:
          description: |-
            Default array value for the field
            Example:
            default:
            - name: web
            port: 80
            Optional
          items:
            $ref: '#/components/schemas/Module.ObjectArrayDefaultItem'
          type: array
          x-templateable: true
        description:
          description: |-
            Help text shown below the label
            Example:
            description: Select the AWS region for your resources
            Optional
          type: string
        id:
          description: |-
            Unique identifier for this input.
            Example:
            id: region
            Required
          minLength: 1
          type: string
        immutable:
          description: >-
            Lock this field after first deploy — prevents changes to destructive
            settings

            Example:

            immutable: true

            Optional — defaults to false
          type: boolean
        item_description:
          description: >-
            User-facing description template shown as a secondary line for each
            array item.

            Supports placeholders like {field_id}.

            Example:

            item_description: "Timeout after {timeout_in_minutes} minutes"

            Optional
          type: string
          x-templateable: true
        item_inputs:
          description: Input definitions allowed inside a module reference's mapped inputs.
          items:
            $ref: '#/components/schemas/Module.RefFallbackInputProperty'
          minItems: 1
          type: array
        item_label:
          description: |-
            Label for each array item, used in add buttons and editor headers
            Example:
            item_label: Service
            Optional
          type: string
        item_title:
          allOf:
            - $ref: '#/components/schemas/Module.ObjectCollectionItemTitleConfig'
          description: User-facing title template for each array item.
        label:
          description: |-
            Text shown above the form field
            Example:
            label: Region
            Required
          minLength: 1
          type: string
        moved_from:
          description: >-
            Input IDs from earlier module versions whose values this input now
            holds.

            Upgrading an existing instance to this version does not trip the
            immutable

            input check for the listed inputs or for this one, so a module
            version can

            rename or merge immutable inputs without forcing a destroy and
            recreate.

            Example:

            moved_from:

            - domain_name

            - subject_alternative_names

            Optional
          items:
            type: string
          type: array
        required:
          description: |-
            Whether the field must contain at least one item
            Example:
            required: true
            Optional — defaults to false
          type: boolean
        show_when:
          allOf:
            - $ref: '#/components/schemas/Module.ShowWhen'
          description: |-
            Only show this field when another field has a specific value
            Example:
            show_when:
            advanced_mode: true
            Optional
        type:
          description: |-
            Input type for structured object arrays
            Example:
            type: object_array
            Required
          enum:
            - object_array
          type: string
      required:
        - id
        - label
        - type
        - item_inputs
      type: object
    Deployments.AwsEc2InstanceReleaseGateStatus:
      description: State of the fail-closed Auto Scaling launch gate for one instance.
      enum:
        - PENDING
        - APPLYING
        - CONTINUE_REQUESTED
        - ABANDON_REQUESTED
      type: string
    Module.EcsCapacityProviderStrategyItem:
      additionalProperties: false
      description: >-
        Capacity-provider strategy entry. Mirrors AWS exactly.


        https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CapacityProviderStrategyItem.html
      properties:
        base:
          description: |-
            Minimum number of tasks placed onto this provider before
            weighting kicks in. At most one entry in the strategy may
            set `base`.
          format: int32
          maximum: 100000
          minimum: 0
          type: integer
          x-templateable: true
        capacity_provider:
          description: |-
            Capacity provider name (e.g. `FARGATE`, `FARGATE_SPOT`, or
            a custom EC2 capacity provider).
          type: string
          x-templateable: true
        weight:
          description: |-
            Relative share of tasks placed onto this provider when the
            strategy has multiple entries.
          format: int32
          maximum: 1000
          minimum: 0
          type: integer
          x-templateable: true
      required:
        - capacity_provider
      type: object
    Module.EcsContainerOverride:
      additionalProperties: false
      description: >-
        Per-container portion of `EcsRunTaskOverrides`. Mirrors the AWS ECS

        RunTask `ContainerOverride` struct field-for-field — every override

        AWS supports for a container is expressible here. The `name` ties

        the override to a container in the task definition.


        https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ContainerOverride.html
      properties:
        command:
          description: Replacement command — replaces the container's CMD array.
          items:
            type: string
          type: array
          x-templateable: true
        cpu:
          description: CPU units override for this container.
          format: int32
          type: integer
          x-templateable: true
        environment:
          description: Environment variables merged on top of the task definition's.
          items:
            $ref: '#/components/schemas/Module.EcsEnvironmentVariable'
          type: array
          x-templateable: true
        environment_files:
          description: Environment files (S3 references) layered on top of `environment`.
          items:
            $ref: '#/components/schemas/Module.EcsEnvironmentFile'
          type: array
          x-templateable: true
        memory:
          description: Hard memory limit (MiB) override for this container.
          format: int32
          type: integer
          x-templateable: true
        memory_reservation:
          description: Soft memory reservation (MiB) override for this container.
          format: int32
          type: integer
          x-templateable: true
        name:
          description: Container name from the task definition. Required.
          minLength: 1
          type: string
          x-templateable: true
        resource_requirements:
          description: GPU / InferenceAccelerator requirements override.
          items:
            $ref: '#/components/schemas/Module.EcsResourceRequirement'
          type: array
          x-templateable: true
      required:
        - name
      type: object
    Module.EcsEphemeralStorage:
      additionalProperties: false
      description: ECS ephemeral storage configuration
      properties:
        size_in_gib:
          description: Storage size in GiB (21–200 for Fargate, minimum 20)
          format: int32
          maximum: 200
          minimum: 20
          type: integer
          x-templateable: true
      required:
        - size_in_gib
      type: object
    Module.EcsNetworkConfiguration:
      additionalProperties: false
      description: >-
        AWS ECS network configuration. Only the `awsvpc` shape exists on

        RunTask (host / bridge networking is task-definition-driven).


        https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_NetworkConfiguration.html
      properties:
        awsvpc_configuration:
          allOf:
            - $ref: '#/components/schemas/Module.EcsAwsVpcConfiguration'
          description: VPC configuration — required when set.
          x-templateable: true
      required:
        - awsvpc_configuration
      type: object
    Module.EcsPlacementConstraint:
      additionalProperties: false
      description: >-
        AWS ECS placement constraint. EC2/EXTERNAL launch types only —

        Fargate ignores these.


        https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_PlacementConstraint.html
      properties:
        expression:
          description: Cluster query expression — required when `type` is `memberOf`.
          type: string
          x-templateable: true
        type:
          description: |-
            Constraint type. `distinctInstance` spreads tasks one-per-host;
            `memberOf` filters by a cluster query expression.
          enum:
            - distinctInstance
            - memberOf
          type: string
          x-templateable: true
      required:
        - type
      type: object
    Module.EcsPlacementStrategy:
      additionalProperties: false
      description: >-
        AWS ECS placement strategy. EC2/EXTERNAL launch types only —

        Fargate ignores these.


        https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_PlacementStrategy.html
      properties:
        field:
          description: |-
            Attribute the strategy operates on (e.g. `instanceId`,
            `attribute:ecs.availability-zone`, `cpu`, `memory`).
          type: string
          x-templateable: true
        type:
          description: |-
            Strategy type. `random` ignores `field`; `spread` and `binpack`
            require `field`.
          enum:
            - random
            - spread
            - binpack
          type: string
          x-templateable: true
      required:
        - type
      type: object
    Module.EcsTag:
      additionalProperties: false
      description: AWS resource tag
      properties:
        key:
          description: Tag key
          type: string
          x-templateable: true
        value:
          description: Tag value
          type: string
          x-templateable: true
      required:
        - key
        - value
      type: object
    Module.EcsTaskVolumeConfiguration:
      additionalProperties: false
      description: >-
        Per-task volume binding for ECS-managed volumes (today: ephemeral

        EBS for Fargate). The `name` must match a volume entry in the

        task definition's `volumes` list.


        https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_TaskVolumeConfiguration.html
      properties:
        managed_ebs_volume:
          allOf:
            - $ref: '#/components/schemas/Module.EcsTaskManagedEBSVolumeConfiguration'
          description: Managed-EBS volume configuration.
          x-templateable: true
        name:
          description: Volume name — must match a `name` in the task definition.
          type: string
          x-templateable: true
      required:
        - name
      type: object
    Deployments.EcsEvidenceQuality:
      description: |-
        Evidence quality for the task's target-group snapshot. Computed
        once at task-stop by the selector. The snapshot is only persisted
        when the task's own target was observed, so the drawer never needs
        to distinguish "found" from "not found" — this label only
        separates the strong failure/healthy frame from a noisier
        initial/unused one.
      enum:
        - definitive
        - transient
      type: string
    Deployments.EcsTargetHealthCheckConfig:
      additionalProperties: false
      description: |-
        Health-check configuration AWS uses to probe the target group.
        Captured alongside `DescribeTargetHealth` so the drawer's target
        card can answer "what endpoint is AWS hitting?" — which is the
        first question readers ask when chasing an unhealthy target.
      properties:
        healthyThresholdCount:
          format: int32
          type: integer
        intervalSeconds:
          format: int32
          type: integer
        matcherSummary:
          description: |-
            Pre-formatted HTTP matcher summary (e.g. "200", "200-399"). Only
            meaningful for HTTP/HTTPS/GRPC.
          type: string
        path:
          description: Path AWS probes. Omitted for TCP-style health checks.
          type: string
        port:
          description: String because AWS accepts "traffic-port" as a literal.
          type: string
        protocol:
          description: |-
            "HTTP" | "HTTPS" | "TCP" | "TLS" | "GRPC" — the AWS enum
            verbatim.
          type: string
        timeoutSeconds:
          format: int32
          type: integer
        unhealthyThresholdCount:
          format: int32
          type: integer
      required:
        - protocol
        - port
      type: object
    Deployments.EcsTargetHealthSource:
      description: |-
        Which ingestion path wrote the snapshot. Used for debugging and UI
        labeling ("was this captured at task-stop or during the deploy
        poll loop?").
      enum:
        - event-ingest
      type: string
    Deployments.EcsTaskTargetObservation:
      additionalProperties: false
      description: |-
        Projection of one `DescribeTargetHealth.TargetHealthDescriptions`
        entry. Carries the observable fields the drawer renders; omits
        volatile/internal bookkeeping.
      properties:
        description:
          description: AWS free-form failure description.
          type: string
        id:
          description: Display key "ip:port" or "container-instance-arn:port".
          type: string
        port:
          format: int32
          type: integer
        rawId:
          description: |-
            Raw AWS target identity — private IP (awsvpc) or
            container-instance ARN (EC2).
          type: string
        reasonCode:
          description: AWS reason code (e.g., "Target.ResponseCodeMismatch").
          type: string
        state:
          description: |-
            AWS target state: "healthy" | "unhealthy" | "draining" |
            "initial" | "unused" | "unavailable" | "unhealthy.draining".
          type: string
      required:
        - id
        - rawId
        - state
      type: object
    Deployments.EksWorkloadDiagnosisLog:
      additionalProperties: false
      description: >-
        What a container printed before it died, attached to the diagnosis that

        reports the death.


        `available` is the field this object exists for, and it must be read

        before anything else here. An unavailable capture and an empty one are

        OPPOSITE conclusions for whoever is debugging: "the process printed

        nothing" points at a crash before start-up, "we could not read the log"

        points at nothing at all and means try the next restart. So when

        `available` is false the text, the line count and `empty` are absent

        entirely rather than present-and-blank — there is nothing for a careless

        reader to render as silence.


        `exitCode` and `restartCount` are strings, not numbers, matching the

        agent's convention for every structured fact it reports: absent means
        "we

        do not know", which a number cannot express without a sentinel somebody

        eventually renders as -1.


        The capture's own exit code and restart count can DISAGREE with the

        diagnosis's. Under a capture rate limit the attached log may come from
        an

        earlier instance than the one the finding currently describes, and a

        reader has to be able to see that the logs are from restart 3 while the

        pod is on restart 40.
      properties:
        available:
          description: >-
            False means Operator could not read the log. See the note above —
            this is

            not the same as the container having printed nothing.
          type: boolean
        capturedAt:
          format: date-time
          type: string
        container:
          description: >-
            The container the output came from. Repeated here rather than
            inherited

            from the finding because a capture can hang off a pod-level finding,
            and

            a reader must never have to guess which container of a
            multi-container

            pod they are looking at.
          type: string
        empty:
          description: >-
            True when the container ran and printed nothing. Only meaningful
            when

            `available`.
          type: boolean
        exitCode:
          description: The run the output came from. Strings for the reason above.
          type: string
        explanation:
          type: string
        lines:
          format: int32
          type: integer
        previous:
          description: >-
            True when the output came from the instance BEFORE the current one —
            the

            run that crashed, rather than the one running now.
          type: boolean
        reason:
          description: >-
            Why an unavailable capture is unavailable. Both empty when
            `available`.
          type: string
        restartCount:
          type: string
        terminationReason:
          type: string
        text:
          description: >-
            The captured output, verbatim. Present only when `available`.
            Bounded on

            the way in as well as by the agent: nothing a cluster prints may
            make one

            row's payload unbounded.
          type: string
        truncated:
          description: >-
            True when the output did not fit the byte cap. The END survives —
            the

            last thing a dying process said is the useful half — so the ellipsis

            belongs at the top.
          type: boolean
      required:
        - available
      type: object
    Deployments.EksWorkloadDriftChange:
      additionalProperties: false
      description: |-
        One field where the live object no longer matches what Ravion deployed.

        `previous` is ALWAYS the value Ravion deployed and `current` is ALWAYS
        what is running now — never the other way round, whichever direction the
        change went. Either may be truncated by the agent.
      properties:
        change:
          description: |-
            changed | added | removed. `added` means the cluster has a field the
            deployed spec does not, which is usually a mutating webhook rather
            than a person.
          type: string
        current:
          type: string
        path:
          description: |-
            Dotted path with list elements keyed by identity, e.g.
            `spec.template.spec.containers[api].image`.
          type: string
        previous:
          type: string
      required:
        - path
        - change
      type: object
    CanvasAnchorSide:
      description: A side of a module card's border.
      enum:
        - top
        - right
        - bottom
        - left
      type: string
    Deployments.AwsAmiBuildStatus:
      description: |-
        Status of the deployment's Image Builder build. Mirrors the Image
        Builder image states, plus SKIPPED for a redeploy or rollback that
        re-released an existing image.
      enum:
        - PENDING
        - CREATING
        - BUILDING
        - TESTING
        - DISTRIBUTING
        - INTEGRATING
        - AVAILABLE
        - FAILED
        - CANCELLED
        - SKIPPED
      type: string
    Deployments.AwsAmiBlockDeviceMappingRef:
      additionalProperties: false
      description: One EBS volume on the built image.
      properties:
        deviceName:
          type: string
        iops:
          format: int32
          type: integer
        throughput:
          format: int32
          type: integer
        volumeSizeGiB:
          format: int32
          type: integer
        volumeType:
          type: string
      required:
        - deviceName
        - volumeSizeGiB
      type: object
    Deployments.AwsAmiComponentRef:
      additionalProperties: false
      description: One Image Builder component of the recipe, with its ARN.
      properties:
        arn:
          type: string
        name:
          type: string
      required:
        - name
        - arn
      type: object
    Deployments.AwsAmiParentImageRef:
      additionalProperties: false
      description: >-
        Parent image as the module definition named it, and the AMI it resolved
        to.
      properties:
        id:
          description: AMI id the parent resolved to at deploy time.
          type: string
        lookupName:
          description: Name filter of a `lookup` parent image.
          type: string
        lookupOwners:
          description: Owners of a `lookup` parent image.
          items:
            type: string
          type: array
      type: object
    Deployments.AwsAmiImageRef:
      additionalProperties: false
      description: One image in one region, as retirement names it.
      properties:
        amiId:
          type: string
        builtByDeploymentId:
          description: Deployment that built the image.
          type: string
        region:
          type: string
      required:
        - region
        - amiId
        - builtByDeploymentId
      type: object
    Deployments.AwsEc2AutomaticRollbackStatus:
      description: |-
        Outcome of the safety rollback attempted after a terminal per-instance
        deployment failure.
      enum:
        - IN_PROGRESS
        - SUCCESS
        - FAILED
        - SKIPPED
      type: string
    Deployments.AwsEc2Runtime:
      description: |-
        Which runtime the deploy targets — drives which release fields on
        `AwsEc2DeploymentDefinition` carry values.
      enum:
        - CONTAINER
        - MANUAL
      type: string
    Deployments.AwsEc2InstanceInvocationStatus:
      description: |-
        Terminal + in-flight states of one instance's command invocation.
        Mirrors the SSM invocation status value space.
      enum:
        - PENDING
        - IN_PROGRESS
        - SUCCESS
        - FAILED
        - TIMED_OUT
        - CANCELLED
      type: string
    Deployments.EcsDeploymentPauseControlAction:
      description: |-
        Operator action accepted for a paused ECS lifecycle hook. Stored
        outside the append-only `events` timeline so accepting a hook does
        not mutate historical PAUSED events, while still giving every
        dashboard session a persisted source of truth after refresh.
      enum:
        - CONTINUE
        - ROLLBACK
      type: string
    Deployments.EcsDeploymentAcceptedPauseControlLabelKind:
      description: |-
        UI label intent for an accepted pause control. The backend derives this
        from the operator action plus the AWS lifecycle stage that was resolved.
      enum:
        - continue
        - traffic_shift
        - revert_standby
      type: string
    Deployments.EcsListenerRule:
      additionalProperties: false
      description: |-
        One ALB listener rule. A single DescribeListeners/DescribeRules
        capture often produces many rows — the same listener can have
        multiple rules forwarding to different target groups (e.g.
        `/api/*` → service A, `/admin/*` → service B).
      properties:
        hostHeaders:
          description: host-header condition values. Empty for the default rule.
          items:
            type: string
          type: array
        isDefaultRule:
          type: boolean
        listenerArn:
          type: string
        pathPatterns:
          description: path-pattern condition values. Empty for the default rule.
          items:
            type: string
          type: array
        port:
          format: int32
          type: integer
        protocol:
          type: string
        ruleArn:
          type: string
        rulePriority:
          description: |-
            Numeric priority of the rule. Null for the listener's default
            rule (which has no priority).
          format: int32
          type: integer
        targetGroupArn:
          description: |-
            Target group this rule forwards to. Used by the drawer to pick
            the rules relevant to a given task (whose TG is resolved from
            the task's slot).
          type: string
        targetGroupName:
          description: |-
            Short target-group name for UI display (derived from the ARN
            tail). Optional because older rows predate the capture activity
            that populates it.
          type: string
      required:
        - listenerArn
        - port
        - protocol
        - ruleArn
        - isDefaultRule
        - targetGroupArn
      type: object
    Deployments.EcsDeployPhaseCode:
      description: |-
        Phase of an ECS deploy run, persisted on each progress event the
        workflow appends to `EcsDeploymentData.events`. The frontend
        branches on this code (not the human-readable label) to render
        step UI; label rendering lives entirely in the frontend.
      enum:
        - INIT
        - PROVISION
        - SNAPSHOT
        - PRE_DEPLOY
        - UPDATE
        - WAIT_HEALTHY
        - POST_DEPLOY
        - ACTIVATE
        - COMPLETE
        - FAILED
        - TRAFFIC_SHIFT
        - BAKE
        - PAUSED
        - WAITING_FOR_STACK_APPLY
        - ROLLBACK
      type: string
    Deployments.EcsDeploymentTrafficPhase:
      description: |-
        Backend-classified traffic role for an ECS deployment event or
        DescribeServiceDeployments snapshot. This keeps AWS lifecycle-stage
        bucket logic on the backend, where the raw ECS status model is
        interpreted, instead of duplicating those string sets in the UI.
      enum:
        - standby
        - production
      type: string
    Deployments.EcsAppliedEarlySuccessCriteria:
      additionalProperties: false
      description: AWS-applied success criteria, retained with the deployment snapshot.
      properties:
        enable:
          type: boolean
        healthyPercent:
          format: int32
          type: integer
        sourceServiceRevisionCleanup:
          enum:
            - BLOCKING
            - DEFERRED
          type: string
      required:
        - enable
      type: object
    Deployments.EcsServiceRevisionTrafficState:
      additionalProperties: false
      description: |-
        One ECS service revision entry from DescribeServiceDeployments.
        ECS reports target and source revisions in terms of service-revision
        ARNs rather than Ravion deployment IDs; consumers match the ARN tail
        to `ModuleDeployment.externalDeploymentId` (`ecs-svc/<tail>`) to
        identify the corresponding row.
      properties:
        pendingTaskCount:
          format: int32
          type: integer
        requestedProductionTrafficWeight:
          description: |-
            Percentage of production traffic ECS reports for this revision.
            Optional because AWS omits it for deployment shapes that do not
            expose traffic weights.
          format: double
          type: number
        requestedTaskCount:
          format: int32
          type: integer
        requestedTestTrafficWeight:
          description: |-
            Percentage of test traffic ECS reports for this revision. Optional
            for the same reason as requestedProductionTrafficWeight.
          format: double
          type: number
        runningTaskCount:
          format: int32
          type: integer
        serviceRevisionArn:
          description: |-
            ARN such as
            arn:aws:ecs:us-east-2:123:service-revision/cluster/service/912...
          type: string
      required:
        - serviceRevisionArn
        - requestedTaskCount
        - runningTaskCount
        - pendingTaskCount
      type: object
    Deployments.EksHelmChartRef:
      additionalProperties: false
      description: |-
        Resolved chart reference captured at deploy time — the module-side
        `Module.HelmChartSource` after template substitution, flattened into
        one model with a `sourceKind` discriminator so the deploy drawer can
        render "which chart was installed" without narrowing a union.

        Which optional fields carry values depends on `sourceKind`:
        - `git`    → `path`, plus `repo` + `branch` (optionally `ref`) when
        the chart was checked out of a repository; `path` alone
        for a chart bundled with the module definition
        - `oci`    → `chart` (the `oci://…` url), optionally `version`
        - `http`   → `repo` + `chart` (the chart name), optionally `version`
      properties:
        branch:
          description: |-
            Branch the chart's source repository was cloned at — `git`
            sources that name a repository. Recorded because it is what names
            the checkout: `ref` is optional and `path` addresses a directory
            inside the clone. Without it a replay of this deploy would have
            nothing to clone.
          type: string
        chart:
          description: |-
            Chart identifier — the full `oci://…` url (`oci`) or the chart
            name within the repository (`http`). Absent for `git`, where the
            chart is addressed by `path`.
          type: string
        credentials:
          allOf:
            - $ref: '#/components/schemas/Deployments.EksChartCredentialRefs'
          description: |-
            References to the credentials this deploy fetched the chart with.
            Absent for a public chart, which is the common case.
        path:
          description: |-
            Path to the chart directory within the checkout — `git` sources
            only.
          type: string
        ref:
          description: |-
            Git ref (branch, tag, or commit SHA) checked out — `git` sources
            only. The workflow records the resolved commit SHA where it can,
            so the deploy is reproducible.
          type: string
        repo:
          description: |-
            Repository URL — the Git remote (`git`) or the Helm repository
            URL (`http`). Absent for `oci` and for a bundled `git` chart.
          type: string
        sourceKind:
          allOf:
            - $ref: '#/components/schemas/Deployments.EksHelmChartSourceKind'
          description: Which kind of chart source this deploy installed from.
        version:
          description: |-
            Chart version installed. Absent when the module config pinned no
            version and Helm resolved "latest" at install time.
          type: string
      required:
        - sourceKind
      type: object
    Deployments.EksDeployEngine:
      description: |-
        Which engine applied this deploy. Mirrors the module-side
        `Module.EksDeploymentDefinition` `engine` discriminator — Helm is the
        only v1 engine; the enum leaves room for raw manifests / Argo CD.
      enum:
        - helm
      type: string
    Deployments.EksSecretRef:
      additionalProperties: false
      description: |-
        One secret reference this deploy handed to the chart, captured at
        deploy time.

        Both fields are references, never values. `valueFrom` is an ARN — the
        same class of identifier as the cluster ARN and runner role ARN
        already stored on this payload — and it is recorded deliberately: the
        deploy drawer's diff has to be able to show that a deploy re-pointed
        `DATABASE_URL` at a *different* secret, which a bare name cannot
        express. Ravion never reads what the ARN points at, so no value can
        reach this payload; the External Secrets Operator resolves the
        reference in-cluster.
      properties:
        name:
          description: |-
            Environment variable name the reference is exposed as in the
            container. Matches the module-side `EcsSecret.name`.
          type: string
        valueFrom:
          description: |-
            Full Parameter Store / Secrets Manager ARN, verbatim as authored
            (after template substitution), including any ECS-style JSON-key
            extraction suffix.
          type: string
      required:
        - name
        - valueFrom
      type: object
    Deployments.EksHelmValuesSummary:
      additionalProperties: false
      description: |-
        Cheap summary of the Helm values this deploy rendered — enough to say
        *whether* they changed, without fetching them.

        The document itself IS stored, on the `EksDeploymentArtifact` row for
        this deployment, and is served by its own endpoint. This summary is
        not a privacy boundary (see the note at the top of this file); it is
        a size one. It rides along on every deployment the list endpoint
        returns, so it has to stay small — and a checksum plus key paths is
        exactly what a list view can act on: mark the deploys where the
        values moved, and fetch documents only for the two an operator
        actually opens.

        The checksum covers the module's own `values` block. The stored
        document additionally carries the deploy's `ravion.secrets`
        references, so the two agree only for a release with no secrets —
        compare a checksum against another checksum, never against a hash of
        a fetched document.
      properties:
        byteSize:
          description: |-
            Byte length of the canonical JSON encoding. Cheap signal for the
            UI when a diff is too large to summarize.
          format: int32
          type: integer
        checksum:
          description: |-
            Lowercase hex SHA-256 of the canonical (sorted-key) JSON encoding
            of the rendered values document. Empty values render as the
            checksum of `{}`.
          type: string
        keyPaths:
          description: |-
            Dotted key paths present in the rendered values, sorted. Leaf
            values are never included. Array elements collapse to their
            parent path (`image.pullSecrets`), so cardinality can't leak
            through the path list either.
          items:
            type: string
          type: array
      required:
        - checksum
        - keyPaths
        - byteSize
      type: object
    Deployments.EksDeployPhaseCode:
      description: |-
        Phase of an EKS deploy run, persisted on each progress event the
        workflow appends to `EksDeploymentData.events`. The frontend
        branches on this code (not a human-readable label) to render step
        UI, exactly as it does for `EcsDeployPhaseCode`.
      enum:
        - INIT
        - SNAPSHOT
        - UPGRADE
        - WAIT_READY
        - COMPLETE
        - FAILED
        - ROLLBACK
      type: string
    Deployments.AwsLambdaFileSystemConfigSnapshot:
      additionalProperties: false
      description: EFS mount snapshot.
      properties:
        arn:
          type: string
        localMountPath:
          type: string
      required:
        - arn
        - localMountPath
      type: object
    Deployments.AwsLambdaImageConfigSnapshot:
      additionalProperties: false
      description: Image-config snapshot — Image-packaged functions only.
      properties:
        command:
          items:
            type: string
          type: array
        entryPoint:
          items:
            type: string
          type: array
        workingDirectory:
          type: string
      type: object
    Deployments.AwsLambdaLoggingConfigSnapshot:
      additionalProperties: false
      description: Logging configuration snapshot.
      properties:
        applicationLogLevel:
          type: string
        logFormat:
          type: string
        logGroup:
          type: string
        systemLogLevel:
          type: string
      type: object
    Deployments.AwsLambdaPackageType:
      description: |-
        Which packaging mode the deploy targets — drives which code-source
        fields on `AwsLambdaDeploymentDefinition` carry values.
      enum:
        - ZIP
        - IMAGE
      type: string
    Deployments.AwsCloudfrontInvalidationStatus:
      description: Status of an individual CloudFront `CreateInvalidation` call.
      enum:
        - IN_PROGRESS
        - COMPLETED
        - FAILED
      type: string
    ModuleInstance.ResolvedCloudWatchLogSource:
      additionalProperties: false
      description: |-
        Resolved CloudWatch log source. All fields optional and nullable —
        stack-output-dependent fields stay null until a successful stack apply
        triggers re-resolution.
      properties:
        aws_account_id:
          nullable: true
          type: string
        filter_pattern:
          nullable: true
          type: string
        log_group:
          nullable: true
          type: string
        log_stream_prefix:
          nullable: true
          type: string
        region:
          nullable: true
          type: string
        type:
          enum:
            - cloudwatch
          nullable: true
          type: string
      type: object
    ModuleInstance.ResolvedEksLokiLogSource:
      additionalProperties: false
      description: >-
        Resolved Loki log source — the EKS path. All fields optional and
        nullable

        for the same reason the CloudWatch mirror's are: a module whose
        observability

        addons stack has not applied yet resolves `cluster_arn` to null, and the
        UI

        must be able to say "not ready" rather than fail to parse.
      properties:
        auth_secret:
          nullable: true
          type: string
        cluster_arn:
          nullable: true
          type: string
        endpoint:
          nullable: true
          type: string
        selector:
          nullable: true
          type: string
        type:
          enum:
            - eks_loki
          nullable: true
          type: string
      type: object
    ModuleInstance.ResolvedExternalLogSource:
      additionalProperties: false
      description: >-
        Resolved external log destination — a vendor Ravion ships to but cannot

        query. Optional and nullable like its siblings: the href is built from
        the

        add-ons stack's outputs, so it is null until that stack has applied, and

        the tab must render "not ready" rather than a dead link.
      properties:
        href:
          nullable: true
          type: string
        provider:
          nullable: true
          type: string
        type:
          enum:
            - external
          nullable: true
          type: string
      type: object
    ModuleInstance.ResolvedCloudWatchMetricSource:
      additionalProperties: false
      description: |-
        Resolved CloudWatch metric source. All fields optional and nullable —
        stack-output-dependent fields stay null until a successful stack apply
        triggers re-resolution.
      properties:
        aws_account_id:
          nullable: true
          type: string
        dimensions:
          additionalProperties:
            nullable: true
            type: string
          nullable: true
          type: object
        name:
          nullable: true
          type: string
        namespace:
          nullable: true
          type: string
        region:
          nullable: true
          type: string
        statistic:
          nullable: true
          type: string
        type:
          enum:
            - cloudwatch
          nullable: true
          type: string
      type: object
    ModuleInstance.ResolvedAmpMetricSource:
      additionalProperties: false
      description: >-
        Resolved Amazon Managed Prometheus metric source. All fields optional
        and

        nullable — stack-output-dependent fields stay null until a successful

        stack apply triggers re-resolution.
      properties:
        aws_account_id:
          nullable: true
          type: string
        legend_format:
          nullable: true
          type: string
        query:
          nullable: true
          type: string
        region:
          nullable: true
          type: string
        type:
          enum:
            - amp
          nullable: true
          type: string
        unit:
          nullable: true
          type: string
        workspace_id:
          nullable: true
          type: string
      type: object
    ModuleInstance.ResolvedEksPrometheusMetricSource:
      additionalProperties: false
      description: |-
        Resolved Prometheus metric source reached through the EKS cluster's
        Operator agent. All fields optional and nullable for the same reason.
      properties:
        auth_secret:
          nullable: true
          type: string
        cluster_arn:
          nullable: true
          type: string
        endpoint:
          nullable: true
          type: string
        legend_format:
          nullable: true
          type: string
        query:
          nullable: true
          type: string
        type:
          enum:
            - eks_prometheus
          nullable: true
          type: string
        unit:
          nullable: true
          type: string
      type: object
    ModuleInstance.ResolvedLinkMetricSource:
      additionalProperties: false
      description: |-
        Resolved vendor deep link for a `type: link` metric entry. Optional and
        nullable: the href is built from the add-ons stack's outputs.
      properties:
        href:
          nullable: true
          type: string
        provider:
          nullable: true
          type: string
        type:
          enum:
            - link
          nullable: true
          type: string
      type: object
    Module.ShowWhenComparableValue:
      anyOf:
        - $ref: '#/components/schemas/Module.ShowWhenValue'
        - items:
            $ref: '#/components/schemas/Module.ShowWhenValue'
          type: array
      description: >-
        Value or values to compare against in a show_when condition; arrays mean
        membership for scalar sources and contains-all for array sources.

        When the source value is scalar, an array condition matches any listed
        value.

        When the source value is an array, a scalar condition matches if the
        array contains that value.

        When the source value is an array, an array condition matches if the
        array contains all listed values.
    Module.ShowWhenNotCondition:
      additionalProperties: false
      description: Negated show_when condition.
      properties:
        not:
          allOf:
            - $ref: '#/components/schemas/Module.ShowWhenComparableValue'
          description: >-
            Show the property only when the source value does not match this
            condition.

            Example:

            not: disabled

            Required
      required:
        - not
      type: object
    Module.EcsEnvironmentVariable:
      additionalProperties: false
      description: Environment variable as name-value pair
      properties:
        name:
          description: Variable name
          type: string
          x-templateable: true
        value:
          description: Variable value
          type: string
          x-templateable: true
      required:
        - name
        - value
      type: object
    Module.EcsEnvironmentFile:
      additionalProperties: false
      description: Environment file from S3
      properties:
        type:
          description: File type
          enum:
            - s3
          type: string
          x-templateable: true
        value:
          description: S3 ARN of the environment file
          type: string
          x-templateable: true
      required:
        - value
        - type
      type: object
    Module.EcsResourceRequirement:
      additionalProperties: false
      description: GPU or other resource requirement
      properties:
        type:
          description: Resource type — currently only GPU
          enum:
            - GPU
            - InferenceAccelerator
          type: string
          x-templateable: true
        value:
          description: Number of resources
          type: string
          x-templateable: true
      required:
        - type
        - value
      type: object
    Module.EcsAwsVpcConfiguration:
      additionalProperties: false
      description: >-
        AWS VPC configuration for `awsvpc`-mode tasks.


        https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_AwsVpcConfiguration.html
      properties:
        assign_public_ip:
          description: |-
            Whether the task ENI gets a public IP. Required for Fargate
            tasks pulling images from non-VPC-routable registries (e.g.
            public ECR) when there's no NAT.
          enum:
            - ENABLED
            - DISABLED
          type: string
          x-templateable: true
        security_groups:
          description: Security groups attached to the task ENI.
          items:
            type: string
          type: array
          x-templateable: true
        subnets:
          description: Subnet IDs the task ENI is placed into.
          items:
            type: string
          minItems: 1
          type: array
          x-templateable: true
      required:
        - subnets
      type: object
    Module.EcsTaskManagedEBSVolumeConfiguration:
      additionalProperties: false
      description: >-
        AWS-managed Fargate ephemeral EBS volume configuration.


        https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_TaskManagedEBSVolumeConfiguration.html
      properties:
        encrypted:
          description: Whether the volume is encrypted at rest.
          type: boolean
          x-templateable: true
        filesystem_type:
          description: |-
            Filesystem type to format the volume with (`ext3`, `ext4`,
            `xfs`, `ntfs`). Defaults per OS family.
          type: string
          x-templateable: true
        iops:
          description: Provisioned IOPS — required for `io1`/`io2`, optional for `gp3`.
          format: int32
          type: integer
          x-templateable: true
        kms_key_id:
          description: KMS key id (alias or ARN) for at-rest encryption.
          type: string
          x-templateable: true
        role_arn:
          description: |-
            IAM role ARN AWS uses to provision the EBS volume on the
            customer's behalf. Required.
          type: string
          x-templateable: true
        size_in_gib:
          description: Volume size (GiB). Range depends on `volume_type`.
          format: int32
          type: integer
          x-templateable: true
        snapshot_id:
          description: Snapshot id to restore from.
          type: string
          x-templateable: true
        tag_specifications:
          description: Tag specifications applied to the EBS volume.
          items:
            $ref: '#/components/schemas/Module.EcsEBSTagSpecification'
          type: array
          x-templateable: true
        termination_policy:
          allOf:
            - $ref: >-
                #/components/schemas/Module.EcsTaskManagedEBSVolumeTerminationPolicy
          description: |-
            Termination policy — controls whether the volume is deleted
            when the task stops.
          x-templateable: true
        throughput:
          description: Provisioned throughput (MiB/s) — `gp3` only.
          format: int32
          type: integer
          x-templateable: true
        volume_initialization_rate:
          description: |-
            Initialization rate (MiB/s) for snapshot-restored volumes —
            controls how fast blocks are pre-warmed.
          format: int32
          type: integer
          x-templateable: true
        volume_type:
          description: |-
            EBS volume type (`gp3`, `gp2`, `io2`, `io1`, `sc1`, `st1`,
            `standard`).
          type: string
          x-templateable: true
      required:
        - role_arn
      type: object
    Deployments.EksChartCredentialRefs:
      additionalProperties: false
      description: |-
        ARNs of the credentials a deploy used to fetch a private chart.

        References only, and the same class of identifier as
        `EksSecretRef.valueFrom` already recorded on this payload: Ravion
        resolves these on the runner instance at fetch time and never
        persists what it read. They are recorded so a replay of this deploy
        can reach the same private registry — a redeploy that dropped them
        would fail authentication against a chart the original deploy pulled
        fine.
      properties:
        password:
          description: Registry / repository password reference. Paired with `username`.
          type: string
        username:
          description: Registry / repository username reference. Paired with `password`.
          type: string
      type: object
    Deployments.EksHelmChartSourceKind:
      description: |-
        Where the chart this deploy installed came from. Mirrors the
        module-side `Module.HelmChartSource` `type` discriminator so the
        snapshot and the config spell the source the same way.
      enum:
        - unknown
        - git
        - oci
        - http
      type: string
    Module.ShowWhenValue:
      anyOf:
        - type: string
        - format: int32
          type: integer
        - type: boolean
      description: |-
        Value that can be used in a show_when condition.
        Supports string, number, or boolean values for comparison.
    Module.EcsEBSTagSpecification:
      additionalProperties: false
      description: >-
        Tag specification for an ECS-managed EBS volume.


        https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_EBSTagSpecification.html
      properties:
        propagate_tags:
          description: |-
            Where the tags come from — explicit list, propagated from the
            task definition, or none.
          enum:
            - TASK_DEFINITION
            - SERVICE
            - NONE
          type: string
          x-templateable: true
        resource_type:
          description: |-
            Resource type the tags apply to. Currently only `volume`
            is supported.
          enum:
            - volume
          type: string
          x-templateable: true
        tags:
          description: Explicit tags.
          items:
            $ref: '#/components/schemas/Module.EcsTag'
          type: array
          x-templateable: true
      required:
        - resource_type
      type: object
    Module.EcsTaskManagedEBSVolumeTerminationPolicy:
      additionalProperties: false
      description: >-
        Termination policy for an ECS-managed EBS volume.


        https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_TaskManagedEBSVolumeTerminationPolicy.html
      properties:
        delete_on_termination:
          description: Whether to delete the volume when the task stops.
          type: boolean
          x-templateable: true
      required:
        - delete_on_termination
      type: object
  securitySchemes:
    BearerAuth:
      scheme: Bearer
      type: http

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.