{
  "source_count": 7,
  "not_selected_count": 0,
  "adapter_planning_approved_count": 7,
  "live_approval_required_count": 7,
  "provider_approval_state": "adapter_planning_only",
  "live_enablement_allowed": false,
  "fixture_mode_requires_credentials": false,
  "review_principles": [
    "do not approve providers from placeholders",
    "add sanitized schema samples before live adapters",
    "keep fixture mode secret-free",
    "separate projection inputs from sportsbook confirmation",
    "prefer cross-sport reuse when it improves customer-facing depth charts, injuries, schedules, or historical views"
  ],
  "sources": [
    {
      "source_key": "schedule",
      "label": "Game Metadata",
      "provider_hint": "nflverse/nflreadpy schedules",
      "decision_status": "nflverse/nflreadpy schedules",
      "decision_state": "approved_pending_schema",
      "risk_level": "Medium",
      "cadence": "weekly slate plus game-window refresh",
      "required_field_count": 7,
      "optional_field_count": 4,
      "approval_proof": [
        "sanitized schedule schema sample",
        "stable game_id and kickoff_time mapping",
        "game-window classification verified"
      ],
      "schema_fixture_required": true,
      "credential_required_for_fixture_mode": false,
      "live_enablement_allowed": false,
      "notes": ""
    },
    {
      "source_key": "odds",
      "label": "Market Lines",
      "provider_hint": "odds API",
      "decision_status": "The Odds API",
      "decision_state": "approved_pending_schema",
      "risk_level": "High",
      "cadence": "pre-publish and publish-time refresh",
      "required_field_count": 7,
      "optional_field_count": 6,
      "approval_proof": [
        "sanitized player-prop and team-market samples",
        "book, line, odds, and update timestamp present",
        "publish-time refresh path documented",
        "best-line shopping fields preserved"
      ],
      "schema_fixture_required": true,
      "credential_required_for_fixture_mode": false,
      "live_enablement_allowed": false,
      "notes": "Best-line shopping is an active gate, so publish-time odds must be refreshable."
    },
    {
      "source_key": "usage",
      "label": "Usage and Role",
      "provider_hint": "nflverse/nflreadpy participation where available",
      "decision_status": "nflverse/nflreadpy",
      "decision_state": "approved_pending_schema",
      "risk_level": "High",
      "cadence": "weekly after games, with depth-chart overrides before kickoff",
      "required_field_count": 5,
      "optional_field_count": 6,
      "approval_proof": [
        "sanitized usage/participation sample",
        "role fields available before grading",
        "cold-start baseline behavior documented"
      ],
      "schema_fixture_required": true,
      "credential_required_for_fixture_mode": false,
      "live_enablement_allowed": false,
      "notes": ""
    },
    {
      "source_key": "injuries",
      "label": "Injuries and Inactives",
      "provider_hint": "official team reports and 90-minute inactive report",
      "decision_status": "manual CSV overrides",
      "decision_state": "approved_pending_schema",
      "risk_level": "High",
      "cadence": "daily practice reports, final status, and per-window 90-minute inactives",
      "required_field_count": 3,
      "optional_field_count": 4,
      "approval_proof": [
        "official inactive-report sample",
        "injury timestamp sample",
        "projection latency check documented",
        "next-man-up and defensive injury fields represented"
      ],
      "schema_fixture_required": true,
      "credential_required_for_fixture_mode": false,
      "live_enablement_allowed": false,
      "notes": "Projection timestamps must be compared against official inactives."
    },
    {
      "source_key": "team_context",
      "label": "Team Context",
      "provider_hint": "derived from market, nflverse/nflreadpy, and baseline model inputs",
      "decision_status": "Derived nflverse plus market context",
      "decision_state": "approved_pending_schema",
      "risk_level": "High",
      "cadence": "pre-slate and publish-time refresh",
      "required_field_count": 5,
      "optional_field_count": 6,
      "approval_proof": [
        "independent model inputs documented",
        "team total derivation separated from graded edge",
        "pace, efficiency, and game-script fields represented"
      ],
      "schema_fixture_required": true,
      "credential_required_for_fixture_mode": false,
      "live_enablement_allowed": false,
      "notes": "Team totals can anchor context but cannot be the sole source of graded edge."
    },
    {
      "source_key": "matchup",
      "label": "Defensive Matchup",
      "provider_hint": "nflverse/nflreadpy plus optional PFF/FTN enrichment",
      "decision_status": "nflverse/nflreadpy defensive matchup baselines",
      "decision_state": "approved_pending_schema",
      "risk_level": "Medium",
      "cadence": "weekly season-long and recent-window refresh",
      "required_field_count": 2,
      "optional_field_count": 3,
      "approval_proof": [
        "stat-specific defensive rank sample",
        "rank direction normalized so rank 1 is favorable",
        "recent-window sample size included",
        "sos_adjusted flag represented"
      ],
      "schema_fixture_required": true,
      "credential_required_for_fixture_mode": false,
      "live_enablement_allowed": false,
      "notes": ""
    },
    {
      "source_key": "weather",
      "label": "Weather",
      "provider_hint": "weather API",
      "decision_status": "Open-Meteo",
      "decision_state": "approved_pending_schema",
      "risk_level": "Medium",
      "cadence": "daily, then same-day window refresh",
      "required_field_count": 5,
      "optional_field_count": 2,
      "approval_proof": [
        "wind speed and direction sample",
        "roof/venue handling documented",
        "same-day refresh timing documented"
      ],
      "schema_fixture_required": true,
      "credential_required_for_fixture_mode": false,
      "live_enablement_allowed": false,
      "notes": "Wind is the primary NFL weather input, especially for passing and kicking context."
    }
  ]
}