{
  "current_phase": "offline_prep",
  "current_phase_reason": "Remain in offline prep while approval, quota, season/window, or blocker gates are still open.",
  "next_phase": "calls_only_staging",
  "activation_ready": false,
  "provider_calls_allowed": false,
  "live_publish_allowed": false,
  "no_call_safe": true,
  "calls_only_supported": true,
  "publish_supported": true,
  "phase_count": 4,
  "phases": [
    {
      "order": 1,
      "key": "offline_prep",
      "title": "Offline prep",
      "status": "READY",
      "owner": "Codex",
      "entry_criteria": [
        "Quality gate passes in fixture/sample mode.",
        "Provider dry run confirms zero provider calls.",
        "Generated artifacts and release bundle are valid."
      ],
      "exit_criteria": [
        "Activation checklist is available for review.",
        "Open activation items have owners and next actions."
      ],
      "allowed_actions": [
        "Build fixtures.",
        "Validate artifacts.",
        "Review sanitized provider samples.",
        "Update provider documentation."
      ],
      "disallowed_actions": [
        "Do not make live provider calls.",
        "Do not publish live picks."
      ]
    },
    {
      "order": 2,
      "key": "approval_review",
      "title": "Provider and quota review",
      "status": "WAITING",
      "owner": "Ryan/Sacboyz decision",
      "entry_criteria": [
        "Offline prep remains green.",
        "Activation checklist identifies only live-enable items."
      ],
      "exit_criteria": [
        "Provider choices are approved for live calls.",
        "Odds API quota is confirmed available.",
        "Season/window is eligible.",
        "Go/no-go reaches human review state."
      ],
      "allowed_actions": [
        "Review provider choices.",
        "Confirm quota outside the no-call build.",
        "Approve calls-only staging when ready."
      ],
      "disallowed_actions": [
        "Do not enable live publish.",
        "Do not treat adapter-planning approval as live approval."
      ]
    },
    {
      "order": 3,
      "key": "calls_only_staging",
      "title": "Calls-only staging",
      "status": "NOT_STARTED",
      "owner": "Codex/provider review",
      "entry_criteria": [
        "Activation checklist passes.",
        "Calls-only runtime mode is supported.",
        "Human review explicitly approves provider calls."
      ],
      "exit_criteria": [
        "Provider calls succeed within quota.",
        "Normalized outputs pass existing contracts.",
        "Publish-time line and inactives gates remain enforced."
      ],
      "allowed_actions": [
        "Run calls-only provider checks.",
        "Cache raw provider responses securely if approved.",
        "Normalize responses into existing sample contracts."
      ],
      "disallowed_actions": [
        "Do not publish live picks.",
        "Do not store secrets in artifacts."
      ]
    },
    {
      "order": 4,
      "key": "publish_review",
      "title": "Live publish review",
      "status": "NOT_STARTED",
      "owner": "Ryan/Sacboyz decision",
      "entry_criteria": [
        "Calls-only staging is green.",
        "No core data is missing.",
        "No publish-time line gates fail.",
        "Human review approves publish mode."
      ],
      "exit_criteria": [
        "Live publish run completes.",
        "Report remains education-first.",
        "Tracker records runtime and data-source provenance."
      ],
      "allowed_actions": [
        "Publish static docs payload.",
        "Track provider provenance.",
        "Monitor post-run review queue."
      ],
      "disallowed_actions": [
        "Do not bypass no-play/abstain states.",
        "Do not publish if quota, line, inactives, or sample gates fail."
      ]
    }
  ],
  "phase_gate_summary": [
    {
      "phase": "offline_prep",
      "can_start": true,
      "open_gate_count": 0,
      "required_gates": [
        "quality_gate_green",
        "provider_dry_run_no_call",
        "artifact_validation"
      ]
    },
    {
      "phase": "approval_review",
      "can_start": true,
      "open_gate_count": 7,
      "required_gates": [
        "provider_approval",
        "quota_confirmation",
        "season_window",
        "go_no_go_review"
      ]
    },
    {
      "phase": "calls_only_staging",
      "can_start": false,
      "open_gate_count": 1,
      "required_gates": [
        "activation_ready",
        "queue_clear",
        "go_review_required",
        "calls_only_supported"
      ]
    },
    {
      "phase": "publish_review",
      "can_start": false,
      "open_gate_count": 1,
      "required_gates": [
        "calls_only_staging_green",
        "publish_human_approval",
        "live_publish_supported"
      ]
    }
  ],
  "open_activation_item_count": 7,
  "blocker_queue_count": 5,
  "go_no_go_decision": "NO_GO_LIVE_BLOCKED",
  "next_action": "Continue offline prep until provider approval, quota, season/window, and human go/no-go review clear."
}