{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://getzero.dev/contracts/zero.vibe_deploy.runtime_manifest.v1.schema.json",
  "title": "ZERO Vibe Deploy Runtime Manifest v1",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "schema_version",
    "mode",
    "provider",
    "startup_command",
    "healthcheck_path",
    "claim_endpoint",
    "heartbeat_endpoint",
    "runtime_base_url_reporting",
    "required_env_keys",
    "forbidden_env_keys",
    "promotion_gates",
    "paper_run",
    "live_execution_default",
    "live_requires_operator_lease"
  ],
  "properties": {
    "schema_version": { "const": "zero.vibe_deploy.runtime_manifest.v1" },
    "mode": { "const": "paper" },
    "provider": { "const": "railway" },
    "startup_command": { "type": "string", "minLength": 1 },
    "healthcheck_path": { "const": "/health" },
    "claim_endpoint": { "type": "string", "format": "uri" },
    "heartbeat_endpoint": { "type": "string", "format": "uri" },
    "runtime_base_url_reporting": {
      "type": "object",
      "additionalProperties": false,
      "required": ["claim_body_key", "heartbeat_signed_body_key", "validation"],
      "properties": {
        "claim_body_key": { "const": "runtime_base_url" },
        "heartbeat_signed_body_key": { "const": "runtime_base_url" },
        "validation": { "const": "public_http_or_https_no_private_dns" }
      }
    },
    "required_env_keys": {
      "type": "array",
      "minItems": 6,
      "uniqueItems": true,
      "items": { "type": "string", "pattern": "^ZERO_[A-Z0-9_]+$" }
    },
    "forbidden_env_keys": {
      "type": "array",
      "minItems": 1,
      "uniqueItems": true,
      "items": { "type": "string", "minLength": 1 }
    },
    "promotion_gates": {
      "type": "array",
      "minItems": 5,
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": ["key", "status", "evidence"],
        "properties": {
          "key": {
            "enum": [
              "claim_token_consumed",
              "first_heartbeat",
              "private_key_free_runtime",
              "paper_run",
              "live_lease"
            ]
          },
          "status": { "const": "required" },
          "evidence": { "type": "string", "minLength": 1 }
        }
      }
    },
    "paper_run": {
      "type": "object",
      "additionalProperties": false,
      "required": ["endpoint", "audit_path", "journal_path", "sample_payload", "acceptance"],
      "properties": {
        "endpoint": { "const": "/execute" },
        "audit_path": { "const": "/audit/export?limit=100" },
        "journal_path": { "type": "string", "minLength": 1 },
        "sample_payload": {
          "type": "object",
          "additionalProperties": false,
          "required": ["coin", "side", "size", "idempotency_key"],
          "properties": {
            "coin": { "type": "string", "minLength": 1 },
            "side": { "enum": ["buy", "sell"] },
            "size": { "type": "number", "exclusiveMinimum": 0 },
            "idempotency_key": { "type": "string", "minLength": 1 }
          }
        },
        "acceptance": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "mode",
            "exchange_orders_allowed",
            "trace_id_required",
            "journal_entry_required",
            "audit_export_required",
            "control_plane_record_required"
          ],
          "properties": {
            "mode": { "const": "paper" },
            "exchange_orders_allowed": { "const": false },
            "trace_id_required": { "const": true },
            "journal_entry_required": { "const": true },
            "audit_export_required": { "const": true },
            "control_plane_record_required": { "const": true }
          }
        }
      }
    },
    "live_execution_default": { "const": false },
    "live_requires_operator_lease": { "const": true }
  }
}
