{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://getzero.dev/contracts/zero.vibe_deploy.recovery_hardening.v1.schema.json",
  "title": "ZERO Vibe Deploy Recovery Hardening v1",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "schema_version",
    "kind",
    "public",
    "status",
    "current_blocker_after_this",
    "canonical_operator_route",
    "recovery_cases",
    "invariants",
    "public_readbacks",
    "score_promotion_gate"
  ],
  "properties": {
    "schema_version": { "const": "zero.vibe_deploy.recovery_hardening.v1" },
    "kind": { "const": "vibe_deploy_recovery_hardening" },
    "public": { "const": true },
    "status": { "enum": ["ready", "attention"] },
    "current_blocker_after_this": { "type": "string", "minLength": 1 },
    "canonical_operator_route": { "const": "/u/{handle}" },
    "recovery_cases": {
      "type": "array",
      "minItems": 6,
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "key",
          "status",
          "operator_surface",
          "api_surface",
          "trigger",
          "recovery",
          "state_policy",
          "live_boundary",
          "verified_by"
        ],
        "properties": {
          "key": {
            "enum": [
              "lost_unclaimed_claim_token",
              "expired_claim_token_runtime_claim",
              "consumed_claim_token_replay",
              "partial_claim_api_key_orphan",
              "ready_runtime_restart",
              "lease_expiry_live_refusal"
            ]
          },
          "status": { "const": "hardened" },
          "operator_surface": { "type": "string", "minLength": 1 },
          "api_surface": { "type": "string", "minLength": 1 },
          "trigger": { "type": "string", "minLength": 1 },
          "recovery": { "type": "string", "minLength": 1 },
          "state_policy": { "type": "string", "minLength": 1 },
          "live_boundary": { "type": "string", "minLength": 1 },
          "verified_by": {
            "type": "array",
            "minItems": 1,
            "items": { "type": "string", "minLength": 1 }
          }
        }
      }
    },
    "invariants": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "claim_token_ttl_s",
        "claim_token_storage",
        "claim_token_replay_policy",
        "replacement_requires_state",
        "replacement_invalidates_previous_unconsumed_tokens",
        "runtime_claim_expired_status",
        "runtime_claim_consumed_status",
        "runtime_claim_already_claimed_status",
        "orphan_api_key_cleanup_required",
        "heartbeat_nonce_policy",
        "live_requires_operator_lease",
        "live_lease_seconds",
        "private_key_env_allowed",
        "exchange_orders_during_recovery"
      ],
      "properties": {
        "claim_token_ttl_s": { "type": "integer", "minimum": 60, "maximum": 3600 },
        "claim_token_storage": { "const": "sha256_hash_only" },
        "claim_token_replay_policy": { "const": "single_use" },
        "replacement_requires_state": { "const": "unclaimed" },
        "replacement_invalidates_previous_unconsumed_tokens": { "const": true },
        "runtime_claim_expired_status": { "const": 410 },
        "runtime_claim_consumed_status": { "const": 409 },
        "runtime_claim_already_claimed_status": { "const": 409 },
        "orphan_api_key_cleanup_required": { "const": true },
        "heartbeat_nonce_policy": { "const": "monotonic_heartbeat_nonce" },
        "live_requires_operator_lease": { "const": true },
        "live_lease_seconds": { "type": "integer", "minimum": 1, "maximum": 600 },
        "private_key_env_allowed": { "const": false },
        "exchange_orders_during_recovery": { "const": false }
      }
    },
    "public_readbacks": {
      "type": "array",
      "minItems": 5,
      "uniqueItems": true,
      "items": { "type": "string", "pattern": "^/api/" }
    },
    "score_promotion_gate": {
      "type": "object",
      "additionalProperties": false,
      "required": ["public_score_moves_when", "next_score_moving_evidence"],
      "properties": {
        "public_score_moves_when": { "type": "string", "minLength": 1 },
        "next_score_moving_evidence": { "type": "string", "minLength": 1 }
      }
    }
  }
}
