> ## Documentation Index
> Fetch the complete documentation index at: https://ravion-b90c0359-devin-1788408180-cross-module-output-refs.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Get DeploymentResource by id

> Retrieve a single deployed Terraform resource by ID. Returns its full configuration and current state. GET /deployment-resources/{id} in the Ravion API…



## OpenAPI

````yaml https://api.ravion.com/openapi.yaml get /deployment-resources/{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: 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
paths:
  /deployment-resources/{id}:
    get:
      tags:
        - DeploymentResources
      summary: Get DeploymentResource by id
      description: >-
        Retrieve a single deployed Terraform resource by ID. Returns its full
        configuration and current state.
      operationId: GetDeploymentResource
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                additionalProperties: false
                properties:
                  data:
                    $ref: '#/components/schemas/DeploymentResource.DetailResponse'
                required:
                  - data
                type: object
          description: The request has succeeded.
        '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:
    DeploymentResource.DetailResponse:
      additionalProperties: false
      properties:
        data:
          $ref: '#/components/schemas/DeploymentResource.Detail'
      required:
        - data
      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
    DeploymentResource.Detail:
      additionalProperties: false
      description: Detail shape with ancillary fields the drawer needs but lists don't.
      properties:
        awsAccountId:
          description: |-
            Database ID of the AWS account that owns the cluster /
            function / distribution.
          type: string
        data:
          $ref: '#/components/schemas/DeploymentResourceData'
        desiredStatus:
          type: string
        ec2Instance:
          allOf:
            - $ref: '#/components/schemas/DeploymentResource.Ec2InstanceDetail'
          description: |-
            Live configuration and health for EC2_INSTANCE. Absent for other
            resource kinds and when the AWS account can no longer be resolved.
        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

            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.
        logStreams:
          description: |-
            Per-container CloudWatch log streams for ECS_TASK. Empty /
            absent for kinds without per-container logs.
          items:
            $ref: '#/components/schemas/DeploymentResource.EcsTaskLogStream'
          type: array
        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
    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
    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:
          EC2_INSTANCE:
            $ref: '#/components/schemas/Deployments.AwsEc2InstanceData'
          ECS_TASK:
            $ref: '#/components/schemas/Deployments.EcsTaskData'
          K8S_WORKLOAD:
            $ref: '#/components/schemas/Deployments.EksWorkloadResourceData'
        propertyName: type
      oneOf:
        - $ref: '#/components/schemas/Deployments.EcsTaskData'
        - $ref: '#/components/schemas/Deployments.AwsEc2InstanceData'
        - $ref: '#/components/schemas/Deployments.EksWorkloadResourceData'
      type: object
    DeploymentResource.Ec2InstanceDetail:
      additionalProperties: false
      description: |-
        On-demand AWS projection used by the EC2 instance drawer. The persisted
        DeploymentResource remains the source of truth for membership and
        release state; this payload supplies volatile configuration and health.
      properties:
        architecture:
          type: string
        autoScaling:
          $ref: '#/components/schemas/DeploymentResource.Ec2AutoScalingDetail'
        availabilityZone:
          type: string
        capacity:
          $ref: '#/components/schemas/DeploymentResource.Ec2InstanceTypeDetail'
        iamInstanceProfileArn:
          type: string
        imageId:
          type: string
        instanceType:
          type: string
        launchTime:
          $ref: '#/components/schemas/UtcDateTime'
        listeners:
          items:
            $ref: '#/components/schemas/DeploymentResource.Ec2ListenerDetail'
          type: array
        loadBalancers:
          items:
            $ref: '#/components/schemas/DeploymentResource.Ec2LoadBalancerDetail'
          type: array
        monitoringState:
          type: string
        name:
          type: string
        platformDetails:
          type: string
        privateDnsName:
          type: string
        privateIpAddress:
          type: string
        publicDnsName:
          type: string
        publicIpAddress:
          type: string
        securityGroups:
          items:
            $ref: '#/components/schemas/DeploymentResource.Ec2SecurityGroup'
          type: array
        ssm:
          $ref: '#/components/schemas/DeploymentResource.Ec2SsmDetail'
        state:
          type: string
        stateTransitionReason:
          type: string
        status:
          $ref: '#/components/schemas/DeploymentResource.Ec2StatusDetail'
        subnetId:
          type: string
        tags:
          items:
            $ref: '#/components/schemas/DeploymentResource.Ec2Tag'
          type: array
        targetGroup:
          $ref: '#/components/schemas/DeploymentResource.Ec2TargetGroupDetail'
        targetHealth:
          $ref: '#/components/schemas/DeploymentResource.Ec2TargetHealthDetail'
        unavailableSections:
          description: |-
            AWS sources that could not be read. Other populated sections remain
            valid and render normally.
          items:
            type: string
          type: array
        vpcId:
          type: string
      required:
        - securityGroups
        - tags
        - loadBalancers
        - listeners
        - unavailableSections
      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
    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
    DeploymentResource.EcsTaskLogStream:
      additionalProperties: false
      properties:
        containerName:
          type: string
        logGroupName:
          type: string
        logStreamPrefix:
          type: string
        region:
          type: string
        streamName:
          type: string
      required:
        - containerName
        - logGroupName
        - region
        - logStreamPrefix
        - streamName
      type: object
    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
      type: string
    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
        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
    DeploymentResource.Ec2AutoScalingDetail:
      additionalProperties: false
      description: Auto Scaling's current view of the instance.
      properties:
        healthStatus:
          type: string
        launchTemplateId:
          type: string
        launchTemplateName:
          type: string
        launchTemplateVersion:
          type: string
        lifecycleState:
          type: string
        protectedFromScaleIn:
          type: boolean
      type: object
    DeploymentResource.Ec2InstanceTypeDetail:
      additionalProperties: false
      description: Static capacity characteristics of the concrete EC2 instance type.
      properties:
        architecture:
          type: string
        defaultVcpus:
          format: int32
          type: integer
        memoryMib:
          format: int64
          type: integer
        networkPerformance:
          type: string
      type: object
    DeploymentResource.Ec2ListenerDetail:
      additionalProperties: false
      description: Listener rule that forwards traffic to the selected target group.
      properties:
        hostHeaders:
          items:
            type: string
          type: array
        isDefaultRule:
          type: boolean
        listenerArn:
          type: string
        loadBalancerArn:
          type: string
        loadBalancerDnsName:
          type: string
        pathPatterns:
          items:
            type: string
          type: array
        port:
          format: int32
          type: integer
        protocol:
          type: string
        rulePriority:
          format: int32
          type: integer
      required:
        - listenerArn
        - loadBalancerArn
        - hostHeaders
        - pathPatterns
        - isDefaultRule
      type: object
    DeploymentResource.Ec2LoadBalancerDetail:
      additionalProperties: false
      description: Load balancer attached to the target group.
      properties:
        dnsName:
          type: string
        loadBalancerArn:
          type: string
        loadBalancerName:
          type: string
        scheme:
          type: string
        type:
          type: string
      required:
        - loadBalancerArn
      type: object
    DeploymentResource.Ec2SecurityGroup:
      additionalProperties: false
      description: One security group attached to the instance's primary network path.
      properties:
        groupId:
          type: string
        groupName:
          type: string
      required:
        - groupId
      type: object
    DeploymentResource.Ec2SsmDetail:
      additionalProperties: false
      description: Systems Manager's current view of the managed node.
      properties:
        agentVersion:
          type: string
        associationStatus:
          type: string
        computerName:
          type: string
        isLatestAgentVersion:
          type: boolean
        lastPingAt:
          $ref: '#/components/schemas/UtcDateTime'
        pingStatus:
          type: string
        platformName:
          type: string
        platformType:
          type: string
        platformVersion:
          type: string
      type: object
    DeploymentResource.Ec2StatusDetail:
      additionalProperties: false
      description: EC2 platform status checks and scheduled maintenance.
      properties:
        attachedEbsStatus:
          type: string
        events:
          items:
            $ref: '#/components/schemas/DeploymentResource.Ec2ScheduledEvent'
          type: array
        instanceStatus:
          type: string
        systemStatus:
          type: string
      required:
        - events
      type: object
    DeploymentResource.Ec2Tag:
      additionalProperties: false
      description: |-
        One EC2 tag. Kept as an array so duplicate/empty values preserve the
        exact AWS response and the UI can render stable key/value rows.
      properties:
        key:
          type: string
        value:
          type: string
      required:
        - key
      type: object
    DeploymentResource.Ec2TargetGroupDetail:
      additionalProperties: false
      description: Target-group configuration surrounding the selected instance target.
      properties:
        healthCheckPath:
          type: string
        healthCheckPort:
          type: string
        healthCheckProtocol:
          type: string
        loadBalancerArns:
          items:
            type: string
          type: array
        matcherGrpcCode:
          type: string
        matcherHttpCode:
          type: string
        port:
          format: int32
          type: integer
        protocol:
          type: string
        protocolVersion:
          type: string
        targetGroupArn:
          type: string
        targetGroupName:
          type: string
        targetType:
          type: string
      required:
        - targetGroupArn
        - loadBalancerArns
      type: object
    DeploymentResource.Ec2TargetHealthDetail:
      additionalProperties: false
      description: |-
        Load-balancer target health for this instance, when the module has a
        target group.
      properties:
        description:
          type: string
        healthCheckPort:
          type: string
        port:
          format: int32
          type: integer
        reason:
          type: string
        state:
          type: string
        targetGroupArn:
          type: string
      required:
        - targetGroupArn
      type: object
    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.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
    DeploymentResource.Ec2ScheduledEvent:
      additionalProperties: false
      description: Scheduled AWS maintenance affecting the instance.
      properties:
        code:
          type: string
        description:
          type: string
        eventId:
          type: string
        notAfter:
          $ref: '#/components/schemas/UtcDateTime'
        notBefore:
          $ref: '#/components/schemas/UtcDateTime'
        notBeforeDeadline:
          $ref: '#/components/schemas/UtcDateTime'
      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
    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
    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

````