> ## Documentation Index
> Fetch the complete documentation index at: https://docs.firedrill.run/llms.txt
> Use this file to discover all available pages before exploring further.

# Read a bounded page of recorded run differences

> Requires run.compare in this exact project. Both world-terminal reports are verified against their immutable manifests; current credential, membership, project grant, evidence availability and selection are rechecked after storage reads. Missing evidence returns 404 control.NOT_FOUND; deleted, deletion-requested, expired or changed evidence returns 409 control.CONFLICT; integrity failures return a sanitized 500 control.INTERNAL and unavailable storage a 503 control.INTERNAL. None is an empty comparison. Incompatible inputs remain explicitly marked incompatible: returned entries are descriptive only. Applied redaction also makes comparison descriptive_only with attribution disabled, even when retained input identities match. State changes align by record identity and mutation ordinal, including seed loading, not reconstructed final state or agent-only changes. Operations align by recorded call position, not inferred causal correspondence. Assertions include changed expectations even with unchanged status and actual value; checks are not re-evaluated. Values are the retained, potentially redacted JSON; each is at most 16 KiB, otherwise its exact canonical-JSON byte count and SHA-256 are returned with omitted state. Use each side's evidenceBundleId with the existing authenticated artifact read to access the complete report. Absent means no aligned recorded entry, never an inferred record deletion. Pages contain only changed entries, at most 25 and 1 MiB. The cursor binds project, ordered run pair, manifest digests and kind; it is not authority. No model execution or mutation occurs.



## OpenAPI

````yaml /api-reference/openapi.json get /v1/projects/{projectId}/run-comparisons/details
openapi: 3.1.0
info:
  title: Firedrill Control API
  version: 1.0.0
  description: >-
    The control plane for drills, drill runs, and the worlds they run in. Errors
    always carry the canonical envelope; unsafe operations require an
    Idempotency-Key; long work returns an operation resource.
servers:
  - url: https://api.firedrill.run
security:
  - controlCredential: []
tags:
  - name: authentication
    description: Sessions, CLI exchange, credentials, and verification keys.
    x-group: Authentication
  - name: organizations
    description: Organization members, billing, usage, retention, audit, and exports.
    x-group: Organizations
  - name: projects
    description: Project lifecycle, access, grants, and repository bindings.
    x-group: Projects
  - name: builds
    description: Immutable builds, uploads, source drafts, and world definitions.
    x-group: Builds and source
  - name: tools
    description: Project Tool discovery, approval, source, and revocation.
    x-group: Tool library
  - name: worlds
    description: >-
      Managed environments, world sessions, state, time, reset, faults, forks,
      and snapshots.
    x-group: Environments and sessions
  - name: runs
    description: >-
      Hosted runs, comparisons, attachments, reports, evidence bundles, sharing,
      and exports.
    x-group: Runs and evidence
  - name: browser
    description: Managed browser tests, runs, messages, streams, frames, and artifacts.
    x-group: Browser testing
  - name: callbacks
    description: Callback receiver approval, revocation, and signing material.
    x-group: Callbacks
  - name: github-ci
    description: >-
      GitHub installations, repository automation, CI suites, cases, evidence,
      and checks.
    x-group: GitHub and CI
  - name: authoring
    description: Authoring sessions, proposals, turns, and scenario proposals.
    x-group: Cloud authoring
