{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://raw.githubusercontent.com/shruggietech/insonic/v1.1.0/schemas/v1.1.0/recording-repair.schema.json",
  "title": "Bounded recording repair decision",
  "type": "object",
  "additionalProperties": false,
  "description": "Durable accepted or unchanged decision using a fixed acoustic evidence basis and finite execution budget.",
  "properties": {
    "kind": {
      "const": "recording-repair",
      "description": "Contract kind."
    },
    "schema_version": {
      "const": "1.1.0",
      "description": "Contract version."
    },
    "recording_id": {
      "$ref": "common.schema.json#/$defs/uuid",
      "description": "Recording identity."
    },
    "revision": {
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991,
      "description": "Accepted current recording revision."
    },
    "document_digest": {
      "type": "string",
      "pattern": "^(?:[a-f0-9]{64})?$",
      "description": "Accepted current document digest."
    },
    "work_id": {
      "$ref": "common.schema.json#/$defs/uuid",
      "description": "Durable repair work identity."
    },
    "status": {
      "enum": [
        "accepted",
        "unchanged"
      ],
      "description": "Whether the accepted current recording was replaced."
    },
    "reason": {
      "enum": [
        "improved",
        "no_repairable_regions",
        "candidate_has_no_timed_cues",
        "candidate_crosses_scope_boundary",
        "candidate_has_no_in_scope_cues",
        "incomparable_evidence",
        "protected_metric_worsened",
        "not_improved"
      ],
      "description": "Candidate decision reason."
    },
    "source_revision": {
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991,
      "description": "Frozen source revision."
    },
    "source_sha256": {
      "type": "string",
      "pattern": "^[a-f0-9]{64}$",
      "description": "Frozen canonical source digest."
    },
    "previous_document_sha256": {
      "type": "string",
      "pattern": "^(?:[a-f0-9]{64})?$",
      "description": "Original accepted document digest."
    },
    "evidence_sha256": {
      "type": "string",
      "pattern": "^(?:[a-f0-9]{64})?$",
      "description": "Fixed acoustic comparison evidence digest."
    },
    "options_sha256": {
      "type": "string",
      "pattern": "^[a-f0-9]{64}$",
      "description": "Fixed comparison tolerances digest."
    },
    "candidate_sha256": {
      "type": "string",
      "pattern": "^(?:[a-f0-9]{64})?$",
      "description": "Accepted candidate digest, or empty for unchanged."
    },
    "selection": {
      "$ref": "#/$defs/selection",
      "description": "Frozen repair scope."
    },
    "policy": {
      "$ref": "pipeline-config.schema.json#/$defs/repair",
      "description": "Normalized finite repair budget."
    },
    "attempts": {
      "type": "object",
      "maxProperties": 16384,
      "propertyNames": {
        "pattern": "^[0-9a-f-]{36}$"
      },
      "additionalProperties": {
        "type": "integer",
        "minimum": 1,
        "maximum": 3,
        "description": "Consumed window executions."
      },
      "description": "Window ID to consumed execution attempts across all retries."
    },
    "before": {
      "type": "array",
      "items": {
        "$ref": "recording-coverage.schema.json#/$defs/track",
        "description": "Track coverage."
      },
      "maxItems": 64,
      "description": "Original per-track metrics."
    },
    "after": {
      "type": "array",
      "items": {
        "$ref": "recording-coverage.schema.json#/$defs/track",
        "description": "Track coverage."
      },
      "maxItems": 64,
      "description": "Candidate metrics, or original metrics when no comparable candidate exists."
    },
    "plan_digest": {
      "type": "string",
      "pattern": "^(?:[a-f0-9]{64})?$",
      "description": "Frozen plan digest, or empty when no windows were elected."
    }
  },
  "required": [
    "kind",
    "schema_version",
    "recording_id",
    "revision",
    "document_digest",
    "work_id",
    "status",
    "reason",
    "source_revision",
    "source_sha256",
    "previous_document_sha256",
    "evidence_sha256",
    "options_sha256",
    "candidate_sha256",
    "selection",
    "policy",
    "attempts",
    "before",
    "after",
    "plan_digest"
  ],
  "$defs": {
    "target": {
      "type": "object",
      "additionalProperties": false,
      "description": "Declared source-clock target or complete replacement scope.",
      "properties": {
        "track_ordinal": {
          "type": "integer",
          "minimum": 0,
          "maximum": 63,
          "description": "Selected track index."
        },
        "start_us": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991,
          "description": "Inclusive source-clock start."
        },
        "end_us": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991,
          "description": "Exclusive source-clock end."
        }
      },
      "required": [
        "track_ordinal",
        "start_us",
        "end_us"
      ]
    },
    "selection": {
      "type": "object",
      "additionalProperties": false,
      "description": "Frozen target, complete cue scope and actual bounded window context.",
      "properties": {
        "targets": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/target",
            "description": "Source target."
          },
          "maxItems": 32,
          "description": "Normalized requested or automatically diagnosed targets."
        },
        "scopes": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/target",
            "description": "Replacement scope."
          },
          "maxItems": 32,
          "description": "Complete cue replacement scopes."
        },
        "windows": {
          "type": "array",
          "items": {
            "type": "object",
            "additionalProperties": false,
            "description": "One selected window.",
            "properties": {
              "window_id": {
                "$ref": "common.schema.json#/$defs/uuid",
                "description": "Window identity."
              },
              "track_ordinal": {
                "type": "integer",
                "minimum": 0,
                "maximum": 63,
                "description": "Selected track index."
              },
              "core": {
                "$ref": "recording-coverage.schema.json#/$defs/span",
                "description": "Window core."
              },
              "context": {
                "$ref": "recording-coverage.schema.json#/$defs/span",
                "description": "Full decoded context interval."
              }
            },
            "required": [
              "window_id",
              "track_ordinal",
              "core",
              "context"
            ]
          },
          "maxItems": 16384,
          "description": "Only these windows may execute."
        },
        "removed_cue_ids": {
          "type": "array",
          "items": {
            "type": "string",
            "description": "Cue identity."
          },
          "maxItems": 65536,
          "description": "Accepted cue IDs replaced inside declared scope."
        }
      },
      "required": [
        "targets",
        "scopes",
        "windows",
        "removed_cue_ids"
      ]
    }
  },
  "examples": [
    {
      "kind": "recording-repair",
      "schema_version": "1.1.0",
      "recording_id": "11111111-1111-4111-8111-111111111111",
      "revision": 1,
      "document_digest": "",
      "work_id": "11111111-1111-4111-8111-111111111111",
      "status": "unchanged",
      "reason": "no_repairable_regions",
      "source_revision": 1,
      "source_sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
      "previous_document_sha256": "",
      "evidence_sha256": "",
      "options_sha256": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
      "candidate_sha256": "",
      "selection": {
        "targets": [],
        "scopes": [],
        "windows": [],
        "removed_cue_ids": []
      },
      "policy": {
        "max_attempts": 1,
        "max_windows": 64,
        "max_duration_us": 300000000
      },
      "attempts": {},
      "before": [],
      "after": [],
      "plan_digest": ""
    }
  ]
}
