{
  "answer": {
    "actual_slips": {
      "input_issues": 0,
      "normal_stake_placed": 0,
      "normal_stake_profit_units": 0,
      "normal_stake_roi": 0.0,
      "normal_stake_settled": 0,
      "normal_stake_settled_stake_units": 0,
      "open": 0,
      "open_stake_units": 0,
      "placed": 0,
      "profit_units": 0,
      "proof_only_placed": 0,
      "proof_only_profit_units": 0,
      "proof_only_roi": 0.0,
      "proof_only_settled": 0,
      "proof_only_settled_stake_units": 0,
      "roi": 0.0,
      "settled": 0,
      "settled_stake_units": 0,
      "source": "data/actual_bets.csv",
      "unclassified_placed": 0,
      "unclassified_profit_units": 0,
      "unclassified_roi": 0.0,
      "unclassified_settled": 0,
      "unclassified_settled_stake_units": 0
    },
    "bet_now": "none",
    "bet_permission": "none",
    "closest_trigger": {
      "command_template": {
        "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
        "mode": "template",
        "placeholders": [
          {
            "field": "decimal_odds",
            "kind": "decimal_odds",
            "label": "Live decimal odds",
            "minimum": "2.198",
            "placeholder": "LIVE_DECIMAL_ODDS",
            "required": true
          },
          {
            "field": "source",
            "kind": "operator_source",
            "label": "Bookmaker/operator",
            "placeholder": "OPERATOR_BOOKMAKER",
            "required": true
          }
        ],
        "requires_replacement": true
      },
      "commands": {
        "preview_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
        "record_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
        "record_price_and_refresh": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
        "rerun": "./run_daily_goal.sh 2026-06-21 2"
      },
      "expected_value": "0.0034",
      "input_fields": [
        {
          "kind": "decimal_odds",
          "label": "Live decimal odds",
          "minimum": "2.198",
          "name": "decimal_odds",
          "placeholder": "LIVE_DECIMAL_ODDS",
          "required": true
        },
        {
          "kind": "operator_source",
          "label": "Bookmaker/operator",
          "name": "source",
          "placeholder": "OPERATOR_BOOKMAKER",
          "required": true
        },
        {
          "default": "live trigger price",
          "kind": "text",
          "label": "Notes",
          "name": "notes",
          "required": false
        }
      ],
      "kickoff_local": "2026-06-21T20:00+01:00",
      "market": "Under 2.5",
      "match": "Belgium v Iran",
      "model_probability": "0.4733",
      "needed_input": "price",
      "needed_odds": "2.198",
      "news": {
        "checked_at": "2026-06-21T07:32:00.796985+00:00",
        "published_at": "2026-06-20T22:38:57Z | 2026-06-21T05:35:00Z | 2026-06-20T18:59:06Z",
        "source": "https://news.google.com/rss/articles/CBMivAFBVV95cUxQZ18tR2hhc2tEdE4tRnR0RkZyVTVYbWRmb25ZLVpGZVkzRUIxWjEzRnhPTWI0eU9uVmxGTmVXSVh3b2NTcm5ER29jczV0M0hKem1LTXNWNlFRU1ZvMFZVU0RNRVBZWlNYUWdRaVA3emotOW5yRk5xbzFKWExlR3lLX2xPUDlFZXFEZk5vODZueUVUMzlnSXpQQmZBajdPLTl3cXhqQ01EOFZpdE96V1pGWGtOb0Jya19uaGZsYw?oc=5 | https://news.google.com/rss/articles/CBMiiAFBVV95cUxNQXZETWdpTHcwMmlZYmNOajhTTW9qQXhEWU5RQ2ltWEZxWnU5S0F3V0tINWtxdTFwZlNNdVBaakNTcHNLbi1nOTZ6YnJEb1Zwank0SWJPdm9ibFF5WERBT0U4d3AtT1RNT3JsTWR3RENpVFB3c2NZLWlneDVBeXlubDQ0clJMajRs?oc=5 | https://news.google.com/rss/articles/CBMiuAFBVV95cUxNQ0piRjVpYTJHNWxsN21ucWRQajFnOGdlSnpwRTh2cGVJMmh2RnhPTGZmTnQ2ckxOazQ5Y0w3QTNPaGRCcUZHZUFydmRPQzVPOTRKRE1jTkt5eHNmcUl2Wlg0MjFNeDdONFFtclVhSWMwbWNqLTRTMDZ4YURxRHZfeWZtTXp2ZDczY3JhQXdaWWt3Njlac1J1U1E0c2lVaVNYVGU3ZmFBVGRXZjZMNFBrT3JxUGZPMll2?oc=5",
        "stake_gate_cleared": true,
        "status": "news_matched",
        "status_label": "news_matched",
        "summary": "injury: Belgium winger Doku ruled out of World Cup match against Iran due to illness - FlashScore UK | lineup: Belgium vs Iran – Predicted lineup and team news - Yahoo Sports | lineup: Belgium vs Iran Predicted Lineups & Team News - Betfred Insights"
      },
      "price_move": "+0.078 (3.7%)",
      "role": "closest_price_trigger",
      "row_number": 1,
      "seen_odds": "2.12",
      "source": "The Odds API soccer_fifa_world_cup: Matchbook (API)",
      "stake_units": "0",
      "watch_window": "in 9h 28m; final 2026-06-21T19:40+01:00",
      "why": "No stake now; watch for 2.198+ model price trigger and complete price, then rerun. stress probability 47.3%; price 2.12; conservative EV 0.3%; break-even odds 2.113; bet odds 2.198 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: Matchbook (API); news: injury: Belgium winger Doku ruled out of World Cup match against Iran due to illness - FlashScore UK | lineup: Belgium vs Iran – Predicted lineup and team news - Yahoo Sports | lineup: Belgium vs Iran Predicted Lineups &; decision: price below World Cup EV gate"
    },
    "command_template": {
      "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
      "mode": "template",
      "placeholders": [
        {
          "field": "decimal_odds",
          "kind": "decimal_odds",
          "label": "Live decimal odds",
          "minimum": "2.198",
          "placeholder": "LIVE_DECIMAL_ODDS",
          "required": true
        },
        {
          "field": "source",
          "kind": "operator_source",
          "label": "Bookmaker/operator",
          "placeholder": "OPERATOR_BOOKMAKER",
          "required": true
        }
      ],
      "requires_replacement": true
    },
    "commands": {
      "preview_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
      "record_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
      "record_price_and_refresh": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
      "rerun": "./run_daily_goal.sh 2026-06-21 2"
    },
    "gate_reason": "no stake; seen 2.12 is EV 0.3%; needs 2.198+; operator/API price confirmed; news gate cleared",
    "input_fields": [
      {
        "kind": "decimal_odds",
        "label": "Live decimal odds",
        "minimum": "2.198",
        "name": "decimal_odds",
        "placeholder": "LIVE_DECIMAL_ODDS",
        "required": true
      },
      {
        "kind": "operator_source",
        "label": "Bookmaker/operator",
        "name": "source",
        "placeholder": "OPERATOR_BOOKMAKER",
        "required": true
      },
      {
        "default": "live trigger price",
        "kind": "text",
        "label": "Notes",
        "name": "notes",
        "required": false
      }
    ],
    "model": {
      "expected_value": "0.0034",
      "probability": "0.4733"
    },
    "needed_input": "price",
    "needed_odds": "2.198",
    "next_market": "Under 2.5",
    "next_match": "Belgium v Iran",
    "next_step": "preview_price",
    "next_watch": {
      "command_template": {
        "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
        "mode": "template",
        "placeholders": [
          {
            "field": "decimal_odds",
            "kind": "decimal_odds",
            "label": "Live decimal odds",
            "minimum": "2.198",
            "placeholder": "LIVE_DECIMAL_ODDS",
            "required": true
          },
          {
            "field": "source",
            "kind": "operator_source",
            "label": "Bookmaker/operator",
            "placeholder": "OPERATOR_BOOKMAKER",
            "required": true
          }
        ],
        "requires_replacement": true
      },
      "commands": {
        "preview_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
        "record_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
        "record_price_and_refresh": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
        "rerun": "./run_daily_goal.sh 2026-06-21 2"
      },
      "expected_value": "0.0034",
      "input_fields": [
        {
          "kind": "decimal_odds",
          "label": "Live decimal odds",
          "minimum": "2.198",
          "name": "decimal_odds",
          "placeholder": "LIVE_DECIMAL_ODDS",
          "required": true
        },
        {
          "kind": "operator_source",
          "label": "Bookmaker/operator",
          "name": "source",
          "placeholder": "OPERATOR_BOOKMAKER",
          "required": true
        },
        {
          "default": "live trigger price",
          "kind": "text",
          "label": "Notes",
          "name": "notes",
          "required": false
        }
      ],
      "kickoff_local": "2026-06-21T20:00+01:00",
      "market": "Under 2.5",
      "match": "Belgium v Iran",
      "model_probability": "0.4733",
      "needed_input": "price",
      "needed_odds": "2.198",
      "news": {
        "checked_at": "2026-06-21T07:32:00.796985+00:00",
        "published_at": "2026-06-20T22:38:57Z | 2026-06-21T05:35:00Z | 2026-06-20T18:59:06Z",
        "source": "https://news.google.com/rss/articles/CBMivAFBVV95cUxQZ18tR2hhc2tEdE4tRnR0RkZyVTVYbWRmb25ZLVpGZVkzRUIxWjEzRnhPTWI0eU9uVmxGTmVXSVh3b2NTcm5ER29jczV0M0hKem1LTXNWNlFRU1ZvMFZVU0RNRVBZWlNYUWdRaVA3emotOW5yRk5xbzFKWExlR3lLX2xPUDlFZXFEZk5vODZueUVUMzlnSXpQQmZBajdPLTl3cXhqQ01EOFZpdE96V1pGWGtOb0Jya19uaGZsYw?oc=5 | https://news.google.com/rss/articles/CBMiiAFBVV95cUxNQXZETWdpTHcwMmlZYmNOajhTTW9qQXhEWU5RQ2ltWEZxWnU5S0F3V0tINWtxdTFwZlNNdVBaakNTcHNLbi1nOTZ6YnJEb1Zwank0SWJPdm9ibFF5WERBT0U4d3AtT1RNT3JsTWR3RENpVFB3c2NZLWlneDVBeXlubDQ0clJMajRs?oc=5 | https://news.google.com/rss/articles/CBMiuAFBVV95cUxNQ0piRjVpYTJHNWxsN21ucWRQajFnOGdlSnpwRTh2cGVJMmh2RnhPTGZmTnQ2ckxOazQ5Y0w3QTNPaGRCcUZHZUFydmRPQzVPOTRKRE1jTkt5eHNmcUl2Wlg0MjFNeDdONFFtclVhSWMwbWNqLTRTMDZ4YURxRHZfeWZtTXp2ZDczY3JhQXdaWWt3Njlac1J1U1E0c2lVaVNYVGU3ZmFBVGRXZjZMNFBrT3JxUGZPMll2?oc=5",
        "stake_gate_cleared": true,
        "status": "news_matched",
        "status_label": "news_matched",
        "summary": "injury: Belgium winger Doku ruled out of World Cup match against Iran due to illness - FlashScore UK | lineup: Belgium vs Iran – Predicted lineup and team news - Yahoo Sports | lineup: Belgium vs Iran Predicted Lineups & Team News - Betfred Insights"
      },
      "price_move": "+0.078 (3.7%)",
      "role": "next_chronological_watch",
      "row_number": 1,
      "seen_odds": "2.12",
      "source": "The Odds API soccer_fifa_world_cup: Matchbook (API)",
      "stake_units": "0",
      "watch_window": "in 9h 28m; final 2026-06-21T19:40+01:00",
      "why": "No stake now; watch for 2.198+ model price trigger and complete price, then rerun. stress probability 47.3%; price 2.12; conservative EV 0.3%; break-even odds 2.113; bet odds 2.198 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: Matchbook (API); news: injury: Belgium winger Doku ruled out of World Cup match against Iran due to illness - FlashScore UK | lineup: Belgium vs Iran – Predicted lineup and team news - Yahoo Sports | lineup: Belgium vs Iran Predicted Lineups &; decision: price below World Cup EV gate"
    },
    "normal_stake_allowed": false,
    "odds": {
      "needed": "2.198",
      "price_move": "+0.078 (3.7%)",
      "seen": "2.12",
      "source": "The Odds API soccer_fifa_world_cup: Matchbook (API)"
    },
    "one_line": "No bet now. Next kickoff watch: Belgium v Iran Under 2.5; record only if a real bookmaker reaches 2.198+.",
    "proof": {
      "actual_placed": 0,
      "actual_profit_units": 0,
      "actual_settled": 0,
      "normal_stake_actual_placed": 0,
      "normal_stake_actual_settled": 0,
      "proof_only_actual_placed": 0,
      "proof_only_actual_settled": 0,
      "proof_state": "PROVE_FIRST",
      "recommendation_profit_units": 0,
      "recommendation_settled": 0,
      "shadow_brier": 0.262498,
      "shadow_forced_profit_units": -1.72,
      "shadow_settled": 40,
      "unclassified_actual_placed": 0,
      "unclassified_actual_settled": 0
    },
    "proof_plan": {},
    "proof_stake_allowed": false,
    "row_number": 1,
    "settlement_plan": {},
    "status": "BLOCKED",
    "viability": {
      "actual_placed": 0,
      "actual_settled": 0,
      "default_ev_gate_bets": "6",
      "default_ev_gate_min_supported_bets": 200,
      "income_staking": "not_ready",
      "normal_stake_actual_placed": 0,
      "normal_stake_actual_settled": 0,
      "one_line": "Not ready for income staking: 0 actual placements; broad positive-EV backtest ROI -3.1%; 0 settled staked live recommendations; default 5% EV gate has 6 historical bets",
      "proof_only_actual_placed": 0,
      "proof_only_actual_settled": 0,
      "reasons": [
        "0 actual placements",
        "broad positive-EV backtest ROI -3.1%",
        "0 settled staked live recommendations",
        "default 5% EV gate has 6 historical bets",
        "no supported 5% EV segment",
        "0 settled actual bookmaker placements"
      ],
      "recommendation_settled": 0,
      "shadow_forced_profit_units": -1.72,
      "shadow_settled": 40,
      "state": "PROVE_FIRST",
      "unclassified_actual_placed": 0,
      "unclassified_actual_settled": 0
    },
    "watch_required": true
  },
  "artifacts": {
    "actual_bets": "data/actual_bets.csv",
    "briefing": "results/daily_briefing.md",
    "daily_card": "/Users/benluong/Library/CloudStorage/GoogleDrive-btl101@gmail.com/My Drive/claude/football betting/results/daily_betting_card.csv",
    "doctor": "results/pipeline_doctor.md",
    "operator_action_queue": "results/operator_action_queue.csv",
    "world_cup_card": "results/world_cup_daily_card.csv",
    "world_cup_news": "results/world_cup_news_context.csv"
  },
  "as_of": "2026-06-21T07:32:00.796985+00:00",
  "as_of_local": "2026-06-21T08:32:00.796985+01:00",
  "bet_now": "none",
  "bet_permission": "none",
  "bet_ticket": [
    "Real-money ticket: none. Do not stake unless a row appears in `Actionable Bets` after a fresh rerun.",
    "Closest conditional trigger: Belgium v Iran Under 2.5; current 2.12 from The Odds API soccer_fifa_world_cup: Matchbook (API), needs 2.198+; complete price and rerun before any stake decision.",
    "Trigger workflow template: only if a live bookmaker reaches 2.198+ model price trigger, replace `LIVE_DECIMAL_ODDS` with the live bookmaker price and `OPERATOR_BOOKMAKER` with the bookmaker/source you checked before running; run `python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run`, then `python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record`."
  ],
  "blockers": [
    "Watch-only: 9 World Cup operator/API price rows were checked and still sit below the EV gate; closest confirmed price is Belgium v Iran Under 2.5 current 2.12 from The Odds API soccer_fifa_world_cup: Matchbook (API) (EV 0.3%; needs 2.198+ for the 4% EV gate; needed input: price)."
  ],
  "candidate_rows": [],
  "closest_trigger_row": {
    "action_type": "watch_price",
    "command": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
    "command_template": {
      "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
      "mode": "template",
      "placeholders": [
        {
          "field": "decimal_odds",
          "kind": "decimal_odds",
          "label": "Live decimal odds",
          "minimum": "2.198",
          "placeholder": "LIVE_DECIMAL_ODDS",
          "required": true
        },
        {
          "field": "source",
          "kind": "operator_source",
          "label": "Bookmaker/operator",
          "placeholder": "OPERATOR_BOOKMAKER",
          "required": true
        }
      ],
      "requires_replacement": true
    },
    "commands": {
      "preview_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
      "record_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
      "record_price_and_refresh": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
      "rerun": "./run_daily_goal.sh 2026-06-21 2"
    },
    "date_utc": "2026-06-21T19:00:00Z",
    "expected_value": "0.0034",
    "input_fields": [
      {
        "kind": "decimal_odds",
        "label": "Live decimal odds",
        "minimum": "2.198",
        "name": "decimal_odds",
        "placeholder": "LIVE_DECIMAL_ODDS",
        "required": true
      },
      {
        "kind": "operator_source",
        "label": "Bookmaker/operator",
        "name": "source",
        "placeholder": "OPERATOR_BOOKMAKER",
        "required": true
      },
      {
        "default": "live trigger price",
        "kind": "text",
        "label": "Notes",
        "name": "notes",
        "required": false
      }
    ],
    "kickoff_local": "2026-06-21T20:00+01:00",
    "market": "Under 2.5",
    "match": "Belgium v Iran",
    "model_probability": "0.4733",
    "needed_input": "price",
    "needed_odds": "2.198",
    "news_command": "",
    "preview_command": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
    "price_move": "+0.078 (3.7%)",
    "priority": "2",
    "recommendation": "WATCH_ONLY",
    "refresh_command": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
    "rerun_command": "./run_daily_goal.sh 2026-06-21 2",
    "row_number": 1,
    "scope": "world_cup",
    "seen_odds": "2.12",
    "source": "The Odds API soccer_fifa_world_cup: Matchbook (API)",
    "stake_units": "0",
    "thresholds": {
      "expected_value": "0.0034",
      "kickoff_local": "2026-06-21T20:00+01:00",
      "model_probability": "0.4733",
      "needed_odds": "2.198",
      "price_move": "+0.078 (3.7%)",
      "seen_odds": "2.12",
      "source": "The Odds API soccer_fifa_world_cup: Matchbook (API)",
      "stake_units": "0",
      "watch_rank": "1",
      "watch_window": "in 9h 28m; final 2026-06-21T19:40+01:00"
    },
    "watch_rank": "1",
    "watch_window": "in 9h 28m; final 2026-06-21T19:40+01:00",
    "why": "No stake now; watch for 2.198+ model price trigger and complete price, then rerun. stress probability 47.3%; price 2.12; conservative EV 0.3%; break-even odds 2.113; bet odds 2.198 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: Matchbook (API); news: injury: Belgium winger Doku ruled out of World Cup match against Iran due to illness - FlashScore UK | lineup: Belgium vs Iran – Predicted lineup and team news - Yahoo Sports | lineup: Belgium vs Iran Predicted Lineups &; decision: price below World Cup EV gate",
    "workflow": {
      "command_template": {
        "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
        "mode": "template",
        "placeholders": [
          {
            "field": "decimal_odds",
            "kind": "decimal_odds",
            "label": "Live decimal odds",
            "minimum": "2.198",
            "placeholder": "LIVE_DECIMAL_ODDS",
            "required": true
          },
          {
            "field": "source",
            "kind": "operator_source",
            "label": "Bookmaker/operator",
            "placeholder": "OPERATOR_BOOKMAKER",
            "required": true
          }
        ],
        "requires_replacement": true
      },
      "commands": {
        "preview_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
        "record_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
        "record_price_and_refresh": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
        "rerun": "./run_daily_goal.sh 2026-06-21 2"
      },
      "input_fields": [
        {
          "kind": "decimal_odds",
          "label": "Live decimal odds",
          "minimum": "2.198",
          "name": "decimal_odds",
          "placeholder": "LIVE_DECIMAL_ODDS",
          "required": true
        },
        {
          "kind": "operator_source",
          "label": "Bookmaker/operator",
          "name": "source",
          "placeholder": "OPERATOR_BOOKMAKER",
          "required": true
        },
        {
          "default": "live trigger price",
          "kind": "text",
          "label": "Notes",
          "name": "notes",
          "required": false
        }
      ],
      "next_step": "preview_price",
      "thresholds": {
        "expected_value": "0.0034",
        "kickoff_local": "2026-06-21T20:00+01:00",
        "model_probability": "0.4733",
        "needed_odds": "2.198",
        "price_move": "+0.078 (3.7%)",
        "seen_odds": "2.12",
        "source": "The Odds API soccer_fifa_world_cup: Matchbook (API)",
        "stake_units": "0",
        "watch_rank": "1",
        "watch_window": "in 9h 28m; final 2026-06-21T19:40+01:00"
      }
    }
  },
  "commands": {
    "preview_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
    "record_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
    "record_price_and_refresh": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
    "rerun": "./run_daily_goal.sh 2026-06-21 2"
  },
  "current_action": {
    "action": "watch_price",
    "action_type": "watch_price",
    "bet_permission": "none",
    "command": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
    "command_template": {
      "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
      "mode": "template",
      "placeholders": [
        {
          "field": "decimal_odds",
          "kind": "decimal_odds",
          "label": "Live decimal odds",
          "minimum": "2.198",
          "placeholder": "LIVE_DECIMAL_ODDS",
          "required": true
        },
        {
          "field": "source",
          "kind": "operator_source",
          "label": "Bookmaker/operator",
          "placeholder": "OPERATOR_BOOKMAKER",
          "required": true
        }
      ],
      "requires_replacement": true
    },
    "commands": {
      "preview_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
      "record_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
      "record_price_and_refresh": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
      "rerun": "./run_daily_goal.sh 2026-06-21 2"
    },
    "date_utc": "2026-06-21T19:00:00Z",
    "expected_value": "0.0034",
    "input_fields": [
      {
        "kind": "decimal_odds",
        "label": "Live decimal odds",
        "minimum": "2.198",
        "name": "decimal_odds",
        "placeholder": "LIVE_DECIMAL_ODDS",
        "required": true
      },
      {
        "kind": "operator_source",
        "label": "Bookmaker/operator",
        "name": "source",
        "placeholder": "OPERATOR_BOOKMAKER",
        "required": true
      },
      {
        "default": "live trigger price",
        "kind": "text",
        "label": "Notes",
        "name": "notes",
        "required": false
      }
    ],
    "kickoff_local": "2026-06-21T20:00+01:00",
    "market": "Under 2.5",
    "match": "Belgium v Iran",
    "model_probability": "0.4733",
    "needed_odds": "2.198",
    "news_command": "",
    "normal_stake_allowed": false,
    "preview_command": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
    "price_move": "+0.078 (3.7%)",
    "proof_stake_allowed": false,
    "recommendation": "WATCH_ONLY",
    "refresh_command": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
    "required_input": "price",
    "rerun_command": "./run_daily_goal.sh 2026-06-21 2",
    "row_number": 1,
    "scope": "world_cup",
    "seen_odds": "2.12",
    "source": "The Odds API soccer_fifa_world_cup: Matchbook (API)",
    "stake_units": "0",
    "summary": "No stake now; watch for 2.198+ model price trigger and complete price, then rerun. stress probability 47.3%; price 2.12; conservative EV 0.3%; break-even odds 2.113; bet odds 2.198 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: Matchbook (API); news: injury: Belgium winger Doku ruled out of World Cup match against Iran due to illness - FlashScore UK | lineup: Belgium vs Iran – Predicted lineup and team news - Yahoo Sports | lineup: Belgium vs Iran Predicted Lineups &; decision: price below World Cup EV gate",
    "thresholds": {
      "expected_value": "0.0034",
      "kickoff_local": "2026-06-21T20:00+01:00",
      "model_probability": "0.4733",
      "needed_odds": "2.198",
      "price_move": "+0.078 (3.7%)",
      "seen_odds": "2.12",
      "source": "The Odds API soccer_fifa_world_cup: Matchbook (API)",
      "stake_units": "0",
      "watch_rank": "1",
      "watch_window": "in 9h 28m; final 2026-06-21T19:40+01:00"
    },
    "watch_rank": "1",
    "watch_required": true,
    "watch_window": "in 9h 28m; final 2026-06-21T19:40+01:00",
    "why": "No stake now; watch for 2.198+ model price trigger and complete price, then rerun. stress probability 47.3%; price 2.12; conservative EV 0.3%; break-even odds 2.113; bet odds 2.198 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: Matchbook (API); news: injury: Belgium winger Doku ruled out of World Cup match against Iran due to illness - FlashScore UK | lineup: Belgium vs Iran – Predicted lineup and team news - Yahoo Sports | lineup: Belgium vs Iran Predicted Lineups &; decision: price below World Cup EV gate",
    "workflow": {
      "command_template": {
        "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
        "mode": "template",
        "placeholders": [
          {
            "field": "decimal_odds",
            "kind": "decimal_odds",
            "label": "Live decimal odds",
            "minimum": "2.198",
            "placeholder": "LIVE_DECIMAL_ODDS",
            "required": true
          },
          {
            "field": "source",
            "kind": "operator_source",
            "label": "Bookmaker/operator",
            "placeholder": "OPERATOR_BOOKMAKER",
            "required": true
          }
        ],
        "requires_replacement": true
      },
      "commands": {
        "preview_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
        "record_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
        "record_price_and_refresh": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
        "rerun": "./run_daily_goal.sh 2026-06-21 2"
      },
      "input_fields": [
        {
          "kind": "decimal_odds",
          "label": "Live decimal odds",
          "minimum": "2.198",
          "name": "decimal_odds",
          "placeholder": "LIVE_DECIMAL_ODDS",
          "required": true
        },
        {
          "kind": "operator_source",
          "label": "Bookmaker/operator",
          "name": "source",
          "placeholder": "OPERATOR_BOOKMAKER",
          "required": true
        },
        {
          "default": "live trigger price",
          "kind": "text",
          "label": "Notes",
          "name": "notes",
          "required": false
        }
      ],
      "next_step": "preview_price",
      "thresholds": {
        "expected_value": "0.0034",
        "kickoff_local": "2026-06-21T20:00+01:00",
        "model_probability": "0.4733",
        "needed_odds": "2.198",
        "price_move": "+0.078 (3.7%)",
        "seen_odds": "2.12",
        "source": "The Odds API soccer_fifa_world_cup: Matchbook (API)",
        "stake_units": "0",
        "watch_rank": "1",
        "watch_window": "in 9h 28m; final 2026-06-21T19:40+01:00"
      }
    }
  },
  "doctor_status": "WATCH_ONLY",
  "evidence": "0 settled staked recommendation(s); 40 settled shadow zero-stake row(s)",
  "fixture_sheet": [
    {
      "action": "Settled 0-0; no staked bet; zero-stake audit only",
      "day": "Today",
      "fixture": "Ecuador v Curaçao",
      "model": "Ecuador 77.0%; xG 3.10; O2.5 59.9% / BTTS 43.7%",
      "odds_trigger": "2 market rows; settled Over 2.5 1.71; model age 44d",
      "result": "0-0"
    },
    {
      "action": "No market checks; refresh World Cup artifacts",
      "day": "Today",
      "fixture": "Spain v Saudi Arabia",
      "model": "Spain 83.2%; xG 3.30; O2.5 64.0% / BTTS 39.6%",
      "odds_trigger": "model scrape age 44d",
      "result": "pending"
    },
    {
      "action": "No bet Under 2.5; needs 2.198+; price",
      "day": "Today",
      "fixture": "Belgium v Iran",
      "model": "Belgium 63.5%; xG 2.60; O2.5 48.2% / BTTS 44.5%",
      "odds_trigger": "2 API price checks; nearest Under 2.5 2.12 needs 2.198+; The Odds API soccer_fifa_world_cup:...",
      "result": "pending"
    },
    {
      "action": "No bet Over 2.5; needs 2.096+",
      "day": "Today",
      "fixture": "Uruguay v Cape Verde",
      "model": "Uruguay 65.7%; xG 2.70; O2.5 50.6% / BTTS 45.3%",
      "odds_trigger": "2 API price checks; nearest Over 2.5 2.32 needs 2.096+; The Odds API soccer_fifa_world_cup: B...",
      "result": "pending"
    },
    {
      "action": "No bet Under 2.5; needs 2.076+; price",
      "day": "Tomorrow",
      "fixture": "New Zealand v Egypt",
      "model": "Egypt 55.1%; xG 2.35; O2.5 41.7% / BTTS 43.4%",
      "odds_trigger": "2 API price checks; nearest Under 2.5 1.80 needs 2.076+; The Odds API soccer_fifa_world_cup:...",
      "result": "pending"
    },
    {
      "action": "No bet Over 2.5; needs 2.347+; price",
      "day": "Tomorrow",
      "fixture": "Argentina v Austria",
      "model": "Argentina 60.1%; xG 2.45; O2.5 44.3% / BTTS 43.1%",
      "odds_trigger": "2 API price checks; nearest Over 2.5 2.02 needs 2.347+; The Odds API soccer_fifa_world_cup: M...",
      "result": "pending"
    }
  ],
  "generated_at": "2026-06-21T07:32:00.796985+00:00",
  "market_decisions": [
    {
      "blocking_reasons": "price/news gates cleared but listed Kelly is below 1u after the totals and handicaps only policy",
      "consensus_probability": "0.5364",
      "date_utc": "2026-06-21T22:00:00Z",
      "decimal_odds": "2.32",
      "elo_model_probability": "0.5731",
      "expected_value": "0.1516",
      "market": "Over 2.5",
      "market_1x2_model_probability": "0.5064",
      "match": "Uruguay v Cape Verde",
      "min_acceptable_odds": "2.014",
      "model_probability": "0.4964",
      "news_status": "news_matched",
      "odds_age_days": "0",
      "price_checked_at": "2026-06-21T07:32:05+00:00",
      "price_source": "The Odds API soccer_fifa_world_cup: BetOnline.ag",
      "price_status": "best_bet_candidate",
      "quarter_kelly": "0.0287",
      "recommendation_status": "no_bet_integer_stake_floor",
      "row_number": 1,
      "scope": "world_cup",
      "settled": "no",
      "stage": "Group H",
      "stake_units": "0.0",
      "status": "no_bet_integer_stake_floor",
      "tracking_key": "world_cup:2026-06-21t22:00:00z:uruguay_v_cape_verde:over_2.5",
      "why": "stress probability 49.6%; price 2.32; conservative EV 15.2%; break-even odds 2.014; bet odds 2.096 for 4% EV; recommendation no_bet_integer_stake_floor; fresh price check from The Odds API soccer_fifa_world_cup: BetOnline.ag (API); news: injury: Team News: Uruguay vs. Cape Verde injury, suspension list, predicted XIs | World Cup 2026 - Sports Mole | lineup: Uruguay vs Cape Verde Predicted Lineups & Team News - Betfred Insights | lineup: Cape Verde predic; decision: price/news gates cleared but listed Kelly is below 1u after the totals and handicaps only policy"
    },
    {
      "blocking_reasons": "settled result supplied",
      "consensus_probability": "0.6316",
      "date_utc": "2026-06-21T00:00:00.000Z",
      "decimal_odds": "1.71",
      "elo_model_probability": "0.6717",
      "expected_value": "0.0116",
      "market": "Over 2.5",
      "market_1x2_model_probability": "0.5988",
      "match": "Ecuador v Curaçao",
      "min_acceptable_odds": "1.69",
      "model_probability": "0.5916",
      "news_status": "news_matched",
      "odds_age_days": "44",
      "price_status": "no_bet_stale_price",
      "profit_units": "0.0",
      "quarter_kelly": "0",
      "recommendation_status": "no_bet_stale_price",
      "result": "0-0",
      "row_number": 2,
      "scope": "world_cup",
      "settled": "yes",
      "stage": "Group E",
      "stake_units": "0.0",
      "status": "settled_result_supplied",
      "tracking_key": "world_cup:2026-06-21t00:00:00.000z:ecuador_v_curaçao:over_2.5",
      "why": "stress probability 59.2%; price 1.71; conservative EV 1.2%; break-even odds 1.690; bet odds 1.758 for 4% EV; recommendation no_bet_stale_price; scraped price age 44 days; news: lineup: Ecuador - Curaçao Line-up: World Cup Football - TNT Sports | lineup: Ecuador vs Curaçao – Official lineups: A PSG player is a starter - MSN | lineup: Ecuador vs Curaçao Lineups, Live Streaming, TV Channels, How a; result 0-0; zero-stake audit: model side missed; decision: settled result supplied",
      "won": "no"
    },
    {
      "blocking_reasons": "price below World Cup EV gate",
      "consensus_probability": "0.5133",
      "date_utc": "2026-06-21T19:00:00Z",
      "decimal_odds": "2.12",
      "elo_model_probability": "0.5071",
      "expected_value": "0.0034",
      "market": "Under 2.5",
      "market_1x2_model_probability": "0.5184",
      "match": "Belgium v Iran",
      "min_acceptable_odds": "2.113",
      "model_probability": "0.4733",
      "news_status": "news_matched",
      "odds_age_days": "0",
      "price_checked_at": "2026-06-21T07:32:17+00:00",
      "price_source": "The Odds API soccer_fifa_world_cup: Matchbook",
      "price_status": "no_bet_rechecked_price",
      "quarter_kelly": "0.0008",
      "recommendation_status": "no_bet_rechecked_price",
      "row_number": 3,
      "scope": "world_cup",
      "settled": "no",
      "stage": "Group G",
      "stake_units": "0.0",
      "status": "no_bet_rechecked_price",
      "tracking_key": "world_cup:2026-06-21t19:00:00z:belgium_v_iran:under_2.5",
      "why": "stress probability 47.3%; price 2.12; conservative EV 0.3%; break-even odds 2.113; bet odds 2.198 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: Matchbook (API); news: injury: Belgium winger Doku ruled out of World Cup match against Iran due to illness - FlashScore UK | lineup: Belgium vs Iran – Predicted lineup and team news - Yahoo Sports | lineup: Belgium vs Iran Predicted Lineups &; decision: price below World Cup EV gate"
    },
    {
      "blocking_reasons": "price below World Cup EV gate",
      "consensus_probability": "0.3398",
      "date_utc": "2026-06-22T21:00:00Z",
      "decimal_odds": "3.3",
      "elo_model_probability": "0.3155",
      "expected_value": "-0.0107",
      "market": "Under 2.5",
      "market_1x2_model_probability": "0.3596",
      "match": "France v Iraq",
      "min_acceptable_odds": "3.336",
      "model_probability": "0.2998",
      "news_status": "news_matched",
      "odds_age_days": "0",
      "price_checked_at": "2026-06-21T07:32:16+00:00",
      "price_source": "The Odds API soccer_fifa_world_cup: Betsson",
      "price_status": "no_bet_rechecked_price",
      "quarter_kelly": "0.0",
      "recommendation_status": "no_bet_rechecked_price",
      "row_number": 4,
      "scope": "world_cup",
      "settled": "no",
      "stage": "Group I",
      "stake_units": "0.0",
      "status": "no_bet_rechecked_price",
      "tracking_key": "world_cup:2026-06-22t21:00:00z:france_v_iraq:under_2.5",
      "why": "stress probability 30.0%; price 3.30; conservative EV -1.1%; break-even odds 3.336; bet odds 3.469 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: Betsson (API); news: lineup: France vs Iraq: Three changes expected in France’s lineup - MSN | lineup: France vs Iraq – The French lineup announced with changes including Barcola - MSN | lineup: France vs Iraq – The French lineup announced w; decision: price below World Cup EV gate"
    },
    {
      "blocking_reasons": "price below World Cup EV gate",
      "consensus_probability": "0.5461",
      "date_utc": "2026-06-22T01:00:00Z",
      "decimal_odds": "1.8",
      "elo_model_probability": "0.5012",
      "expected_value": "-0.0978",
      "market": "Under 2.5",
      "market_1x2_model_probability": "0.5828",
      "match": "New Zealand v Egypt",
      "min_acceptable_odds": "1.995",
      "model_probability": "0.5012",
      "news_status": "news_matched",
      "odds_age_days": "0",
      "price_checked_at": "2026-06-21T07:31:54+00:00",
      "price_source": "The Odds API soccer_fifa_world_cup: Unibet (SE)",
      "price_status": "no_bet_rechecked_price",
      "quarter_kelly": "0.0",
      "recommendation_status": "no_bet_rechecked_price",
      "row_number": 5,
      "scope": "world_cup",
      "settled": "no",
      "stage": "Group G",
      "stake_units": "0.0",
      "status": "no_bet_rechecked_price",
      "tracking_key": "world_cup:2026-06-22t01:00:00z:new_zealand_v_egypt:under_2.5",
      "why": "stress probability 50.1%; price 1.80; conservative EV -9.8%; break-even odds 1.995; bet odds 2.076 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: Unibet (SE) (API); news: lineup: Egypt predicted lineup and team news vs New Zealand - Yahoo Sports Canada | lineup: New Zealand vs Egypt Predicted Lineups & Team News - Betfred Insights | availability: David Raya: ‘When you lose a Champions Lea; decision: price below World Cup EV gate"
    },
    {
      "blocking_reasons": "price below World Cup EV gate",
      "consensus_probability": "0.5034",
      "date_utc": "2026-06-22T17:00:00Z",
      "decimal_odds": "2.02",
      "elo_model_probability": "0.5769",
      "expected_value": "-0.1045",
      "market": "Over 2.5",
      "market_1x2_model_probability": "0.4433",
      "match": "Argentina v Austria",
      "min_acceptable_odds": "2.256",
      "model_probability": "0.4433",
      "news_status": "news_matched",
      "odds_age_days": "0",
      "price_checked_at": "2026-06-21T07:32:17+00:00",
      "price_source": "The Odds API soccer_fifa_world_cup: Matchbook",
      "price_status": "no_bet_rechecked_price",
      "quarter_kelly": "0.0",
      "recommendation_status": "no_bet_rechecked_price",
      "row_number": 6,
      "scope": "world_cup",
      "settled": "no",
      "stage": "Group J",
      "stake_units": "0.0",
      "status": "no_bet_rechecked_price",
      "tracking_key": "world_cup:2026-06-22t17:00:00z:argentina_v_austria:over_2.5",
      "why": "stress probability 44.3%; price 2.02; conservative EV -10.4%; break-even odds 2.256; bet odds 2.347 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: Matchbook (API); news: injury: Argentina Dealt Severe Injury Blow Ahead of Crucial Austria Clash - The Daily Campus | lineup: Argentina hint at multiple changes to starting XI against Austria - daily-sun.com | lineup: Argentina vs Austria at W; decision: price below World Cup EV gate"
    },
    {
      "blocking_reasons": "price below World Cup EV gate",
      "consensus_probability": "0.4539",
      "date_utc": "2026-06-22T01:00:00Z",
      "decimal_odds": "2.13",
      "elo_model_probability": "0.4988",
      "expected_value": "-0.1184",
      "market": "Over 2.5",
      "market_1x2_model_probability": "0.4172",
      "match": "New Zealand v Egypt",
      "min_acceptable_odds": "2.416",
      "model_probability": "0.4139",
      "news_status": "news_matched",
      "odds_age_days": "0",
      "price_checked_at": "2026-06-21T07:32:06+00:00",
      "price_source": "The Odds API soccer_fifa_world_cup: GTbets",
      "price_status": "no_bet_rechecked_price",
      "quarter_kelly": "0.0",
      "recommendation_status": "no_bet_rechecked_price",
      "row_number": 7,
      "scope": "world_cup",
      "settled": "no",
      "stage": "Group G",
      "stake_units": "0.0",
      "status": "no_bet_rechecked_price",
      "tracking_key": "world_cup:2026-06-22t01:00:00z:new_zealand_v_egypt:over_2.5",
      "why": "stress probability 41.4%; price 2.13; conservative EV -11.8%; break-even odds 2.416; bet odds 2.513 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: GTbets (API); news: lineup: Egypt predicted lineup and team news vs New Zealand - Yahoo Sports Canada | lineup: New Zealand vs Egypt Predicted Lineups & Team News - Betfred Insights | availability: David Raya: ‘When you lose a Champions Lea; decision: price below World Cup EV gate"
    },
    {
      "blocking_reasons": "price below World Cup EV gate",
      "consensus_probability": "0.4867",
      "date_utc": "2026-06-21T19:00:00Z",
      "decimal_odds": "1.88",
      "elo_model_probability": "0.4929",
      "expected_value": "-0.1602",
      "market": "Over 2.5",
      "market_1x2_model_probability": "0.4816",
      "match": "Belgium v Iran",
      "min_acceptable_odds": "2.239",
      "model_probability": "0.4467",
      "news_status": "news_matched",
      "odds_age_days": "0",
      "price_checked_at": "2026-06-21T07:32:17+00:00",
      "price_source": "The Odds API soccer_fifa_world_cup: Matchbook",
      "price_status": "no_bet_rechecked_price",
      "quarter_kelly": "0.0",
      "recommendation_status": "no_bet_rechecked_price",
      "row_number": 8,
      "scope": "world_cup",
      "settled": "no",
      "stage": "Group G",
      "stake_units": "0.0",
      "status": "no_bet_rechecked_price",
      "tracking_key": "world_cup:2026-06-21t19:00:00z:belgium_v_iran:over_2.5",
      "why": "stress probability 44.7%; price 1.88; conservative EV -16.0%; break-even odds 2.239; bet odds 2.329 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: Matchbook (API); news: injury: Belgium winger Doku ruled out of World Cup match against Iran due to illness - FlashScore UK | lineup: Belgium vs Iran – Predicted lineup and team news - Yahoo Sports | lineup: Belgium vs Iran Predicted Lineups &; decision: price below World Cup EV gate"
    },
    {
      "blocking_reasons": "price below World Cup EV gate",
      "consensus_probability": "0.6602",
      "date_utc": "2026-06-22T21:00:00Z",
      "decimal_odds": "1.35",
      "elo_model_probability": "0.6845",
      "expected_value": "-0.1627",
      "market": "Over 2.5",
      "market_1x2_model_probability": "0.6404",
      "match": "France v Iraq",
      "min_acceptable_odds": "1.612",
      "model_probability": "0.6202",
      "news_status": "news_matched",
      "odds_age_days": "0",
      "price_checked_at": "2026-06-21T07:32:16+00:00",
      "price_source": "The Odds API soccer_fifa_world_cup: William Hill",
      "price_status": "no_bet_rechecked_price",
      "quarter_kelly": "0.0",
      "recommendation_status": "no_bet_rechecked_price",
      "row_number": 9,
      "scope": "world_cup",
      "settled": "no",
      "stage": "Group I",
      "stake_units": "0.0",
      "status": "no_bet_rechecked_price",
      "tracking_key": "world_cup:2026-06-22t21:00:00z:france_v_iraq:over_2.5",
      "why": "stress probability 62.0%; price 1.35; conservative EV -16.3%; break-even odds 1.612; bet odds 1.677 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: William Hill (API); news: lineup: France vs Iraq: Three changes expected in France’s lineup - MSN | lineup: France vs Iraq – The French lineup announced with changes including Barcola - MSN | lineup: France vs Iraq – The French lineup announced w; decision: price below World Cup EV gate"
    },
    {
      "blocking_reasons": "price below World Cup EV gate",
      "consensus_probability": "0.4966",
      "date_utc": "2026-06-22T17:00:00Z",
      "decimal_odds": "1.97",
      "elo_model_probability": "0.4231",
      "expected_value": "-0.1665",
      "market": "Under 2.5",
      "market_1x2_model_probability": "0.5567",
      "match": "Argentina v Austria",
      "min_acceptable_odds": "2.364",
      "model_probability": "0.4231",
      "news_status": "news_matched",
      "odds_age_days": "0",
      "price_checked_at": "2026-06-21T07:32:17+00:00",
      "price_source": "The Odds API soccer_fifa_world_cup: Matchbook",
      "price_status": "no_bet_rechecked_price",
      "quarter_kelly": "0.0",
      "recommendation_status": "no_bet_rechecked_price",
      "row_number": 10,
      "scope": "world_cup",
      "settled": "no",
      "stage": "Group J",
      "stake_units": "0.0",
      "status": "no_bet_rechecked_price",
      "tracking_key": "world_cup:2026-06-22t17:00:00z:argentina_v_austria:under_2.5",
      "why": "stress probability 42.3%; price 1.97; conservative EV -16.7%; break-even odds 2.364; bet odds 2.459 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: Matchbook (API); news: injury: Argentina Dealt Severe Injury Blow Ahead of Crucial Austria Clash - The Daily Campus | lineup: Argentina hint at multiple changes to starting XI against Austria - daily-sun.com | lineup: Argentina vs Austria at W; decision: price below World Cup EV gate"
    },
    {
      "blocking_reasons": "price below World Cup EV gate",
      "consensus_probability": "0.4636",
      "date_utc": "2026-06-21T22:00:00Z",
      "decimal_odds": "1.67",
      "elo_model_probability": "0.4269",
      "expected_value": "-0.2926",
      "market": "Under 2.5",
      "market_1x2_model_probability": "0.4936",
      "match": "Uruguay v Cape Verde",
      "min_acceptable_odds": "2.361",
      "model_probability": "0.4236",
      "news_status": "news_matched",
      "odds_age_days": "0",
      "price_checked_at": "2026-06-21T07:31:54+00:00",
      "price_source": "The Odds API soccer_fifa_world_cup: Unibet (SE)",
      "price_status": "no_bet_rechecked_price",
      "quarter_kelly": "0.0",
      "recommendation_status": "no_bet_rechecked_price",
      "row_number": 11,
      "scope": "world_cup",
      "settled": "no",
      "stage": "Group H",
      "stake_units": "0.0",
      "status": "no_bet_rechecked_price",
      "tracking_key": "world_cup:2026-06-21t22:00:00z:uruguay_v_cape_verde:under_2.5",
      "why": "stress probability 42.4%; price 1.67; conservative EV -29.3%; break-even odds 2.361; bet odds 2.456 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: Unibet (SE) (API); news: injury: Team News: Uruguay vs. Cape Verde injury, suspension list, predicted XIs | World Cup 2026 - Sports Mole | lineup: Uruguay vs Cape Verde Predicted Lineups & Team News - Betfred Insights | lineup: Cape Verde predic; decision: price below World Cup EV gate"
    },
    {
      "blocking_reasons": "settled result supplied",
      "consensus_probability": "0.3684",
      "date_utc": "2026-06-21T00:00:00.000Z",
      "decimal_odds": "2.0",
      "elo_model_probability": "0.3283",
      "expected_value": "-0.3434",
      "market": "Under 2.5",
      "market_1x2_model_probability": "0.4012",
      "match": "Ecuador v Curaçao",
      "min_acceptable_odds": "3.046",
      "model_probability": "0.3283",
      "news_status": "news_matched",
      "odds_age_days": "44",
      "price_status": "no_bet_stale_price",
      "profit_units": "0.0",
      "quarter_kelly": "0",
      "recommendation_status": "no_bet_stale_price",
      "result": "0-0",
      "row_number": 12,
      "scope": "world_cup",
      "settled": "yes",
      "stage": "Group E",
      "stake_units": "0.0",
      "status": "settled_result_supplied",
      "tracking_key": "world_cup:2026-06-21t00:00:00.000z:ecuador_v_curaçao:under_2.5",
      "why": "stress probability 32.8%; price 2.00; conservative EV -34.3%; break-even odds 3.046; bet odds 3.168 for 4% EV; recommendation no_bet_stale_price; scraped price age 44 days; news: lineup: Ecuador - Curaçao Line-up: World Cup Football - TNT Sports | lineup: Ecuador vs Curaçao – Official lineups: A PSG player is a starter - MSN | lineup: Ecuador vs Curaçao Lineups, Live Streaming, TV Channels, How a; result 0-0; zero-stake audit: model side hit; decision: settled result supplied",
      "won": "yes"
    }
  ],
  "news_context": [
    {
      "away": "Curaçao",
      "checked_at": "2026-06-21T07:32:00.796985+00:00",
      "date_utc": "2026-06-21T00:00:00.000Z",
      "home": "Ecuador",
      "match": "Ecuador v Curaçao",
      "news": "lineup: Ecuador - Curaçao Line-up: World Cup Football - TNT Sports | lineup: Ecuador vs Curaçao – Official lineups: A PSG player is a starter - MSN | lineup: Ecuador vs Curaçao Lineups, Live Streaming, TV Channels, How and Where to Watch In USA & Other Countries - Athlon Sports",
      "published_at": "2026-06-21T04:43:14Z | 2026-06-21T02:19:56Z | 2026-06-20T23:32:05Z",
      "scope": "world_cup",
      "source": "https://news.google.com/rss/articles/CBMiowFBVV95cUxQSzdVYkJtSGtMTjFyZkstLXVtYXF0bmh5ckVDREQ2SGpRaUxpQ2owel81QmRLb2l6ekxKdUowc3FCTkRrajJSSFRPYUhBckQ2NDlFTk9zZzZuNUE0eXNEd2o2UjBibkEtSXk0Y25Lc3lHVy15QTh2VG52X2ZfazVXT2ZyVHpNWDBRdTFackk1a2NYNnZqd3NBaUJGZmFSakpfZ29Z?oc=5 | https://news.google.com/rss/articles/CBMiugFBVV95cUxNeFdvZUMxa09tOGN6TVh2akx6bkNQM1ZlV2xKZG5XRmI5ZXZUbjZDV1B3LXlCMzh3UWlwN182a3R6Ri1hT0dDVm9TZUZXMUxJdW53QTN1QS12M1ZOc1p3SjBjeFlQNEx4Zy1lbWRNakJCU2o4M0llVEdFbGhlekhIQXVDWnBDWWNpeWNVVEdpb0tqMXZkZ1BZbGlNSjJoT3JjdmVOSWRCWVRmTWpITXBoWW43OWI4b3JOVEE?oc=5 | https://news.google.com/rss/articles/CBMinwFBVV95cUxQOG11Y1ZuaEZZMXE2bmR4NlFIckJmNVVUbkJEYlluU3NJMGpWMzI5TExpN0JKRXhaMkcyOFlYZl80MFgxelhiVlZISEdUQ1NzU3BlUFYwSFFDdHBZcnp3RlEteHRpdFJRT2R0T3BiTHJPVmtkVFY0QTZNS1RHWGNuc0NBel9tMWxTVGxZRDVoX3JiWkhaNDhnWk5MTDYyWVE?oc=5",
      "stage": "Group E",
      "stake_gate_cleared": true,
      "status": "news_matched",
      "status_label": "news_matched"
    },
    {
      "away": "Saudi Arabia",
      "checked_at": "2026-06-21T07:32:00.796985+00:00",
      "date_utc": "2026-06-21T16:00:00Z",
      "home": "Spain",
      "match": "Spain v Saudi Arabia",
      "news": "lineup: Spain vs. Saudi Arabia predicted lineups, starting 11 for World Cup 2026 Group H game at Mercedes-Benz Stadium - sportingnews.com | lineup: Saudi Arabia XI vs Spain – Predicted lineup and team news - Yahoo Sports | lineup: Spain vs Saudi Arabia – Predicted lineup and team news - Yahoo Sports",
      "published_at": "2026-06-21T06:20:02Z | 2026-06-21T05:35:00Z | 2026-06-21T05:35:00Z",
      "scope": "world_cup",
      "source": "https://news.google.com/rss/articles/CBMixgFBVV95cUxNcnd5X2RJUXJDV0M5bVhMMUF4aGNtN1pPbkpxSWlhbl9UdnZYS0xLdWNKSHJvUjkyRVlHNG40N0ZtZWw1bVFMV1pnbXZjeU9fMGtSQmxSWG9sWHp5Y0ZUUi1OR0NjSi1xZW1wMjlMaXNjQjhpQ2VOeDMzWWxZd2hiZHFZdkp5SGtjb1F5MHpOMDdkcUpGQUozbXEwdURHeEFlTVB3ZDJhLXg0ZXJNMFVhQ2pQVXFLd1ozWURGZV9XdjRrWVFvWnc?oc=5 | https://news.google.com/rss/articles/CBMifkFVX3lxTFB4TFFTZEN2aW9MVHdDNGR5eHpUb0V3NG1zWlUwRkVCcFFBa3pjNm1fY3ppZkQxQlBuMXpNNmkxaW1VTldURGpzd1NYbFFZVW9rUXFZZE1sYTVKdTBEMFpXRGpFejRGb3lMOUhpcUQ2a2w2ZzM2VHZKOFhjZXJidw?oc=5 | https://news.google.com/rss/articles/CBMihwFBVV95cUxQZHdiRlFzVjZFbU45NWs3Sy13N25DbUkyNGh4ekJTZzMwLWktbTl0ZEVxQ0pUS0d6Ri1PQ2EycC15ZEpBWDRxNUNVdFdwZ3dXZ2pQZk9vdVQyOU1rYzExVm5VSFBLY0dhSU81bjhRSkZQakNNSGVwQ0R6Qm96bHdJcGZXcGI5N1E?oc=5",
      "stage": "Group H",
      "stake_gate_cleared": true,
      "status": "news_matched",
      "status_label": "news_matched"
    },
    {
      "away": "Iran",
      "checked_at": "2026-06-21T07:32:00.796985+00:00",
      "date_utc": "2026-06-21T19:00:00Z",
      "home": "Belgium",
      "match": "Belgium v Iran",
      "news": "injury: Belgium winger Doku ruled out of World Cup match against Iran due to illness - FlashScore UK | lineup: Belgium vs Iran – Predicted lineup and team news - Yahoo Sports | lineup: Belgium vs Iran Predicted Lineups & Team News - Betfred Insights",
      "published_at": "2026-06-20T22:38:57Z | 2026-06-21T05:35:00Z | 2026-06-20T18:59:06Z",
      "scope": "world_cup",
      "source": "https://news.google.com/rss/articles/CBMivAFBVV95cUxQZ18tR2hhc2tEdE4tRnR0RkZyVTVYbWRmb25ZLVpGZVkzRUIxWjEzRnhPTWI0eU9uVmxGTmVXSVh3b2NTcm5ER29jczV0M0hKem1LTXNWNlFRU1ZvMFZVU0RNRVBZWlNYUWdRaVA3emotOW5yRk5xbzFKWExlR3lLX2xPUDlFZXFEZk5vODZueUVUMzlnSXpQQmZBajdPLTl3cXhqQ01EOFZpdE96V1pGWGtOb0Jya19uaGZsYw?oc=5 | https://news.google.com/rss/articles/CBMiiAFBVV95cUxNQXZETWdpTHcwMmlZYmNOajhTTW9qQXhEWU5RQ2ltWEZxWnU5S0F3V0tINWtxdTFwZlNNdVBaakNTcHNLbi1nOTZ6YnJEb1Zwank0SWJPdm9ibFF5WERBT0U4d3AtT1RNT3JsTWR3RENpVFB3c2NZLWlneDVBeXlubDQ0clJMajRs?oc=5 | https://news.google.com/rss/articles/CBMiuAFBVV95cUxNQ0piRjVpYTJHNWxsN21ucWRQajFnOGdlSnpwRTh2cGVJMmh2RnhPTGZmTnQ2ckxOazQ5Y0w3QTNPaGRCcUZHZUFydmRPQzVPOTRKRE1jTkt5eHNmcUl2Wlg0MjFNeDdONFFtclVhSWMwbWNqLTRTMDZ4YURxRHZfeWZtTXp2ZDczY3JhQXdaWWt3Njlac1J1U1E0c2lVaVNYVGU3ZmFBVGRXZjZMNFBrT3JxUGZPMll2?oc=5",
      "stage": "Group G",
      "stake_gate_cleared": true,
      "status": "news_matched",
      "status_label": "news_matched"
    },
    {
      "away": "Cape Verde",
      "checked_at": "2026-06-21T07:32:00.796985+00:00",
      "date_utc": "2026-06-21T22:00:00Z",
      "home": "Uruguay",
      "match": "Uruguay v Cape Verde",
      "news": "injury: Team News: Uruguay vs. Cape Verde injury, suspension list, predicted XIs | World Cup 2026 - Sports Mole | lineup: Uruguay vs Cape Verde Predicted Lineups & Team News - Betfred Insights | lineup: Cape Verde predicted lineup vs Uruguay for FIFA World Cup 2026 - Khel Now",
      "published_at": "2026-06-20T22:00:00Z | 2026-06-20T22:00:14Z | 2026-06-20T12:23:11Z",
      "scope": "world_cup",
      "source": "https://news.google.com/rss/articles/CBMi2AFBVV95cUxPRE5TbXpEMTh0SjJnLTR1TFZ6WHFIUjBfLVpJdzktSEdKVEtzeWhnd19oU1NDVUp1Q21IamRxbmZxczd4a1FYTVI2UUY4WUNzMlV4c0FUR0JSdGZvTDJoZlowbHhYSUFidl81UEJEd0lycTNaaDZNT3FBQ3dkalBNNE5vaU1IQmp5Sm5rUHJrT2dha3E2YVRNVjBlT2FlN29PbWxIMTVMY1c0R2F1THgyRXYyYnR0S2l0a2dadkx5NWJOcTlsMmxES285ckNudS1CT2Zha2l2ZGY?oc=5 | https://news.google.com/rss/articles/CBMiwAFBVV95cUxPVWhqNVFlTHZ5czNoaEpjS2cxT2pfSWhYTUVzOTN1QWtPSWRYNkViRW9vODJlZXdWNUVvbjV6eFQ4VDFTbHUxZ2Rvc05CYU5xbFZtNjNBS2JBNFJhRWxHTDhiMUdvYTJPWjlKSTN6VERqaFhIOWNfSDF2bDFHSzJsell1WTVYdWIzT0oxV0dmaVJVREVtZS1JY045Wk1sZnZSRXZHUnpEb0Y5Ry1lU29qZmlkSEtXZWt1OHVVcDZ6SDU?oc=5 | https://news.google.com/rss/articles/CBMipwFBVV95cUxNQTcwMUJQTkpEMGZiR0lwRGJkWjN6XzFoOVFMeWlXSjBMNmdENWNMSFFKTVFJZFNoYUYxdHFGVFRKS3AxbHRObnEwTk4yRVhRUnF4amlCeG5qRUhWelhwYUMyT1pTTVJ4cjRIeFFOMDhfWV9wZGRLMFhoOHNObzlxX2luR1dMNXZHaU1USVJHSWdqOU1IbUNLT29nMjJQM1RTSndDWU5LVQ?oc=5",
      "stage": "Group H",
      "stake_gate_cleared": true,
      "status": "news_matched",
      "status_label": "news_matched"
    },
    {
      "away": "Egypt",
      "checked_at": "2026-06-21T07:32:00.796985+00:00",
      "date_utc": "2026-06-22T01:00:00Z",
      "home": "New Zealand",
      "match": "New Zealand v Egypt",
      "news": "lineup: Egypt predicted lineup and team news vs New Zealand - Yahoo Sports Canada | lineup: New Zealand vs Egypt Predicted Lineups & Team News - Betfred Insights | availability: David Raya: ‘When you lose a Champions League final it destroys you inside’ - The goalkeeper discusses being bullied by 35-year-olds in the English fifth tier, winning the Premier League and competition in the Spain...",
      "published_at": "2026-06-21T05:35:00Z | 2026-06-21T01:00:40Z | 2026-06-20T11:00:04Z",
      "scope": "world_cup",
      "source": "https://news.google.com/rss/articles/CBMihwFBVV95cUxQUDNDcjJ4NndGZFNCTHlERER0UWN0ZXJEMVZUYnRxTUxOd1BmeEtNbGNzWTE5Z1hMWElaWUhBVmV5Rm9jTDVCTDU5c2JoSjVPNE1USW9DTUpzU2o5UEV4SXdGXzFYMzBkTlpaNkNtZEYzZnhqQU5rY2lPWFdEUHRGUnZxdWFFWHc?oc=5 | https://news.google.com/rss/articles/CBMivwFBVV95cUxPX1FrWFVEeEt0bU5veWpSVFB4S3BUaWJ4WkVEeGVNTHBPT1B5NXVlakhRYVl1UnF1c3ZaNjFPRlNuNHI3T041N0pMaEZZVFk4S01WbzJ2WjV6SzBxZXVPWGoxWVVtSjVMUWtkNGNEbDQ1YnpkZDhsUHd2elI3dGtQOHVFWXhvazl2ajNSWDZpU3RsSjNGbU43WmxRa1R3dnUtbG84WlpzWFZTUE5qcnlDQmRRMy1VazRGNDI4bUl0QQ?oc=5 | https://www.theguardian.com/football/2026/jun/20/david-raya-when-you-lose-a-champions-league-final-it-destroys-you-inside",
      "stage": "Group G",
      "stake_gate_cleared": true,
      "status": "news_matched",
      "status_label": "news_matched"
    },
    {
      "away": "Austria",
      "checked_at": "2026-06-21T07:32:00.796985+00:00",
      "date_utc": "2026-06-22T17:00:00Z",
      "home": "Argentina",
      "match": "Argentina v Austria",
      "news": "injury: Argentina Dealt Severe Injury Blow Ahead of Crucial Austria Clash - The Daily Campus | lineup: Argentina hint at multiple changes to starting XI against Austria - daily-sun.com | lineup: Argentina vs Austria at World Cup 2026: TV channel, how to watch, kick-off time, live stream, referee, predicted line-ups - ESPN",
      "published_at": "2026-06-20T09:10:16Z | 2026-06-21T06:29:02Z | 2026-06-20T18:50:00Z",
      "scope": "world_cup",
      "source": "https://news.google.com/rss/articles/CBMiX0FVX3lxTE96cjhJQ0FQbS1WVjRMcXVlNDNiZGxFa0hNS1VWQ3hSME1SUzZfN3VDU0dySWdkWlB2OFJkcHpXcjhFbzhrSjhiRlNMc1hNUnlUbHRBYkctLXdJQ1gzM1dr?oc=5 | https://news.google.com/rss/articles/CBMiqAFBVV95cUxQLUNCMXVhWlg3cG1KTW9ldGNjS0pFYmtLei1ZLUxpcThWeFlQeWRUWjExUjlqcUdkSEsySDZ3TGVrTGFqM0J0bXhuT2tDYVkxTWdMUEg4NWo1UlMwX3ljdlNxYU4xU0dhUjYxd3otSU1nemtrS2dseDBHVXhyX2R6OEZGQVp4WWcwNV9uaXpYVTFQLWwya1h6WF9IRnRDZmhKSi1WWllwc2c?oc=5 | https://news.google.com/rss/articles/CBMi7AFBVV95cUxQUEhYOG5TcVZNekNENnkxS3YyQTVfVWJSeF8wS0xjU1hWRDV6a0lYeTlmcU5KbEVadDAxajd0anB5SE5NYjNKMUpUZ1BaOFdiemxKbWdiRlg5dU0wODFlSUE4TVNPZmdneENjbS11RXhhLWJKODRCQlBjX2xYYnAwQ0hnV1p3NWp3eWxEcjFWNzRlWHJMbGNNWVVqNXdKdUlrZk0yN1kzVUl5aU1CaEc3bldmUVZfN05jSDBMTXgzY2gzOWpBbVlCcC02VjRQWWpMWDVmR2Vtd2s0RFEtekRxMzVZUVoyRjhGb3ctRA?oc=5",
      "stage": "Group J",
      "stake_gate_cleared": true,
      "status": "news_matched",
      "status_label": "news_matched"
    },
    {
      "away": "Iraq",
      "checked_at": "2026-06-21T07:32:00.796985+00:00",
      "date_utc": "2026-06-22T21:00:00Z",
      "home": "France",
      "match": "France v Iraq",
      "news": "lineup: France vs Iraq: Three changes expected in France’s lineup - MSN | lineup: France vs Iraq – The French lineup announced with changes including Barcola - MSN | lineup: France vs Iraq – The French lineup announced with changes including Barcola - MSN",
      "published_at": "2026-06-20T13:20:58Z | 2026-06-20T10:14:38Z | 2026-06-20T08:18:47Z",
      "scope": "world_cup",
      "source": "https://news.google.com/rss/articles/CBMivgJBVV95cUxPQ1d5UW9aN2phbUhFdk1LR1ViQXlVbkkxajFub1o3d1FXS3ZRa3E0WGFlNXZ5aGRiZElHSmJYNkpFYmhNZTFWRmR1YlZ2dzZqd214SVQ4OUVYcjFkZ2tPclN5UVFwSndtTGhuOHpMaS1UYXQ4ZFhFeVJ1bnlycVRjSGJUOHlFZ1M2UlpDbnJYV3RqNEtJTGtmQk9sbEVFaXVOYWc5aXB6U2tlcGZPMm1lLTBKRG5rM1VPR3hXLXBkaHh0RHdiZWpiTThnVWtxek9JcGE4TzUtSmhqXzc3ZXZraFBZZ3hvdDEtVms5WnNBU3pNODNYbXYzMjE4dlJTa0tfRzVFNkZoWkZMbExuRGljVHZTYVh3WTBBOEZRdm9SZVZ4RHludExjZWlpMThpSm5KVUVxd0Y0YzlHNkxReGc?oc=5 | https://news.google.com/rss/articles/CBMi2AJBVV95cUxQazMzVUVXOWpIM1huZmYtXzRLMlVBOU9aLVFpREhGQUlIeVIyWDdGdDlnYmZILTdsOHo4QktuNGgtUFNRNW5UMkk3Zkpnc0w2Unp6eURWOWh6QmFhRzJkVmNydmFxS0pyOEotUmpmamdoSjl1d0g3V0hfcmlXYnRZVkZ2VUE2bklGSHFreFdDUmlKTzRSUmtUek9ydkk2Nkd4Nk9VbFpjM1Q3VmNVZHM2Z0d2MlJDSUdHZjE0ZF9FaklkRlNYcXN3dWtBVVF4WHBnX0VfRHN1RDd2WVJ1d21aZlR0OTc4cjFNaGQtRG1tR2xQUTA3TWdSM2VnMVdRMkx2UXlCamtkVmQzQjZHSzBVWXhNY3NFcTktLUJiOU54R1F4TXN2ZjdYQnVaMU0tQTl3eDVqVGhvZkhjbXg3alRjNEE1Y0kyTnRlUUVyQzVNYWJHNWhTZ2ZtYw?oc=5 | https://news.google.com/rss/articles/CBMiwgFBVV95cUxOakJ1dzBtV3dTNi1qdkRwVGRndHNvNjdqSzYxNTR0RFo3VDB4ejVXTHVNejRqTlRBb2hyaVRlODBXb3BENU85TV9XMnROY2JvTzJaR3hubUFMSXp6RFdsbVRucElNdkh0a0NDd2FQZlFvYkU1UkF0N0xMMTdSZV96bjBKdi1GRFZCMkxVSURMdWlZb1dHNV9kZkt4UWFqWk82SE9PS1l4VDhFZ2trVzZjeHh3NUR5bEMyWFlpYXlJT2g4dw?oc=5",
      "stage": "Group I",
      "stake_gate_cleared": true,
      "status": "news_matched",
      "status_label": "news_matched"
    }
  ],
  "next_action_row": {
    "action_type": "watch_price",
    "command": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
    "command_template": {
      "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
      "mode": "template",
      "placeholders": [
        {
          "field": "decimal_odds",
          "kind": "decimal_odds",
          "label": "Live decimal odds",
          "minimum": "2.198",
          "placeholder": "LIVE_DECIMAL_ODDS",
          "required": true
        },
        {
          "field": "source",
          "kind": "operator_source",
          "label": "Bookmaker/operator",
          "placeholder": "OPERATOR_BOOKMAKER",
          "required": true
        }
      ],
      "requires_replacement": true
    },
    "commands": {
      "preview_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
      "record_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
      "record_price_and_refresh": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
      "rerun": "./run_daily_goal.sh 2026-06-21 2"
    },
    "date_utc": "2026-06-21T19:00:00Z",
    "expected_value": "0.0034",
    "input_fields": [
      {
        "kind": "decimal_odds",
        "label": "Live decimal odds",
        "minimum": "2.198",
        "name": "decimal_odds",
        "placeholder": "LIVE_DECIMAL_ODDS",
        "required": true
      },
      {
        "kind": "operator_source",
        "label": "Bookmaker/operator",
        "name": "source",
        "placeholder": "OPERATOR_BOOKMAKER",
        "required": true
      },
      {
        "default": "live trigger price",
        "kind": "text",
        "label": "Notes",
        "name": "notes",
        "required": false
      }
    ],
    "kickoff_local": "2026-06-21T20:00+01:00",
    "market": "Under 2.5",
    "match": "Belgium v Iran",
    "model_probability": "0.4733",
    "needed_input": "price",
    "needed_odds": "2.198",
    "news_command": "",
    "preview_command": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
    "price_move": "+0.078 (3.7%)",
    "priority": "2",
    "recommendation": "WATCH_ONLY",
    "refresh_command": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
    "rerun_command": "./run_daily_goal.sh 2026-06-21 2",
    "row_number": 1,
    "scope": "world_cup",
    "seen_odds": "2.12",
    "source": "The Odds API soccer_fifa_world_cup: Matchbook (API)",
    "stake_units": "0",
    "thresholds": {
      "expected_value": "0.0034",
      "kickoff_local": "2026-06-21T20:00+01:00",
      "model_probability": "0.4733",
      "needed_odds": "2.198",
      "price_move": "+0.078 (3.7%)",
      "seen_odds": "2.12",
      "source": "The Odds API soccer_fifa_world_cup: Matchbook (API)",
      "stake_units": "0",
      "watch_rank": "1",
      "watch_window": "in 9h 28m; final 2026-06-21T19:40+01:00"
    },
    "watch_rank": "1",
    "watch_window": "in 9h 28m; final 2026-06-21T19:40+01:00",
    "why": "No stake now; watch for 2.198+ model price trigger and complete price, then rerun. stress probability 47.3%; price 2.12; conservative EV 0.3%; break-even odds 2.113; bet odds 2.198 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: Matchbook (API); news: injury: Belgium winger Doku ruled out of World Cup match against Iran due to illness - FlashScore UK | lineup: Belgium vs Iran – Predicted lineup and team news - Yahoo Sports | lineup: Belgium vs Iran Predicted Lineups &; decision: price below World Cup EV gate",
    "workflow": {
      "command_template": {
        "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
        "mode": "template",
        "placeholders": [
          {
            "field": "decimal_odds",
            "kind": "decimal_odds",
            "label": "Live decimal odds",
            "minimum": "2.198",
            "placeholder": "LIVE_DECIMAL_ODDS",
            "required": true
          },
          {
            "field": "source",
            "kind": "operator_source",
            "label": "Bookmaker/operator",
            "placeholder": "OPERATOR_BOOKMAKER",
            "required": true
          }
        ],
        "requires_replacement": true
      },
      "commands": {
        "preview_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
        "record_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
        "record_price_and_refresh": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
        "rerun": "./run_daily_goal.sh 2026-06-21 2"
      },
      "input_fields": [
        {
          "kind": "decimal_odds",
          "label": "Live decimal odds",
          "minimum": "2.198",
          "name": "decimal_odds",
          "placeholder": "LIVE_DECIMAL_ODDS",
          "required": true
        },
        {
          "kind": "operator_source",
          "label": "Bookmaker/operator",
          "name": "source",
          "placeholder": "OPERATOR_BOOKMAKER",
          "required": true
        },
        {
          "default": "live trigger price",
          "kind": "text",
          "label": "Notes",
          "name": "notes",
          "required": false
        }
      ],
      "next_step": "preview_price",
      "thresholds": {
        "expected_value": "0.0034",
        "kickoff_local": "2026-06-21T20:00+01:00",
        "model_probability": "0.4733",
        "needed_odds": "2.198",
        "price_move": "+0.078 (3.7%)",
        "seen_odds": "2.12",
        "source": "The Odds API soccer_fifa_world_cup: Matchbook (API)",
        "stake_units": "0",
        "watch_rank": "1",
        "watch_window": "in 9h 28m; final 2026-06-21T19:40+01:00"
      }
    }
  },
  "next_actions": [
    "Stake: none. No row passed all freshness, news, calibration, strategy, and EV gates.",
    "No-bet: 9 World Cup operator/API price rows were checked and still sit below the EV gate; closest confirmed price is Belgium v Iran Under 2.5 current 2.12 from The Odds API soccer_fifa_world_cup: Matchbook (API) (EV 0.3%; needs 2.198+ for the 4% EV gate; needed input: price).",
    "Next watch: Belgium v Iran Under 2.5 kicks off 2026-06-21T20:00+01:00; watch in 9h 28m; final 2026-06-21T19:40+01:00; seen 2.12, needs 2.198+ (+0.078 (3.7%)); needed input: price.",
    "Next watch command template: if Belgium v Iran Under 2.5 reaches 2.198+ model price trigger, replace `LIVE_DECIMAL_ODDS` with the live bookmaker price and `OPERATOR_BOOKMAKER` with the bookmaker/source you checked before running; run `python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run`, then `python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record`.",
    "Market coverage: 1 World Cup fixture(s) have no evaluated market rows in `results/world_cup_market_checks.csv`; refresh World Cup market artifacts before betting: Spain v Saudi Arabia.",
    "Domestic: API key is set, but no domestic fixtures with supported totals odds are in this window.",
    "Evidence: no settled staked recommendations yet; keep any first live stakes tiny until the ledger has real outcomes."
  ],
  "next_step": "preview_price",
  "next_watch_row": {
    "action_type": "watch_price",
    "command": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
    "command_template": {
      "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
      "mode": "template",
      "placeholders": [
        {
          "field": "decimal_odds",
          "kind": "decimal_odds",
          "label": "Live decimal odds",
          "minimum": "2.198",
          "placeholder": "LIVE_DECIMAL_ODDS",
          "required": true
        },
        {
          "field": "source",
          "kind": "operator_source",
          "label": "Bookmaker/operator",
          "placeholder": "OPERATOR_BOOKMAKER",
          "required": true
        }
      ],
      "requires_replacement": true
    },
    "commands": {
      "preview_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
      "record_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
      "record_price_and_refresh": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
      "rerun": "./run_daily_goal.sh 2026-06-21 2"
    },
    "date_utc": "2026-06-21T19:00:00Z",
    "expected_value": "0.0034",
    "input_fields": [
      {
        "kind": "decimal_odds",
        "label": "Live decimal odds",
        "minimum": "2.198",
        "name": "decimal_odds",
        "placeholder": "LIVE_DECIMAL_ODDS",
        "required": true
      },
      {
        "kind": "operator_source",
        "label": "Bookmaker/operator",
        "name": "source",
        "placeholder": "OPERATOR_BOOKMAKER",
        "required": true
      },
      {
        "default": "live trigger price",
        "kind": "text",
        "label": "Notes",
        "name": "notes",
        "required": false
      }
    ],
    "kickoff_local": "2026-06-21T20:00+01:00",
    "market": "Under 2.5",
    "match": "Belgium v Iran",
    "model_probability": "0.4733",
    "needed_input": "price",
    "needed_odds": "2.198",
    "news_command": "",
    "preview_command": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
    "price_move": "+0.078 (3.7%)",
    "priority": "2",
    "recommendation": "WATCH_ONLY",
    "refresh_command": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
    "rerun_command": "./run_daily_goal.sh 2026-06-21 2",
    "row_number": 1,
    "scope": "world_cup",
    "seen_odds": "2.12",
    "source": "The Odds API soccer_fifa_world_cup: Matchbook (API)",
    "stake_units": "0",
    "thresholds": {
      "expected_value": "0.0034",
      "kickoff_local": "2026-06-21T20:00+01:00",
      "model_probability": "0.4733",
      "needed_odds": "2.198",
      "price_move": "+0.078 (3.7%)",
      "seen_odds": "2.12",
      "source": "The Odds API soccer_fifa_world_cup: Matchbook (API)",
      "stake_units": "0",
      "watch_rank": "1",
      "watch_window": "in 9h 28m; final 2026-06-21T19:40+01:00"
    },
    "watch_rank": "1",
    "watch_window": "in 9h 28m; final 2026-06-21T19:40+01:00",
    "why": "No stake now; watch for 2.198+ model price trigger and complete price, then rerun. stress probability 47.3%; price 2.12; conservative EV 0.3%; break-even odds 2.113; bet odds 2.198 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: Matchbook (API); news: injury: Belgium winger Doku ruled out of World Cup match against Iran due to illness - FlashScore UK | lineup: Belgium vs Iran – Predicted lineup and team news - Yahoo Sports | lineup: Belgium vs Iran Predicted Lineups &; decision: price below World Cup EV gate",
    "workflow": {
      "command_template": {
        "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
        "mode": "template",
        "placeholders": [
          {
            "field": "decimal_odds",
            "kind": "decimal_odds",
            "label": "Live decimal odds",
            "minimum": "2.198",
            "placeholder": "LIVE_DECIMAL_ODDS",
            "required": true
          },
          {
            "field": "source",
            "kind": "operator_source",
            "label": "Bookmaker/operator",
            "placeholder": "OPERATOR_BOOKMAKER",
            "required": true
          }
        ],
        "requires_replacement": true
      },
      "commands": {
        "preview_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
        "record_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
        "record_price_and_refresh": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
        "rerun": "./run_daily_goal.sh 2026-06-21 2"
      },
      "input_fields": [
        {
          "kind": "decimal_odds",
          "label": "Live decimal odds",
          "minimum": "2.198",
          "name": "decimal_odds",
          "placeholder": "LIVE_DECIMAL_ODDS",
          "required": true
        },
        {
          "kind": "operator_source",
          "label": "Bookmaker/operator",
          "name": "source",
          "placeholder": "OPERATOR_BOOKMAKER",
          "required": true
        },
        {
          "default": "live trigger price",
          "kind": "text",
          "label": "Notes",
          "name": "notes",
          "required": false
        }
      ],
      "next_step": "preview_price",
      "thresholds": {
        "expected_value": "0.0034",
        "kickoff_local": "2026-06-21T20:00+01:00",
        "model_probability": "0.4733",
        "needed_odds": "2.198",
        "price_move": "+0.078 (3.7%)",
        "seen_odds": "2.12",
        "source": "The Odds API soccer_fifa_world_cup: Matchbook (API)",
        "stake_units": "0",
        "watch_rank": "1",
        "watch_window": "in 9h 28m; final 2026-06-21T19:40+01:00"
      }
    }
  },
  "normal_stake_allowed": false,
  "one_line": "No bet now. Next kickoff watch: Belgium v Iran Under 2.5; record only if a real bookmaker reaches 2.198+.",
  "operator_answer": {
    "action": "watch_price",
    "action_slate": {
      "price_watches": 6,
      "proof_candidates": 0,
      "stake_candidates": 0,
      "state": "price_watch_only",
      "total": 6
    },
    "actual_slips": {
      "input_issues": 0,
      "normal_stake_placed": 0,
      "normal_stake_profit_units": 0,
      "normal_stake_roi": 0.0,
      "normal_stake_settled": 0,
      "normal_stake_settled_stake_units": 0,
      "open": 0,
      "open_stake_units": 0,
      "placed": 0,
      "profit_units": 0,
      "proof_only_placed": 0,
      "proof_only_profit_units": 0,
      "proof_only_roi": 0.0,
      "proof_only_settled": 0,
      "proof_only_settled_stake_units": 0,
      "roi": 0.0,
      "settled": 0,
      "settled_stake_units": 0,
      "source": "data/actual_bets.csv",
      "unclassified_placed": 0,
      "unclassified_profit_units": 0,
      "unclassified_roi": 0.0,
      "unclassified_settled": 0,
      "unclassified_settled_stake_units": 0
    },
    "bet_now": "none",
    "bet_permission": "none",
    "closest_trigger": {
      "command_template": {
        "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
        "mode": "template",
        "placeholders": [
          {
            "field": "decimal_odds",
            "kind": "decimal_odds",
            "label": "Live decimal odds",
            "minimum": "2.198",
            "placeholder": "LIVE_DECIMAL_ODDS",
            "required": true
          },
          {
            "field": "source",
            "kind": "operator_source",
            "label": "Bookmaker/operator",
            "placeholder": "OPERATOR_BOOKMAKER",
            "required": true
          }
        ],
        "requires_replacement": true
      },
      "commands": {
        "preview_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
        "record_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
        "record_price_and_refresh": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
        "rerun": "./run_daily_goal.sh 2026-06-21 2"
      },
      "expected_value": "0.0034",
      "input_fields": [
        {
          "kind": "decimal_odds",
          "label": "Live decimal odds",
          "minimum": "2.198",
          "name": "decimal_odds",
          "placeholder": "LIVE_DECIMAL_ODDS",
          "required": true
        },
        {
          "kind": "operator_source",
          "label": "Bookmaker/operator",
          "name": "source",
          "placeholder": "OPERATOR_BOOKMAKER",
          "required": true
        },
        {
          "default": "live trigger price",
          "kind": "text",
          "label": "Notes",
          "name": "notes",
          "required": false
        }
      ],
      "kickoff_local": "2026-06-21T20:00+01:00",
      "market": "Under 2.5",
      "match": "Belgium v Iran",
      "model_probability": "0.4733",
      "needed_input": "price",
      "needed_odds": "2.198",
      "news": {
        "checked_at": "2026-06-21T07:32:00.796985+00:00",
        "published_at": "2026-06-20T22:38:57Z | 2026-06-21T05:35:00Z | 2026-06-20T18:59:06Z",
        "source": "https://news.google.com/rss/articles/CBMivAFBVV95cUxQZ18tR2hhc2tEdE4tRnR0RkZyVTVYbWRmb25ZLVpGZVkzRUIxWjEzRnhPTWI0eU9uVmxGTmVXSVh3b2NTcm5ER29jczV0M0hKem1LTXNWNlFRU1ZvMFZVU0RNRVBZWlNYUWdRaVA3emotOW5yRk5xbzFKWExlR3lLX2xPUDlFZXFEZk5vODZueUVUMzlnSXpQQmZBajdPLTl3cXhqQ01EOFZpdE96V1pGWGtOb0Jya19uaGZsYw?oc=5 | https://news.google.com/rss/articles/CBMiiAFBVV95cUxNQXZETWdpTHcwMmlZYmNOajhTTW9qQXhEWU5RQ2ltWEZxWnU5S0F3V0tINWtxdTFwZlNNdVBaakNTcHNLbi1nOTZ6YnJEb1Zwank0SWJPdm9ibFF5WERBT0U4d3AtT1RNT3JsTWR3RENpVFB3c2NZLWlneDVBeXlubDQ0clJMajRs?oc=5 | https://news.google.com/rss/articles/CBMiuAFBVV95cUxNQ0piRjVpYTJHNWxsN21ucWRQajFnOGdlSnpwRTh2cGVJMmh2RnhPTGZmTnQ2ckxOazQ5Y0w3QTNPaGRCcUZHZUFydmRPQzVPOTRKRE1jTkt5eHNmcUl2Wlg0MjFNeDdONFFtclVhSWMwbWNqLTRTMDZ4YURxRHZfeWZtTXp2ZDczY3JhQXdaWWt3Njlac1J1U1E0c2lVaVNYVGU3ZmFBVGRXZjZMNFBrT3JxUGZPMll2?oc=5",
        "stake_gate_cleared": true,
        "status": "news_matched",
        "status_label": "news_matched",
        "summary": "injury: Belgium winger Doku ruled out of World Cup match against Iran due to illness - FlashScore UK | lineup: Belgium vs Iran – Predicted lineup and team news - Yahoo Sports | lineup: Belgium vs Iran Predicted Lineups & Team News - Betfred Insights"
      },
      "price_move": "+0.078 (3.7%)",
      "role": "closest_price_trigger",
      "row_number": 1,
      "seen_odds": "2.12",
      "source": "The Odds API soccer_fifa_world_cup: Matchbook (API)",
      "stake_units": "0",
      "watch_window": "in 9h 28m; final 2026-06-21T19:40+01:00",
      "why": "No stake now; watch for 2.198+ model price trigger and complete price, then rerun. stress probability 47.3%; price 2.12; conservative EV 0.3%; break-even odds 2.113; bet odds 2.198 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: Matchbook (API); news: injury: Belgium winger Doku ruled out of World Cup match against Iran due to illness - FlashScore UK | lineup: Belgium vs Iran – Predicted lineup and team news - Yahoo Sports | lineup: Belgium vs Iran Predicted Lineups &; decision: price below World Cup EV gate"
    },
    "command_template": {
      "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
      "mode": "template",
      "placeholders": [
        {
          "field": "decimal_odds",
          "kind": "decimal_odds",
          "label": "Live decimal odds",
          "minimum": "2.198",
          "placeholder": "LIVE_DECIMAL_ODDS",
          "required": true
        },
        {
          "field": "source",
          "kind": "operator_source",
          "label": "Bookmaker/operator",
          "placeholder": "OPERATOR_BOOKMAKER",
          "required": true
        }
      ],
      "requires_replacement": true
    },
    "commands": {
      "preview_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
      "record_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
      "record_price_and_refresh": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
      "rerun": "./run_daily_goal.sh 2026-06-21 2"
    },
    "gate_reason": "no stake; seen 2.12 is EV 0.3%; needs 2.198+; operator/API price confirmed; news gate cleared",
    "input_fields": [
      {
        "kind": "decimal_odds",
        "label": "Live decimal odds",
        "minimum": "2.198",
        "name": "decimal_odds",
        "placeholder": "LIVE_DECIMAL_ODDS",
        "required": true
      },
      {
        "kind": "operator_source",
        "label": "Bookmaker/operator",
        "name": "source",
        "placeholder": "OPERATOR_BOOKMAKER",
        "required": true
      },
      {
        "default": "live trigger price",
        "kind": "text",
        "label": "Notes",
        "name": "notes",
        "required": false
      }
    ],
    "model": {
      "expected_value": "0.0034",
      "probability": "0.4733"
    },
    "needed_input": "price",
    "needed_odds": "2.198",
    "news": {
      "checked_at": "2026-06-21T07:32:00.796985+00:00",
      "published_at": "2026-06-20T22:38:57Z | 2026-06-21T05:35:00Z | 2026-06-20T18:59:06Z",
      "source": "https://news.google.com/rss/articles/CBMivAFBVV95cUxQZ18tR2hhc2tEdE4tRnR0RkZyVTVYbWRmb25ZLVpGZVkzRUIxWjEzRnhPTWI0eU9uVmxGTmVXSVh3b2NTcm5ER29jczV0M0hKem1LTXNWNlFRU1ZvMFZVU0RNRVBZWlNYUWdRaVA3emotOW5yRk5xbzFKWExlR3lLX2xPUDlFZXFEZk5vODZueUVUMzlnSXpQQmZBajdPLTl3cXhqQ01EOFZpdE96V1pGWGtOb0Jya19uaGZsYw?oc=5 | https://news.google.com/rss/articles/CBMiiAFBVV95cUxNQXZETWdpTHcwMmlZYmNOajhTTW9qQXhEWU5RQ2ltWEZxWnU5S0F3V0tINWtxdTFwZlNNdVBaakNTcHNLbi1nOTZ6YnJEb1Zwank0SWJPdm9ibFF5WERBT0U4d3AtT1RNT3JsTWR3RENpVFB3c2NZLWlneDVBeXlubDQ0clJMajRs?oc=5 | https://news.google.com/rss/articles/CBMiuAFBVV95cUxNQ0piRjVpYTJHNWxsN21ucWRQajFnOGdlSnpwRTh2cGVJMmh2RnhPTGZmTnQ2ckxOazQ5Y0w3QTNPaGRCcUZHZUFydmRPQzVPOTRKRE1jTkt5eHNmcUl2Wlg0MjFNeDdONFFtclVhSWMwbWNqLTRTMDZ4YURxRHZfeWZtTXp2ZDczY3JhQXdaWWt3Njlac1J1U1E0c2lVaVNYVGU3ZmFBVGRXZjZMNFBrT3JxUGZPMll2?oc=5",
      "stake_gate_cleared": true,
      "status": "news_matched",
      "status_label": "news_matched",
      "summary": "injury: Belgium winger Doku ruled out of World Cup match against Iran due to illness - FlashScore UK | lineup: Belgium vs Iran – Predicted lineup and team news - Yahoo Sports | lineup: Belgium vs Iran Predicted Lineups & Team News - Betfred Insights"
    },
    "news_slate": {
      "notes": [
        {
          "checked_at": "2026-06-21T07:32:00.796985+00:00",
          "match": "Ecuador v Curaçao",
          "signals": [
            "lineup"
          ],
          "stake_gate_cleared": true,
          "status": "news_matched"
        },
        {
          "checked_at": "2026-06-21T07:32:00.796985+00:00",
          "match": "Spain v Saudi Arabia",
          "signals": [
            "lineup"
          ],
          "stake_gate_cleared": true,
          "status": "news_matched"
        },
        {
          "checked_at": "2026-06-21T07:32:00.796985+00:00",
          "match": "Belgium v Iran",
          "signals": [
            "injury",
            "lineup"
          ],
          "stake_gate_cleared": true,
          "status": "news_matched"
        },
        {
          "checked_at": "2026-06-21T07:32:00.796985+00:00",
          "match": "Uruguay v Cape Verde",
          "signals": [
            "injury",
            "lineup"
          ],
          "stake_gate_cleared": true,
          "status": "news_matched"
        },
        {
          "checked_at": "2026-06-21T07:32:00.796985+00:00",
          "match": "New Zealand v Egypt",
          "signals": [
            "lineup",
            "availability"
          ],
          "stake_gate_cleared": true,
          "status": "news_matched"
        },
        {
          "checked_at": "2026-06-21T07:32:00.796985+00:00",
          "match": "Argentina v Austria",
          "signals": [
            "injury",
            "lineup"
          ],
          "stake_gate_cleared": true,
          "status": "news_matched"
        },
        {
          "checked_at": "2026-06-21T07:32:00.796985+00:00",
          "match": "France v Iraq",
          "signals": [
            "lineup"
          ],
          "stake_gate_cleared": true,
          "status": "news_matched"
        }
      ],
      "stake_gate_cleared": 7,
      "stake_gate_pending": 0,
      "statuses": {
        "news_matched": 7
      },
      "total": 7
    },
    "next_market": "Under 2.5",
    "next_match": "Belgium v Iran",
    "next_step": "preview_price",
    "next_watch": {
      "command_template": {
        "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
        "mode": "template",
        "placeholders": [
          {
            "field": "decimal_odds",
            "kind": "decimal_odds",
            "label": "Live decimal odds",
            "minimum": "2.198",
            "placeholder": "LIVE_DECIMAL_ODDS",
            "required": true
          },
          {
            "field": "source",
            "kind": "operator_source",
            "label": "Bookmaker/operator",
            "placeholder": "OPERATOR_BOOKMAKER",
            "required": true
          }
        ],
        "requires_replacement": true
      },
      "commands": {
        "preview_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
        "record_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
        "record_price_and_refresh": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
        "rerun": "./run_daily_goal.sh 2026-06-21 2"
      },
      "expected_value": "0.0034",
      "input_fields": [
        {
          "kind": "decimal_odds",
          "label": "Live decimal odds",
          "minimum": "2.198",
          "name": "decimal_odds",
          "placeholder": "LIVE_DECIMAL_ODDS",
          "required": true
        },
        {
          "kind": "operator_source",
          "label": "Bookmaker/operator",
          "name": "source",
          "placeholder": "OPERATOR_BOOKMAKER",
          "required": true
        },
        {
          "default": "live trigger price",
          "kind": "text",
          "label": "Notes",
          "name": "notes",
          "required": false
        }
      ],
      "kickoff_local": "2026-06-21T20:00+01:00",
      "market": "Under 2.5",
      "match": "Belgium v Iran",
      "model_probability": "0.4733",
      "needed_input": "price",
      "needed_odds": "2.198",
      "news": {
        "checked_at": "2026-06-21T07:32:00.796985+00:00",
        "published_at": "2026-06-20T22:38:57Z | 2026-06-21T05:35:00Z | 2026-06-20T18:59:06Z",
        "source": "https://news.google.com/rss/articles/CBMivAFBVV95cUxQZ18tR2hhc2tEdE4tRnR0RkZyVTVYbWRmb25ZLVpGZVkzRUIxWjEzRnhPTWI0eU9uVmxGTmVXSVh3b2NTcm5ER29jczV0M0hKem1LTXNWNlFRU1ZvMFZVU0RNRVBZWlNYUWdRaVA3emotOW5yRk5xbzFKWExlR3lLX2xPUDlFZXFEZk5vODZueUVUMzlnSXpQQmZBajdPLTl3cXhqQ01EOFZpdE96V1pGWGtOb0Jya19uaGZsYw?oc=5 | https://news.google.com/rss/articles/CBMiiAFBVV95cUxNQXZETWdpTHcwMmlZYmNOajhTTW9qQXhEWU5RQ2ltWEZxWnU5S0F3V0tINWtxdTFwZlNNdVBaakNTcHNLbi1nOTZ6YnJEb1Zwank0SWJPdm9ibFF5WERBT0U4d3AtT1RNT3JsTWR3RENpVFB3c2NZLWlneDVBeXlubDQ0clJMajRs?oc=5 | https://news.google.com/rss/articles/CBMiuAFBVV95cUxNQ0piRjVpYTJHNWxsN21ucWRQajFnOGdlSnpwRTh2cGVJMmh2RnhPTGZmTnQ2ckxOazQ5Y0w3QTNPaGRCcUZHZUFydmRPQzVPOTRKRE1jTkt5eHNmcUl2Wlg0MjFNeDdONFFtclVhSWMwbWNqLTRTMDZ4YURxRHZfeWZtTXp2ZDczY3JhQXdaWWt3Njlac1J1U1E0c2lVaVNYVGU3ZmFBVGRXZjZMNFBrT3JxUGZPMll2?oc=5",
        "stake_gate_cleared": true,
        "status": "news_matched",
        "status_label": "news_matched",
        "summary": "injury: Belgium winger Doku ruled out of World Cup match against Iran due to illness - FlashScore UK | lineup: Belgium vs Iran – Predicted lineup and team news - Yahoo Sports | lineup: Belgium vs Iran Predicted Lineups & Team News - Betfred Insights"
      },
      "price_move": "+0.078 (3.7%)",
      "role": "next_chronological_watch",
      "row_number": 1,
      "seen_odds": "2.12",
      "source": "The Odds API soccer_fifa_world_cup: Matchbook (API)",
      "stake_units": "0",
      "watch_window": "in 9h 28m; final 2026-06-21T19:40+01:00",
      "why": "No stake now; watch for 2.198+ model price trigger and complete price, then rerun. stress probability 47.3%; price 2.12; conservative EV 0.3%; break-even odds 2.113; bet odds 2.198 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: Matchbook (API); news: injury: Belgium winger Doku ruled out of World Cup match against Iran due to illness - FlashScore UK | lineup: Belgium vs Iran – Predicted lineup and team news - Yahoo Sports | lineup: Belgium vs Iran Predicted Lineups &; decision: price below World Cup EV gate"
    },
    "normal_stake_allowed": false,
    "odds": {
      "needed": "2.198",
      "price_move": "+0.078 (3.7%)",
      "seen": "2.12",
      "source": "The Odds API soccer_fifa_world_cup: Matchbook (API)"
    },
    "odds_slate": {
      "active_price_rows": 10,
      "closest_trigger": {
        "market": "Under 2.5",
        "match": "Belgium v Iran",
        "needed_input": "price",
        "needed_odds": "2.198",
        "price_move": "+0.078 (3.7%)",
        "seen_odds": "2.12",
        "source": "The Odds API soccer_fifa_world_cup: Matchbook (API)"
      },
      "operator_api_confirmed": 10,
      "other_price_rows": 0,
      "public_scout_only": 0,
      "source_counts": {
        "API": 10
      },
      "stakeability": "operator_or_api_prices_present",
      "trigger_rows": 6
    },
    "one_line": "No bet now. Next kickoff watch: Belgium v Iran Under 2.5; record only if a real bookmaker reaches 2.198+.",
    "operator_blocker": "42 deduped checked World Cup price rows; 42 active pre-match; 10 operator/API-confirmed active pre-match rows (source rows: 0 manual CSV rows; 0 price queue rows; 40 automatic price rows) from data/manual_price_checks.csv, results/manual_price_recheck_queue.csv, and results/world_cup_live_price_checks.csv",
    "primary_blocker": "Watch-only: 9 World Cup operator/API price rows were checked and still sit below the EV gate; closest confirmed price is Belgium v Iran Under 2.5 current 2.12 from The Odds API soccer_fifa_world_cup: Matchbook (API) (EV 0.3%; needs 2.198+ for the 4% EV gate; needed input: price).",
    "proof": {
      "actual_placed": 0,
      "actual_profit_units": 0,
      "actual_settled": 0,
      "normal_stake_actual_placed": 0,
      "normal_stake_actual_settled": 0,
      "proof_only_actual_placed": 0,
      "proof_only_actual_settled": 0,
      "proof_state": "PROVE_FIRST",
      "recommendation_profit_units": 0,
      "recommendation_settled": 0,
      "shadow_brier": 0.262498,
      "shadow_forced_profit_units": -1.72,
      "shadow_settled": 40,
      "unclassified_actual_placed": 0,
      "unclassified_actual_settled": 0
    },
    "proof_plan": {},
    "proof_stake_allowed": false,
    "result_slate": {
      "latest_settled": {
        "action": "Settled 0-0; no staked bet; zero-stake audit only",
        "fixture": "Ecuador v Curaçao",
        "result": "0-0"
      },
      "pending_fixtures": 5,
      "result_settlement_actions": 0,
      "settled_results": 1,
      "state": "part_settled",
      "total_fixtures": 6
    },
    "risk_warning": "The domestic strategy gate is not historically supported enough, but no domestic rows are in the current card.",
    "row_number": 1,
    "settlement_plan": {},
    "setup": {},
    "status": "BLOCKED",
    "thresholds": {
      "expected_value": "0.0034",
      "kickoff_local": "2026-06-21T20:00+01:00",
      "model_probability": "0.4733",
      "needed_odds": "2.198",
      "price_move": "+0.078 (3.7%)",
      "seen_odds": "2.12",
      "source": "The Odds API soccer_fifa_world_cup: Matchbook (API)",
      "stake_units": "0",
      "watch_rank": "1",
      "watch_window": "in 9h 28m; final 2026-06-21T19:40+01:00"
    },
    "viability": {
      "actual_placed": 0,
      "actual_settled": 0,
      "default_ev_gate_bets": "6",
      "default_ev_gate_min_supported_bets": 200,
      "income_staking": "not_ready",
      "normal_stake_actual_placed": 0,
      "normal_stake_actual_settled": 0,
      "one_line": "Not ready for income staking: 0 actual placements; broad positive-EV backtest ROI -3.1%; 0 settled staked live recommendations; default 5% EV gate has 6 historical bets",
      "proof_only_actual_placed": 0,
      "proof_only_actual_settled": 0,
      "reasons": [
        "0 actual placements",
        "broad positive-EV backtest ROI -3.1%",
        "0 settled staked live recommendations",
        "default 5% EV gate has 6 historical bets",
        "no supported 5% EV segment",
        "0 settled actual bookmaker placements"
      ],
      "recommendation_settled": 0,
      "shadow_forced_profit_units": -1.72,
      "shadow_settled": 40,
      "state": "PROVE_FIRST",
      "unclassified_actual_placed": 0,
      "unclassified_actual_settled": 0
    },
    "watch_required": true,
    "watchlist": [
      {
        "command_template": {
          "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
          "mode": "template",
          "placeholders": [
            {
              "field": "decimal_odds",
              "kind": "decimal_odds",
              "label": "Live decimal odds",
              "minimum": "2.198",
              "placeholder": "LIVE_DECIMAL_ODDS",
              "required": true
            },
            {
              "field": "source",
              "kind": "operator_source",
              "label": "Bookmaker/operator",
              "placeholder": "OPERATOR_BOOKMAKER",
              "required": true
            }
          ],
          "requires_replacement": true
        },
        "commands": {
          "preview_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
          "record_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
          "record_price_and_refresh": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
          "rerun": "./run_daily_goal.sh 2026-06-21 2"
        },
        "expected_value": "0.0034",
        "input_fields": [
          {
            "kind": "decimal_odds",
            "label": "Live decimal odds",
            "minimum": "2.198",
            "name": "decimal_odds",
            "placeholder": "LIVE_DECIMAL_ODDS",
            "required": true
          },
          {
            "kind": "operator_source",
            "label": "Bookmaker/operator",
            "name": "source",
            "placeholder": "OPERATOR_BOOKMAKER",
            "required": true
          },
          {
            "default": "live trigger price",
            "kind": "text",
            "label": "Notes",
            "name": "notes",
            "required": false
          }
        ],
        "kickoff_local": "2026-06-21T20:00+01:00",
        "market": "Under 2.5",
        "match": "Belgium v Iran",
        "model_probability": "0.4733",
        "needed_input": "price",
        "needed_odds": "2.198",
        "news": {
          "checked_at": "2026-06-21T07:32:00.796985+00:00",
          "published_at": "2026-06-20T22:38:57Z | 2026-06-21T05:35:00Z | 2026-06-20T18:59:06Z",
          "source": "https://news.google.com/rss/articles/CBMivAFBVV95cUxQZ18tR2hhc2tEdE4tRnR0RkZyVTVYbWRmb25ZLVpGZVkzRUIxWjEzRnhPTWI0eU9uVmxGTmVXSVh3b2NTcm5ER29jczV0M0hKem1LTXNWNlFRU1ZvMFZVU0RNRVBZWlNYUWdRaVA3emotOW5yRk5xbzFKWExlR3lLX2xPUDlFZXFEZk5vODZueUVUMzlnSXpQQmZBajdPLTl3cXhqQ01EOFZpdE96V1pGWGtOb0Jya19uaGZsYw?oc=5 | https://news.google.com/rss/articles/CBMiiAFBVV95cUxNQXZETWdpTHcwMmlZYmNOajhTTW9qQXhEWU5RQ2ltWEZxWnU5S0F3V0tINWtxdTFwZlNNdVBaakNTcHNLbi1nOTZ6YnJEb1Zwank0SWJPdm9ibFF5WERBT0U4d3AtT1RNT3JsTWR3RENpVFB3c2NZLWlneDVBeXlubDQ0clJMajRs?oc=5 | https://news.google.com/rss/articles/CBMiuAFBVV95cUxNQ0piRjVpYTJHNWxsN21ucWRQajFnOGdlSnpwRTh2cGVJMmh2RnhPTGZmTnQ2ckxOazQ5Y0w3QTNPaGRCcUZHZUFydmRPQzVPOTRKRE1jTkt5eHNmcUl2Wlg0MjFNeDdONFFtclVhSWMwbWNqLTRTMDZ4YURxRHZfeWZtTXp2ZDczY3JhQXdaWWt3Njlac1J1U1E0c2lVaVNYVGU3ZmFBVGRXZjZMNFBrT3JxUGZPMll2?oc=5",
          "stake_gate_cleared": true,
          "status": "news_matched",
          "status_label": "news_matched",
          "summary": "injury: Belgium winger Doku ruled out of World Cup match against Iran due to illness - FlashScore UK | lineup: Belgium vs Iran – Predicted lineup and team news - Yahoo Sports | lineup: Belgium vs Iran Predicted Lineups & Team News - Betfred Insights"
        },
        "price_move": "+0.078 (3.7%)",
        "role": "price_watch",
        "row_number": 1,
        "seen_odds": "2.12",
        "source": "The Odds API soccer_fifa_world_cup: Matchbook (API)",
        "stake_units": "0",
        "watch_window": "in 9h 28m; final 2026-06-21T19:40+01:00",
        "why": "No stake now; watch for 2.198+ model price trigger and complete price, then rerun. stress probability 47.3%; price 2.12; conservative EV 0.3%; break-even odds 2.113; bet odds 2.198 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: Matchbook (API); news: injury: Belgium winger Doku ruled out of World Cup match against Iran due to illness - FlashScore UK | lineup: Belgium vs Iran – Predicted lineup and team news - Yahoo Sports | lineup: Belgium vs Iran Predicted Lineups &; decision: price below World Cup EV gate"
      },
      {
        "command_template": {
          "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
          "mode": "template",
          "placeholders": [
            {
              "field": "decimal_odds",
              "kind": "decimal_odds",
              "label": "Live decimal odds",
              "minimum": "2.456",
              "placeholder": "LIVE_DECIMAL_ODDS",
              "required": true
            },
            {
              "field": "source",
              "kind": "operator_source",
              "label": "Bookmaker/operator",
              "placeholder": "OPERATOR_BOOKMAKER",
              "required": true
            }
          ],
          "requires_replacement": true
        },
        "commands": {
          "preview_price": "python3 record_price_check.py --action-row 2 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.456 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
          "record_price": "python3 record_price_check.py --action-row 2 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.456 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
          "record_price_and_refresh": "python3 record_price_check.py --action-row 2 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.456 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
          "rerun": "./run_daily_goal.sh 2026-06-21 2"
        },
        "expected_value": "-0.2926",
        "input_fields": [
          {
            "kind": "decimal_odds",
            "label": "Live decimal odds",
            "minimum": "2.456",
            "name": "decimal_odds",
            "placeholder": "LIVE_DECIMAL_ODDS",
            "required": true
          },
          {
            "kind": "operator_source",
            "label": "Bookmaker/operator",
            "name": "source",
            "placeholder": "OPERATOR_BOOKMAKER",
            "required": true
          },
          {
            "default": "live trigger price",
            "kind": "text",
            "label": "Notes",
            "name": "notes",
            "required": false
          }
        ],
        "kickoff_local": "2026-06-21T23:00+01:00",
        "market": "Under 2.5",
        "match": "Uruguay v Cape Verde",
        "model_probability": "0.4236",
        "needed_input": "price",
        "needed_odds": "2.456",
        "news": {
          "checked_at": "2026-06-21T07:32:00.796985+00:00",
          "published_at": "2026-06-20T22:00:00Z | 2026-06-20T22:00:14Z | 2026-06-20T12:23:11Z",
          "source": "https://news.google.com/rss/articles/CBMi2AFBVV95cUxPRE5TbXpEMTh0SjJnLTR1TFZ6WHFIUjBfLVpJdzktSEdKVEtzeWhnd19oU1NDVUp1Q21IamRxbmZxczd4a1FYTVI2UUY4WUNzMlV4c0FUR0JSdGZvTDJoZlowbHhYSUFidl81UEJEd0lycTNaaDZNT3FBQ3dkalBNNE5vaU1IQmp5Sm5rUHJrT2dha3E2YVRNVjBlT2FlN29PbWxIMTVMY1c0R2F1THgyRXYyYnR0S2l0a2dadkx5NWJOcTlsMmxES285ckNudS1CT2Zha2l2ZGY?oc=5 | https://news.google.com/rss/articles/CBMiwAFBVV95cUxPVWhqNVFlTHZ5czNoaEpjS2cxT2pfSWhYTUVzOTN1QWtPSWRYNkViRW9vODJlZXdWNUVvbjV6eFQ4VDFTbHUxZ2Rvc05CYU5xbFZtNjNBS2JBNFJhRWxHTDhiMUdvYTJPWjlKSTN6VERqaFhIOWNfSDF2bDFHSzJsell1WTVYdWIzT0oxV0dmaVJVREVtZS1JY045Wk1sZnZSRXZHUnpEb0Y5Ry1lU29qZmlkSEtXZWt1OHVVcDZ6SDU?oc=5 | https://news.google.com/rss/articles/CBMipwFBVV95cUxNQTcwMUJQTkpEMGZiR0lwRGJkWjN6XzFoOVFMeWlXSjBMNmdENWNMSFFKTVFJZFNoYUYxdHFGVFRKS3AxbHRObnEwTk4yRVhRUnF4amlCeG5qRUhWelhwYUMyT1pTTVJ4cjRIeFFOMDhfWV9wZGRLMFhoOHNObzlxX2luR1dMNXZHaU1USVJHSWdqOU1IbUNLT29nMjJQM1RTSndDWU5LVQ?oc=5",
          "stake_gate_cleared": true,
          "status": "news_matched",
          "status_label": "news_matched",
          "summary": "injury: Team News: Uruguay vs. Cape Verde injury, suspension list, predicted XIs | World Cup 2026 - Sports Mole | lineup: Uruguay vs Cape Verde Predicted Lineups & Team News - Betfred Insights | lineup: Cape Verde predicted lineup vs Uruguay for FIFA World Cup 2026 - Khel Now"
        },
        "price_move": "+0.786 (47.1%)",
        "role": "price_watch",
        "row_number": 2,
        "seen_odds": "1.67",
        "source": "The Odds API soccer_fifa_world_cup: Unibet (SE) (API)",
        "stake_units": "0",
        "watch_window": "in 12h 28m; final 2026-06-21T22:40+01:00",
        "why": "No stake now; watch for 2.456+ model price trigger and complete price, then rerun. stress probability 42.4%; price 1.67; conservative EV -29.3%; break-even odds 2.361; bet odds 2.456 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: Unibet (SE) (API); news: injury: Team News: Uruguay vs. Cape Verde injury, suspension list, predicted XIs | World Cup 2026 - Sports Mole | lineup: Uruguay vs Cape Verde Predicted Lineups & Team News - Betfred Insights | lineup: Cape Verde predic; decision: price below World Cup EV gate"
      },
      {
        "command_template": {
          "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
          "mode": "template",
          "placeholders": [
            {
              "field": "decimal_odds",
              "kind": "decimal_odds",
              "label": "Live decimal odds",
              "minimum": "2.076",
              "placeholder": "LIVE_DECIMAL_ODDS",
              "required": true
            },
            {
              "field": "source",
              "kind": "operator_source",
              "label": "Bookmaker/operator",
              "placeholder": "OPERATOR_BOOKMAKER",
              "required": true
            }
          ],
          "requires_replacement": true
        },
        "commands": {
          "preview_price": "python3 record_price_check.py --action-row 3 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.076 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
          "record_price": "python3 record_price_check.py --action-row 3 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.076 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
          "record_price_and_refresh": "python3 record_price_check.py --action-row 3 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.076 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
          "rerun": "./run_daily_goal.sh 2026-06-21 2"
        },
        "expected_value": "-0.0978",
        "input_fields": [
          {
            "kind": "decimal_odds",
            "label": "Live decimal odds",
            "minimum": "2.076",
            "name": "decimal_odds",
            "placeholder": "LIVE_DECIMAL_ODDS",
            "required": true
          },
          {
            "kind": "operator_source",
            "label": "Bookmaker/operator",
            "name": "source",
            "placeholder": "OPERATOR_BOOKMAKER",
            "required": true
          },
          {
            "default": "live trigger price",
            "kind": "text",
            "label": "Notes",
            "name": "notes",
            "required": false
          }
        ],
        "kickoff_local": "2026-06-22T02:00+01:00",
        "market": "Under 2.5",
        "match": "New Zealand v Egypt",
        "model_probability": "0.5012",
        "needed_input": "price",
        "needed_odds": "2.076",
        "news": {
          "checked_at": "2026-06-21T07:32:00.796985+00:00",
          "published_at": "2026-06-21T05:35:00Z | 2026-06-21T01:00:40Z | 2026-06-20T11:00:04Z",
          "source": "https://news.google.com/rss/articles/CBMihwFBVV95cUxQUDNDcjJ4NndGZFNCTHlERER0UWN0ZXJEMVZUYnRxTUxOd1BmeEtNbGNzWTE5Z1hMWElaWUhBVmV5Rm9jTDVCTDU5c2JoSjVPNE1USW9DTUpzU2o5UEV4SXdGXzFYMzBkTlpaNkNtZEYzZnhqQU5rY2lPWFdEUHRGUnZxdWFFWHc?oc=5 | https://news.google.com/rss/articles/CBMivwFBVV95cUxPX1FrWFVEeEt0bU5veWpSVFB4S3BUaWJ4WkVEeGVNTHBPT1B5NXVlakhRYVl1UnF1c3ZaNjFPRlNuNHI3T041N0pMaEZZVFk4S01WbzJ2WjV6SzBxZXVPWGoxWVVtSjVMUWtkNGNEbDQ1YnpkZDhsUHd2elI3dGtQOHVFWXhvazl2ajNSWDZpU3RsSjNGbU43WmxRa1R3dnUtbG84WlpzWFZTUE5qcnlDQmRRMy1VazRGNDI4bUl0QQ?oc=5 | https://www.theguardian.com/football/2026/jun/20/david-raya-when-you-lose-a-champions-league-final-it-destroys-you-inside",
          "stake_gate_cleared": true,
          "status": "news_matched",
          "status_label": "news_matched",
          "summary": "lineup: Egypt predicted lineup and team news vs New Zealand - Yahoo Sports Canada | lineup: New Zealand vs Egypt Predicted Lineups & Team News - Betfred Insights | availability: David Raya: ‘When you lose a Champions League final it destroys you inside’ - The goalkeeper discusses being bullied by 35-year-olds in the English fifth tier, winning the Premier League and competition in the Spain..."
        },
        "price_move": "+0.276 (15.3%)",
        "role": "price_watch",
        "row_number": 3,
        "seen_odds": "1.80",
        "source": "The Odds API soccer_fifa_world_cup: Unibet (SE) (API)",
        "stake_units": "0",
        "watch_window": "in 15h 28m; final 2026-06-22T01:40+01:00",
        "why": "No stake now; watch for 2.076+ model price trigger and complete price, then rerun. stress probability 50.1%; price 1.80; conservative EV -9.8%; break-even odds 1.995; bet odds 2.076 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: Unibet (SE) (API); news: lineup: Egypt predicted lineup and team news vs New Zealand - Yahoo Sports Canada | lineup: New Zealand vs Egypt Predicted Lineups & Team News - Betfred Insights | availability: David Raya: ‘When you lose a Champions Lea; decision: price below World Cup EV gate"
      },
      {
        "command_template": {
          "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
          "mode": "template",
          "placeholders": [
            {
              "field": "decimal_odds",
              "kind": "decimal_odds",
              "label": "Live decimal odds",
              "minimum": "2.513",
              "placeholder": "LIVE_DECIMAL_ODDS",
              "required": true
            },
            {
              "field": "source",
              "kind": "operator_source",
              "label": "Bookmaker/operator",
              "placeholder": "OPERATOR_BOOKMAKER",
              "required": true
            }
          ],
          "requires_replacement": true
        },
        "commands": {
          "preview_price": "python3 record_price_check.py --action-row 4 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.513 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
          "record_price": "python3 record_price_check.py --action-row 4 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.513 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
          "record_price_and_refresh": "python3 record_price_check.py --action-row 4 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.513 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
          "rerun": "./run_daily_goal.sh 2026-06-21 2"
        },
        "expected_value": "-0.1184",
        "input_fields": [
          {
            "kind": "decimal_odds",
            "label": "Live decimal odds",
            "minimum": "2.513",
            "name": "decimal_odds",
            "placeholder": "LIVE_DECIMAL_ODDS",
            "required": true
          },
          {
            "kind": "operator_source",
            "label": "Bookmaker/operator",
            "name": "source",
            "placeholder": "OPERATOR_BOOKMAKER",
            "required": true
          },
          {
            "default": "live trigger price",
            "kind": "text",
            "label": "Notes",
            "name": "notes",
            "required": false
          }
        ],
        "kickoff_local": "2026-06-22T02:00+01:00",
        "market": "Over 2.5",
        "match": "New Zealand v Egypt",
        "model_probability": "0.4139",
        "needed_input": "price",
        "needed_odds": "2.513",
        "news": {
          "checked_at": "2026-06-21T07:32:00.796985+00:00",
          "published_at": "2026-06-21T05:35:00Z | 2026-06-21T01:00:40Z | 2026-06-20T11:00:04Z",
          "source": "https://news.google.com/rss/articles/CBMihwFBVV95cUxQUDNDcjJ4NndGZFNCTHlERER0UWN0ZXJEMVZUYnRxTUxOd1BmeEtNbGNzWTE5Z1hMWElaWUhBVmV5Rm9jTDVCTDU5c2JoSjVPNE1USW9DTUpzU2o5UEV4SXdGXzFYMzBkTlpaNkNtZEYzZnhqQU5rY2lPWFdEUHRGUnZxdWFFWHc?oc=5 | https://news.google.com/rss/articles/CBMivwFBVV95cUxPX1FrWFVEeEt0bU5veWpSVFB4S3BUaWJ4WkVEeGVNTHBPT1B5NXVlakhRYVl1UnF1c3ZaNjFPRlNuNHI3T041N0pMaEZZVFk4S01WbzJ2WjV6SzBxZXVPWGoxWVVtSjVMUWtkNGNEbDQ1YnpkZDhsUHd2elI3dGtQOHVFWXhvazl2ajNSWDZpU3RsSjNGbU43WmxRa1R3dnUtbG84WlpzWFZTUE5qcnlDQmRRMy1VazRGNDI4bUl0QQ?oc=5 | https://www.theguardian.com/football/2026/jun/20/david-raya-when-you-lose-a-champions-league-final-it-destroys-you-inside",
          "stake_gate_cleared": true,
          "status": "news_matched",
          "status_label": "news_matched",
          "summary": "lineup: Egypt predicted lineup and team news vs New Zealand - Yahoo Sports Canada | lineup: New Zealand vs Egypt Predicted Lineups & Team News - Betfred Insights | availability: David Raya: ‘When you lose a Champions League final it destroys you inside’ - The goalkeeper discusses being bullied by 35-year-olds in the English fifth tier, winning the Premier League and competition in the Spain..."
        },
        "price_move": "+0.383 (18.0%)",
        "role": "price_watch",
        "row_number": 4,
        "seen_odds": "2.13",
        "source": "The Odds API soccer_fifa_world_cup: GTbets (API)",
        "stake_units": "0",
        "watch_window": "in 15h 28m; final 2026-06-22T01:40+01:00",
        "why": "No stake now; watch for 2.513+ model price trigger and complete price, then rerun. stress probability 41.4%; price 2.13; conservative EV -11.8%; break-even odds 2.416; bet odds 2.513 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: GTbets (API); news: lineup: Egypt predicted lineup and team news vs New Zealand - Yahoo Sports Canada | lineup: New Zealand vs Egypt Predicted Lineups & Team News - Betfred Insights | availability: David Raya: ‘When you lose a Champions Lea; decision: price below World Cup EV gate"
      },
      {
        "command_template": {
          "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
          "mode": "template",
          "placeholders": [
            {
              "field": "decimal_odds",
              "kind": "decimal_odds",
              "label": "Live decimal odds",
              "minimum": "2.347",
              "placeholder": "LIVE_DECIMAL_ODDS",
              "required": true
            },
            {
              "field": "source",
              "kind": "operator_source",
              "label": "Bookmaker/operator",
              "placeholder": "OPERATOR_BOOKMAKER",
              "required": true
            }
          ],
          "requires_replacement": true
        },
        "commands": {
          "preview_price": "python3 record_price_check.py --action-row 5 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.347 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
          "record_price": "python3 record_price_check.py --action-row 5 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.347 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
          "record_price_and_refresh": "python3 record_price_check.py --action-row 5 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.347 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
          "rerun": "./run_daily_goal.sh 2026-06-21 2"
        },
        "expected_value": "-0.1045",
        "input_fields": [
          {
            "kind": "decimal_odds",
            "label": "Live decimal odds",
            "minimum": "2.347",
            "name": "decimal_odds",
            "placeholder": "LIVE_DECIMAL_ODDS",
            "required": true
          },
          {
            "kind": "operator_source",
            "label": "Bookmaker/operator",
            "name": "source",
            "placeholder": "OPERATOR_BOOKMAKER",
            "required": true
          },
          {
            "default": "live trigger price",
            "kind": "text",
            "label": "Notes",
            "name": "notes",
            "required": false
          }
        ],
        "kickoff_local": "2026-06-22T18:00+01:00",
        "market": "Over 2.5",
        "match": "Argentina v Austria",
        "model_probability": "0.4433",
        "needed_input": "price",
        "needed_odds": "2.347",
        "news": {
          "checked_at": "2026-06-21T07:32:00.796985+00:00",
          "published_at": "2026-06-20T09:10:16Z | 2026-06-21T06:29:02Z | 2026-06-20T18:50:00Z",
          "source": "https://news.google.com/rss/articles/CBMiX0FVX3lxTE96cjhJQ0FQbS1WVjRMcXVlNDNiZGxFa0hNS1VWQ3hSME1SUzZfN3VDU0dySWdkWlB2OFJkcHpXcjhFbzhrSjhiRlNMc1hNUnlUbHRBYkctLXdJQ1gzM1dr?oc=5 | https://news.google.com/rss/articles/CBMiqAFBVV95cUxQLUNCMXVhWlg3cG1KTW9ldGNjS0pFYmtLei1ZLUxpcThWeFlQeWRUWjExUjlqcUdkSEsySDZ3TGVrTGFqM0J0bXhuT2tDYVkxTWdMUEg4NWo1UlMwX3ljdlNxYU4xU0dhUjYxd3otSU1nemtrS2dseDBHVXhyX2R6OEZGQVp4WWcwNV9uaXpYVTFQLWwya1h6WF9IRnRDZmhKSi1WWllwc2c?oc=5 | https://news.google.com/rss/articles/CBMi7AFBVV95cUxQUEhYOG5TcVZNekNENnkxS3YyQTVfVWJSeF8wS0xjU1hWRDV6a0lYeTlmcU5KbEVadDAxajd0anB5SE5NYjNKMUpUZ1BaOFdiemxKbWdiRlg5dU0wODFlSUE4TVNPZmdneENjbS11RXhhLWJKODRCQlBjX2xYYnAwQ0hnV1p3NWp3eWxEcjFWNzRlWHJMbGNNWVVqNXdKdUlrZk0yN1kzVUl5aU1CaEc3bldmUVZfN05jSDBMTXgzY2gzOWpBbVlCcC02VjRQWWpMWDVmR2Vtd2s0RFEtekRxMzVZUVoyRjhGb3ctRA?oc=5",
          "stake_gate_cleared": true,
          "status": "news_matched",
          "status_label": "news_matched",
          "summary": "injury: Argentina Dealt Severe Injury Blow Ahead of Crucial Austria Clash - The Daily Campus | lineup: Argentina hint at multiple changes to starting XI against Austria - daily-sun.com | lineup: Argentina vs Austria at World Cup 2026: TV channel, how to watch, kick-off time, live stream, referee, predicted line-ups - ESPN"
        },
        "price_move": "+0.327 (16.2%)",
        "role": "price_watch",
        "row_number": 5,
        "seen_odds": "2.02",
        "source": "The Odds API soccer_fifa_world_cup: Matchbook (API)",
        "stake_units": "0",
        "watch_window": "in 1d 7h; final 2026-06-22T17:40+01:00",
        "why": "No stake now; watch for 2.347+ model price trigger and complete price, then rerun. stress probability 44.3%; price 2.02; conservative EV -10.4%; break-even odds 2.256; bet odds 2.347 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: Matchbook (API); news: injury: Argentina Dealt Severe Injury Blow Ahead of Crucial Austria Clash - The Daily Campus | lineup: Argentina hint at multiple changes to starting XI against Austria - daily-sun.com | lineup: Argentina vs Austria at W; decision: price below World Cup EV gate"
      },
      {
        "command_template": {
          "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
          "mode": "template",
          "placeholders": [
            {
              "field": "decimal_odds",
              "kind": "decimal_odds",
              "label": "Live decimal odds",
              "minimum": "3.469",
              "placeholder": "LIVE_DECIMAL_ODDS",
              "required": true
            },
            {
              "field": "source",
              "kind": "operator_source",
              "label": "Bookmaker/operator",
              "placeholder": "OPERATOR_BOOKMAKER",
              "required": true
            }
          ],
          "requires_replacement": true
        },
        "commands": {
          "preview_price": "python3 record_price_check.py --action-row 6 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 3.469 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
          "record_price": "python3 record_price_check.py --action-row 6 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 3.469 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
          "record_price_and_refresh": "python3 record_price_check.py --action-row 6 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 3.469 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
          "rerun": "./run_daily_goal.sh 2026-06-21 2"
        },
        "expected_value": "-0.0107",
        "input_fields": [
          {
            "kind": "decimal_odds",
            "label": "Live decimal odds",
            "minimum": "3.469",
            "name": "decimal_odds",
            "placeholder": "LIVE_DECIMAL_ODDS",
            "required": true
          },
          {
            "kind": "operator_source",
            "label": "Bookmaker/operator",
            "name": "source",
            "placeholder": "OPERATOR_BOOKMAKER",
            "required": true
          },
          {
            "default": "live trigger price",
            "kind": "text",
            "label": "Notes",
            "name": "notes",
            "required": false
          }
        ],
        "kickoff_local": "2026-06-22T22:00+01:00",
        "market": "Under 2.5",
        "match": "France v Iraq",
        "model_probability": "0.2998",
        "needed_input": "price",
        "needed_odds": "3.469",
        "news": {
          "checked_at": "2026-06-21T07:32:00.796985+00:00",
          "published_at": "2026-06-20T13:20:58Z | 2026-06-20T10:14:38Z | 2026-06-20T08:18:47Z",
          "source": "https://news.google.com/rss/articles/CBMivgJBVV95cUxPQ1d5UW9aN2phbUhFdk1LR1ViQXlVbkkxajFub1o3d1FXS3ZRa3E0WGFlNXZ5aGRiZElHSmJYNkpFYmhNZTFWRmR1YlZ2dzZqd214SVQ4OUVYcjFkZ2tPclN5UVFwSndtTGhuOHpMaS1UYXQ4ZFhFeVJ1bnlycVRjSGJUOHlFZ1M2UlpDbnJYV3RqNEtJTGtmQk9sbEVFaXVOYWc5aXB6U2tlcGZPMm1lLTBKRG5rM1VPR3hXLXBkaHh0RHdiZWpiTThnVWtxek9JcGE4TzUtSmhqXzc3ZXZraFBZZ3hvdDEtVms5WnNBU3pNODNYbXYzMjE4dlJTa0tfRzVFNkZoWkZMbExuRGljVHZTYVh3WTBBOEZRdm9SZVZ4RHludExjZWlpMThpSm5KVUVxd0Y0YzlHNkxReGc?oc=5 | https://news.google.com/rss/articles/CBMi2AJBVV95cUxQazMzVUVXOWpIM1huZmYtXzRLMlVBOU9aLVFpREhGQUlIeVIyWDdGdDlnYmZILTdsOHo4QktuNGgtUFNRNW5UMkk3Zkpnc0w2Unp6eURWOWh6QmFhRzJkVmNydmFxS0pyOEotUmpmamdoSjl1d0g3V0hfcmlXYnRZVkZ2VUE2bklGSHFreFdDUmlKTzRSUmtUek9ydkk2Nkd4Nk9VbFpjM1Q3VmNVZHM2Z0d2MlJDSUdHZjE0ZF9FaklkRlNYcXN3dWtBVVF4WHBnX0VfRHN1RDd2WVJ1d21aZlR0OTc4cjFNaGQtRG1tR2xQUTA3TWdSM2VnMVdRMkx2UXlCamtkVmQzQjZHSzBVWXhNY3NFcTktLUJiOU54R1F4TXN2ZjdYQnVaMU0tQTl3eDVqVGhvZkhjbXg3alRjNEE1Y0kyTnRlUUVyQzVNYWJHNWhTZ2ZtYw?oc=5 | https://news.google.com/rss/articles/CBMiwgFBVV95cUxOakJ1dzBtV3dTNi1qdkRwVGRndHNvNjdqSzYxNTR0RFo3VDB4ejVXTHVNejRqTlRBb2hyaVRlODBXb3BENU85TV9XMnROY2JvTzJaR3hubUFMSXp6RFdsbVRucElNdkh0a0NDd2FQZlFvYkU1UkF0N0xMMTdSZV96bjBKdi1GRFZCMkxVSURMdWlZb1dHNV9kZkt4UWFqWk82SE9PS1l4VDhFZ2trVzZjeHh3NUR5bEMyWFlpYXlJT2g4dw?oc=5",
          "stake_gate_cleared": true,
          "status": "news_matched",
          "status_label": "news_matched",
          "summary": "lineup: France vs Iraq: Three changes expected in France’s lineup - MSN | lineup: France vs Iraq – The French lineup announced with changes including Barcola - MSN | lineup: France vs Iraq – The French lineup announced with changes including Barcola - MSN"
        },
        "price_move": "+0.169 (5.1%)",
        "role": "price_watch",
        "row_number": 6,
        "seen_odds": "3.30",
        "source": "The Odds API soccer_fifa_world_cup: Betsson (API)",
        "stake_units": "0",
        "watch_window": "in 1d 11h; final 2026-06-22T21:40+01:00",
        "why": "No stake now; watch for 3.469+ model price trigger and complete price, then rerun. stress probability 30.0%; price 3.30; conservative EV -1.1%; break-even odds 3.336; bet odds 3.469 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: Betsson (API); news: lineup: France vs Iraq: Three changes expected in France’s lineup - MSN | lineup: France vs Iraq – The French lineup announced with changes including Barcola - MSN | lineup: France vs Iraq – The French lineup announced w; decision: price below World Cup EV gate"
      }
    ],
    "why": "No stake now; watch for 2.198+ model price trigger and complete price, then rerun. stress probability 47.3%; price 2.12; conservative EV 0.3%; break-even odds 2.113; bet odds 2.198 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: Matchbook (API); news: injury: Belgium winger Doku ruled out of World Cup match against Iran due to illness - FlashScore UK | lineup: Belgium vs Iran – Predicted lineup and team news - Yahoo Sports | lineup: Belgium vs Iran Predicted Lineups &; decision: price below World Cup EV gate"
  },
  "performance": {
    "actual_bets": {
      "input_issues": 0,
      "normal_stake_placed": 0,
      "normal_stake_profit_units": 0,
      "normal_stake_roi": 0.0,
      "normal_stake_settled": 0,
      "normal_stake_settled_stake_units": 0,
      "open": 0,
      "open_slips": [],
      "open_stake_units": 0,
      "placed": 0,
      "profit_units": 0,
      "proof_only_placed": 0,
      "proof_only_profit_units": 0,
      "proof_only_roi": 0.0,
      "proof_only_settled": 0,
      "proof_only_settled_stake_units": 0,
      "raw_rows": 0,
      "roi": 0.0,
      "settled": 0,
      "settled_slips": [],
      "settled_stake_units": 0,
      "source": "data/actual_bets.csv",
      "unclassified_placed": 0,
      "unclassified_profit_units": 0,
      "unclassified_roi": 0.0,
      "unclassified_settled": 0,
      "unclassified_settled_stake_units": 0,
      "usable_rows": 0,
      "wins": 0
    },
    "doctor_evidence": {
      "Actual betting ledger": {
        "detail": "0 placed in data/actual_bets.csv; 0 normal-stake; 0 proof-only; 0 unclassified; 0 open (0.00u); 0 settled; actual P/L 0.00u from 0.00u; 0 input issue(s)",
        "status": "WARN"
      },
      "Historical strategy support": {
        "detail": "Historical strategy gate needs proof: sample too small (6 bets; need 200) at EV >= 5.0% (observed ROI 64.8%)",
        "status": "WARN"
      },
      "Settled live evidence": {
        "detail": "2 open listed recommendation(s) (0 current candidate(s), 2 now downgraded/missing from current gates), 0 settled; open listed/audit stake 0.027u, not actual bookmaker exposure; settled profit 0.00u; settled ROI 0.0%; shadow zero-stake settled 40, forced-side P/L -1.72u from 40.00u; shadow probability expected 17.10 winner(s), actual 19, Brier 0.262",
        "status": "WARN"
      }
    },
    "recommendation_ledger": {
      "open": 2,
      "open_current_candidate_stake_units": 0.0,
      "open_current_candidates": 0,
      "open_downgraded": 0,
      "open_missing_current": 2,
      "open_not_current": 2,
      "open_not_current_stake_units": 0.027,
      "open_stake_units": 0.027,
      "profit_units": 0,
      "roi": 0.0,
      "settled": 0,
      "settled_stake_units": 0,
      "shadow": {
        "actual_rate": 0.475,
        "actual_wins": 19.0,
        "average_probability": 0.427395,
        "brier": 0.262498,
        "calibration_gap": 0.047605,
        "expected_wins": 17.096,
        "forced_profit_units": -1.72,
        "forced_roi": -0.043,
        "forced_stake_units": 40.0,
        "priced": 40,
        "probability_count": 40,
        "settled": 40,
        "wins": 19
      },
      "staked": 2,
      "wins": 0
    },
    "strategy": {
      "broad_positive_ev": {
        "avg_expected_value": "0.011062885904397132",
        "bets": "1735",
        "min_ev": "0.0",
        "profit_units": "-54.23000000000003",
        "roi": "-0.03125648414985593"
      },
      "default_ev_gate": {
        "avg_expected_value": "0.05376257809132098",
        "bets": "6",
        "min_ev": "0.05",
        "min_supported_bets": 200,
        "profit_units": "3.8900000000000006",
        "roi": "0.6483333333333334",
        "supported_sample": false
      },
      "proof_reasons": [
        "0 settled staked live recommendations",
        "broad positive-EV backtest ROI -3.1%",
        "default 5% EV gate has 6 historical bets",
        "no supported 5% EV segment",
        "0 settled actual bookmaker placements"
      ],
      "proof_state": "PROVE_FIRST",
      "supported_default_segments": 0
    }
  },
  "proof": {
    "actual_placed": 0,
    "actual_profit_units": 0,
    "actual_settled": 0,
    "normal_stake_actual_placed": 0,
    "normal_stake_actual_settled": 0,
    "proof_only_actual_placed": 0,
    "proof_only_actual_settled": 0,
    "proof_state": "PROVE_FIRST",
    "recommendation_profit_units": 0,
    "recommendation_settled": 0,
    "shadow_brier": 0.262498,
    "shadow_forced_profit_units": -1.72,
    "shadow_settled": 40,
    "unclassified_actual_placed": 0,
    "unclassified_actual_settled": 0
  },
  "proof_stake_allowed": false,
  "readiness": {
    "actual_slips": "0 placed in `data/actual_bets.csv`; 0 normal-stake; 0 proof-only; 0 unclassified; 0 open (0.00u); 0 settled; actual P/L 0.00u; 0 input issues",
    "api_key": "set",
    "api_key_env": "THE_ODDS_API_KEY",
    "api_key_file_status": {
      "blank_files": [],
      "files": [
        ".env.local"
      ],
      "key": "THE_ODDS_API_KEY",
      "key_files": [
        ".env.local"
      ],
      "state": "key_present_in_file"
    },
    "doctor_checks": {
      "Actual bet input quality": {
        "detail": "0 invalid actual bookmaker placement row(s)",
        "status": "PASS"
      },
      "Actual betting ledger": {
        "detail": "0 placed in data/actual_bets.csv; 0 normal-stake; 0 proof-only; 0 unclassified; 0 open (0.00u); 0 settled; actual P/L 0.00u from 0.00u; 0 input issue(s)",
        "status": "WARN"
      },
      "Briefing artifact age": {
        "detail": "0.0 hours old",
        "status": "PASS"
      },
      "Daily card artifact age": {
        "detail": "0.0 hours old",
        "status": "PASS"
      },
      "Domestic card rows": {
        "detail": "0 rows in window; statuses: none",
        "status": "WARN"
      },
      "Domestic odds API key": {
        "detail": "`THE_ODDS_API_KEY` is set",
        "status": "PASS"
      },
      "Domestic result settlement": {
        "detail": "0 unsettled staked domestic row(s) dated before 2026-06-21 (Europe/Dublin)",
        "status": "PASS"
      },
      "Historical strategy support": {
        "detail": "Historical strategy gate needs proof: sample too small (6 bets; need 200) at EV >= 5.0% (observed ROI 64.8%)",
        "status": "WARN"
      },
      "Settled live evidence": {
        "detail": "2 open listed recommendation(s) (0 current candidate(s), 2 now downgraded/missing from current gates), 0 settled; open listed/audit stake 0.027u, not actual bookmaker exposure; settled profit 0.00u; settled ROI 0.0%; shadow zero-stake settled 40, forced-side P/L -1.72u from 40.00u; shadow probability expected 17.10 winner(s), actual 19, Brier 0.262",
        "status": "WARN"
      },
      "World Cup daily card rows": {
        "detail": "12 artifact rows in results/world_cup_daily_card.csv; current statuses: no_bet_integer_stake_floor: 1, no_bet_rechecked_price: 9, settled_result_supplied: 2",
        "status": "PASS"
      },
      "World Cup fixture rows": {
        "detail": "7 fixtures in window",
        "status": "PASS"
      },
      "World Cup history rows": {
        "detail": "165 tracked rows in results/world_cup_bet_history.csv",
        "status": "PASS"
      },
      "World Cup manual price input quality": {
        "detail": "0 unusable or expired attempted manual price row(s)",
        "status": "PASS"
      },
      "World Cup market freshness": {
        "detail": "0 active stale-price check(s); 0 started row(s) closed; 47 total market checks",
        "status": "PASS"
      },
      "World Cup news context": {
        "detail": "7/7 current fixture rows; 7 RSS matched headline(s); 0 manual team-news check(s); 7 gate-clearing row(s); artifact 0.0 hours old",
        "status": "PASS"
      },
      "World Cup news gate": {
        "detail": "1/1 active decision row(s) have gate-clearing news; 0 fixture(s) need manual team-news check",
        "status": "PASS"
      },
      "World Cup news intake queue": {
        "detail": "No pre-match fixture needs manual news intake",
        "status": "PASS"
      },
      "World Cup price evidence": {
        "detail": "42 deduped checked World Cup price rows; 42 active pre-match; 10 operator/API-confirmed active pre-match rows (source rows: 0 manual CSV rows; 0 price queue rows; 40 automatic price rows) from data/manual_price_checks.csv, results/manual_price_recheck_queue.csv, and results/world_cup_live_price_checks.csv",
        "status": "PASS"
      },
      "World Cup price-move triggers": {
        "detail": "6 operator/API no-bet trigger rows; closest Belgium v Iran Under 2.5 at 2.12 needs 2.198+; needed input: price; all shown trigger rows have gate-clearing news",
        "status": "PASS"
      },
      "World Cup refresh age": {
        "detail": "0.0 hours since fetch",
        "status": "PASS"
      },
      "World Cup result input quality": {
        "detail": "0 unusable result row(s) in data/world_cup_results.csv",
        "status": "PASS"
      },
      "World Cup result rows": {
        "detail": "36 valid result row(s), 36 raw row(s) in data/world_cup_results.csv; 0 fixture/history item(s) due for settlement",
        "status": "PASS"
      }
    },
    "fixture_summary": "7 fixtures in the sheet (4 today, 3 tomorrow); 0 domestic rows; 7 World Cup fixtures",
    "proof_state": "PROVE_FIRST - 0 settled staked live recommendations; broad positive-EV backtest ROI -3.1%; default 5% EV gate has 6 historical bets; no supported 5% EV segment",
    "world_cup_price_evidence": "`data/manual_price_checks.csv`, `results/manual_price_recheck_queue.csv`, and `results/world_cup_live_price_checks.csv` (42 deduped checked price rows; 42 active pre-match; 10 operator/API-confirmed active pre-match rows; source rows: 0 manual CSV rows; 0 price queue rows; 10 automatic price rows)"
  },
  "risk_warnings": [
    "The domestic strategy gate is not historically supported enough, but no domestic rows are in the current card.",
    "No settled staked live recommendations yet, so real-money performance is unproven; shadow zero-stake audit has 40 settled zero-stake model row(s).",
    "No actual bookmaker placements are recorded in `data/actual_bets.csv`; actual P/L is unproven even when model/shadow rows settle."
  ],
  "snapshot_warnings": [],
  "stake_summary": "0; do not stake until blockers are fixed",
  "status": "BLOCKED",
  "viability": {
    "actual_placed": 0,
    "actual_settled": 0,
    "default_ev_gate_bets": "6",
    "default_ev_gate_min_supported_bets": 200,
    "income_staking": "not_ready",
    "normal_stake_actual_placed": 0,
    "normal_stake_actual_settled": 0,
    "one_line": "Not ready for income staking: 0 actual placements; broad positive-EV backtest ROI -3.1%; 0 settled staked live recommendations; default 5% EV gate has 6 historical bets",
    "proof_only_actual_placed": 0,
    "proof_only_actual_settled": 0,
    "reasons": [
      "0 actual placements",
      "broad positive-EV backtest ROI -3.1%",
      "0 settled staked live recommendations",
      "default 5% EV gate has 6 historical bets",
      "no supported 5% EV segment",
      "0 settled actual bookmaker placements"
    ],
    "recommendation_settled": 0,
    "shadow_forced_profit_units": -1.72,
    "shadow_settled": 40,
    "state": "PROVE_FIRST",
    "unclassified_actual_placed": 0,
    "unclassified_actual_settled": 0
  },
  "watch_required": true,
  "watch_rows": [
    {
      "action_type": "watch_price",
      "command": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
      "command_template": {
        "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
        "mode": "template",
        "placeholders": [
          {
            "field": "decimal_odds",
            "kind": "decimal_odds",
            "label": "Live decimal odds",
            "minimum": "2.198",
            "placeholder": "LIVE_DECIMAL_ODDS",
            "required": true
          },
          {
            "field": "source",
            "kind": "operator_source",
            "label": "Bookmaker/operator",
            "placeholder": "OPERATOR_BOOKMAKER",
            "required": true
          }
        ],
        "requires_replacement": true
      },
      "commands": {
        "preview_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
        "record_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
        "record_price_and_refresh": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
        "rerun": "./run_daily_goal.sh 2026-06-21 2"
      },
      "date_utc": "2026-06-21T19:00:00Z",
      "expected_value": "0.0034",
      "input_fields": [
        {
          "kind": "decimal_odds",
          "label": "Live decimal odds",
          "minimum": "2.198",
          "name": "decimal_odds",
          "placeholder": "LIVE_DECIMAL_ODDS",
          "required": true
        },
        {
          "kind": "operator_source",
          "label": "Bookmaker/operator",
          "name": "source",
          "placeholder": "OPERATOR_BOOKMAKER",
          "required": true
        },
        {
          "default": "live trigger price",
          "kind": "text",
          "label": "Notes",
          "name": "notes",
          "required": false
        }
      ],
      "kickoff_local": "2026-06-21T20:00+01:00",
      "market": "Under 2.5",
      "match": "Belgium v Iran",
      "model_probability": "0.4733",
      "needed_input": "price",
      "needed_odds": "2.198",
      "news_command": "",
      "preview_command": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
      "price_move": "+0.078 (3.7%)",
      "priority": "2",
      "recommendation": "WATCH_ONLY",
      "refresh_command": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
      "rerun_command": "./run_daily_goal.sh 2026-06-21 2",
      "row_number": 1,
      "scope": "world_cup",
      "seen_odds": "2.12",
      "source": "The Odds API soccer_fifa_world_cup: Matchbook (API)",
      "stake_units": "0",
      "thresholds": {
        "expected_value": "0.0034",
        "kickoff_local": "2026-06-21T20:00+01:00",
        "model_probability": "0.4733",
        "needed_odds": "2.198",
        "price_move": "+0.078 (3.7%)",
        "seen_odds": "2.12",
        "source": "The Odds API soccer_fifa_world_cup: Matchbook (API)",
        "stake_units": "0",
        "watch_rank": "1",
        "watch_window": "in 9h 28m; final 2026-06-21T19:40+01:00"
      },
      "watch_rank": "1",
      "watch_window": "in 9h 28m; final 2026-06-21T19:40+01:00",
      "why": "No stake now; watch for 2.198+ model price trigger and complete price, then rerun. stress probability 47.3%; price 2.12; conservative EV 0.3%; break-even odds 2.113; bet odds 2.198 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: Matchbook (API); news: injury: Belgium winger Doku ruled out of World Cup match against Iran due to illness - FlashScore UK | lineup: Belgium vs Iran – Predicted lineup and team news - Yahoo Sports | lineup: Belgium vs Iran Predicted Lineups &; decision: price below World Cup EV gate",
      "workflow": {
        "command_template": {
          "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
          "mode": "template",
          "placeholders": [
            {
              "field": "decimal_odds",
              "kind": "decimal_odds",
              "label": "Live decimal odds",
              "minimum": "2.198",
              "placeholder": "LIVE_DECIMAL_ODDS",
              "required": true
            },
            {
              "field": "source",
              "kind": "operator_source",
              "label": "Bookmaker/operator",
              "placeholder": "OPERATOR_BOOKMAKER",
              "required": true
            }
          ],
          "requires_replacement": true
        },
        "commands": {
          "preview_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
          "record_price": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
          "record_price_and_refresh": "python3 record_price_check.py --action-row 1 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.198 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
          "rerun": "./run_daily_goal.sh 2026-06-21 2"
        },
        "input_fields": [
          {
            "kind": "decimal_odds",
            "label": "Live decimal odds",
            "minimum": "2.198",
            "name": "decimal_odds",
            "placeholder": "LIVE_DECIMAL_ODDS",
            "required": true
          },
          {
            "kind": "operator_source",
            "label": "Bookmaker/operator",
            "name": "source",
            "placeholder": "OPERATOR_BOOKMAKER",
            "required": true
          },
          {
            "default": "live trigger price",
            "kind": "text",
            "label": "Notes",
            "name": "notes",
            "required": false
          }
        ],
        "next_step": "preview_price",
        "thresholds": {
          "expected_value": "0.0034",
          "kickoff_local": "2026-06-21T20:00+01:00",
          "model_probability": "0.4733",
          "needed_odds": "2.198",
          "price_move": "+0.078 (3.7%)",
          "seen_odds": "2.12",
          "source": "The Odds API soccer_fifa_world_cup: Matchbook (API)",
          "stake_units": "0",
          "watch_rank": "1",
          "watch_window": "in 9h 28m; final 2026-06-21T19:40+01:00"
        }
      }
    },
    {
      "action_type": "watch_price",
      "command": "python3 record_price_check.py --action-row 2 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.456 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
      "command_template": {
        "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
        "mode": "template",
        "placeholders": [
          {
            "field": "decimal_odds",
            "kind": "decimal_odds",
            "label": "Live decimal odds",
            "minimum": "2.456",
            "placeholder": "LIVE_DECIMAL_ODDS",
            "required": true
          },
          {
            "field": "source",
            "kind": "operator_source",
            "label": "Bookmaker/operator",
            "placeholder": "OPERATOR_BOOKMAKER",
            "required": true
          }
        ],
        "requires_replacement": true
      },
      "commands": {
        "preview_price": "python3 record_price_check.py --action-row 2 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.456 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
        "record_price": "python3 record_price_check.py --action-row 2 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.456 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
        "record_price_and_refresh": "python3 record_price_check.py --action-row 2 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.456 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
        "rerun": "./run_daily_goal.sh 2026-06-21 2"
      },
      "date_utc": "2026-06-21T22:00:00Z",
      "expected_value": "-0.2926",
      "input_fields": [
        {
          "kind": "decimal_odds",
          "label": "Live decimal odds",
          "minimum": "2.456",
          "name": "decimal_odds",
          "placeholder": "LIVE_DECIMAL_ODDS",
          "required": true
        },
        {
          "kind": "operator_source",
          "label": "Bookmaker/operator",
          "name": "source",
          "placeholder": "OPERATOR_BOOKMAKER",
          "required": true
        },
        {
          "default": "live trigger price",
          "kind": "text",
          "label": "Notes",
          "name": "notes",
          "required": false
        }
      ],
      "kickoff_local": "2026-06-21T23:00+01:00",
      "market": "Under 2.5",
      "match": "Uruguay v Cape Verde",
      "model_probability": "0.4236",
      "needed_input": "price",
      "needed_odds": "2.456",
      "news_command": "",
      "preview_command": "python3 record_price_check.py --action-row 2 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.456 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
      "price_move": "+0.786 (47.1%)",
      "priority": "2",
      "recommendation": "WATCH_ONLY",
      "refresh_command": "python3 record_price_check.py --action-row 2 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.456 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
      "rerun_command": "./run_daily_goal.sh 2026-06-21 2",
      "row_number": 2,
      "scope": "world_cup",
      "seen_odds": "1.67",
      "source": "The Odds API soccer_fifa_world_cup: Unibet (SE) (API)",
      "stake_units": "0",
      "thresholds": {
        "expected_value": "-0.2926",
        "kickoff_local": "2026-06-21T23:00+01:00",
        "model_probability": "0.4236",
        "needed_odds": "2.456",
        "price_move": "+0.786 (47.1%)",
        "seen_odds": "1.67",
        "source": "The Odds API soccer_fifa_world_cup: Unibet (SE) (API)",
        "stake_units": "0",
        "watch_rank": "2",
        "watch_window": "in 12h 28m; final 2026-06-21T22:40+01:00"
      },
      "watch_rank": "2",
      "watch_window": "in 12h 28m; final 2026-06-21T22:40+01:00",
      "why": "No stake now; watch for 2.456+ model price trigger and complete price, then rerun. stress probability 42.4%; price 1.67; conservative EV -29.3%; break-even odds 2.361; bet odds 2.456 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: Unibet (SE) (API); news: injury: Team News: Uruguay vs. Cape Verde injury, suspension list, predicted XIs | World Cup 2026 - Sports Mole | lineup: Uruguay vs Cape Verde Predicted Lineups & Team News - Betfred Insights | lineup: Cape Verde predic; decision: price below World Cup EV gate",
      "workflow": {
        "command_template": {
          "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
          "mode": "template",
          "placeholders": [
            {
              "field": "decimal_odds",
              "kind": "decimal_odds",
              "label": "Live decimal odds",
              "minimum": "2.456",
              "placeholder": "LIVE_DECIMAL_ODDS",
              "required": true
            },
            {
              "field": "source",
              "kind": "operator_source",
              "label": "Bookmaker/operator",
              "placeholder": "OPERATOR_BOOKMAKER",
              "required": true
            }
          ],
          "requires_replacement": true
        },
        "commands": {
          "preview_price": "python3 record_price_check.py --action-row 2 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.456 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
          "record_price": "python3 record_price_check.py --action-row 2 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.456 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
          "record_price_and_refresh": "python3 record_price_check.py --action-row 2 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.456 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
          "rerun": "./run_daily_goal.sh 2026-06-21 2"
        },
        "input_fields": [
          {
            "kind": "decimal_odds",
            "label": "Live decimal odds",
            "minimum": "2.456",
            "name": "decimal_odds",
            "placeholder": "LIVE_DECIMAL_ODDS",
            "required": true
          },
          {
            "kind": "operator_source",
            "label": "Bookmaker/operator",
            "name": "source",
            "placeholder": "OPERATOR_BOOKMAKER",
            "required": true
          },
          {
            "default": "live trigger price",
            "kind": "text",
            "label": "Notes",
            "name": "notes",
            "required": false
          }
        ],
        "next_step": "preview_price",
        "thresholds": {
          "expected_value": "-0.2926",
          "kickoff_local": "2026-06-21T23:00+01:00",
          "model_probability": "0.4236",
          "needed_odds": "2.456",
          "price_move": "+0.786 (47.1%)",
          "seen_odds": "1.67",
          "source": "The Odds API soccer_fifa_world_cup: Unibet (SE) (API)",
          "stake_units": "0",
          "watch_rank": "2",
          "watch_window": "in 12h 28m; final 2026-06-21T22:40+01:00"
        }
      }
    },
    {
      "action_type": "watch_price",
      "command": "python3 record_price_check.py --action-row 3 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.076 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
      "command_template": {
        "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
        "mode": "template",
        "placeholders": [
          {
            "field": "decimal_odds",
            "kind": "decimal_odds",
            "label": "Live decimal odds",
            "minimum": "2.076",
            "placeholder": "LIVE_DECIMAL_ODDS",
            "required": true
          },
          {
            "field": "source",
            "kind": "operator_source",
            "label": "Bookmaker/operator",
            "placeholder": "OPERATOR_BOOKMAKER",
            "required": true
          }
        ],
        "requires_replacement": true
      },
      "commands": {
        "preview_price": "python3 record_price_check.py --action-row 3 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.076 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
        "record_price": "python3 record_price_check.py --action-row 3 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.076 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
        "record_price_and_refresh": "python3 record_price_check.py --action-row 3 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.076 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
        "rerun": "./run_daily_goal.sh 2026-06-21 2"
      },
      "date_utc": "2026-06-22T01:00:00Z",
      "expected_value": "-0.0978",
      "input_fields": [
        {
          "kind": "decimal_odds",
          "label": "Live decimal odds",
          "minimum": "2.076",
          "name": "decimal_odds",
          "placeholder": "LIVE_DECIMAL_ODDS",
          "required": true
        },
        {
          "kind": "operator_source",
          "label": "Bookmaker/operator",
          "name": "source",
          "placeholder": "OPERATOR_BOOKMAKER",
          "required": true
        },
        {
          "default": "live trigger price",
          "kind": "text",
          "label": "Notes",
          "name": "notes",
          "required": false
        }
      ],
      "kickoff_local": "2026-06-22T02:00+01:00",
      "market": "Under 2.5",
      "match": "New Zealand v Egypt",
      "model_probability": "0.5012",
      "needed_input": "price",
      "needed_odds": "2.076",
      "news_command": "",
      "preview_command": "python3 record_price_check.py --action-row 3 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.076 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
      "price_move": "+0.276 (15.3%)",
      "priority": "2",
      "recommendation": "WATCH_ONLY",
      "refresh_command": "python3 record_price_check.py --action-row 3 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.076 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
      "rerun_command": "./run_daily_goal.sh 2026-06-21 2",
      "row_number": 3,
      "scope": "world_cup",
      "seen_odds": "1.80",
      "source": "The Odds API soccer_fifa_world_cup: Unibet (SE) (API)",
      "stake_units": "0",
      "thresholds": {
        "expected_value": "-0.0978",
        "kickoff_local": "2026-06-22T02:00+01:00",
        "model_probability": "0.5012",
        "needed_odds": "2.076",
        "price_move": "+0.276 (15.3%)",
        "seen_odds": "1.80",
        "source": "The Odds API soccer_fifa_world_cup: Unibet (SE) (API)",
        "stake_units": "0",
        "watch_rank": "3",
        "watch_window": "in 15h 28m; final 2026-06-22T01:40+01:00"
      },
      "watch_rank": "3",
      "watch_window": "in 15h 28m; final 2026-06-22T01:40+01:00",
      "why": "No stake now; watch for 2.076+ model price trigger and complete price, then rerun. stress probability 50.1%; price 1.80; conservative EV -9.8%; break-even odds 1.995; bet odds 2.076 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: Unibet (SE) (API); news: lineup: Egypt predicted lineup and team news vs New Zealand - Yahoo Sports Canada | lineup: New Zealand vs Egypt Predicted Lineups & Team News - Betfred Insights | availability: David Raya: ‘When you lose a Champions Lea; decision: price below World Cup EV gate",
      "workflow": {
        "command_template": {
          "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
          "mode": "template",
          "placeholders": [
            {
              "field": "decimal_odds",
              "kind": "decimal_odds",
              "label": "Live decimal odds",
              "minimum": "2.076",
              "placeholder": "LIVE_DECIMAL_ODDS",
              "required": true
            },
            {
              "field": "source",
              "kind": "operator_source",
              "label": "Bookmaker/operator",
              "placeholder": "OPERATOR_BOOKMAKER",
              "required": true
            }
          ],
          "requires_replacement": true
        },
        "commands": {
          "preview_price": "python3 record_price_check.py --action-row 3 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.076 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
          "record_price": "python3 record_price_check.py --action-row 3 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.076 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
          "record_price_and_refresh": "python3 record_price_check.py --action-row 3 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.076 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
          "rerun": "./run_daily_goal.sh 2026-06-21 2"
        },
        "input_fields": [
          {
            "kind": "decimal_odds",
            "label": "Live decimal odds",
            "minimum": "2.076",
            "name": "decimal_odds",
            "placeholder": "LIVE_DECIMAL_ODDS",
            "required": true
          },
          {
            "kind": "operator_source",
            "label": "Bookmaker/operator",
            "name": "source",
            "placeholder": "OPERATOR_BOOKMAKER",
            "required": true
          },
          {
            "default": "live trigger price",
            "kind": "text",
            "label": "Notes",
            "name": "notes",
            "required": false
          }
        ],
        "next_step": "preview_price",
        "thresholds": {
          "expected_value": "-0.0978",
          "kickoff_local": "2026-06-22T02:00+01:00",
          "model_probability": "0.5012",
          "needed_odds": "2.076",
          "price_move": "+0.276 (15.3%)",
          "seen_odds": "1.80",
          "source": "The Odds API soccer_fifa_world_cup: Unibet (SE) (API)",
          "stake_units": "0",
          "watch_rank": "3",
          "watch_window": "in 15h 28m; final 2026-06-22T01:40+01:00"
        }
      }
    },
    {
      "action_type": "watch_price",
      "command": "python3 record_price_check.py --action-row 4 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.513 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
      "command_template": {
        "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
        "mode": "template",
        "placeholders": [
          {
            "field": "decimal_odds",
            "kind": "decimal_odds",
            "label": "Live decimal odds",
            "minimum": "2.513",
            "placeholder": "LIVE_DECIMAL_ODDS",
            "required": true
          },
          {
            "field": "source",
            "kind": "operator_source",
            "label": "Bookmaker/operator",
            "placeholder": "OPERATOR_BOOKMAKER",
            "required": true
          }
        ],
        "requires_replacement": true
      },
      "commands": {
        "preview_price": "python3 record_price_check.py --action-row 4 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.513 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
        "record_price": "python3 record_price_check.py --action-row 4 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.513 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
        "record_price_and_refresh": "python3 record_price_check.py --action-row 4 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.513 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
        "rerun": "./run_daily_goal.sh 2026-06-21 2"
      },
      "date_utc": "2026-06-22T01:00:00Z",
      "expected_value": "-0.1184",
      "input_fields": [
        {
          "kind": "decimal_odds",
          "label": "Live decimal odds",
          "minimum": "2.513",
          "name": "decimal_odds",
          "placeholder": "LIVE_DECIMAL_ODDS",
          "required": true
        },
        {
          "kind": "operator_source",
          "label": "Bookmaker/operator",
          "name": "source",
          "placeholder": "OPERATOR_BOOKMAKER",
          "required": true
        },
        {
          "default": "live trigger price",
          "kind": "text",
          "label": "Notes",
          "name": "notes",
          "required": false
        }
      ],
      "kickoff_local": "2026-06-22T02:00+01:00",
      "market": "Over 2.5",
      "match": "New Zealand v Egypt",
      "model_probability": "0.4139",
      "needed_input": "price",
      "needed_odds": "2.513",
      "news_command": "",
      "preview_command": "python3 record_price_check.py --action-row 4 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.513 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
      "price_move": "+0.383 (18.0%)",
      "priority": "2",
      "recommendation": "WATCH_ONLY",
      "refresh_command": "python3 record_price_check.py --action-row 4 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.513 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
      "rerun_command": "./run_daily_goal.sh 2026-06-21 2",
      "row_number": 4,
      "scope": "world_cup",
      "seen_odds": "2.13",
      "source": "The Odds API soccer_fifa_world_cup: GTbets (API)",
      "stake_units": "0",
      "thresholds": {
        "expected_value": "-0.1184",
        "kickoff_local": "2026-06-22T02:00+01:00",
        "model_probability": "0.4139",
        "needed_odds": "2.513",
        "price_move": "+0.383 (18.0%)",
        "seen_odds": "2.13",
        "source": "The Odds API soccer_fifa_world_cup: GTbets (API)",
        "stake_units": "0",
        "watch_rank": "4",
        "watch_window": "in 15h 28m; final 2026-06-22T01:40+01:00"
      },
      "watch_rank": "4",
      "watch_window": "in 15h 28m; final 2026-06-22T01:40+01:00",
      "why": "No stake now; watch for 2.513+ model price trigger and complete price, then rerun. stress probability 41.4%; price 2.13; conservative EV -11.8%; break-even odds 2.416; bet odds 2.513 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: GTbets (API); news: lineup: Egypt predicted lineup and team news vs New Zealand - Yahoo Sports Canada | lineup: New Zealand vs Egypt Predicted Lineups & Team News - Betfred Insights | availability: David Raya: ‘When you lose a Champions Lea; decision: price below World Cup EV gate",
      "workflow": {
        "command_template": {
          "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
          "mode": "template",
          "placeholders": [
            {
              "field": "decimal_odds",
              "kind": "decimal_odds",
              "label": "Live decimal odds",
              "minimum": "2.513",
              "placeholder": "LIVE_DECIMAL_ODDS",
              "required": true
            },
            {
              "field": "source",
              "kind": "operator_source",
              "label": "Bookmaker/operator",
              "placeholder": "OPERATOR_BOOKMAKER",
              "required": true
            }
          ],
          "requires_replacement": true
        },
        "commands": {
          "preview_price": "python3 record_price_check.py --action-row 4 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.513 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
          "record_price": "python3 record_price_check.py --action-row 4 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.513 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
          "record_price_and_refresh": "python3 record_price_check.py --action-row 4 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.513 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
          "rerun": "./run_daily_goal.sh 2026-06-21 2"
        },
        "input_fields": [
          {
            "kind": "decimal_odds",
            "label": "Live decimal odds",
            "minimum": "2.513",
            "name": "decimal_odds",
            "placeholder": "LIVE_DECIMAL_ODDS",
            "required": true
          },
          {
            "kind": "operator_source",
            "label": "Bookmaker/operator",
            "name": "source",
            "placeholder": "OPERATOR_BOOKMAKER",
            "required": true
          },
          {
            "default": "live trigger price",
            "kind": "text",
            "label": "Notes",
            "name": "notes",
            "required": false
          }
        ],
        "next_step": "preview_price",
        "thresholds": {
          "expected_value": "-0.1184",
          "kickoff_local": "2026-06-22T02:00+01:00",
          "model_probability": "0.4139",
          "needed_odds": "2.513",
          "price_move": "+0.383 (18.0%)",
          "seen_odds": "2.13",
          "source": "The Odds API soccer_fifa_world_cup: GTbets (API)",
          "stake_units": "0",
          "watch_rank": "4",
          "watch_window": "in 15h 28m; final 2026-06-22T01:40+01:00"
        }
      }
    },
    {
      "action_type": "watch_price",
      "command": "python3 record_price_check.py --action-row 5 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.347 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
      "command_template": {
        "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
        "mode": "template",
        "placeholders": [
          {
            "field": "decimal_odds",
            "kind": "decimal_odds",
            "label": "Live decimal odds",
            "minimum": "2.347",
            "placeholder": "LIVE_DECIMAL_ODDS",
            "required": true
          },
          {
            "field": "source",
            "kind": "operator_source",
            "label": "Bookmaker/operator",
            "placeholder": "OPERATOR_BOOKMAKER",
            "required": true
          }
        ],
        "requires_replacement": true
      },
      "commands": {
        "preview_price": "python3 record_price_check.py --action-row 5 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.347 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
        "record_price": "python3 record_price_check.py --action-row 5 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.347 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
        "record_price_and_refresh": "python3 record_price_check.py --action-row 5 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.347 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
        "rerun": "./run_daily_goal.sh 2026-06-21 2"
      },
      "date_utc": "2026-06-22T17:00:00Z",
      "expected_value": "-0.1045",
      "input_fields": [
        {
          "kind": "decimal_odds",
          "label": "Live decimal odds",
          "minimum": "2.347",
          "name": "decimal_odds",
          "placeholder": "LIVE_DECIMAL_ODDS",
          "required": true
        },
        {
          "kind": "operator_source",
          "label": "Bookmaker/operator",
          "name": "source",
          "placeholder": "OPERATOR_BOOKMAKER",
          "required": true
        },
        {
          "default": "live trigger price",
          "kind": "text",
          "label": "Notes",
          "name": "notes",
          "required": false
        }
      ],
      "kickoff_local": "2026-06-22T18:00+01:00",
      "market": "Over 2.5",
      "match": "Argentina v Austria",
      "model_probability": "0.4433",
      "needed_input": "price",
      "needed_odds": "2.347",
      "news_command": "",
      "preview_command": "python3 record_price_check.py --action-row 5 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.347 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
      "price_move": "+0.327 (16.2%)",
      "priority": "2",
      "recommendation": "WATCH_ONLY",
      "refresh_command": "python3 record_price_check.py --action-row 5 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.347 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
      "rerun_command": "./run_daily_goal.sh 2026-06-21 2",
      "row_number": 5,
      "scope": "world_cup",
      "seen_odds": "2.02",
      "source": "The Odds API soccer_fifa_world_cup: Matchbook (API)",
      "stake_units": "0",
      "thresholds": {
        "expected_value": "-0.1045",
        "kickoff_local": "2026-06-22T18:00+01:00",
        "model_probability": "0.4433",
        "needed_odds": "2.347",
        "price_move": "+0.327 (16.2%)",
        "seen_odds": "2.02",
        "source": "The Odds API soccer_fifa_world_cup: Matchbook (API)",
        "stake_units": "0",
        "watch_rank": "5",
        "watch_window": "in 1d 7h; final 2026-06-22T17:40+01:00"
      },
      "watch_rank": "5",
      "watch_window": "in 1d 7h; final 2026-06-22T17:40+01:00",
      "why": "No stake now; watch for 2.347+ model price trigger and complete price, then rerun. stress probability 44.3%; price 2.02; conservative EV -10.4%; break-even odds 2.256; bet odds 2.347 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: Matchbook (API); news: injury: Argentina Dealt Severe Injury Blow Ahead of Crucial Austria Clash - The Daily Campus | lineup: Argentina hint at multiple changes to starting XI against Austria - daily-sun.com | lineup: Argentina vs Austria at W; decision: price below World Cup EV gate",
      "workflow": {
        "command_template": {
          "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
          "mode": "template",
          "placeholders": [
            {
              "field": "decimal_odds",
              "kind": "decimal_odds",
              "label": "Live decimal odds",
              "minimum": "2.347",
              "placeholder": "LIVE_DECIMAL_ODDS",
              "required": true
            },
            {
              "field": "source",
              "kind": "operator_source",
              "label": "Bookmaker/operator",
              "placeholder": "OPERATOR_BOOKMAKER",
              "required": true
            }
          ],
          "requires_replacement": true
        },
        "commands": {
          "preview_price": "python3 record_price_check.py --action-row 5 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.347 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
          "record_price": "python3 record_price_check.py --action-row 5 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.347 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
          "record_price_and_refresh": "python3 record_price_check.py --action-row 5 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 2.347 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
          "rerun": "./run_daily_goal.sh 2026-06-21 2"
        },
        "input_fields": [
          {
            "kind": "decimal_odds",
            "label": "Live decimal odds",
            "minimum": "2.347",
            "name": "decimal_odds",
            "placeholder": "LIVE_DECIMAL_ODDS",
            "required": true
          },
          {
            "kind": "operator_source",
            "label": "Bookmaker/operator",
            "name": "source",
            "placeholder": "OPERATOR_BOOKMAKER",
            "required": true
          },
          {
            "default": "live trigger price",
            "kind": "text",
            "label": "Notes",
            "name": "notes",
            "required": false
          }
        ],
        "next_step": "preview_price",
        "thresholds": {
          "expected_value": "-0.1045",
          "kickoff_local": "2026-06-22T18:00+01:00",
          "model_probability": "0.4433",
          "needed_odds": "2.347",
          "price_move": "+0.327 (16.2%)",
          "seen_odds": "2.02",
          "source": "The Odds API soccer_fifa_world_cup: Matchbook (API)",
          "stake_units": "0",
          "watch_rank": "5",
          "watch_window": "in 1d 7h; final 2026-06-22T17:40+01:00"
        }
      }
    },
    {
      "action_type": "watch_price",
      "command": "python3 record_price_check.py --action-row 6 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 3.469 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
      "command_template": {
        "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
        "mode": "template",
        "placeholders": [
          {
            "field": "decimal_odds",
            "kind": "decimal_odds",
            "label": "Live decimal odds",
            "minimum": "3.469",
            "placeholder": "LIVE_DECIMAL_ODDS",
            "required": true
          },
          {
            "field": "source",
            "kind": "operator_source",
            "label": "Bookmaker/operator",
            "placeholder": "OPERATOR_BOOKMAKER",
            "required": true
          }
        ],
        "requires_replacement": true
      },
      "commands": {
        "preview_price": "python3 record_price_check.py --action-row 6 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 3.469 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
        "record_price": "python3 record_price_check.py --action-row 6 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 3.469 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
        "record_price_and_refresh": "python3 record_price_check.py --action-row 6 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 3.469 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
        "rerun": "./run_daily_goal.sh 2026-06-21 2"
      },
      "date_utc": "2026-06-22T21:00:00Z",
      "expected_value": "-0.0107",
      "input_fields": [
        {
          "kind": "decimal_odds",
          "label": "Live decimal odds",
          "minimum": "3.469",
          "name": "decimal_odds",
          "placeholder": "LIVE_DECIMAL_ODDS",
          "required": true
        },
        {
          "kind": "operator_source",
          "label": "Bookmaker/operator",
          "name": "source",
          "placeholder": "OPERATOR_BOOKMAKER",
          "required": true
        },
        {
          "default": "live trigger price",
          "kind": "text",
          "label": "Notes",
          "name": "notes",
          "required": false
        }
      ],
      "kickoff_local": "2026-06-22T22:00+01:00",
      "market": "Under 2.5",
      "match": "France v Iraq",
      "model_probability": "0.2998",
      "needed_input": "price",
      "needed_odds": "3.469",
      "news_command": "",
      "preview_command": "python3 record_price_check.py --action-row 6 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 3.469 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
      "price_move": "+0.169 (5.1%)",
      "priority": "2",
      "recommendation": "WATCH_ONLY",
      "refresh_command": "python3 record_price_check.py --action-row 6 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 3.469 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
      "rerun_command": "./run_daily_goal.sh 2026-06-21 2",
      "row_number": 6,
      "scope": "world_cup",
      "seen_odds": "3.30",
      "source": "The Odds API soccer_fifa_world_cup: Betsson (API)",
      "stake_units": "0",
      "thresholds": {
        "expected_value": "-0.0107",
        "kickoff_local": "2026-06-22T22:00+01:00",
        "model_probability": "0.2998",
        "needed_odds": "3.469",
        "price_move": "+0.169 (5.1%)",
        "seen_odds": "3.30",
        "source": "The Odds API soccer_fifa_world_cup: Betsson (API)",
        "stake_units": "0",
        "watch_rank": "6",
        "watch_window": "in 1d 11h; final 2026-06-22T21:40+01:00"
      },
      "watch_rank": "6",
      "watch_window": "in 1d 11h; final 2026-06-22T21:40+01:00",
      "why": "No stake now; watch for 3.469+ model price trigger and complete price, then rerun. stress probability 30.0%; price 3.30; conservative EV -1.1%; break-even odds 3.336; bet odds 3.469 for 4% EV; recommendation no_bet_rechecked_price; fresh price check from The Odds API soccer_fifa_world_cup: Betsson (API); news: lineup: France vs Iraq: Three changes expected in France’s lineup - MSN | lineup: France vs Iraq – The French lineup announced with changes including Barcola - MSN | lineup: France vs Iraq – The French lineup announced w; decision: price below World Cup EV gate",
      "workflow": {
        "command_template": {
          "instruction": "Replace LIVE_DECIMAL_ODDS=live bookmaker price; OPERATOR_BOOKMAKER=bookmaker/source checked before running template commands.",
          "mode": "template",
          "placeholders": [
            {
              "field": "decimal_odds",
              "kind": "decimal_odds",
              "label": "Live decimal odds",
              "minimum": "3.469",
              "placeholder": "LIVE_DECIMAL_ODDS",
              "required": true
            },
            {
              "field": "source",
              "kind": "operator_source",
              "label": "Bookmaker/operator",
              "placeholder": "OPERATOR_BOOKMAKER",
              "required": true
            }
          ],
          "requires_replacement": true
        },
        "commands": {
          "preview_price": "python3 record_price_check.py --action-row 6 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 3.469 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --dry-run",
          "record_price": "python3 record_price_check.py --action-row 6 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 3.469 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\"",
          "record_price_and_refresh": "python3 record_price_check.py --action-row 6 --decimal-odds LIVE_DECIMAL_ODDS --min-decimal-odds 3.469 --source \"OPERATOR_BOOKMAKER\" --notes \"live trigger price\" --answer-mode --rerun-after-record",
          "rerun": "./run_daily_goal.sh 2026-06-21 2"
        },
        "input_fields": [
          {
            "kind": "decimal_odds",
            "label": "Live decimal odds",
            "minimum": "3.469",
            "name": "decimal_odds",
            "placeholder": "LIVE_DECIMAL_ODDS",
            "required": true
          },
          {
            "kind": "operator_source",
            "label": "Bookmaker/operator",
            "name": "source",
            "placeholder": "OPERATOR_BOOKMAKER",
            "required": true
          },
          {
            "default": "live trigger price",
            "kind": "text",
            "label": "Notes",
            "name": "notes",
            "required": false
          }
        ],
        "next_step": "preview_price",
        "thresholds": {
          "expected_value": "-0.0107",
          "kickoff_local": "2026-06-22T22:00+01:00",
          "model_probability": "0.2998",
          "needed_odds": "3.469",
          "price_move": "+0.169 (5.1%)",
          "seen_odds": "3.30",
          "source": "The Odds API soccer_fifa_world_cup: Betsson (API)",
          "stake_units": "0",
          "watch_rank": "6",
          "watch_window": "in 1d 11h; final 2026-06-22T21:40+01:00"
        }
      }
    }
  ],
  "why": "1 World Cup fixture(s) have no market checks",
  "window": {
    "as_of": "2026-06-21T07:32:00.796985+00:00",
    "as_of_local": "2026-06-21T08:32:00.796985+01:00",
    "days": 2,
    "end_date": "2026-06-22",
    "start_date": "2026-06-21",
    "timezone": "Europe/Dublin"
  }
}