paths:
  /v1/projects/{projectId}/run-comparisons/details:
    get:
      tags:
        - runs
      summary: Read a bounded page of recorded run differences
      description: >-
        Requires run.compare in this exact project. Both world-terminal reports
        are verified against their immutable manifests; current credential,
        membership, project grant, evidence availability and selection are
        rechecked after storage reads. Missing evidence returns 404
        control.NOT_FOUND; deleted, deletion-requested, expired or changed
        evidence returns 409 control.CONFLICT; integrity failures return a
        sanitized 500 control.INTERNAL and unavailable storage a 503
        control.INTERNAL. None is an empty comparison. Incompatible inputs
        remain explicitly marked incompatible: returned entries are descriptive
        only. Applied redaction also makes comparison descriptive_only with
        attribution disabled, even when retained input identities match. State
        changes align by record identity and mutation ordinal, including seed
        loading, not reconstructed final state or agent-only changes. Operations
        align by recorded call position, not inferred causal correspondence.
        Assertions include changed expectations even with unchanged status and
        actual value; checks are not re-evaluated. Values are the retained,
        potentially redacted JSON; each is at most 16 KiB, otherwise its exact
        canonical-JSON byte count and SHA-256 are returned with omitted state.
        Use each side's evidenceBundleId with the existing authenticated
        artifact read to access the complete report. Absent means no aligned
        recorded entry, never an inferred record deletion. Pages contain only
        changed entries, at most 25 and 1 MiB. The cursor binds project, ordered
        run pair, manifest digests and kind; it is not authority. No model
        execution or mutation occurs.
      operationId: runs.compareDetails
      parameters:
        - name: projectId
          in: path
          required: true
          schema:
            type: string
            pattern: ^prj_[0-9a-z]{12,32}$
        - name: baselineHostedRunId
          in: query
          required: true
          schema:
            type: string
            pattern: ^hrun_[0-9a-z]{12,32}$
        - name: candidateHostedRunId
          in: query
          required: true
          schema:
            type: string
            pattern: ^hrun_[0-9a-z]{12,32}$
        - name: kind
          in: query
          required: true
          schema:
            type: string
            enum:
              - state_changes
              - operations
              - assertions
        - name: cursor
          in: query
          required: false
          schema:
            type: string
            minLength: 1
            maxLength: 4096
        - name: limit
          in: query
          required: false
          schema:
            default: 10
            type: integer
            minimum: 1
            maximum: 25
      responses:
        '200':
          description: Bounded recorded differences
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HostedRunComparisonDetailPage'
        default:
          description: Canonical error envelope
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
components:
  schemas:
    HostedRunComparisonDetailPage:
      type: object
      properties:
        schemaVersion:
          type: number
          enum:
            - 1
        projectId:
          type: string
          pattern: ^prj_[0-9a-z]{12,32}$
        baseline:
          type: object
          properties:
            hostedRunId:
              type: string
              pattern: ^hrun_[0-9a-z]{12,32}$
            evidenceBundleId:
              type: string
              pattern: ^evidence_[0-9a-z]{12,32}$
            runId:
              type: string
              pattern: ^run_[A-Za-z0-9][A-Za-z0-9_-]{5,95}$
            manifestDigest:
              type: string
              pattern: ^sha256:[0-9a-f]{64}$
            redaction:
              type: object
              properties:
                policy:
                  type: string
                  enum:
                    - safe_fields_v2
                applied:
                  type: boolean
                replacements:
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
              required:
                - policy
                - applied
                - replacements
              additionalProperties: false
          required:
            - hostedRunId
            - evidenceBundleId
            - runId
            - manifestDigest
            - redaction
          additionalProperties: false
        candidate:
          type: object
          properties:
            hostedRunId:
              type: string
              pattern: ^hrun_[0-9a-z]{12,32}$
            evidenceBundleId:
              type: string
              pattern: ^evidence_[0-9a-z]{12,32}$
            runId:
              type: string
              pattern: ^run_[A-Za-z0-9][A-Za-z0-9_-]{5,95}$
            manifestDigest:
              type: string
              pattern: ^sha256:[0-9a-f]{64}$
            redaction:
              type: object
              properties:
                policy:
                  type: string
                  enum:
                    - safe_fields_v2
                applied:
                  type: boolean
                replacements:
                  type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
              required:
                - policy
                - applied
                - replacements
              additionalProperties: false
          required:
            - hostedRunId
            - evidenceBundleId
            - runId
            - manifestDigest
            - redaction
          additionalProperties: false
        compatibility:
          type: object
          properties:
            status:
              type: string
              enum:
                - exact_inputs
                - descriptive_only
                - incompatible
            canAttributeBehaviorChange:
              type: boolean
            differences:
              type: array
              items:
                type: string
                enum:
                  - drill
                  - scenario
                  - target
                  - seed
                  - build
                  - package_lock
                  - runtime_controls
            explanation:
              type: string
              minLength: 1
              maxLength: 2000
          required:
            - status
            - canAttributeBehaviorChange
            - differences
            - explanation
          additionalProperties: false
        kind:
          type: string
          enum:
            - state_changes
            - operations
            - assertions
        alignment:
          type: string
          minLength: 1
          maxLength: 2000
        offset:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        total:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        items:
          maxItems: 25
          type: array
          items:
            oneOf:
              - type: object
                properties:
                  key:
                    type: string
                    minLength: 1
                    maxLength: 2048
                  changedFields:
                    minItems: 1
                    maxItems: 32
                    type: array
                    items:
                      type: string
                      minLength: 1
                      maxLength: 64
                  baseline:
                    oneOf:
                      - type: object
                        properties:
                          state:
                            type: string
                            enum:
                              - available
                          value:
                            $ref: >-
                              #/components/schemas/HostedRunComparisonDetailPage___schema0
                          bytes:
                            type: integer
                            minimum: 0
                            maximum: 16384
                          digest:
                            type: string
                            pattern: ^sha256:[0-9a-f]{64}$
                        required:
                          - state
                          - value
                          - bytes
                          - digest
                        additionalProperties: false
                      - type: object
                        properties:
                          state:
                            type: string
                            enum:
                              - omitted
                          reason:
                            type: string
                            enum:
                              - size_limit
                          bytes:
                            type: integer
                            minimum: -9007199254740991
                            maximum: 9007199254740991
                          digest:
                            type: string
                            pattern: ^sha256:[0-9a-f]{64}$
                        required:
                          - state
                          - reason
                          - bytes
                          - digest
                        additionalProperties: false
                      - type: object
                        properties:
                          state:
                            type: string
                            enum:
                              - absent
                        required:
                          - state
                        additionalProperties: false
                  candidate:
                    oneOf:
                      - type: object
                        properties:
                          state:
                            type: string
                            enum:
                              - available
                          value:
                            $ref: >-
                              #/components/schemas/HostedRunComparisonDetailPage___schema0
                          bytes:
                            type: integer
                            minimum: 0
                            maximum: 16384
                          digest:
                            type: string
                            pattern: ^sha256:[0-9a-f]{64}$
                        required:
                          - state
                          - value
                          - bytes
                          - digest
                        additionalProperties: false
                      - type: object
                        properties:
                          state:
                            type: string
                            enum:
                              - omitted
                          reason:
                            type: string
                            enum:
                              - size_limit
                          bytes:
                            type: integer
                            minimum: -9007199254740991
                            maximum: 9007199254740991
                          digest:
                            type: string
                            pattern: ^sha256:[0-9a-f]{64}$
                        required:
                          - state
                          - reason
                          - bytes
                          - digest
                        additionalProperties: false
                      - type: object
                        properties:
                          state:
                            type: string
                            enum:
                              - absent
                        required:
                          - state
                        additionalProperties: false
                  kind:
                    type: string
                    enum:
                      - state_changes
                  identity:
                    type: object
                    properties:
                      packageId:
                        type: string
                        minLength: 1
                        maxLength: 96
                        pattern: ^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$
                      namespace:
                        type: string
                        minLength: 1
                        maxLength: 96
                        pattern: ^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$
                      rowId:
                        type: string
                        minLength: 1
                        maxLength: 512
                      mutation:
                        type: integer
                        minimum: 0
                        exclusiveMinimum: true
                        maximum: 9007199254740991
                    required:
                      - packageId
                      - namespace
                      - rowId
                      - mutation
                    additionalProperties: false
                required:
                  - key
                  - changedFields
                  - baseline
                  - candidate
                  - kind
                  - identity
                additionalProperties: false
              - type: object
                properties:
                  key:
                    type: string
                    minLength: 1
                    maxLength: 2048
                  changedFields:
                    minItems: 1
                    maxItems: 32
                    type: array
                    items:
                      type: string
                      minLength: 1
                      maxLength: 64
                  baseline:
                    oneOf:
                      - type: object
                        properties:
                          state:
                            type: string
                            enum:
                              - available
                          value:
                            $ref: >-
                              #/components/schemas/HostedRunComparisonDetailPage___schema0
                          bytes:
                            type: integer
                            minimum: 0
                            maximum: 16384
                          digest:
                            type: string
                            pattern: ^sha256:[0-9a-f]{64}$
                        required:
                          - state
                          - value
                          - bytes
                          - digest
                        additionalProperties: false
                      - type: object
                        properties:
                          state:
                            type: string
                            enum:
                              - omitted
                          reason:
                            type: string
                            enum:
                              - size_limit
                          bytes:
                            type: integer
                            minimum: -9007199254740991
                            maximum: 9007199254740991
                          digest:
                            type: string
                            pattern: ^sha256:[0-9a-f]{64}$
                        required:
                          - state
                          - reason
                          - bytes
                          - digest
                        additionalProperties: false
                      - type: object
                        properties:
                          state:
                            type: string
                            enum:
                              - absent
                        required:
                          - state
                        additionalProperties: false
                  candidate:
                    oneOf:
                      - type: object
                        properties:
                          state:
                            type: string
                            enum:
                              - available
                          value:
                            $ref: >-
                              #/components/schemas/HostedRunComparisonDetailPage___schema0
                          bytes:
                            type: integer
                            minimum: 0
                            maximum: 16384
                          digest:
                            type: string
                            pattern: ^sha256:[0-9a-f]{64}$
                        required:
                          - state
                          - value
                          - bytes
                          - digest
                        additionalProperties: false
                      - type: object
                        properties:
                          state:
                            type: string
                            enum:
                              - omitted
                          reason:
                            type: string
                            enum:
                              - size_limit
                          bytes:
                            type: integer
                            minimum: -9007199254740991
                            maximum: 9007199254740991
                          digest:
                            type: string
                            pattern: ^sha256:[0-9a-f]{64}$
                        required:
                          - state
                          - reason
                          - bytes
                          - digest
                        additionalProperties: false
                      - type: object
                        properties:
                          state:
                            type: string
                            enum:
                              - absent
                        required:
                          - state
                        additionalProperties: false
                  kind:
                    type: string
                    enum:
                      - operations
                  identity:
                    type: object
                    properties:
                      position:
                        type: integer
                        minimum: 0
                        exclusiveMinimum: true
                        maximum: 9007199254740991
                    required:
                      - position
                    additionalProperties: false
                required:
                  - key
                  - changedFields
                  - baseline
                  - candidate
                  - kind
                  - identity
                additionalProperties: false
              - type: object
                properties:
                  key:
                    type: string
                    minLength: 1
                    maxLength: 2048
                  changedFields:
                    minItems: 1
                    maxItems: 32
                    type: array
                    items:
                      type: string
                      minLength: 1
                      maxLength: 64
                  baseline:
                    oneOf:
                      - type: object
                        properties:
                          state:
                            type: string
                            enum:
                              - available
                          value:
                            $ref: >-
                              #/components/schemas/HostedRunComparisonDetailPage___schema0
                          bytes:
                            type: integer
                            minimum: 0
                            maximum: 16384
                          digest:
                            type: string
                            pattern: ^sha256:[0-9a-f]{64}$
                        required:
                          - state
                          - value
                          - bytes
                          - digest
                        additionalProperties: false
                      - type: object
                        properties:
                          state:
                            type: string
                            enum:
                              - omitted
                          reason:
                            type: string
                            enum:
                              - size_limit
                          bytes:
                            type: integer
                            minimum: -9007199254740991
                            maximum: 9007199254740991
                          digest:
                            type: string
                            pattern: ^sha256:[0-9a-f]{64}$
                        required:
                          - state
                          - reason
                          - bytes
                          - digest
                        additionalProperties: false
                      - type: object
                        properties:
                          state:
                            type: string
                            enum:
                              - absent
                        required:
                          - state
                        additionalProperties: false
                  candidate:
                    oneOf:
                      - type: object
                        properties:
                          state:
                            type: string
                            enum:
                              - available
                          value:
                            $ref: >-
                              #/components/schemas/HostedRunComparisonDetailPage___schema0
                          bytes:
                            type: integer
                            minimum: 0
                            maximum: 16384
                          digest:
                            type: string
                            pattern: ^sha256:[0-9a-f]{64}$
                        required:
                          - state
                          - value
                          - bytes
                          - digest
                        additionalProperties: false
                      - type: object
                        properties:
                          state:
                            type: string
                            enum:
                              - omitted
                          reason:
                            type: string
                            enum:
                              - size_limit
                          bytes:
                            type: integer
                            minimum: -9007199254740991
                            maximum: 9007199254740991
                          digest:
                            type: string
                            pattern: ^sha256:[0-9a-f]{64}$
                        required:
                          - state
                          - reason
                          - bytes
                          - digest
                        additionalProperties: false
                      - type: object
                        properties:
                          state:
                            type: string
                            enum:
                              - absent
                        required:
                          - state
                        additionalProperties: false
                  kind:
                    type: string
                    enum:
                      - assertions
                  identity:
                    type: object
                    properties:
                      checkpointId:
                        type: string
                        minLength: 1
                        maxLength: 96
                        pattern: ^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$
                      assertionId:
                        type: string
                        minLength: 1
                        maxLength: 96
                        pattern: ^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$
                    required:
                      - checkpointId
                      - assertionId
                    additionalProperties: false
                required:
                  - key
                  - changedFields
                  - baseline
                  - candidate
                  - kind
                  - identity
                additionalProperties: false
        nextCursor:
          type: string
          minLength: 1
          maxLength: 4096
      required:
        - schemaVersion
        - projectId
        - baseline
        - candidate
        - compatibility
        - kind
        - alignment
        - offset
        - total
        - items
      additionalProperties: false
    ErrorEnvelope:
      type: object
      properties:
        code:
          type: string
          pattern: ^(control|world)\.[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$
        message:
          type: string
          minLength: 1
        correlationId:
          type: string
          minLength: 1
        retryable:
          type: boolean
        retryAfterMs:
          type: integer
          exclusiveMinimum: 0
          maximum: 9007199254740991
        operationId:
          type: string
        source:
          type: string
          enum:
            - platform
            - simulated_provider
        issues:
          type: array
          items:
            type: object
            properties:
              path:
                type: string
              code:
                type: string
              message:
                type: string
            required:
              - path
              - code
              - message
            additionalProperties: false
        details:
          type: object
          propertyNames:
            type: string
          additionalProperties: {}
        evidence:
          type: object
          properties:
            sessionId:
              type: string
            runId:
              type: string
            journalSeq:
              type: integer
              minimum: 0
              maximum: 9007199254740991
            buildHash:
              type: string
          additionalProperties: false
      required:
        - code
        - message
        - correlationId
        - retryable
        - source
      additionalProperties: true
    HostedRunComparisonDetailPage___schema0:
      description: Any JSON-compatible value
  securitySchemes:
    controlCredential:
      type: http
      scheme: bearer
      description: Opaque control credential

````