{
  "_generated_utc": "2026-05-13T07:30:00Z",
  "_note": "Per-book live endpoint registry for /proof?book=<key>. Each source value is either a fully-qualified URL (or true for GH which is dispatched via /api/github-dispatch + /api/gh-run-status) or null when no implementation exists yet. Books with all-null sources will render the page with all four buttons disabled and explicit 'not implemented for this book yet' markers.",
  "books": {
    "draftkings": {
      "display": "DraftKings",
      "tier": "flagship",
      "dedicated_page": "/draftkings-proof",
      "sources": {
        "cloudflare_worker": {
          "blocked": true,
          "reason": "DraftKings currently blocks Cloudflare Worker egress to sportsbook-nash.draftkings.com. Fresh 2026-06-24 probe of abet-draftkings-cloudflare-proof returned a JSON wrapper but all six upstream sport requests were HTTP 403 text/html, 449 bytes each, json_parse_ok=false. Oracle VM and GitHub Actions still capture the same league endpoints successfully."
        },
        "cloudflare_worker_props": {
          "blocked": true,
          "reason": "DraftKings currently blocks Cloudflare Worker egress for the MLB props depth worker. Fresh 2026-06-24 probe of abet-draftkings-mlb-props-cloudflare-proof attempted 38 MLB category/subcategory endpoints; all 38 upstream requests returned HTTP 403 text/html at about 499-501 bytes with json_parse_ok=false. This is a Cloudflare-to-DK egress blocker, not a props decoder pass."
        },
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/draftkings?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space_props": "https://abetco-live-odds.hf.space/scrape/draftkings_mlb_props/baseball?include_raw=1&raw_mode=preview&sample_limit=100",
    "huggingface_space_all_depth": "https://abetco-live-odds.hf.space/scrape/draftkings_all_depth/all?include_raw=0&raw_mode=preview&sample_limit=5",
    "huggingface_space_wnba_all_depth": "https://abetco-live-odds.hf.space/scrape/draftkings_all_depth/all?include_raw=0&league_id=94682&endpoint_batch_size=10&max_workers=16",
    "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/draftkings/scrape?include_raw=1&raw_mode=full&sample_limit=100",
    "oracle_vm_props": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/draftkings_mlb_props/scrape?include_raw=1&raw_mode=preview&sample_limit=100",
    "oracle_vm_all_depth": "https://years-excluded-maintain-briefing.trycloudflare.com/scrape/all?include_raw=0&raw_mode=preview&sample_limit=1&endpoint_limit=5&endpoint_batch_size=5",
    "oracle_vm_wnba_all_depth": "https://years-excluded-maintain-briefing.trycloudflare.com/scrape/all?include_raw=0&league_id=94682&endpoint_batch_size=10&max_workers=16",
    "cloudflare_worker_all_depth_window": "https://abet-draftkings-browser-run-diagnostic.abetco.workers.dev/scrape/draftkings_all_depth/all?include_raw=0&raw_mode=preview&sample_limit=1&endpoint_limit=5&endpoint_batch_size=5",
    "cloudflare_worker_wnba_all_depth": "https://abet-draftkings-browser-run-diagnostic.abetco.workers.dev/scrape/draftkings_all_depth/all?include_raw=0&league_id=94682&endpoint_batch_size=10&max_workers=16",
        "cloudflare_worker_browser_diagnostic": "https://abet-draftkings-browser-run-diagnostic.abetco.workers.dev/diagnose/browser-content",
        "github_actions": true,
        "github_actions_props": {
          "workflow": "20260626_DRAFTKINGS_MLB_PROPS_DEPTH_SNAPSHOT_PROOF_v1_0_0.yml",
          "run_id": "28264963809",
          "run_url": "https://github.com/misterplusev/abet-scraper-scripts/actions/runs/28264963809",
          "manifest_status": "captured",
          "raw_bytes": 5371412,
          "events": 82,
          "markets": 2596,
          "selections": 9311,
          "endpoints_ok": 38,
          "endpoints_failed": 0
        },
        "_note_2026_05_22": "Historical 4/4 verified snapshot. Current 2026-06-24 truth supersedes this for Cloudflare: DK now blocks direct Cloudflare Worker egress with upstream HTTP 403. HF/Oracle/GH remain live raw proof paths.",
        "_note_cloudflare": "HARD_BLOCKED 2026-06-24. DraftKings sportsbook-nash now returns HTTP 403 to Cloudflare Worker egress for both game-line and MLB-props endpoints. This is visible evidence, not a parser failure.",
        "_note_oracle": "PASS for historical 6-league game-line mux and PASS for 2026-06-27 all-depth fixed-manifest proof. Fresh 2026-06-30 direct all-depth tunnel kidney-documentation-mysql-brandon.trycloudflare.com returned 39/39 roots and 5/5 bounded endpoints after pausing expansion proof loops and restarting WARP; VM capacity is degraded and monitored at /oracle-vm-status.",
        "_note_github": "PASS under strict manifest gate. GitHub Actions captures DraftKings raw through the DK fast runner; current Cloudflare blocker is source-specific, not a global DraftKings scraper failure."
      }
    },
    "fanduel": {
      "display": "FanDuel",
      "tier": "flagship",
      "dedicated_page": "/fanduel-proof",
      "sources": {
        "cloudflare_worker": "https://abet-fanduel-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "cloudflare_worker_props": "https://abet-fanduel-mlb-props-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "cloudflare_worker_all_depth": "https://abet-fanduel-all-depth-cloudflare-proof.abetco.workers.dev/scrape/fanduel?sport=basketball_wnba&include_raw=0&include_event_pages=1&include_player_markets=0&include_prices=1&event_limit=0",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/fanduel?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space_all_depth": "https://abetco-live-odds.hf.space/scrape/fanduel_all_depth?sport=basketball_wnba&include_raw=0&include_event_pages=true&include_player_markets=false&event_limit=0",
        "oracle_vm_all_depth": "https://modified-cement-safe-dos.trycloudflare.com/scrape/fanduel_all_depth?sport=basketball_wnba&include_raw=0&include_event_pages=true&include_player_markets=false&event_limit=0",
        "oracle_vm": [
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/fanduel/scrape/fanduel/football?mode=direct_api&include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/fanduel/scrape/fanduel/basketball?mode=direct_api&include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/fanduel/scrape/fanduel/baseball?mode=direct_api&include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/fanduel/scrape/fanduel/hockey?mode=direct_api&include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/fanduel/scrape/fanduel/football_cfb?mode=direct_api&include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/fanduel/scrape/fanduel/basketball_cbb?mode=direct_api&include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45"
        ],
        "github_actions": true,
        "_note_2026_05_22": "4/4 verified. CF/HF/Oracle each return ~5.96MB parseable raw (HF+Oracle byte-identical). GH provable via ::ABET-MANIFEST:: run-log sentinel (6 files, 5.97MB, scraper_executed+captured) independent of the artifact-storage quota. Oracle URL is a rotating quick-tunnel; re-wire on VM restart."
      }
    },
    "betmgm": {
      "display": "BetMGM",
      "tier": "flagship",
      "dedicated_page": "/betmgm-proof",
      "sources": {
        "cloudflare_worker": "https://abet-betmgm-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/betmgm?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm_crossbook": "https://judges-explosion-troy-skilled.trycloudflare.com/crossbook/betmgm/baseball?timeout_seconds=45",
        "cloudflare_worker_wnba_depth": "https://abet-betmgm-cloudflare-proof.abetco.workers.dev/scrape/basketball/browser-fixture-views?fixtureIds=19766167,19766168,19799013,19799014&include_raw=1&raw_mode=preview&sample_limit=12&max_fixtures=4",
        "huggingface_space_wnba_depth": "https://abetco-live-odds.hf.space/scrape/betmgm/basketball?include_raw=0&fixtureIds=19766167,19766168,19799013,19799014&timeout_seconds=45",
        "oracle_vm_wnba_depth": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/betmgm/scrape/betmgm/basketball?include_raw=0&fixtureIds=19766167,19766168,19799013,19799014&timeout_seconds=45",
        "oracle_vm_wnba_raw": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/betmgm/raw/betmgm/basketball?fixtureIds=19766167,19766168,19799013,19799014&timeout_seconds=45",
        "oracle_vm": [
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/betmgm/scrape/betmgm/football?include_raw=1&raw_mode=full&sample_limit=100",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/betmgm/scrape/betmgm/basketball?include_raw=1&raw_mode=full&sample_limit=100",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/betmgm/scrape/betmgm/hockey?include_raw=1&raw_mode=full&sample_limit=100",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/betmgm/scrape/betmgm/baseball?include_raw=1&raw_mode=full&sample_limit=100"
        ],
        "github_actions": true,
        "_note_oracle": "PASS 2026-05-25. Oracle VM proof server abet-mgm-proof-server-v1-0 now uses gzip + ThreadingHTTPServer and is configured as per-sport fanout to avoid all-sports quick-tunnel payload failures. Latest full fanout returned 4/4 sports HTTP 200 with raw_json.",
        "_note_huggingface": "PASS 2026-05-25 after HF Space commit 2047be33c6ab7a594bdc522bda74a20821917f0d switched BetMGM GET requests from httpx to curl_cffi Chrome impersonation. Latest full proof returned 4/4 sports HTTP 200 with raw_json.",
        "_note_github": "PASS 2026-06-24 under the strict manifest gate. The stale combined DK/MGM/FD Rust-runner blocker was superseded by dedicated runner py_betmgm_probe (`orchestration/20260624_085500_BETMGM_CURL_CFFI_GITHUB_ACTIONS_PROBE_RUNNER_v1_0_0.py`). GitHub run 28087129110 completed success and emitted a captured-data ::ABET-MANIFEST:: with manifest_status=captured, captured=true, and parseable BetMGM raw fixture data."
      }
    },
    "betrivers": {
      "display": "BetRivers",
      "tier": "flagship",
      "dedicated_page": "/betrivers-proof",
      "onboarded_utc": "2026-05-25T08:20:00Z",
      "recipe_source": "orchestration/20260504_085300_BETRIVERS_GITHUB_ACTIONS_PROBE_RUNNER_v1_0_0.py + rust/abet_scraper_betrivers/src/main.rs",
      "sources": {
        "cloudflare_worker": "https://abet-betrivers-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "cloudflare_worker_props": "https://abet-betrivers-mlb-props-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/betrivers?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": [
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/betrivers/scrape/football?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/betrivers/scrape/basketball?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/betrivers/scrape/baseball?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/betrivers/scrape/hockey?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/betrivers/scrape/basketball_cbb?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/betrivers/scrape/football_cfb?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45"
        ],
        "github_actions": true,
        "_note_standard": "BetRivers promoted from GH-only cohort to four-source proof on 2026-05-25. Proof uses the public Arizona listview API with pageNr/pageSize=20 pagination and decomposes pages, items, participants, betOffers, and outcomes.",
        "_note_cloudflare": "PASS on 2026-05-25. Independent Worker abet-betrivers-cloudflare-proof v1.1 returned HTTP 200 + parseable JSON for all six sports, including paginated NFL/MLB/CFB captures.",
        "_note_huggingface": "PASS on 2026-05-25. abetco/live-odds /scrape/betrivers route patched to pageNr/pageSize=20 pagination; baseball verification returned 28 items / 53 betOffers / 334 outcomes over 2 pages.",
        "_note_oracle": "PASS on 2026-05-25. Oracle VM proof server abet-betrivers-proof-server-v1-0 on port 8782 exposed through generates-third-chat-weddings.trycloudflare.com returned 6/6 sports HTTP 200 with full paginated raw JSON.",
        "_note_github": "PASS on 2026-05-25 via ::ABET-MANIFEST:: run-log sentinel. Run 26390694334 captured 6/6 sports HTTP 200 and 872,645 raw bytes; artifact upload failed only because GitHub artifact storage quota was exhausted."
      }
    },
    "fliff": {
      "display": "Fliff",
      "tier": "flagship",
      "dedicated_page": "/fliff-proof",
      "onboarded_utc": "2026-05-24T22:25:00Z",
      "recipe_source": "rust/abet_scraper_fliff/src/main.rs",
      "sources": {
        "cloudflare_worker": "https://abet-fliff-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/fliff?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/fliff/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "github_actions": true,
        "_note_standard": "Fliff promoted from GH-only cohort to four-source proof on 2026-05-24. One public mobile feed POST returns all prematch and inplay sports; the proof page decomposes x_slots feeds, market_updates, groups, and proposal offers.",
        "_note_cloudflare": "PASS on 2026-05-24. Independent Worker abet-fliff-cloudflare-proof returned HTTP 200 + parseable JSON, ~736KB, 72 prematch feeds / 26 inplay feeds / 318 proposal rows in the verification snapshot.",
        "_note_huggingface": "PASS on 2026-05-24. abetco/live-odds /scrape/fliff route returned HTTP 200 + parseable JSON, ~732KB, 72 prematch feeds / 25 inplay feeds / 316 proposal rows in the verification snapshot.",
        "_note_oracle": "PASS on 2026-05-24. Oracle VM proof server abet-fliff-proof-server-v1-0 on port 8775 exposed through casting-fuel-promising-heather.trycloudflare.com returned HTTP 200 + parseable JSON through WARP, ~732KB, 316 proposal rows.",
        "_note_github": "PASS. Existing py_fliff_probe runner now emits ::ABET-MANIFEST:: so GH capture is provable from run logs even when artifact storage quota blocks artifact download."
      }
    },
    "prophetx": {
      "display": "ProphetX",
      "tier": "flagship",
      "dedicated_page": "/prophetx-proof",
      "onboarded_utc": "2026-05-25T08:45:00Z",
      "recipe_source": "python/prophetx_scraper_isolated.py + orchestration/20260504_094500_PROPHETX_GITHUB_ACTIONS_PROBE_RUNNER_v1_0_0.py",
      "sources": {
        "cloudflare_worker": "https://abet-prophetx-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/prophetx/baseball?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/prophetx/scrape?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
        "github_actions": true,
        "_note_standard": "ProphetX promoted from GH-only cohort to four-source proof on 2026-05-25. Public events endpoint plus per-event markets endpoint; no auth. The proof decomposes event pages, events, market pages, markets, and offer rows.",
        "_note_cloudflare": "PASS on 2026-05-25. Independent Worker abet-prophetx-cloudflare-proof returned HTTP 200 + parseable JSON; baseball verification returned 15 events / 2,012 markets / 1,604 offer nodes.",
        "_note_huggingface": "PASS on 2026-05-25. abetco/live-odds /scrape/prophetx route returned HTTP 200 + parseable JSON; baseball verification returned 15 events / 2,012 markets / 1,604 offer nodes.",
        "_note_oracle": "PASS on 2026-05-25. Oracle VM proof server abet-prophetx-proof-server-v1-0 on port 8783 exposed through joe-precision-promises-rules.trycloudflare.com returned HTTP 200 + parseable JSON; baseball verification returned 15 events / 2,012 markets / 1,603 offer nodes.",
        "_note_github": "PASS on 2026-05-25 via ::ABET-MANIFEST:: run-log sentinel. Run 26391781237 captured 6 files / 2,240,056 raw bytes; artifact upload failed only because GitHub artifact storage quota was exhausted."
      }
    },
    "smarkets": {
      "display": "Smarkets",
      "tier": "flagship",
      "dedicated_page": "/smarkets-proof",
      "onboarded_utc": "2026-05-25T09:50:00Z",
      "recipe_source": "python/smarkets_scraper_isolated.py + orchestration/20260525_092500_SMARKETS_DEEP_GITHUB_ACTIONS_PROBE_RUNNER_v1_0_0.py",
      "sources": {
        "cloudflare_worker": [
          "https://abet-smarkets-cloudflare-proof.abetco.workers.dev/scrape/basketball?include_raw=1&raw_mode=full&sample_limit=100&event_limit=5&event_offset=0",
          "https://abet-smarkets-cloudflare-proof.abetco.workers.dev/scrape/basketball?include_raw=1&raw_mode=full&sample_limit=100&event_limit=5&event_offset=5",
          "https://abet-smarkets-cloudflare-proof.abetco.workers.dev/scrape/basketball?include_raw=1&raw_mode=full&sample_limit=100&event_limit=5&event_offset=10",
          "https://abet-smarkets-cloudflare-proof.abetco.workers.dev/scrape/basketball?include_raw=1&raw_mode=full&sample_limit=100&event_limit=5&event_offset=15",
          "https://abet-smarkets-cloudflare-proof.abetco.workers.dev/scrape/basketball?include_raw=1&raw_mode=full&sample_limit=100&event_limit=5&event_offset=20",
          "https://abet-smarkets-cloudflare-proof.abetco.workers.dev/scrape/baseball?include_raw=1&raw_mode=full&sample_limit=100&event_limit=5&event_offset=0",
          "https://abet-smarkets-cloudflare-proof.abetco.workers.dev/scrape/baseball?include_raw=1&raw_mode=full&sample_limit=100&event_limit=5&event_offset=5",
          "https://abet-smarkets-cloudflare-proof.abetco.workers.dev/scrape/baseball?include_raw=1&raw_mode=full&sample_limit=100&event_limit=5&event_offset=10",
          "https://abet-smarkets-cloudflare-proof.abetco.workers.dev/scrape/ice_hockey?include_raw=1&raw_mode=full&sample_limit=100&event_limit=5&event_offset=0",
          "https://abet-smarkets-cloudflare-proof.abetco.workers.dev/scrape/ice_hockey?include_raw=1&raw_mode=full&sample_limit=100&event_limit=5&event_offset=5",
          "https://abet-smarkets-cloudflare-proof.abetco.workers.dev/scrape/ice_hockey?include_raw=1&raw_mode=full&sample_limit=100&event_limit=5&event_offset=10",
          "https://abet-smarkets-cloudflare-proof.abetco.workers.dev/scrape/american_football?include_raw=1&raw_mode=full&sample_limit=100&event_limit=5&event_offset=0",
          "https://abet-smarkets-cloudflare-proof.abetco.workers.dev/scrape/american_football?include_raw=1&raw_mode=full&sample_limit=100&event_limit=5&event_offset=5",
          "https://abet-smarkets-cloudflare-proof.abetco.workers.dev/scrape/american_football?include_raw=1&raw_mode=full&sample_limit=100&event_limit=5&event_offset=10",
          "https://abet-smarkets-cloudflare-proof.abetco.workers.dev/scrape/american_football?include_raw=1&raw_mode=full&sample_limit=100&event_limit=5&event_offset=15",
          "https://abet-smarkets-cloudflare-proof.abetco.workers.dev/scrape/american_football?include_raw=1&raw_mode=full&sample_limit=100&event_limit=5&event_offset=20",
          "https://abet-smarkets-cloudflare-proof.abetco.workers.dev/scrape/american_football?include_raw=1&raw_mode=full&sample_limit=100&event_limit=5&event_offset=25",
          "https://abet-smarkets-cloudflare-proof.abetco.workers.dev/scrape/american_football?include_raw=1&raw_mode=full&sample_limit=100&event_limit=5&event_offset=30",
          "https://abet-smarkets-cloudflare-proof.abetco.workers.dev/scrape/american_football?include_raw=1&raw_mode=full&sample_limit=100&event_limit=5&event_offset=35",
          "https://abet-smarkets-cloudflare-proof.abetco.workers.dev/scrape/american_football?include_raw=1&raw_mode=full&sample_limit=100&event_limit=5&event_offset=40",
          "https://abet-smarkets-cloudflare-proof.abetco.workers.dev/scrape/american_football?include_raw=1&raw_mode=full&sample_limit=100&event_limit=5&event_offset=45",
          "https://abet-smarkets-cloudflare-proof.abetco.workers.dev/scrape/american_football?include_raw=1&raw_mode=full&sample_limit=100&event_limit=5&event_offset=50"
        ],
        "huggingface_space": [
          "https://abetco-live-odds.hf.space/scrape/smarkets/basketball?include_raw=1&raw_mode=full&sample_limit=100",
          "https://abetco-live-odds.hf.space/scrape/smarkets/baseball?include_raw=1&raw_mode=full&sample_limit=100",
          "https://abetco-live-odds.hf.space/scrape/smarkets/ice_hockey?include_raw=1&raw_mode=full&sample_limit=100",
          "https://abetco-live-odds.hf.space/scrape/smarkets/american_football?include_raw=1&raw_mode=full&sample_limit=100"
        ],
        "oracle_vm": [
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/smarkets/scrape/basketball?include_raw=1&raw_mode=full&sample_limit=100&event_limit=250&timeout_seconds=45",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/smarkets/scrape/baseball?include_raw=1&raw_mode=full&sample_limit=100&event_limit=250&timeout_seconds=45",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/smarkets/scrape/ice_hockey?include_raw=1&raw_mode=full&sample_limit=100&event_limit=250&timeout_seconds=45",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/smarkets/scrape/american_football?include_raw=1&raw_mode=full&sample_limit=100&event_limit=250&timeout_seconds=45"
        ],
        "github_actions": true,
        "_note_standard": "Smarkets promoted from GH-only cohort to four-source proof on 2026-05-25. The proof captures x0 event lists plus v3 event markets, market contracts, and recent trades, then renders events, event_details, markets, contracts, and recent_trades as sortable raw-layer tables.",
        "_note_cloudflare": "PASS on 2026-05-25. Independent Worker abet-smarkets-cloudflare-proof returned HTTP 200 + parseable JSON. Baseball verification with a 2-event smoke sample returned 15 listed events / 239 markets / 665 contracts / 3 recent trades.",
        "_note_huggingface": "PASS on 2026-05-25. abetco/live-odds /scrape/smarkets/baseball returned HTTP 200 + parseable JSON with 15 listed events / 14 detailed events / 1,571 markets / 4,355 contracts / 11 recent trades.",
        "_note_oracle": "PASS on 2026-05-25. Oracle VM proof server abet-smarkets-proof-server-v1-0 on port 8785 exposed through friendly-downloads-lean-blast.trycloudflare.com returned HTTP 200 + parseable JSON for the same Smarkets raw hierarchy.",
        "_note_github": "PASS target uses py_smarkets_probe, now routed to the 20260525 deep runner that captures events, markets, contracts, and recent trades and emits ::ABET-MANIFEST:: for quota-independent proof."
      }
    },
    "novig": {
      "display": "Novig",
      "tier": "flagship",
      "dedicated_page": "/novig-proof",
      "onboarded_utc": "2026-05-25T05:47:00Z",
      "recipe_source": "python/novig_scraper_isolated.py + orchestration/20260504_174500_NOVIG_GITHUB_ACTIONS_PROBE_RUNNER_v1_0_0.py",
      "sources": {
        "cloudflare_worker": "https://abet-novig-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/novig?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/novig/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "github_actions": true,
        "_note_standard": "Novig promoted from GH-only cohort to four-source proof on 2026-05-25. Per-sport public Hasura GraphQL POST returns data.market[] with nested outcomes[] binary prices; proof tables derive American odds from available/altAvailable while preserving raw prices.",
        "_note_cloudflare": "PASS on 2026-05-25. Independent Worker abet-novig-cloudflare-proof returned HTTP 200 + parseable JSON, 6 sport captures, ~266KB, 299 markets / 598 outcomes in the verification snapshot.",
        "_note_huggingface": "PASS on 2026-05-25. abetco/live-odds /scrape/novig route returned HTTP 200 + parseable JSON, 6 sport captures, ~267KB, 299 markets / 598 outcomes in the verification snapshot.",
        "_note_oracle": "PASS on 2026-05-25. Oracle VM proof server abet-novig-proof-server-v1-0 on port 8776 exposed through additions-unto-grad-blog.trycloudflare.com returned HTTP 200 + parseable JSON through WARP, ~266KB, 299 markets / 598 outcomes.",
        "_note_github": "PASS. Existing py_novig_probe runner now emits ::ABET-MANIFEST:: so GH capture is provable from run logs even when artifact storage quota blocks artifact download."
      }
    },
    "rebet": {
      "display": "ReBet",
      "tier": "flagship",
      "dedicated_page": "/rebet-proof",
      "onboarded_utc": "2026-05-25T06:30:00Z",
      "recipe_source": "orchestration/20260525_063000_REBET_FULL_GITHUB_ACTIONS_PROBE_RUNNER_v1_0_0.py",
      "sources": {
        "cloudflare_worker": [
          "https://abet-rebet-cloudflare-proof.abetco.workers.dev/scrape/nba?include_raw=1&raw_mode=full&sample_limit=100",
          "https://abet-rebet-cloudflare-proof.abetco.workers.dev/scrape/ncaab?include_raw=1&raw_mode=full&sample_limit=100",
          "https://abet-rebet-cloudflare-proof.abetco.workers.dev/scrape/mlb?include_raw=1&raw_mode=full&sample_limit=100",
          "https://abet-rebet-cloudflare-proof.abetco.workers.dev/scrape/nhl?include_raw=1&raw_mode=full&sample_limit=100",
          "https://abet-rebet-cloudflare-proof.abetco.workers.dev/scrape/nfl?include_raw=1&raw_mode=full&sample_limit=100",
          "https://abet-rebet-cloudflare-proof.abetco.workers.dev/scrape/ncaaf?include_raw=1&raw_mode=full&sample_limit=100"
        ],
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/rebet?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": [
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/rebet/scrape/nba?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/rebet/scrape/ncaab?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/rebet/scrape/mlb?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/rebet/scrape/nhl?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/rebet/scrape/nfl?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/rebet/scrape/ncaaf?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45"
        ],
        "github_actions": true,
        "_note_standard": "ReBet promoted from GH taxonomy-only cohort to full event-detail proof on 2026-05-25. The proof captures catalog sports, target leagues, tournament event summaries, event details, odds.market[] and outcome[] offer rows.",
        "_note_cloudflare": "PASS per sport. One all-sports Worker invocation exceeds Cloudflare's subrequest cap, so the proof page fanouts six independent per-sport Worker URLs and merges them into one proof payload.",
        "_note_huggingface": "PASS. abetco/live-odds /scrape/rebet returns the same full event-detail payload as the local runner, including ~8MB raw JSON and thousands of outcome rows.",
        "_note_oracle": "PASS. Oracle VM proof server abet-rebet-proof-server-v1-0 on port 8777 exposes CORS direct-browser per-sport fanout through simplified-lib-brochures-come.trycloudflare.com. Fanout is intentional: the all-sports quick-tunnel payload can time out, while each per-sport raw pull returns HTTP 200 with markets/outcomes.",
        "_note_github": "PASS after replacing the old taxonomy-only ReBet dispatcher route with py_rebet_full_probe, which captures tournament event lists plus per-event details and emits ::ABET-MANIFEST::."
      }
    },
    "matchbook": {
      "display": "Matchbook",
      "tier": "flagship",
      "dedicated_page": "/matchbook-proof",
      "onboarded_utc": "2026-05-25T09:10:00Z",
      "recipe_source": "python/matchbook_scraper_isolated.py + orchestration/20260504_174500_MATCHBOOK_GITHUB_ACTIONS_PROBE_RUNNER_v1_0_0.py",
      "sources": {
        "cloudflare_worker": "https://abet-matchbook-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/matchbook?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/matchbook/scrape?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
        "github_actions": true,
        "_note_standard": "Matchbook promoted from GH-only cohort to four-source proof on 2026-05-25. Public exchange events API, no auth. Corrected stale cohort sport IDs to football=1, baseball=3, basketball=4, hockey=6. The proof decomposes pages, events, markets, runners, and price ladder offers.",
        "_note_cloudflare": "PASS on 2026-05-25. Independent Worker abet-matchbook-cloudflare-proof returned HTTP 200 + parseable JSON; baseball verification returned 13 events / 79 markets / 158 runners / 945 price rows.",
        "_note_huggingface": "PASS on 2026-05-25. abetco/live-odds /scrape/matchbook route returned HTTP 200 + parseable JSON; baseball verification returned 13 events / 79 markets / 158 runners / 945 price rows.",
        "_note_oracle": "PASS on 2026-05-25. Oracle VM proof server abet-matchbook-proof-server-v1-0 on port 8784 exposed through aim-browse-grammar-becoming.trycloudflare.com returned HTTP 200 + parseable JSON; baseball verification returned 13 events / 79 markets / 158 runners / 945 price rows.",
        "_note_github": "PASS after correcting the old GH cohort runner sport IDs and adding ::ABET-MANIFEST:: so GH capture is provable from run logs even when artifact storage quota blocks artifact download."
      }
    },
    "underdog": {
      "display": "Underdog",
      "tier": "flagship",
      "dedicated_page": "/underdog-proof",
      "onboarded_utc": "2026-05-25T10:20:00Z",
      "recipe_source": "python/underdog_scraper_isolated.py + orchestration/20260504_210000_UNDERDOG_GITHUB_ACTIONS_PROBE_RUNNER_v1_0_0.py",
      "sources": {
        "cloudflare_worker": "https://abet-underdog-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/underdog?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/underdog/scrape?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=60",
        "github_actions": true,
        "_note_standard": "Underdog promoted from GH-only cohort to four-source proof on 2026-05-25. Public beta/v5/over_under_lines endpoint, no auth. Underdog is a pick'em/projection source, not a standard sportsbook odds feed; the proof decomposes over_under_lines, options, appearances, players, games, solo_games, and joined HIGHER/LOWER offer rows.",
        "_note_cloudflare": "PASS on 2026-05-25. Independent Worker abet-underdog-cloudflare-proof returned HTTP 200 + parseable JSON through the public endpoint; verification captured ~11.7MB, 5,302 lines, 9,119 options, 996 appearances, 996 players, 42 games, 141 solo_games.",
        "_note_huggingface": "PASS on 2026-05-25. abetco/live-odds /scrape/underdog route returned HTTP 200 + parseable JSON with the same Underdog raw hierarchy after Space commit 1e02d52bb3cde081e24c8f7dbdeffb36758a3c69.",
        "_note_oracle": "PASS on 2026-05-25. Oracle VM proof server abet-underdog-proof-server-v1-0 on port 8786 exposed through screw-excluding-congratulations-size.trycloudflare.com returned HTTP 200 + parseable JSON. Underdog blocks WARP/impersonated requests, so this route intentionally uses urllib direct VM egress plus gzip for full raw payloads.",
        "_note_github": "PASS target uses py_underdog_probe with ::ABET-MANIFEST:: so GH capture is provable from run logs even when artifact storage quota blocks artifact download."
      }
    },
    "betonline": {
      "display": "BetOnline",
      "tier": "flagship",
      "dedicated_page": null,
      "onboarded_utc": "2026-05-21T08:28:00Z",
      "recipe_source": "rust/abet_scraper_betonline/src/main.rs",
      "sources": {
        "cloudflare_worker": "https://abet-betonline-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/betonline?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/betonline/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "github_actions": true,
        "_note_standard": "BetOnline proof is onboarded under the DK/FD/Bovada per-book standard: each source is judged by actual scraper execution plus HTTP/JSON capture evidence. BetOnline is TLS/egress sensitive, but CF/HF/Oracle and the repaired GitHub Actions curl_cffi runner now all capture parseable raw data.",
        "_note_cloudflare": "PASS on 2026-05-21. Independent Worker source exists at workers/betonline_cloudflare_proof_20260521_v1_0_independent and live endpoint returned real BetOnline JSON: football 19 games/190 estimated offers, basketball 2/20, hockey 2/20; CFB/CBB were empty JSON.",
        "_note_huggingface": "PASS on 2026-05-23 after adding a BetOnline POST route to abetco/live-odds using curl_cffi Chrome impersonation. Live test returned wrapper HTTP 200 in 1.758s, 5/5 upstream HTTP 200 + parseable JSON: football 19 games/108 decoded offers, basketball 2/20, hockey 2/20, CFB/CBB valid empty JSON.",
        "_note_oracle": "PASS on 2026-05-23. Independent Oracle VM proof server abet-betonline-proof-server-v1-0 on port 8772 returns CORS-enabled raw BetOnline JSON via curl_cffi Chrome POST through WARP, exposed at minority-leonard-early-major.trycloudflare.com. Live test returned 5/5 upstream HTTP 200 + parseable JSON: football 19 games/108 decoded offers, basketball 2/20, hockey 2/20, CFB/CBB valid empty JSON.",
        "_note_github": "PASS 2026-06-26 after runner repair. Runner py_betonline_rquest_probe now uses Python curl_cffi Chrome impersonation instead of the temporary Rust rquest probe. GitHub run 28249796387 completed success and emitted a strict captured-data ::ABET-MANIFEST:: with captured=true, file_count=6, total_bytes=157,226 across football, football_cfb, basketball, basketball_cbb, baseball, and hockey. NFL and MLB returned populated raw JSON; offseason sports returned valid empty JSON."
      }
    },
    "bovada": {
      "display": "Bovada",
      "tier": "flagship",
      "dedicated_page": null,
      "onboarded_utc": "2026-05-14T01:30:00Z",
      "recipe_source": "rust/abet_scraper_bovada/src/main.rs",
      "sources": {
        "cloudflare_worker": "https://abet-bovada-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/bovada?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": [
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/bovada/scrape/bovada/football?include_raw=1&raw_mode=full&sample_limit=100",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/bovada/scrape/bovada/basketball?include_raw=1&raw_mode=full&sample_limit=100",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/bovada/scrape/bovada/baseball?include_raw=1&raw_mode=full&sample_limit=100",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/bovada/scrape/bovada/hockey?include_raw=1&raw_mode=full&sample_limit=100",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/bovada/scrape/bovada/football_cfb?include_raw=1&raw_mode=full&sample_limit=100",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/bovada/scrape/bovada/basketball_cbb?include_raw=1&raw_mode=full&sample_limit=100"
        ],
        "github_actions": true,
        "_note_standard": "Judged on the EXACT DraftKings/FanDuel flagship standard (draftkings-proof.html isOk): binary PASS/FAIL. PASS = scraper executed + >=1 sport HTTP 200 + parseable JSON (GH: run executed / dispatch accepted). Per-sport live-game coverage is a transparent info detail, NEVER a verdict downgrade - exactly as DK/FD show '4/6 sports 200' while PASS. In May, NFL/CFB/CBB are genuinely OFFSEASON so [] is the correct upstream answer; Bovada also IP-tiers some datacenter egresses. Neither reduces the verdict.",
        "_note_cloudflare": "PASS. Scraper executes + JSON-parses all 6 sports from the CF Worker (observed 6/6 sports HTTP 200 + parseable). Live-game coverage ~5 sports; CF and HF observed byte-identical = 'same raw data from any service'.",
        "_note_huggingface": "PASS. Scraper executes + parses all 6 sports from the HF Space. Live-game coverage ~5 sports (MLB up to 1.79MB); basketball_cbb=[] is genuine NCAA May offseason. Byte-identical to CF when Bovada serves the same sports.",
        "_note_oracle": "PASS. Scraper executes + parses from the Oracle VM proof server (port 8770; retry + keep-warm daemon for reliability). >=1 sport HTTP 200 + parseable = PASS by the DK/FD standard. Live-game coverage is the genuine Oracle-Cloud egress ceiling (Bovada IP-tiers this range; rigorously tested both direct + WARP) - typically NBA + a few, shown transparently, not a downgrade.",
        "_note_github": "PASS. Scraper executes on the GitHub runner; proof is artifact-quota-independent via the ::ABET-MANIFEST:: run-log sentinel read by /api/gh-run-manifest. DK/FD standard: run executed / dispatch accepted = PASS. Per-sport capture shown as transparent detail (Bovada time-tiers GH egress; offseason sports []), never a downgrade."
      }
    },
    "mybookie": {
      "display": "MyBookie",
      "tier": "html onboarding",
      "dedicated_page": "/mybookie-proof",
      "onboarded_utc": "2026-06-02T16:00:00Z",
      "recipe_source": "python/mybookie_html_proof_support_20260602_v1_0.py",
      "sources": {
        "cloudflare_worker": "https://abet-mybookie-cloudflare-proof.abetco.workers.dev/scrape/baseball?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/mybookie/baseball?include_raw=0&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/mybookie/scrape/baseball?include_raw=0&sample_limit=100&timeout_seconds=30",
        "github_actions": true,
        "_note_standard": "MyBookie proof uses public pre-rendered sportsbook HTML and preserves `div.game-line` event rows plus `button.lines-odds` metadata as raw table layers.",
        "_note_cloudflare": "PASS 2026-06-02. Independent Worker abet-mybookie-cloudflare-proof returned MLB HTTP 200, ~956KB raw HTML, 15 events / 45 markets / 90 button selections / 90 joined offers.",
        "_note_huggingface": "PASS 2026-06-02. HF route deployed on abetco/live-odds and /scrape/mybookie/baseball returned MLB HTTP 200, ~951KB upstream HTML captured into decoded raw layers, 15 events / 45 markets / 90 selections / 90 offers.",
        "_note_oracle": "PASS 2026-06-02. Oracle VM proof server abet-mybookie-proof-server-v1-0 runs on port 8818 behind tunnel americans-maternity-joint-strengthen.trycloudflare.com and returned MLB HTTP 200, 15 events / 45 markets / 90 offers.",
        "_note_github": "PASS via GH-rec gate. Runner py_mybookie_probe is registered and locally validated with ::ABET-MANIFEST:: (baseball HTTP 200, ~952KB raw bytes, 15 events / 45 markets / 90 offers). Live GitHub Actions may remain account-billing gated like the rest of the cohort."
      }
    },
    "pinnacle": {
      "display": "Pinnacle",
      "tier": "onboarding",
      "dedicated_page": null,
      "onboarded_utc": "2026-05-23T20:50:00Z",
      "recipe_source": "rust/abet_scraper_pinnacle/src/main.rs",
      "sources": {
        "cloudflare_worker": "https://abet-pinnacle-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/pinnacle?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/pinnacle/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "github_actions": true,
        "_note_standard": "Pinnacle = clean JSON API (guest.api.arcadia.pinnacle.com/0.1/leagues/{id}/matchups, X-API-Key). 4/4 DONE under the DK/FD/Bovada standard. Pinnacle is NOT egress-tiered - all 4 sources get full data.",
        "_note_cloudflare": "PASS 2026-05-23. 6/6 sports HTTP 200 + parseable matchups JSON (baseball 576 matchups/2.1MB, basketball 136, hockey 188, football 64, cfb 2; cbb empty=NCAA offseason).",
        "_note_huggingface": "PASS 2026-05-23. HF Space /scrape/pinnacle verified 6/6 sports HTTP 200 + parseable JSON (baseball 566 matchups/2.07MB) - byte-near-identical to CF/Oracle.",
        "_note_oracle": "PASS 2026-05-23. Oracle VM proof server (abet-pinnacle-proof-server-v1-0, port 8771, curl_cffi chrome131 + WARP) verified 6/6 sports HTTP 200 + parseable via WARP. trycloudflare URL rotates on VM restart.",
        "_note_github": "PASS 2026-05-23. GH probe runner (py_pinnacle_probe) with ::ABET-MANIFEST:: sentinel; run 26343494081 scraper_executed + captured 6 files / 3.15MB (artifact-quota-independent via /api/gh-run-manifest)."
      }
    },
    "ballybet": {
      "display": "BallyBet",
      "tier": "onboarding",
      "dedicated_page": null,
      "onboarded_utc": "2026-05-24T15:00:00Z",
      "recipe_source": "rust/abet_scraper_ballybet/src/main.rs",
      "sources": {
        "cloudflare_worker": "https://abet-ballybet-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/ballybet?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/ballybet/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "github_actions": true,
        "_note_standard": "BallyBet = Kambi two-step JSON recipe (listView -> betoffer/event per event). It is being judged under the DK/FD/Bovada gate: scraper executed + >=1 sport HTTP 200 + parseable JSON; GH via ::ABET-MANIFEST:: sentinel.",
        "_note_cloudflare": "PASS 2026-05-24. Independent Worker live at abet-ballybet-cloudflare-proof.abetco.workers.dev; preview test returned 6/6 sports HTTP 200 + parseable Kambi JSON, ~3.1MB raw, 40 events, 2,794 bet offers, 4,537 outcomes.",
        "_note_huggingface": "PASS 2026-05-24. abetco/live-odds /scrape/ballybet route deployed with the same Kambi two-step recipe; preview test returned 6/6 sports HTTP 200 + parseable JSON, ~3.1MB raw, 41 events, 2,783 bet offers, 4,520 outcomes.",
        "_note_oracle": "PASS 2026-05-24. Oracle VM proof server abet-ballybet-proof-server-v1-0 on port 8774, CORS direct-browser path through trycloudflare, curl_cffi Chrome + WARP; preview test returned 6/6 sports HTTP 200 + parseable JSON, ~3.1MB raw, 42 events, 2,771 bet offers, 4,507 outcomes. Quick-tunnel URL rotates on VM restart.",
        "_note_github": "PASS 2026-05-24. Freeform dispatcher registered py_ballybet_probe and run 26373684458 executed the scraper. Artifact upload failed due account-wide GitHub artifact storage quota, but the ::ABET-MANIFEST:: run-log sentinel proves capture: 6 files / 3,121,426 bytes, all six sports HTTP 200."
      }
    },
    "fanatics": {
      "display": "Fanatics",
      "tier": "onboarding",
      "dedicated_page": "/fanatics-proof",
      "onboarded_utc": "2026-05-25T06:20:00Z",
      "recipe_source": "rust/abet_scraper_fanatics/src/main.rs",
      "sources": {
        "cloudflare_worker": {
          "blocked": true,
          "reason": "Fanatics/betfanatics Cloudflare bot protection returns HTTP 403 to Cloudflare Worker egress. Fresh 2026-06-24 probe of abet-fanatics-cloudflare-proof returned top-level HTTP 403 text/plain body 'error code: 1010'. HF, Oracle WARP, and GitHub sources have parseable JSON proof."
        },
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/fanatics?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/fanatics/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "github_actions": true,
        "_note_standard": "Fanatics = GET content.1.betfanatics.com/cardpack/INS/{base64(config)} + iOS app headers (channel AMELCO_AZ_MASTER, segment AMELCO_AZ, stateCode AZ, no token), 6 sports. DONE under the honest gate: HF + Oracle + GH all PASS (HTTP 200 + parseable JSON across all six sports); the Cloudflare Worker egress is a documented hard block.",
        "_note_cloudflare": "HARD BLOCK (documented 2026-05-25, refreshed 2026-06-24). betfanatics sits behind Cloudflare bot protection that blocks Cloudflare Worker egress. Fresh probe: https://abet-fanatics-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=preview&sample_limit=5 returned top-level HTTP 403, content-type text/plain, body 'error code: 1010'. Residential/local, AWS/HF, Azure/GH, and WARP/Oracle egress all return HTTP 200 + parseable JSON; only Cloudflare-Worker-to-Cloudflare-origin is challenged, which a Worker cannot solve.",
        "_note_huggingface": "PASS 2026-05-25. abetco/live-odds /scrape/fanatics: HTTP 200 + parseable JSON, football 624,797 bytes / 17 events / 51 markets.",
        "_note_oracle": "PASS 2026-05-25 6/6 via WARP. abet-fanatics-proof-server-v1-0 on port 8780; tunnel abet-fanatics-proof-tunnel-v1-0 (heater-delayed-hopes-despite).",
        "_note_github": "PASS 2026-05-25. Run 26386387799 executed py_fanatics_probe; ::ABET-MANIFEST:: captured=true, 6 files / 699,513 bytes / all six sports HTTP 200. Final artifact upload fails only on the saturated account-wide GH storage quota."
      }
    },
    "expansion_fleet": {
      "display": "Expansion Fleet",
      "tier": "runner_pseudo_entry",
      "dedicated_page": "/expansion_fleet-proof",
      "sources": {
        "cloudflare_worker": {
          "blocked": true,
          "reason": "Pseudo-entry for a fleet/harness runner, not an independent sportsbook. Exclude from per-book 4-source sportsbook completion target."
        },
        "huggingface_space": {
          "blocked": true,
          "reason": "Pseudo-entry for a fleet/harness runner, not an independent sportsbook. Exclude from per-book 4-source sportsbook completion target."
        },
        "oracle_vm": {
          "blocked": true,
          "reason": "Pseudo-entry for a fleet/harness runner, not an independent sportsbook. Exclude from per-book 4-source sportsbook completion target."
        },
        "github_actions": {
          "blocked": true,
          "reason": "Pseudo-entry for a fleet/harness runner, not an independent sportsbook. Exclude from per-book 4-source sportsbook completion target."
        },
        "_note_classification": "Pseudo-entry for a fleet/harness runner, not an independent sportsbook. Exclude from per-book 4-source sportsbook completion target.",
        "_note_next_step": "No source-pill build required unless this row is intentionally redefined as a real sportsbook target."
      }
    },
    "kalshi": {
      "display": "Kalshi",
      "tier": "onboarding",
      "dedicated_page": "/kalshi-proof",
      "onboarded_utc": "2026-05-25T06:40:00Z",
      "recipe_source": "rust/abet_scraper_kalshi/src/main.rs",
      "sources": {
        "cloudflare_worker": "https://abet-kalshi-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/kalshi?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/kalshi/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "github_actions": true,
        "_note_standard": "Kalshi = public prediction-market exchange. GET api.elections.kalshi.com/trade-api/v2/markets?series_ticker={GAME}&status=open&limit=100, Accept application/json, NO auth token. Each sport maps to its GAME (moneyline) series ticker; response is {markets:[{ticker,event_ticker,title,yes_bid,yes_ask,no_bid,no_ask,last_price,volume,open_interest,close_time}],cursor}. DONE 4/4 under the honest gate: CF + HF + Oracle + GH all return HTTP 200 + parseable JSON across all six sports.",
        "_note_cloudflare": "PASS 2026-05-25 6/6. abet-kalshi-cloudflare-proof.abetco.workers.dev (datacenter egress not blocked; Kalshi API is public).",
        "_note_huggingface": "PASS 2026-05-25. abetco/live-odds /scrape/kalshi, HTTP 200 + parseable JSON (baseball 176KB / 86 markets).",
        "_note_oracle": "PASS 2026-05-25 6/6 via WARP. abet-kalshi-proof-server-v1-0 port 8781; tunnel abet-kalshi-proof-tunnel-v1-0 (say-interested-knife-taxation).",
        "_note_github": "PASS 2026-05-25. Run 26387034845 executed py_kalshi_probe; ::ABET-MANIFEST:: captured=true, 6 files / 336,131 bytes / all six sports HTTP 200. Artifact upload fails only on the saturated account-wide GH storage quota."
      }
    },
    "polymarket": {
      "display": "Polymarket",
      "tier": "onboarding",
      "dedicated_page": "/polymarket-proof",
      "onboarded_utc": "2026-05-25T13:05:00Z",
      "recipe_source": "rust/abet_scraper_polymarket/src/main.rs",
      "sources": {
        "cloudflare_worker": "https://abet-polymarket-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=preview&sample_limit=20",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/polymarket?include_raw=1&raw_mode=preview&sample_limit=20",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/polymarket/scrape?include_raw=1&raw_mode=preview&sample_limit=20",
        "github_actions": true,
        "_note_standard": "Polymarket = public decentralized prediction-market exchange. GET gamma-api.polymarket.com/events?tag_id={TAG}&closed=false&limit=20&offset=0, Accept application/json + UA, NO auth token. Top-level JSON ARRAY of events with nested markets[] and tags[]. limit capped at 20 for transport sanity (full scraper paginates at 100). raw_mode=preview keeps browser payloads small. DONE 4/4: CF + HF + Oracle + GH all HTTP 200 + parseable JSON across all six sports.",
        "_note_cloudflare": "PASS 2026-05-25 6/6. abet-polymarket-cloudflare-proof.abetco.workers.dev (datacenter egress not blocked; Gamma API is public).",
        "_note_huggingface": "PASS 2026-05-25. abetco/live-odds /scrape/polymarket (baseball 2.0MB / 20 events / 555 markets).",
        "_note_oracle": "PASS 2026-05-25 6/6 via WARP. abet-polymarket-proof-server-v1-0 port 8795; tunnel abet-polymarket-proof-tunnel-v1-0 (yearly-trust-filme-certificate).",
        "_note_github": "PASS 2026-05-25. Run 26402012284 executed py_polymarket_probe; ::ABET-MANIFEST:: captured=true, 6 files / 9,307,015 bytes / all six sports HTTP 200."
      }
    },
    "caesars": {
      "display": "Caesars",
      "tier": "browser_waf_blocked",
      "dedicated_page": "/caesars-proof",
      "sources": {
        "cloudflare_worker": {
          "blocked": true,
          "reason": "Caesars requires a live browser/WAF session. Fresh 2026-06-24 production proxy probe of abet-caesars-cloudflare-proof mode=browser returned a JSON wrapper but Browser Run failed before capture: Unable to create new browser, code 429 Rate limit exceeded. Direct non-browser requests return upstream/edge HTTP 403."
        },
        "huggingface_space": {
          "blocked": true,
          "reason": "Caesars requires a browser/WAF session. Fresh 2026-06-24 HF Playwright probe loaded the Caesars sportsbook page, but every Caesars API hit returned CloudFront HTTP 403 text/html, including /home, /navigation-items, /sports/baseball/quick-picks, and /sports/baseball/tabs."
        },
        "oracle_vm": {
          "blocked": true,
          "reason": "Caesars browser/CDP capture works on local Windows Chrome, but the Oracle VM has no usable Chrome binary and prior Playwright diagnostics show the VM browser runtime hangs. Direct non-browser HTTP returns upstream HTTP 403."
        },
        "github_actions": {
          "blocked": true,
          "reason": "A GH runner would need a real browser/WAF capture lane, and live Actions are currently account-billing gated. Direct non-browser requests return upstream HTTP 403."
        },
        "_note_standard": "Caesars raw data is not missing: local Chrome/CDP captured the public Caesars API /home JSON on 2026-06-04, and python/caesars_support.py decoded 375 offers from eventDisplayGroups[]. Fresh non-browser requests are still upstream HTTP 403. The deployed independent Cloudflare Worker now has both direct and Browser Run modes, but Browser Run session creation is currently Cloudflare-rate-limited. The shared HF Space now has a Playwright Chromium Caesars route, but Caesars CloudFront returns 403 to the HF browser egress.",
        "_note_cloudflare": "HARD BLOCK refreshed 2026-06-24. abet-caesars-cloudflare-proof is deployed and /status returns 200. Production /api/proxy probe of mode=browser returned HTTP 200 wrapper, but the nested source failed before parseable Caesars JSON: transport_ok=false, error_message 'Unable to create new browser: code: 429: message: Rate limit exceeded'. Direct mode / direct non-browser fetches return HTTP 403. This proves the CF source is implemented and points at the viable browser path, but Cloudflare Browser Run capacity / Caesars WAF path prevents a passing proof on this source.",
        "_note_huggingface": "HARD BLOCK refreshed 2026-06-24. abetco/live-odds has Playwright Chromium plus /scrape/caesars. Fresh HF probe loaded the sportsbook page with title 'Odds; Betting Lines & Spreads | Caesars Sportsbook Arizona', but the captured Caesars API calls for /home, /navigation-items, /sports/baseball/quick-picks, and /sports/baseball/tabs all returned CloudFront HTTP 403 text/html. This is a live HF browser-egress blocker, not a missing route/source-code issue.",
        "_note_browser_evidence": "Local non-headless Chrome/CDP captured /home (258,382 bytes, eventDisplayGroups=8), /sports/baseball/tabs (93,684 bytes), /sports/baseball/quick-picks (277,884 bytes), and /sports/homepage/quick-picks (644,217 bytes). Existing Caesars parser decoded 375 joined offers from /home. No token values were committed.",
        "_note_non_browser_evidence": "Fresh Node, Python urllib, curl_cffi impersonation, and Cloudflare Worker non-browser fetches return upstream HTTP 403 unless a live browser/WAF session has just been established locally. Therefore the remaining work is a browser-capable source lane, not a raw-shape/parser problem."
      },
      "recipe_source": "python/caesars_scraper.py + python/caesars_direct_proof_support_20260604_v1_0.py + docs/20260604_CAESARS_BROWSER_CDP_RAW_EVIDENCE_AND_SOURCE_BLOCKER_UPDATE_v1_0_0.md"
    },
    "hardrock": {
      "display": "Hard Rock Bet",
      "tier": "onboarding",
      "dedicated_page": null,
      "onboarded_utc": "2026-05-24T00:00:00Z",
      "recipe_source": "rust/abet_scraper_hardrock/src/main.rs",
      "sources": {
        "cloudflare_worker": "https://abet-hardrock-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/hardrock?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/hardrock/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "github_actions": true,
        "_note_standard": "Hard Rock Bet = GraphQL POST (api.hardrocksportsbook.com/java-graphql/graphql, betSync query, ARIZONA_ONLINE, no token). DONE under the strict source-health gate: CF + HF + Oracle PASS; GitHub Actions PASS after the 2026-06-26 curl_cffi Chrome-impersonation runner repair.",
        "_note_cloudflare": "PASS 2026-05-24. Independent Worker live; 6/6 sports HTTP 200 + parseable GraphQL JSON (baseball 13 events/7288 markets/1.99MB, basketball 2/1248, football 16/48, hockey 2/540, cfb 14/39; cbb empty=NCAA offseason). Decimal odds decoded to American.",
        "_note_huggingface": "PASS 2026-05-24. HF Space /scrape/hardrock (curl_cffi Chrome POST) verified 6/6 sports HTTP 200 + parseable GraphQL JSON (baseball 1.54MB). Byte-near-identical to CF/Oracle.",
        "_note_oracle": "PASS 2026-05-24. Oracle VM proof server (abet-hardrock-proof-server-v1-0, port 8773, curl_cffi chrome131 + WARP, GraphQL POST) verified 6/6 sports HTTP 200 + parseable (baseball 11 events/5584 markets/1.5MB). HardRock allows WARP egress (unlike GitHub). trycloudflare URL rotates on VM restart.",
        "_note_github": "PASS 2026-06-26 after runner repair. Runner py_hardrock_probe now uses curl_cffi Chrome impersonation instead of plain urllib. GitHub run 28249284279 completed success and emitted a strict captured-data ::ABET-MANIFEST:: with captured=true, file_count=6, total_bytes=2,763,351 across football, basketball, baseball, hockey, football_cfb, and basketball_cbb."
      }
    },
    "thescore": {
      "display": "theScore Bet",
      "tier": "reference_variant",
      "dedicated_page": "/thescore-proof",
      "onboarded_utc": "2026-05-25T11:20:00Z",
      "recipe_source": "python/thescore_reference_support.py + rust/abet_scraper_thescore/src/main.rs auth blocker docs",
      "sources": {
        "cloudflare_worker": [
          "https://abet-thescore-cloudflare-proof.abetco.workers.dev/scrape/basketball?include_raw=1&raw_mode=full&sample_limit=100",
          "https://abet-thescore-cloudflare-proof.abetco.workers.dev/scrape/hockey?include_raw=1&raw_mode=full&sample_limit=100",
          "https://abet-thescore-cloudflare-proof.abetco.workers.dev/scrape/baseball?include_raw=1&raw_mode=full&sample_limit=100",
          "https://abet-thescore-cloudflare-proof.abetco.workers.dev/scrape/football?include_raw=1&raw_mode=full&sample_limit=100",
          "https://abet-thescore-cloudflare-proof.abetco.workers.dev/scrape/football_cfb?include_raw=1&raw_mode=full&sample_limit=100"
        ],
        "huggingface_space": [
          "https://abetco-live-odds.hf.space/scrape/thescore/basketball?include_raw=1&raw_mode=full&sample_limit=100",
          "https://abetco-live-odds.hf.space/scrape/thescore/hockey?include_raw=1&raw_mode=full&sample_limit=100",
          "https://abetco-live-odds.hf.space/scrape/thescore/baseball?include_raw=1&raw_mode=full&sample_limit=100",
          "https://abetco-live-odds.hf.space/scrape/thescore/football?include_raw=1&raw_mode=full&sample_limit=100",
          "https://abetco-live-odds.hf.space/scrape/thescore/football_cfb?include_raw=1&raw_mode=full&sample_limit=100"
        ],
        "oracle_vm": [
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/thescore/scrape/basketball?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=80",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/thescore/scrape/hockey?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=80",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/thescore/scrape/baseball?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=80",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/thescore/scrape/football?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=80",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/thescore/scrape/football_cfb?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=80"
        ],
        "github_actions": true,
        "_note_standard": "TheScore currently has two lanes. This proof is the public api.thescore.com reference-line lane with real event and odd{} raw data. The authenticated ESPN BET/theScore sportsbook GraphQL scraper remains blocked pending a fresh thescore_auth_state.json refresh-token seed.",
        "_note_authenticated_lane_blocker": "BLOCKED per docs/20260407_190500_THESCORE_BROWSER_TOKEN_AUDIT_AND_BLOCKER_STATUS_v1_0_0.md. Browser token recovery found no refreshable candidate; Rust scraper exits with missing thescore_auth_state.json.",
        "_note_cloudflare": "Public reference variant implemented as independent abet-thescore-cloudflare-proof Worker. Per-sport fanout avoids one oversized all-sports response.",
        "_note_huggingface": "Public reference variant added to abetco/live-odds as /scrape/thescore/{sport}.",
        "_note_oracle": "Public reference variant deployed on Oracle VM service abet-thescore-proof-server-v1-0 port 8790, quick tunnel concentrate-chem-titans-atlantic.trycloudflare.com.",
        "_note_github": "Public reference variant runner registered as py_thescore_public_reference_probe and emits ::ABET-MANIFEST::. GH proves public-reference capture, not authenticated sportsbook GraphQL."
      }
    },
    "atg": {
      "display": "ATG",
      "tier": "kambi_direct_onboarding",
      "dedicated_page": "/atg-proof",
      "onboarded_utc": "2026-05-30T22:00:00Z",
      "recipe_source": "python/atg_scraper_isolated.py + python/kambi_direct_proof_support_20260526_v1_0.py",
      "sources": {
        "cloudflare_worker": "https://abet-atg-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "cloudflare_worker_wnba_depth": "https://abet-atg-cloudflare-proof.abetco.workers.dev/scrape/basketball_wnba?include_raw=1&raw_mode=preview&sample_limit=20",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/atg?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space_wnba_depth": "https://abetco-live-odds.hf.space/scrape/atg/basketball_wnba?include_raw=1&raw_mode=preview&sample_limit=20",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/atg/scrape?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
        "oracle_vm_wnba_depth": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/atg/scrape/basketball_wnba?include_raw=1&raw_mode=preview&sample_limit=20&timeout_seconds=45",
        "github_actions": true,
        "_note_standard": "ATG proof uses public Kambi listView JSON and preserves event, betOffers, and outcome layers for sortable proof tables.",
        "_note_wnba_depth": "PASS 2026-07-12. Kambi basketball/wnba path returns 4 WNBA events, 12 betOffers, 24 outcomes across CF/HF/Oracle. CF 603ms round trip, HF 347ms, Oracle 1,990ms.",
        "_note_cloudflare": "PASS 2026-06-01. Independent Worker abet-atg-cloudflare-proof built from the Kambi direct single-step listView template and deployed via local Wrangler. /scrape/baseball returned HTTP 200, parseable JSON, about 31KB raw bytes, 9 events, 27 betOffers, and 54 outcomes.",
        "_note_huggingface": "PASS 2026-05-30. abetco/live-odds /scrape/atg/baseball returned HTTP 200, parseable JSON, about 51KB raw bytes, 14 events, 42 betOffers, and 84 outcomes.",
        "_note_oracle": "PASS 2026-05-30. abet-atg-proof-server-v1-0 runs on Oracle VM port 8807 behind tunnel reviews-equal-bears-continuous.trycloudflare.com. Baseball returned HTTP 200, parseable JSON, about 51KB raw bytes, 14 events, 42 betOffers, and 84 outcomes.",
        "_note_github": "Runner py_atg_probe is registered in the freeform dispatcher and validated locally with ::ABET-MANIFEST:: (baseball HTTP 200, about 51KB raw bytes, 14 events, 42 betOffers, 84 outcomes). Live GitHub Actions dispatch is expected to stay blocked until the account payment/spend-limit gate is cleared."
      }
    },
    "betanything": {
      "display": "BetAnything",
      "tier": "onboarding",
      "dedicated_page": "/betanything-proof",
      "onboarded_utc": "2026-06-04T09:00:00Z",
      "recipe_source": "python/betanything_support.py",
      "sources": {
        "cloudflare_worker": "https://abet-betanything-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/betanything?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/betanything/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "github_actions": true,
        "_note_standard": "BetAnything proof uses the public Remix sports-betting.data route graph, preserves the exact upstream raw bytes/SHA, decodes routes/sports-betting._index.data.trendingBets[], and renders sortable event/card/joined-offer tables.",
        "_note_recipe_fix": "The previous blocker was stale parser logic: the current production field is trendingBets, not trendingBetsWithCta/cards. Local smoke 2026-06-04 returned 7 events / 42 outcomes; live source probes returned HTTP 200, ~96KB raw bytes, 10 cards/events and 42 outcomes.",
        "_note_cloudflare": "PASS 2026-06-04. Independent Worker abet-betanything-cloudflare-proof deployed with Wrangler and returned HTTP 200, 96,109 raw bytes, 10 cards/events, 42 outcomes.",
        "_note_huggingface": "PASS 2026-06-04. abetco/live-odds /scrape/betanything uploaded at HF commits 19a2590/f03e658 and returned HTTP 200, 96,109 raw bytes, 10 cards/events, 42 outcomes.",
        "_note_oracle": "PASS 2026-06-04. abet-betanything-proof-server-v1-0 runs on Oracle VM port 8820 behind tunnel affiliates-presentations-premier-mailto.trycloudflare.com and returned HTTP 200, 96,109 raw bytes, 10 cards/events, 42 outcomes.",
        "_note_github": "GH-rec runner py_betanything_probe is registered and locally validated with ::ABET-MANIFEST:: (HTTP 200, 96,109 raw bytes). Live GitHub dispatch remains subject to the account-wide billing/spend gate until restored."
      }
    },
    "betopenly": {
      "display": "BetOpenly",
      "tier": "onboarding",
      "dedicated_page": "/betopenly-proof",
      "onboarded_utc": "2026-05-25T21:05:00Z",
      "recipe_source": "python/betopenly_scraper_isolated.py",
      "sources": {
        "cloudflare_worker": "https://abet-betopenly-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/betopenly?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/betopenly/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "github_actions": true,
        "_note_standard": "BetOpenly = public peer-to-peer betting exchange. GET api.betopenly.com/v1/bets/livefeed, Accept json + Origin/Referer app.betopenly.com, NO auth token. Single JSON feed = top-level ARRAY of P2P bets (id/title/combinedOdds/combinedDecimalsOdds/amount* / details[]); the scraper filters by league client-side so the proof models one 'all' route (Fliff precedent). DONE 4/4: CF + HF + Oracle + GH all HTTP 200 + parseable JSON.",
        "_note_cloudflare": "PASS 2026-05-25. abet-betopenly-cloudflare-proof.abetco.workers.dev (188 bets; datacenter egress not blocked).",
        "_note_huggingface": "PASS 2026-05-25. abetco/live-odds /scrape/betopenly (189 bets, ~435KB).",
        "_note_oracle": "PASS 2026-05-25 via WARP. abet-betopenly-proof-server-v1-0 port 8797; tunnel abet-betopenly-proof-tunnel-v1-0 (livecam-attempt-gather-suffering). 190 bets.",
        "_note_github": "PASS 2026-05-25. Run 26419734682 executed py_betopenly_probe; ::ABET-MANIFEST:: captured=true, 1 file / 435,161 bytes / HTTP 200. Artifact upload fails only on the saturated account-wide GH storage quota."
      }
    },
    "betparx": {
      "display": "BetParx",
      "tier": "kambi_direct_onboarding",
      "dedicated_page": "/betparx-proof",
      "onboarded_utc": "2026-05-26T08:15:00Z",
      "recipe_source": "python/betparx_scraper_isolated.py + python/kambi_direct_proof_support_20260526_v1_0.py",
    "sources": {
      "cloudflare_worker": "https://abet-betparx-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
      "cloudflare_worker_wnba_depth": "https://abet-betparx-cloudflare-proof.abetco.workers.dev/scrape/basketball_wnba?include_raw=1&raw_mode=preview&sample_limit=20",
      "huggingface_space": "https://abetco-live-odds.hf.space/scrape/betparx?include_raw=1&raw_mode=full&sample_limit=100",
      "huggingface_space_wnba_depth": "https://abetco-live-odds.hf.space/scrape/betparx/basketball_wnba?include_raw=1&raw_mode=preview&sample_limit=20",
      "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/betparx/scrape?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
      "oracle_vm_wnba_depth": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/betparx/scrape/basketball_wnba?include_raw=1&raw_mode=preview&sample_limit=20&timeout_seconds=45",
      "github_actions": true,
      "_note_standard": "BetParx proof uses public Kambi listView JSON and preserves event, betOffers, and outcome layers for sortable proof tables.",
      "_note_cloudflare": "PASS 2026-06-01. Independent Worker abet-betparx-cloudflare-proof built (single-step Kambi listView, mirrors python/betparx + kambi_direct_proof_support) and deployed by claude after wrangler re-auth; /scrape returned HTTP 200, 6/6 sports parseable, 417KB, 222 outcomes.",
      "_note_wnba_depth": "PASS 2026-07-12. Kambi basketball/wnba path added across CF/HF/Oracle. Live WNBA route returns 4 events, 12 betOffers, 24 outcomes. CF source latency 226ms, HF 135ms, Oracle 195ms.",
      "_note_huggingface": "PASS 2026-05-26. abetco/live-odds /scrape/betparx/baseball returned HTTP 200, parseable JSON, 52KB raw bytes, 15 events, 45 betOffers, and 90 outcomes.",
        "_note_oracle": "PASS 2026-05-26. abet-betparx-proof-server-v1-0 runs on Oracle VM port 8805 behind tunnel beliefs-opportunities-sympathy-imaging.trycloudflare.com. Baseball returned HTTP 200, parseable JSON, 52KB raw bytes, 15 events, 45 betOffers, and 90 outcomes.",
        "_note_github": "Runner py_betparx_probe is registered in the freeform dispatcher and validated locally with ::ABET-MANIFEST:: (baseball HTTP 200, 52KB raw bytes, 15 events, 45 betOffers, 90 outcomes). Live GitHub Actions dispatch is expected to stay blocked until the account payment/spend-limit gate is cleared."
      }
    },
    "betr_au": {
      "display": "BetR (AU)",
      "tier": "nextjs_onboarding",
      "dedicated_page": "/betr_au-proof",
      "onboarded_utc": "2026-06-01T19:15:00Z",
      "recipe_source": "python/betr_au_scraper_isolated.py + python/betr_au_nextjs_proof_support_20260601_v1_0.py",
      "sources": {
        "cloudflare_worker": "https://abet-betr-au-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/betr_au?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/betr_au/scrape?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=60",
        "github_actions": true,
        "_note_standard": "Betr AU proof uses public Next.js index JSON from www.betr.com.au/_next/data/{buildId}/index.json. Raw proof preserves events[], markets[], outcomes[], offers[], and the upstream index_payload when raw_mode=full.",
        "_note_cloudflare": "PASS 2026-06-01. Independent Worker abet-betr-au-cloudflare-proof returned HTTP 200 from /scrape with parseable Next.js JSON. All-sports probe saw 12 events, 24 markets/outcomes/offers, and about 630KB raw bytes per sport fetch.",
        "_note_huggingface": "PASS 2026-06-01. abetco/live-odds route /scrape/betr_au added with the same Next.js proof support module; Space returns parseable events/markets/outcomes/offers layers from the public _next/data index payload.",
        "_note_oracle": "PASS 2026-06-01. abet-betr-au-proof-server-v1-0 runs on Oracle VM port 8808 behind quick tunnel pics-games-medline-cho.trycloudflare.com. Direct baseball probe returned HTTP 200, parseable JSON, about 610KB raw bytes, 9 events, 18 markets, 18 outcomes, and 18 offers.",
        "_note_github": "Runner py_betr_au_probe is registered in the freeform dispatcher and validated locally with ::ABET-MANIFEST:: (baseball HTTP 200, about 610KB raw bytes, 9 events, 18 markets/outcomes/offers). Live GitHub Actions dispatch remains account-billing-gated until billing/spend limits are restored."
      }
    },
    "betsafe": {
      "display": "Betsafe",
      "tier": "geofence_browser_blocked",
      "dedicated_page": "/betsafe-proof",
      "sources": {
        "cloudflare_worker": {
          "blocked": true,
          "reason": "Fresh 2026-06-24 direct probe of abet-betsafe-nordicbet-egress-probe /scrape/betsafe returned top-level HTTP 403 text/plain with body `error code: 1010`; diagnostic Worker cannot obtain a populated odds payload from Cloudflare egress."
        },
        "huggingface_space": {
          "blocked": true,
          "reason": "Fresh 2026-06-24 HF probe executed the Betsafe diagnostic route, but returned zero populated odds-like probes: web/widget/route paths 302 to country-blocked, Strive mobile token HTTP 200 JSON Code=422 session-init failure, Kambi token HTTP 403, and public countries JSON is config-only."
        },
        "oracle_vm": {
          "blocked": true,
          "reason": "Fresh 2026-06-24 Oracle mux probe executed seven Betsafe diagnostic checks but returned ok=false and zero populated odds-like probes: web page HTTP 202 empty, widget/route paths 302 country-blocked, Strive mobile token Code=422, Kambi token HTTP 403, public countries config-only."
        },
        "github_actions": {
          "blocked": true,
          "reason": "GH diagnostic runner py_betsafe_diagnostic_probe is registered and locally emits ::ABET-MANIFEST:: with scraper_executed=true, but captured=false because no odds-like payload is returned. Live GitHub Actions is also account-billing gated. Do not turn this pill green until live GH can run and return populated odds-like JSON."
        },
        "_note_standard": "Betsafe browser bootstrap is geofenced from current proof infrastructure: local/browser redirects to country-blocked, direct widget APIs return CloudFront 403, Oracle direct returns empty HTTP 202, Oracle WARP redirects to country-blocked, and Oracle Chromium currently hangs. No source can honestly PASS until an allowed egress/browser lane or alternate populated endpoint is available.",
        "_note_cloudflare": "HARD BLOCK refreshed 2026-06-24. Independent Cloudflare Worker abet-betsafe-nordicbet-egress-probe remains deployed, but direct /scrape/betsafe returns top-level HTTP 403 text/plain with body `error code: 1010`. Earlier diagnostic evidence still shows page/widget/route paths country-blocked, mobile token Code=422, Kambi token HTTP 403, and public countries config-only.",
        "_note_huggingface": "HARD BLOCK refreshed 2026-06-24. abetco/live-odds /scrape/betsafe executes the diagnostic route but returns zero populated odds-like probes: web_sportsbook_page, historical_widget_view_nba, and route_data_nba 302 to country-blocked; mobile_strive_sportsbook_token ch2/ch3 HTTP 200 JSON Code=422; mobile_strive_kambi_token HTTP 403; public countries JSON config-only.",
        "_note_oracle": "HARD BLOCK refreshed 2026-06-24. Oracle mux /oracle/betsafe/scrape/betsafe executes seven diagnostic probes and returns wrapper HTTP 200 with ok=false, result_count=7, populated_json_probe_count=0: web page HTTP 202 empty, widget/route 302 country-blocked, mobile token Code=422, Kambi token HTTP 403, public countries config-only.",
        "_note_github": "REGISTERED RED runner 2026-06-05. Dispatcher now has book=betsafe -> py_betsafe_diagnostic_probe (`orchestration/20260605_011500_BETSAFE_GITHUB_ACTIONS_DIAGNOSTIC_PROBE_RUNNER_v1_0_0.py`). Local run emitted ::ABET-MANIFEST:: with scraper_executed=true, captured=false, total_bytes=5978, probes=7, populated_odds_like_probes=0. Public GH pill remains blocked because live Actions billing is down and no odds-like JSON was captured.",
        "_note_evidence": "2026-06-04 recheck: local/browser redirects to country-blocked pages; direct /api/sb/v1/widgets/view/v1 and events-table/v2 return CloudFront 403; Oracle direct returns empty HTTP 202; Oracle WARP follows to country-blocked; Oracle Playwright Chromium hangs under timeout. Do not mark PASS without a populated raw odds payload.",
        "_note_next_step": "Find an allowed egress/browser lane or alternate official populated endpoint first. Current four proof sources cannot reach the sportsbook widget bootstrap or odds APIs."
      },
      "recipe_source": "python/betsson_family_support.py"
    },
    "betsson": {
      "display": "Betsson",
      "tier": "browser_widget_partial",
      "dedicated_page": "/betsson-proof",
      "sources": {
        "cloudflare_worker": "https://abet-betsson-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=preview&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/betsson/all?include_raw=1&raw_mode=preview&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/betsson/scrape?include_raw=1&raw_mode=preview&sample_limit=100",
        "github_actions": true,
        "_note_standard": "Betsson .com remains geofence/browser blocked from current proof infrastructure, but official Betsson Spain (betsson.es) returns populated anonymous sportsbook widget JSON through anonymous sportsbook widget headers. CF, HF, and Oracle are live PASS. GH still needs a runner after GitHub Actions billing is restored.",
        "_note_evidence": "2026-06-04 HF live probe: /scrape/betsson/all via production /api/proxy returned wrapper HTTP 200, transport_ok true, source http_status 200, raw_bytes 662770, shape counts payloads=6 events=31 markets=52 selections=33 marketSelections=296 offers=20. Browser evidence page_url=https://www.betsson.es/sportsbook and title=Casino en l\u00ednea | Juegos online y apuestas deportivas | 18+ BetssonES. Earlier .com/.dk/.mx/.pe/.br plus Betsafe/NordicBet host probes still returned country-blocked HTML or empty route-data.",
        "_note_cloudflare": "2026-06-04 live CF probe after direct-header conversion: abet-betsson-cloudflare-proof /scrape returns wrapper HTTP 200, source transport_ok=true, http_status=200, raw_bytes about 170k, and counts payloads=4 events=21 markets=29 selections=33 offers=20. This no longer depends on Cloudflare Browser Run.",
        "_note_oracle": "2026-06-04 live Oracle probe: https://its-sudden-anatomy-laura.trycloudflare.com/scrape returned HTTP 200, source transport_ok=true, http_status=200, raw_bytes about 170k, and counts payloads=4 events=21 markets=29 selections=33 offers=20 from the VM-local direct widget proof server on port 8824.",
        "_note_github": "GH-rec PASS 2026-06-04. Runner py_betsson_direct_widget_probe emitted ::ABET-MANIFEST:: locally with captured=true, HTTP 200, 170,763 raw bytes, and counts payloads=4 events=21 markets=29 selections=33 offers=20. Live GitHub Actions remains account-billing gated like the other GH-rec books.",
        "_note_next_step": "When GitHub Actions billing is restored, dispatch book=betsson to collect the same direct-widget manifest on GitHub-hosted egress."
      },
      "recipe_source": "python/betsson_family_support.py"
    },
    "betway": {
      "display": "Betway",
      "tier": "nextjs_onboarding",
      "dedicated_page": "/betway-proof",
      "onboarded_utc": "2026-05-26T03:20:00Z",
      "recipe_source": "python/betway_scraper_isolated.py + python/betway_nextjs_proof_support_20260526_v1_0.py",
      "sources": {
        "cloudflare_worker": "https://abet-betway-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/betway?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/betway/scrape?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
        "github_actions": true,
        "_note_standard": "Betway proof uses public Next.js sport group pages and decodes embedded React flight payloads into pages, events, markets, outcomes, and offers tables.",
        "_note_cloudflare": "Independent Cloudflare Worker implementation is pending. New deploy jobs are currently blocked by the account-wide GitHub Actions billing/spend gate.",
        "_note_huggingface": "PASS 2026-05-26. abetco/live-odds /scrape/betway/baseball returned HTTP 200, parseable HTML/React-flight data, ~645KB raw bytes, 20 events, 53 markets, 160 outcomes, and 97 offers.",
        "_note_oracle": "PASS 2026-05-26. abet-betway-proof-server-v1-0 runs on Oracle VM port 8804 behind tunnel gain-psp-parliamentary-turned.trycloudflare.com. Baseball returned HTTP 200, parseable HTML/React-flight data, ~655KB raw bytes, 20 events, 54 markets, 162 outcomes, and 96 offers.",
        "_note_github": "Runner py_betway_probe is registered in the freeform dispatcher and validated locally with ::ABET-MANIFEST:: (baseball HTTP 200, ~643KB raw bytes, 19 events, 51 markets, 156 outcomes, 95 offers). Live GitHub Actions dispatch is expected to stay blocked until the account payment/spend-limit gate is cleared."
      }
    },
    "coral": {
      "display": "Coral",
      "tier": "cms_json_onboarding",
      "dedicated_page": "/coral-proof",
      "onboarded_utc": "2026-05-26T02:30:00Z",
      "recipe_source": "python/coral_scraper_isolated.py + python/coral_cms_support.py + python/coral_cms_proof_support_20260526_v1_0.py",
      "sources": {
        "cloudflare_worker": "https://abet-coral-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/coral?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/coral/scrape?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=90",
        "github_actions": true,
        "_note_standard": "Coral proof uses the existing public Coral CMS JSON recipe. It fetches sport CMS pages, preserves page/module metadata, and parses event rows, market rows, and offer rows into raw-layer tables: pages[], modules[], events[], markets[], offers[].",
        "_note_cloudflare": "PASS 2026-06-22. Independent Coral Worker abet-coral-cloudflare-proof now bypasses the empty FSC page shell and pulls OpenBet SiteServer EventToOutcomeForType/101685 for MLB. Live probe returned HTTP 200, parseable JSON, raw_bytes=7,359,022, events=13, markets=42, offers=60 with real ML/TOTAL rows such as CIN Reds v MIL Brewers.",
        "_note_huggingface": "PASS 2026-06-22. abetco/live-odds /scrape/coral/baseball uses the updated OpenBet SiteServer support module. Warm live probe returned HTTP 200, raw_bytes=7,360,681, events=13, markets=43, offers=62 with real ML/TOTAL rows.",
        "_note_oracle": "PASS 2026-06-22. abet-coral-proof-server-v1-0 runs on Oracle VM port 8802 behind fresh tunnel saves-alphabetical-groundwater-wagon.trycloudflare.com. Public tunnel probe returned HTTP 200, raw_bytes=7,360,681, events=13, markets=43, offers=62.",
        "_note_github": "GH-rec under current account-billing gate. Runner py_coral_probe imports the updated root Python SiteServer support module. Local smoke run emitted ::ABET-MANIFEST:: captured=true, file_count=1, baseball HTTP 200, raw_bytes=7,360,678, counts pages=1/modules=0/events=13/markets=43/offers=62. Live GitHub Actions dispatch remains account-billing/artifact-state dependent."
      }
    },
    "draftkings_pick6": {
      "display": "DraftKings Pick6",
      "tier": "root-data onboarding",
      "dedicated_page": "/draftkings_pick6-proof",
      "onboarded_utc": "2026-06-02T14:15:00Z",
      "recipe_source": "python/draftkings_pick6_scraper_isolated.py + python/draftkings_pick6_root_data_proof_support_20260602_v1_0.py",
      "sources": {
        "cloudflare_worker": "https://abet-draftkings-pick6-cloudflare-proof.abetco.workers.dev/scrape/mlb?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/draftkings_pick6/mlb?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/draftkings_pick6/scrape/mlb?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
        "github_actions": true,
        "_note_standard": "DraftKings Pick6 proof uses the public Remix _root.data route, not the Playwright DOM path. Raw hierarchy preserves $.encoded_root[] plus decoded $.decoded_data.pickCardData.pickCardsByPickGroup maps and joined activePickableMarkets[].activeSelections[] projection offers.",
        "_note_cloudflare": "PASS 2026-06-02. Independent Worker abet-draftkings-pick6-cloudflare-proof returned HTTP 200, parseable text/x-script root data, 15 competitions, 28 pick cards, 157 pickable markets, and 180 selection offers.",
        "_note_huggingface": "PASS 2026-06-02. abetco/live-odds /scrape/draftkings_pick6/mlb returned HTTP 200, parseable root data, and the same Pick6 hierarchy as Cloudflare.",
        "_note_oracle": "PASS 2026-06-02. VM direct egress gets upstream 403, so the Oracle proof server uses the VM WARP socks5 tunnel verified by curl. Tunnel democrats-portland-beside-meyer on port 8816 returned HTTP 200, parseable root data, and live Pick6 projection offers.",
        "_note_github": "PASS via GH-rec gate. Runner py_draftkings_pick6_probe is registered and locally validated with ::ABET-MANIFEST:: (MLB HTTP 200, ~386KB raw bytes). Live GitHub Actions may remain account-billing gated like the rest of the cohort."
      }
    },
    "everygame": {
      "display": "Everygame",
      "tier": "html_scrape_onboarding",
      "dedicated_page": "/everygame-proof",
      "onboarded_utc": "2026-05-25T22:15:00Z",
      "recipe_source": "python/everygame_scraper_isolated.py + python/everygame_html_proof_support_20260525_v1_0.py",
      "sources": {
        "cloudflare_worker": "https://abet-everygame-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/everygame?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/everygame/scrape?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
        "github_actions": true,
        "_note_standard": "Everygame is the first HTML-scrape proof gate. It fetches public sports.everygame.eu league pages, preserves page-level HTML proof metadata, and parses event rows plus offer rows into raw-layer tables: pages[], events[], offers[].",
        "_note_cloudflare": "PASS 2026-06-01. Independent Everygame Worker abet-everygame-cloudflare-proof returned HTTP 200 through production /api/proxy with parseable HTML-proof JSON, about 787KB raw HTML, 18 events, and 90 offer rows.",
        "_note_huggingface": "PASS 2026-05-25. abetco/live-odds /scrape/everygame/baseball returned HTTP 200, parseable JSON, 218KB raw HTML, 12 events, and 60 offer rows.",
        "_note_oracle": "PASS 2026-05-25 via WARP/Oracle. abet-everygame-proof-server-v1-0 runs on port 8798 behind abet-everygame-proof-tunnel-v1-0 (sensitivity-page-appliances-bureau). Baseball returned HTTP 200, parseable JSON, 12 events, and 60 offer rows.",
        "_note_github": "GH-rec under current account-billing gate. Runner py_everygame_probe is registered in the freeform dispatcher and emits ::ABET-MANIFEST:: locally, but run 26422039063 never started because GitHub reported recent account payments failed or spending limit needs increase. This is an account/Actions infrastructure blocker, not a scraper-code result."
      }
    },
    "expansion_props_sync": {
      "display": "Expansion Props Sync",
      "tier": "runner_pseudo_entry",
      "dedicated_page": "/expansion_props_sync-proof",
      "sources": {
        "cloudflare_worker": {
          "blocked": true,
          "reason": "Pseudo-entry for props sync/orchestration, not an independent sportsbook. Exclude from per-book 4-source sportsbook completion target."
        },
        "huggingface_space": {
          "blocked": true,
          "reason": "Pseudo-entry for props sync/orchestration, not an independent sportsbook. Exclude from per-book 4-source sportsbook completion target."
        },
        "oracle_vm": {
          "blocked": true,
          "reason": "Pseudo-entry for props sync/orchestration, not an independent sportsbook. Exclude from per-book 4-source sportsbook completion target."
        },
        "github_actions": {
          "blocked": true,
          "reason": "Pseudo-entry for props sync/orchestration, not an independent sportsbook. Exclude from per-book 4-source sportsbook completion target."
        },
        "_note_classification": "Pseudo-entry for props sync/orchestration, not an independent sportsbook. Exclude from per-book 4-source sportsbook completion target.",
        "_note_next_step": "No source-pill build required unless this row is intentionally redefined as a real sportsbook target."
      }
    },
    "expansion_team_runner": {
      "display": "Expansion Team Runner",
      "tier": "runner_pseudo_entry",
      "dedicated_page": "/expansion_team_runner-proof",
      "sources": {
        "cloudflare_worker": {
          "blocked": true,
          "reason": "Pseudo-entry for team runner/orchestration, not an independent sportsbook. Exclude from per-book 4-source sportsbook completion target."
        },
        "huggingface_space": {
          "blocked": true,
          "reason": "Pseudo-entry for team runner/orchestration, not an independent sportsbook. Exclude from per-book 4-source sportsbook completion target."
        },
        "oracle_vm": {
          "blocked": true,
          "reason": "Pseudo-entry for team runner/orchestration, not an independent sportsbook. Exclude from per-book 4-source sportsbook completion target."
        },
        "github_actions": {
          "blocked": true,
          "reason": "Pseudo-entry for team runner/orchestration, not an independent sportsbook. Exclude from per-book 4-source sportsbook completion target."
        },
        "_note_classification": "Pseudo-entry for team runner/orchestration, not an independent sportsbook. Exclude from per-book 4-source sportsbook completion target.",
        "_note_next_step": "No source-pill build required unless this row is intentionally redefined as a real sportsbook target."
      }
    },
    "grosvenor": {
      "display": "Grosvenor",
      "tier": "kambi_direct_repair",
      "dedicated_page": "/grosvenor-proof",
      "onboarded_utc": "2026-06-02T16:30:00Z",
      "recipe_source": "python/kambi_direct_proof_support_20260526_v1_0.py",
      "sources": {
        "cloudflare_worker": "https://abet-grosvenor-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "cloudflare_worker_wnba_depth": "https://abet-grosvenor-cloudflare-proof.abetco.workers.dev/scrape/basketball_wnba?include_raw=1&raw_mode=preview&sample_limit=20",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/grosvenor?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space_wnba_depth": "https://abetco-live-odds.hf.space/scrape/grosvenor/basketball_wnba?include_raw=1&raw_mode=preview&sample_limit=20",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/grosvenor/scrape?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
        "oracle_vm_wnba_depth": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/grosvenor/scrape/basketball_wnba?include_raw=1&raw_mode=preview&sample_limit=20&timeout_seconds=45",
        "github_actions": true,
        "_note_standard": "Grosvenor proof was repaired 2026-06-24 after the old pre-rendered HTML sport table stopped exposing NBA rows. Current proof uses Grosvenor's public Kambi gruk listView API and preserves event wrappers, events, betOffers, criteria, offer types, outcomes, odds, and lines.",
        "_note_wnba_depth": "PASS 2026-07-12. Kambi basketball/wnba path returns 4 WNBA events, 12 betOffers, 24 outcomes across CF/HF/Oracle. CF 567ms round trip, HF 338ms, Oracle 767ms.",
        "_note_cloudflare": "REPAIR 2026-06-24. Independent Worker abet-grosvenor-cloudflare-proof switched to public Kambi gruk listView endpoints.",
        "_note_huggingface": "REPAIR 2026-06-24. HF route switched from the old HTML parser to shared Kambi direct proof support for grosvenor.",
        "_note_oracle": "REPAIR 2026-06-24. Oracle route should use the muxed Grosvenor service after its server-side support is updated to the Kambi direct path.",
        "_note_github": "REPAIR 2026-06-24. Runner py_grosvenor_probe now points to 20260624_091200_GROSVENOR_KAMBI_DIRECT_GITHUB_ACTIONS_PROBE_RUNNER_v1_0_0.py; local manifest captured baseball 14 events / 42 betOffers / 84 outcomes, NFL 17 / 51 / 102, and NCAAF 9 / 27 / 54."
      }
    },
    "kambi_expansion": {
      "display": "Kambi Expansion",
      "tier": "runner_pseudo_entry",
      "dedicated_page": "/kambi_expansion-proof",
      "sources": {
        "cloudflare_worker": {
          "blocked": true,
          "reason": "Pseudo-entry for the generic Kambi expansion harness. Its real book members (BallyBet, BetParx, TABtouch, ATG, Svenska Spel, Unibet AU, Unibet, etc.) are tracked as separate rows."
        },
        "huggingface_space": {
          "blocked": true,
          "reason": "Pseudo-entry for the generic Kambi expansion harness. Its real book members (BallyBet, BetParx, TABtouch, ATG, Svenska Spel, Unibet AU, Unibet, etc.) are tracked as separate rows."
        },
        "oracle_vm": {
          "blocked": true,
          "reason": "Pseudo-entry for the generic Kambi expansion harness. Its real book members (BallyBet, BetParx, TABtouch, ATG, Svenska Spel, Unibet AU, Unibet, etc.) are tracked as separate rows."
        },
        "github_actions": {
          "blocked": true,
          "reason": "Pseudo-entry for the generic Kambi expansion harness. Its real book members (BallyBet, BetParx, TABtouch, ATG, Svenska Spel, Unibet AU, Unibet, etc.) are tracked as separate rows."
        },
        "_note_classification": "Pseudo-entry for the generic Kambi expansion harness. Its real book members (BallyBet, BetParx, TABtouch, ATG, Svenska Spel, Unibet AU, Unibet, etc.) are tracked as separate rows.",
        "_note_next_step": "No source-pill build required unless this row is intentionally redefined as a real sportsbook target."
      }
    },
    "ladbrokes": {
      "display": "Ladbrokes",
      "tier": "cms_json_onboarding",
      "dedicated_page": "/ladbrokes-proof",
      "onboarded_utc": "2026-05-26T03:00:00Z",
      "recipe_source": "python/ladbrokes_scraper_isolated.py + python/coral_cms_support.py + python/ladbrokes_cms_proof_support_20260526_v1_0.py",
      "sources": {
        "cloudflare_worker": "https://abet-ladbrokes-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/ladbrokes?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/ladbrokes/scrape?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=90",
        "github_actions": true,
        "_note_standard": "Ladbrokes proof uses public Entain CMS JSON from cms-prod.ladbrokes.com/cms/api/ladbrokes/fsc and decodes raw pages, modules, events, markets, and offers into sortable proof tables.",
        "_note_cloudflare": "PASS 2026-06-22. Independent Ladbrokes Worker abet-ladbrokes-cloudflare-proof now bypasses the empty FSC page shell and pulls OpenBet SiteServer EventToOutcomeForType/101685 for MLB. Live probe returned HTTP 200, parseable JSON, raw_bytes=7,399,828, events=13, markets=42, offers=60 with real ML/TOTAL rows such as Colorado Rockies v Boston Red Sox.",
        "_note_huggingface": "PASS 2026-06-22. abetco/live-odds /scrape/ladbrokes/baseball uses the updated OpenBet SiteServer support module. Warm live probe returned HTTP 200, raw_bytes=7,408,485, events=13, markets=43, offers=62 with real ML/TOTAL rows.",
        "_note_oracle": "PASS 2026-06-22. abet-ladbrokes-proof-server-v1-0 runs on Oracle VM port 8803 behind fresh tunnel governmental-manually-cellular-plays.trycloudflare.com. Public tunnel probe returned HTTP 200, raw_bytes=7,408,482, events=13, markets=43, offers=62.",
        "_note_github": "GH-rec under current account-billing gate. Runner py_ladbrokes_probe imports the updated root Python SiteServer support module. Local smoke run emitted ::ABET-MANIFEST:: captured=true, file_count=1, baseball HTTP 200, raw_bytes=7,401,490, counts pages=1/modules=0/events=13/markets=43/offers=62. Live GitHub Actions dispatch remains account-billing/artifact-state dependent."
      }
    },
    "livescorebet": {
      "display": "LiveScore Bet",
      "tier": "flagship",
      "dedicated_page": "/livescorebet-proof",
      "onboarded_utc": "2026-05-25T20:15:00Z",
      "recipe_source": "python/livescorebet_scraper_isolated.py + python/livescore_gateway_support.py + python/livescorebet_gateway_proof_support_20260525_v1_0.py",
      "sources": {
        "cloudflare_worker": "https://abet-livescorebet-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/livescorebet?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/livescorebet/scrape?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
        "github_actions": true,
        "_note_standard": "LiveScore Bet proof uses the directly callable public sportsbook gateway endpoints: sport competitions -> events/matches. The production scraper uses Playwright bootstrap, but the proof sources use direct browser-like requests and return competitions, events, markets, and selections in raw-layer tables.",
        "_note_oracle": "Oracle VM proof server runs on port 8796 behind abet-livescorebet-proof-tunnel-v1-0. The trycloudflare URL rotates when the tunnel restarts."
      }
    },
    "marathonbet": {
      "display": "Marathonbet",
      "tier": "html_onboarding",
      "dedicated_page": "/marathonbet-proof",
      "onboarded_utc": "2026-06-01T21:51:00Z",
      "recipe_source": "python/marathonbet_scraper_isolated.py + python/marathonbet_html_proof_support_20260601_v1_0.py",
      "sources": {
        "cloudflare_worker": "https://abet-marathonbet-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/marathonbet?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": [
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/marathonbet/scrape/basketball?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=60",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/marathonbet/scrape/baseball?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=60",
          "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/marathonbet/scrape/hockey?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=60"
        ],
        "github_actions": true
      },
      "_note_standard": "Marathonbet proof uses public pre-rendered HTML pages from marathonbet.com/en/betting/{sport}. The proof decoder preserves raw pages plus explicit events[], markets[], outcomes[], and joined offers[] layers; counts are intentionally broader than the normalized scraper because this page proves raw visible coupon data.",
      "_note_cloudflare": "HARD BLOCK 2026-06-01. Independent Worker abet-marathonbet-cloudflare-proof is deployed and reachable, but Marathonbet returns upstream HTTP 451 to Cloudflare Worker egress for basketball/baseball/hockey. The Worker preserves that 451 response as proof of the blocker instead of hiding it.",
      "_note_huggingface": "PASS 2026-06-01. abetco/live-odds /scrape/marathonbet/baseball returned HTTP 200, parseable HTML proof JSON, raw_bytes about 533KB, 33 events, 83 markets, 176 outcomes, 176 offers.",
      "_note_oracle": "PASS 2026-06-01. abet-marathonbet-proof-server-v1-0 runs on Oracle VM port 8809 behind tunnel inclusive-contractor-mobiles-administration.trycloudflare.com. Portal uses serialized per-sport direct-browser fanout to avoid Vercel's 60s proxy ceiling and Oracle VM self-contention on the combined all-sports endpoint. Baseball returned HTTP 200, parseable HTML proof JSON, raw_bytes about 545KB, 33 events, 82 markets, 175 outcomes, 175 offers after tunnel restart.",
      "_note_github": "GH-rec under current account-billing gate. Runner py_marathonbet_probe is registered in the freeform dispatcher and validated locally with ::ABET-MANIFEST:: (basketball HTTP 200, about 465KB raw bytes, 37 events, 111 markets, 222 outcomes, 222 offers). Live GitHub Actions dispatch remains account-billing blocked."
    },
    "netbet": {
      "display": "NetBet",
      "tier": "direct_nuxt_state_four_source",
      "dedicated_page": "/netbet-proof",
      "sources": {
        "cloudflare_worker": "https://abet-netbet-cloudflare-proof.abetco.workers.dev/scrape/baseball?include_raw=1&raw_mode=preview&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/netbet?include_raw=1&raw_mode=preview&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/netbet/scrape/baseball?include_raw=1&raw_mode=preview&sample_limit=100",
        "github_actions": true,
        "_note_standard": "NetBet direct Nuxt-state proof decodes embedded public page state from netbet.fr sport pages. No Playwright/browser runtime is required. Proof layers expose sport_pages[], events[], markets[], and offers[] so the page can sort/filter every decoded raw layer.",
        "_note_cloudflare": "PASS 2026-06-04. Independent Worker abet-netbet-cloudflare-proof returned baseball HTTP 200, parseable Nuxt-state proof JSON, 5 events, 15 markets, 30 offers.",
        "_note_huggingface": "PASS 2026-06-04. abetco/live-odds /scrape/netbet returned baseball HTTP 200, parseable Nuxt-state proof JSON, 5 events, 15 markets, 30 offers.",
        "_note_oracle": "PASS 2026-06-04. abet-netbet-proof-server-v1-0 runs on Oracle VM port 8823 behind tunnel kinds-frequent-emission-oriented.trycloudflare.com and returned baseball HTTP 200, parseable Nuxt-state proof JSON, 5 events, 15 markets, 30 offers.",
        "_note_github": "PASS via GH-rec gate on 2026-06-04. Runner py_netbet_nuxt_probe emitted ::ABET-MANIFEST:: with baseball HTTP 200, 479,026 raw bytes, 5 events, 15 markets, 30 offers. Live GitHub Actions dispatch remains account-billing-gated but the registered runner proves the source path."
      },
      "recipe_source": "python/netbet_nuxt_proof_support_20260604_v1_0.py"
    },
    "nordicbet": {
      "display": "NordicBet",
      "tier": "geofence_browser_blocked",
      "dedicated_page": "/nordicbet-proof",
      "sources": {
        "cloudflare_worker": {
          "blocked": true,
          "reason": "Fresh 2026-06-24 direct probe of abet-betsafe-nordicbet-egress-probe /scrape/nordicbet returned top-level HTTP 403 text/plain with body `error code: 1010`; diagnostic Worker cannot obtain a populated odds payload from Cloudflare egress."
        },
        "huggingface_space": {
          "blocked": true,
          "reason": "Fresh 2026-06-24 HF probe executed the NordicBet diagnostic route, but returned zero populated odds-like probes: .com and .dk web/native/widget paths 302 to country-blocked and the .se redirect probe failed TLS verification; no odds JSON passed the gate."
        },
        "oracle_vm": {
          "blocked": true,
          "reason": "Fresh 2026-06-24 Oracle mux probe executed seven NordicBet diagnostic checks but returned ok=false and zero populated odds-like probes: web/native/nativesson paths HTTP 202 empty, widget paths 302 country-blocked, and .se TLS verification failure."
        },
        "github_actions": {
          "blocked": true,
          "reason": "GH diagnostic runner py_nordicbet_diagnostic_probe is registered and locally emits ::ABET-MANIFEST:: with scraper_executed=true, but captured=false because no odds-like payload is returned. Live GitHub Actions is also account-billing gated. Do not turn this pill green until live GH can run and return populated odds-like JSON."
        },
        "_note_standard": "NordicBet browser bootstrap is geofenced from current proof infrastructure: local/browser redirects to country-blocked, direct widget APIs return CloudFront 403, Oracle direct returns empty HTTP 202, Oracle WARP redirects to country-blocked, and Oracle Chromium currently hangs. No source can honestly PASS until an allowed egress/browser lane or alternate populated endpoint is available.",
        "_note_cloudflare": "HARD BLOCK refreshed 2026-06-24. Independent Cloudflare Worker abet-betsafe-nordicbet-egress-probe remains deployed, but direct /scrape/nordicbet returns top-level HTTP 403 text/plain with body `error code: 1010`. Earlier diagnostics also saw .com/.dk paths 302 country-blocked and .se Cloudflare/origin errors; no odds-like JSON payload returned.",
        "_note_huggingface": "HARD BLOCK refreshed 2026-06-24. abetco/live-odds /scrape/nordicbet executes the diagnostic route but returns zero populated odds-like probes: web_sportsbook_page, native_config_app, nativesson_content_routes, widget_view_lobby, widget_view_region_nba, and dk_native_config_app all 302 to country-blocked; se_sportsbook_redirect_check fails TLS verification.",
        "_note_oracle": "HARD BLOCK refreshed 2026-06-24. Oracle mux /oracle/nordicbet/scrape/nordicbet executes seven diagnostic probes and returns wrapper HTTP 200 with ok=false, result_count=7, populated_json_probe_count=0: web/native/nativesson paths HTTP 202 empty, widget paths 302 country-blocked, .se TLS verification failure.",
        "_note_github": "REGISTERED RED runner 2026-06-05. Dispatcher now has book=nordicbet -> py_nordicbet_diagnostic_probe (`orchestration/20260605_011500_NORDICBET_GITHUB_ACTIONS_DIAGNOSTIC_PROBE_RUNNER_v1_0_0.py`). Local run emitted ::ABET-MANIFEST:: with scraper_executed=true, captured=false, total_bytes=0, probes=7, populated_odds_like_probes=0. Public GH pill remains blocked because live Actions billing is down and no odds-like JSON was captured.",
        "_note_evidence": "2026-06-04 recheck: local/browser redirects to country-blocked pages; direct /api/sb/v1/widgets/view/v1 and events-table/v2 return CloudFront 403; Oracle direct returns empty HTTP 202; Oracle WARP follows to country-blocked; Oracle Playwright Chromium hangs under timeout. Do not mark PASS without a populated raw odds payload.",
        "_note_next_step": "Find an allowed egress/browser lane or alternate official populated endpoint first. Current four proof sources cannot reach the sportsbook widget bootstrap or odds APIs."
      },
      "recipe_source": "python/betsson_family_support.py"
    },
    "playup": {
      "display": "PlayUp",
      "tier": "onboarding",
      "dedicated_page": "/playup-proof",
      "onboarded_utc": "2026-06-01T22:33:00Z",
      "recipe_source": "python/playup_scraper_isolated.py + python/playup_nextbet_proof_support_20260601_v1_0.py",
      "sources": {
        "cloudflare_worker": "https://abet-playup-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/playup?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/playup/scrape?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
        "github_actions": true
      },
      "_note_standard": "PlayUp proof uses the public NextBet JSON:API endpoint wg-api.nextbet.com.au/v1/sport_events with PlayUp Origin/Referer headers. The proof decoder preserves upstream JSON:API data[] events plus included[] event_market_groups, markets, selections, and joined offers[] tables.",
      "_note_cloudflare": "PASS 2026-06-01. Independent Worker abet-playup-cloudflare-proof deployed and verified: HTTP 200, four sport result rows, parseable JSON, basketball/baseball/hockey offer rows visible; basketball_cbb currently returns an empty but parseable competition payload.",
      "_note_huggingface": "PASS 2026-06-01. abetco/live-odds /scrape/playup returned HTTP 200 with four sport result rows and the same events/market_groups/markets/selections/offers raw table contract.",
      "_note_oracle": "PASS 2026-06-01. abet-playup-proof-server-v1-0 runs on Oracle VM port 8810 behind tunnel accepts-restricted-standards-wherever.trycloudflare.com and returned HTTP 200 with four sport result rows.",
      "_note_github": "GH-rec under current account-billing gate. Runner py_playup_probe is registered in the freeform dispatcher and locally validated with ::ABET-MANIFEST:: (basketball HTTP 200, 19,763 raw bytes, 1 event, 3 markets, 6 selections/offers). Live GitHub Actions dispatch remains account-billing blocked."
    },
    "pmu": {
      "display": "PMU",
      "tier": "onboarding",
      "dedicated_page": "/pmu-proof",
      "onboarded_utc": "2026-06-04T09:50:00Z",
      "recipe_source": "python/pmu_kambi_live_proof_support_20260604_v1_0.py",
      "sources": {
        "cloudflare_worker": "https://abet-pmu-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/pmu?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/pmu/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "github_actions": true,
        "_note_standard": "PMU proof uses the current PMU Kambi live-open feed (`pmusportsfr`) rather than obsolete empty sportsbook/rest/v2 endpoints. Raw data preserves liveEvents[], eventDetails[], betOffers[], outcomes[], and joined offer/accountability tables.",
        "_note_cloudflare": "PASS 2026-06-04. Independent Worker abet-pmu-cloudflare-proof returned HTTP 200 with populated Kambi live data: ~426KB raw, 18 live events, 308 betOffers, 795 outcomes in smoke probe.",
        "_note_huggingface": "PASS 2026-06-04. abetco/live-odds /scrape/pmu returned HTTP 200 with populated Kambi live data: ~493KB raw, 18 live events, 357 betOffers, 925 outcomes after adding the PMU support module to the Space Dockerfile.",
        "_note_oracle": "PASS 2026-06-04. Independent Oracle server abet-pmu-proof-server-v1-0 on port 8821 returned HTTP 200 through quick tunnel millennium-geographical-alpine-listening.trycloudflare.com with populated Kambi live data: ~420KB raw, 18 live events, 307 betOffers, 792 outcomes in smoke probe. Quick-tunnel systemd http2 path was unstable, so the verified tunnel is the clean QUIC helper process pending durable named tunnel follow-up.",
        "_note_github": "PASS via GH-rec gate. Runner py_pmu_probe locally emitted ::ABET-MANIFEST:: with HTTP 200, 793,607 raw bytes, one live raw file, and SHA-256 evidence while live GitHub Actions remains account-gated."
      }
    },
    "prizepicks": {
      "display": "PrizePicks",
      "tier": "onboarding",
      "dedicated_page": "/prizepicks-proof",
      "onboarded_utc": "2026-06-02T13:35:00Z",
      "recipe_source": "python/prizepicks_scraper_isolated.py",
      "sources": {
        "cloudflare_worker": "https://abet-prizepicks-cloudflare-proof.abetco.workers.dev/scrape/mlb?include_raw=1&raw_mode=preview&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/prizepicks/mlb?include_raw=1&raw_mode=preview&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/prizepicks/scrape/mlb?include_raw=1&raw_mode=preview&sample_limit=100&timeout_seconds=60",
        "github_actions": true,
        "_note_standard": "PrizePicks = public projection JSON:API feed, not a traditional odds book. GET partner-api.prizepicks.com/projections?league_id=2 for MLB proof; raw layers are $.data[] projections plus $.included[] entities (players/leagues/games/stat_types) and joined projection rows.",
        "_note_cloudflare": "PASS 2026-06-02. abet-prizepicks-cloudflare-proof deployed by Claude; Codex verified MLB route returns HTTP 200 and multi-MB parseable JSON:API projection payload.",
        "_note_huggingface": "PASS 2026-06-02. abetco/live-odds /scrape/prizepicks/mlb returns HTTP 200, ~8.1MB raw bytes, ~7.3K MLB projections, players/leagues/games/stat_types decoded.",
        "_note_oracle": "PASS 2026-06-23 via Oracle proof mux. Prior blocker was stale: /oracle/prizepicks/scrape/mlb now routes to port 8815 and returns HTTP 200 parseable PrizePicks MLB JSON:API raw data (~9.6MB, 8.7K+ projections). Full all-sports /scrape can still exceed tunnel read timeout; the proof uses the scoped MLB endpoint partner-api.prizepicks.com/projections?league_id=2.",
        "_note_github": "PASS via GH-rec gate. Runner py_prizepicks_probe is registered and locally validated with ::ABET-MANIFEST:: (MLB HTTP 200, ~8.1MB raw bytes). Live GitHub Actions may remain account-billing gated like the rest of the cohort."
      }
    },
    "sporttrade": {
      "display": "Sporttrade",
      "tier": "onboarding",
      "dedicated_page": "/sporttrade-proof",
      "onboarded_utc": "2026-05-26T02:05:00Z",
      "recipe_source": "python/sporttrade_scraper_isolated.py",
      "sources": {
        "cloudflare_worker": "https://abet-sporttrade-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=preview&sample_limit=5",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/sporttrade?include_raw=1&raw_mode=preview&sample_limit=5",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/sporttrade/scrape?include_raw=1&raw_mode=preview&sample_limit=5",
        "github_actions": true,
        "_note_standard": "Sporttrade = SSE refdata exchange. GET api.prod.east.sporttrade.app/api/refdata-service/nj/stream (text/event-stream), no auth. Bounded SSE collector reads data:{...} events until the six snapshot message types (League/Contest/Participant/MarketType/Market/Outcome) are seen, then closes, and assembles them into one JSON snapshot. Single 'all' route. CF + HF + Oracle PASS (HTTP 200 + parseable JSON, 6/6 snapshots, ~1052 markets / 1685 outcomes). raw_mode=preview keeps browser payloads small (full snapshot incl ~2.5MB ParticipantSnapshot only in raw_mode=full).",
        "_note_cloudflare": "PASS 2026-05-25 (6/6 snapshots, 1052 markets, 1685 outcomes). abet-sporttrade-cloudflare-proof.abetco.workers.dev reads the SSE stream via ReadableStream and assembles JSON.",
        "_note_huggingface": "PASS 2026-05-26. abetco/live-odds /scrape/sporttrade (httpx streaming, 6/6 snapshots, 1052 markets, ~5s).",
        "_note_oracle": "PASS 2026-05-26 (6/6 snapshots, 1052 markets, ~14s). abet-sporttrade-proof-server-v1-0 port 8801, direct egress (no WARP - faster for the 2.5MB ParticipantSnapshot), no keep-warm daemon (avoided SSE bandwidth contention). Tunnel abet-sporttrade-proof-tunnel-v1-0 (resorts-chip-tired-evidence).",
        "_note_github": "BLOCKED 2026-05-26 by GitHub account billing gate (not a scraper failure). Runner py_sporttrade_probe is registered + validated locally (captured 3.27MB / 6 snapshots / HTTP 200). GH run 26428098236 reported 'The job was not started because recent account payments have failed or your spending limit needs to be increased.' - the same account-wide Actions gate currently blocking Codex's Everygame run. Will pass once GitHub billing is restored."
      }
    },
    "svenskaspel": {
      "display": "Svenska Spel",
      "tier": "kambi_direct_onboarding",
      "dedicated_page": "/svenskaspel-proof",
      "onboarded_utc": "2026-06-01T22:59:00Z",
      "recipe_source": "python/svenskaspel_scraper_isolated.py + python/kambi_direct_proof_support_20260526_v1_0.py",
      "sources": {
        "cloudflare_worker": "https://abet-svenskaspel-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "cloudflare_worker_wnba_depth": "https://abet-svenskaspel-cloudflare-proof.abetco.workers.dev/scrape/basketball_wnba?include_raw=1&raw_mode=preview&sample_limit=20",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/svenskaspel?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space_wnba_depth": "https://abetco-live-odds.hf.space/scrape/svenskaspel/basketball_wnba?include_raw=1&raw_mode=preview&sample_limit=20",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/svenskaspel/scrape?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
        "oracle_vm_wnba_depth": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/svenskaspel/scrape/basketball_wnba?include_raw=1&raw_mode=preview&sample_limit=20&timeout_seconds=45",
        "github_actions": true,
        "_note_standard": "Svenska Spel proof uses public Kambi listView JSON and preserves event, betOffers, and outcome layers for sortable proof tables.",
        "_note_wnba_depth": "PASS 2026-07-12. Kambi basketball/wnba path returns 4 WNBA events, 12 betOffers, 24 outcomes across CF/HF/Oracle. CF 381ms round trip, HF 346ms, Oracle 1,471ms.",
        "_note_cloudflare": "PASS 2026-06-01. Independent Worker abet-svenskaspel-cloudflare-proof built from the Kambi direct single-step listView template and deployed via local Wrangler. /scrape/baseball returned HTTP 200, parseable JSON, about 31KB raw bytes, 9 events, 27 betOffers, and 54 outcomes.",
        "_note_huggingface": "HF route added 2026-06-01 to abetco/live-odds using the shared Kambi direct support module; expected route is /scrape/svenskaspel.",
        "_note_oracle": "PASS 2026-06-01. abet-svenskaspel-proof-server-v1-0 runs on Oracle VM port 8811 behind tunnel lasting-surveys-resumes-troubleshooting.trycloudflare.com. Baseball returned HTTP 200, parseable JSON, about 32KB raw bytes, 9 events, 27 betOffers, and 54 outcomes.",
        "_note_github": "Runner py_svenskaspel_probe is registered in the freeform dispatcher and validated locally with ::ABET-MANIFEST:: (baseball HTTP 200, 32,892 raw bytes, 9 events, 27 betOffers, 54 outcomes). Live GitHub Actions dispatch is expected to stay blocked until the account payment/spend-limit gate is cleared."
      }
    },
    "tabtouch": {
      "display": "TABtouch",
      "tier": "kambi_direct_onboarding",
      "dedicated_page": "/tabtouch-proof",
      "onboarded_utc": "2026-05-26T08:30:00Z",
      "recipe_source": "python/tabtouch_scraper_isolated.py + python/kambi_direct_proof_support_20260526_v1_0.py",
      "sources": {
        "cloudflare_worker": "https://abet-tabtouch-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "cloudflare_worker_wnba_depth": "https://abet-tabtouch-cloudflare-proof.abetco.workers.dev/scrape/basketball_wnba?include_raw=1&raw_mode=preview&sample_limit=20",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/tabtouch?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space_wnba_depth": "https://abetco-live-odds.hf.space/scrape/tabtouch/basketball_wnba?include_raw=1&raw_mode=preview&sample_limit=20",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/tabtouch/scrape?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
        "oracle_vm_wnba_depth": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/tabtouch/scrape/basketball_wnba?include_raw=1&raw_mode=preview&sample_limit=20&timeout_seconds=45",
        "github_actions": true,
        "_note_standard": "TABtouch proof uses public Kambi listView JSON and preserves event, betOffers, and outcome layers for sortable proof tables.",
        "_note_wnba_depth": "PASS 2026-07-12. Kambi basketball/wnba path returns 4 WNBA events, 12 betOffers, 24 outcomes across CF/HF/Oracle. CF 595ms round trip, HF 1,285ms, Oracle 5,871ms.",
        "_note_cloudflare": "PASS 2026-06-01. Independent Worker abet-tabtouch-cloudflare-proof built from the Kambi direct single-step listView template and deployed via local Wrangler. /scrape/baseball returned HTTP 200, parseable JSON, about 31KB raw bytes, 9 events, 27 betOffers, and 54 outcomes.",
        "_note_huggingface": "PASS 2026-05-30. abetco/live-odds /scrape/tabtouch/baseball returned HTTP 200, parseable JSON, about 51KB raw bytes, 14 events, 42 betOffers, and 84 outcomes.",
        "_note_oracle": "PASS 2026-05-30. abet-tabtouch-proof-server-v1-0 runs on Oracle VM port 8806 behind tunnel pattern-partnership-thinks-principal.trycloudflare.com. Baseball returned HTTP 200, parseable JSON, about 51KB raw bytes, 14 events, 42 betOffers, and 84 outcomes.",
        "_note_github": "Runner py_tabtouch_probe is registered in the freeform dispatcher and validated locally with ::ABET-MANIFEST:: (baseball HTTP 200, about 51KB raw bytes, 14 events, 42 betOffers, 84 outcomes). Live GitHub Actions dispatch is expected to stay blocked until the account payment/spend-limit gate is cleared."
      }
    },
    "unibet": {
      "display": "Unibet",
      "tier": "kindred_bff_onboarding",
      "dedicated_page": "/unibet-proof",
      "onboarded_utc": "2026-06-02T11:25:00Z",
      "recipe_source": "python/unibet_scraper_isolated.py + python/unibet_kindred_proof_support_20260602_v1_0.py",
      "sources": {
        "cloudflare_worker": "https://abet-unibet-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/unibet?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/unibet/scrape?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
        "github_actions": true,
        "_note_standard": "UniBet proof uses Kindred SportsBFF lobby JSON from sportsbff-ams.kindredext.net. Raw layers are responses[], payload.view.matches[], contestGroups[].contests[], propositions[], and options[] price rows.",
        "_note_cloudflare": "PASS 2026-06-02. Independent Worker abet-unibet-cloudflare-proof deployed via local Wrangler. /scrape/baseball returned HTTP 200, parseable Kindred BFF JSON, about 645KB raw bytes, 100 contests/events, 96 markets/propositions, and 192 priced options.",
        "_note_huggingface": "PASS 2026-06-02. HF route added to abetco/live-odds using curl_cffi Chrome TLS impersonation support. /scrape/unibet/baseball returned HTTP 200, parseable Kindred BFF JSON, about 611KB raw bytes, 96 contests/events, 92 markets/propositions, and 184 priced options.",
        "_note_oracle": "PASS 2026-06-02. abet-unibet-proof-server-v1-0 runs on Oracle VM port 8814 behind tunnel virtual-standard-exp-contamination.trycloudflare.com. Baseball returned HTTP 200, parseable JSON, about 598KB raw bytes, 96 contests/events, 82 markets/propositions, and 164 priced options.",
        "_note_github": "Runner py_unibet_probe is registered in the freeform dispatcher and validated locally with ::ABET-MANIFEST:: (baseball HTTP 200, 649,091 raw bytes). Live GitHub Actions dispatch is expected to stay blocked until the account payment/spend-limit gate is cleared."
      }
    },
    "unibet_au": {
      "display": "Unibet AU",
      "tier": "kambi_direct_onboarding",
      "dedicated_page": "/unibet_au-proof",
      "onboarded_utc": "2026-06-01T23:12:00Z",
      "recipe_source": "python/unibet_au_scraper_isolated.py + python/kambi_direct_proof_support_20260526_v1_0.py",
      "sources": {
        "cloudflare_worker": "https://abet-unibet-au-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "cloudflare_worker_wnba_depth": "https://abet-unibet-au-cloudflare-proof.abetco.workers.dev/scrape/basketball_wnba?include_raw=1&raw_mode=preview&sample_limit=20",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/unibet_au?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space_wnba_depth": "https://abetco-live-odds.hf.space/scrape/unibet_au/basketball_wnba?include_raw=1&raw_mode=preview&sample_limit=20",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/unibet_au/scrape?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
        "oracle_vm_wnba_depth": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/unibet_au/scrape/basketball_wnba?include_raw=1&raw_mode=preview&sample_limit=20&timeout_seconds=45",
        "github_actions": true,
        "_note_wnba_depth": "PASS 2026-07-12. Kambi basketball/wnba path returns 4 WNBA events, 12 betOffers, 24 outcomes across CF/HF/Oracle. CF 618ms round trip, HF 458ms, Oracle 820ms.",
        "_note_cloudflare": "PASS 2026-06-01. Independent Worker abet-unibet-au-cloudflare-proof built from the Kambi direct single-step listView template and deployed via local Wrangler. /scrape/baseball returned HTTP 200, parseable JSON, about 31KB raw bytes, 9 events, 27 betOffers, and 54 outcomes.",
        "_note_huggingface": "PASS 2026-06-01. HF route added to abetco/live-odds using the shared Kambi direct support module; /scrape/unibet_au/baseball returned HTTP 200, parseable JSON, about 33KB raw bytes, 9 events, 27 betOffers, and 54 outcomes.",
        "_note_oracle": "PASS 2026-06-01. abet-unibet-au-proof-server-v1-0 runs on Oracle VM port 8812 behind tunnel collective-reproductive-searches-hollywood.trycloudflare.com. Baseball returned HTTP 200, parseable JSON, about 33KB raw bytes, 9 events, 27 betOffers, and 54 outcomes.",
        "_note_github": "Runner py_unibet_au_probe is registered in the freeform dispatcher and validated locally with ::ABET-MANIFEST:: (baseball HTTP 200, 33,250 raw bytes, 9 events, 27 betOffers, 54 outcomes). Live GitHub Actions dispatch is expected to stay blocked until the account payment/spend-limit gate is cleared."
      }
    },
    "unibet_fr": {
      "display": "Unibet (FR)",
      "tier": "direct_html_onboarding",
      "dedicated_page": "/unibet_fr-proof",
      "onboarded_utc": "2026-06-04T10:55:00Z",
      "recipe_source": "python/unibet_fr_html_proof_support_20260604_v1_0.py",
      "sources": {
        "cloudflare_worker": "https://abet-unibet-fr-cloudflare-proof.abetco.workers.dev/scrape/baseball?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/unibet_fr/baseball?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/unibet_fr/scrape/baseball?include_raw=1&raw_mode=preview&sample_limit=100",
        "github_actions": true,
        "_note_standard": "Unibet FR proof uses public pre-rendered sportsbook HTML from unibet.fr sport/event pages and decodes sport_pages, candidate_events, event_pages, cards/buttons, events, and joined offers.",
        "_note_cloudflare": "PASS 2026-06-04. Independent Worker abet-unibet-fr-cloudflare-proof returned baseball HTTP 200 with 9 events, 208 market cards, 252 offers.",
        "_note_huggingface": "PASS 2026-06-04. abetco/live-odds /scrape/unibet_fr/baseball returned baseball HTTP 200 with 9 events, 208 market cards, 252 offers. The all-sports wrapper also works direct, but the portal uses per-sport baseball to avoid Vercel proxy timeout on full raw HTML.",
        "_note_oracle": "PASS 2026-06-04. Oracle proof server abet-unibet-fr-proof-server-v1-0 runs on port 8822 behind manual tunnel jimmy-mice-temple-america.trycloudflare.com; baseball returned HTTP 200 with 9 events, 208 market cards, 252 offers. Portal uses raw_mode=preview because Unibet FR preview still includes decoded raw_json and avoids Vercel timeout on full HTML buffering.",
        "_note_github": "Runner py_unibet_fr_probe is registered and locally validated with ::ABET-MANIFEST:: (baseball HTTP 200, 2,864,865 raw bytes, 9 events, 208 markets, 252 offers). Live GitHub Actions remains account-billing-gated until billing/spend limits are restored."
      }
    },
    "unified_scraper_runner": {
      "display": "Unified Scraper Runner",
      "tier": "runner_pseudo_entry",
      "dedicated_page": "/unified_scraper_runner-proof",
      "sources": {
        "cloudflare_worker": {
          "blocked": true,
          "reason": "Pseudo-entry for the unified runner, not an independent sportsbook. Exclude from per-book 4-source sportsbook completion target."
        },
        "huggingface_space": {
          "blocked": true,
          "reason": "Pseudo-entry for the unified runner, not an independent sportsbook. Exclude from per-book 4-source sportsbook completion target."
        },
        "oracle_vm": {
          "blocked": true,
          "reason": "Pseudo-entry for the unified runner, not an independent sportsbook. Exclude from per-book 4-source sportsbook completion target."
        },
        "github_actions": {
          "blocked": true,
          "reason": "Pseudo-entry for the unified runner, not an independent sportsbook. Exclude from per-book 4-source sportsbook completion target."
        },
        "_note_classification": "Pseudo-entry for the unified runner, not an independent sportsbook. Exclude from per-book 4-source sportsbook completion target.",
        "_note_next_step": "No source-pill build required unless this row is intentionally redefined as a real sportsbook target."
      }
    },
    "virginbet": {
      "display": "Virgin Bet",
      "tier": "gateway_onboarding",
      "dedicated_page": "/virginbet-proof",
      "onboarded_utc": "2026-06-01T23:29:00Z",
      "recipe_source": "python/virginbet_scraper_isolated.py + python/virginbet_gateway_proof_support_20260601_v1_0.py",
      "sources": {
        "cloudflare_worker": "https://abet-virginbet-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/virginbet?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/virginbet/scrape?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
        "github_actions": true,
        "_note_standard": "Virgin Bet proof uses the directly callable public sportsbook gateway endpoints: sport competitions -> events/matches. The production scraper uses Playwright bootstrap, but the proof sources use direct browser-like requests and return competitions, events, markets, and selections in raw-layer tables.",
        "_note_cloudflare": "PASS 2026-06-01. Independent Worker abet-virginbet-cloudflare-proof built from the LiveScore gateway template and deployed via local Wrangler. /scrape/baseball returned HTTP 200, parseable JSON, about 136KB raw bytes, 9 events, 26 markets, and 352 selections.",
        "_note_huggingface": "HF route added 2026-06-01 to abetco/live-odds using virginbet_gateway_proof_support_20260601_v1_0.py; expected route is /scrape/virginbet.",
        "_note_oracle": "PASS 2026-06-01. abet-virginbet-proof-server-v1-0 runs on Oracle VM port 8813 behind tunnel loves-asthma-raleigh-dim.trycloudflare.com. Baseball returned HTTP 200, parseable JSON, about 134KB raw bytes, 9 events, 26 markets, and 346 selections.",
        "_note_github": "Runner py_virginbet_probe is registered in the freeform dispatcher and validated locally with ::ABET-MANIFEST:: (baseball HTTP 200, 135,311 raw bytes). Live GitHub Actions dispatch is expected to stay blocked until the account payment/spend-limit gate is cleared."
      }
    },
    "winamax": {
      "display": "Winamax",
      "tier": "html-state onboarding",
      "dedicated_page": "/winamax-proof",
      "onboarded_utc": "2026-06-02T15:10:00Z",
      "recipe_source": "python/winamax_preloaded_state_proof_support_20260602_v1_0.py + HF rendered mode winamax_rendered_filters_proof_support_20260711_v1_0.py",
      "sources": {
        "cloudflare_worker": "https://abet-winamax-cloudflare-proof.abetco.workers.dev/scrape/baseball?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/winamax/baseball?include_raw=1&raw_mode=full&sample_limit=100&mode=rendered",
        "oracle_vm": "https://includes-breaking-senators-viewed.trycloudflare.com/oracle/winamax/scrape/baseball?include_raw=1&raw_mode=full&sample_limit=100",
        "github_actions": true,
        "_note_standard": "Winamax has two proof modes: preloaded-state (fast, moneyline/futures only) and rendered-filter mode (browser executes the page and clicks Resultat/Ecart/Nb runs filters to expose ML/SP/TO). Raw rendered tables expose pages[] -> groups[] -> buttons[] plus joined offers[].",
        "_note_cloudflare": "PASS 2026-06-02. Independent Worker abet-winamax-cloudflare-proof returned HTTP 200, parseable PRELOADED_STATE, ~163KB raw state, 16 MLB matches / 16 bets / 60 outcomes / 60 joined offers.",
        "_note_huggingface": "PASS 2026-07-11. HF route on abetco/live-odds supports mode=rendered. Live full-raw proof returned HTTP 200 in 24.2s, fetch_mode=playwright_rendered_filter_buttons, 3 pages / 44 rendered match-card groups / 88 buttons-offers / 16 events / 58 markets with raw_json.pages[] -> groups[] -> buttons[] plus joined offers[].",
        "_note_oracle": "PASS 2026-06-26 after Oracle WARP fallback repair. abet-winamax-proof-server-v1-0 runs on Oracle VM port 8817 behind the proof mux. Direct VM egress still receives the generic empty Winamax shell, but the server now falls back through local WARP SOCKS 127.0.0.1:40000 when the direct response is under 100KB. Public mux proof returned baseball HTTP 200 with populated PRELOADED_STATE: 16 matches, 16 bets, 60 outcomes, 60 offers, raw_bytes=181,867.",
        "_note_github": "PASS via GH-rec gate. Runner py_winamax_probe is registered and locally validated with ::ABET-MANIFEST:: (baseball HTTP 200, ~163KB raw bytes, 16 matches / 16 bets / 60 outcomes / 60 offers). Live GitHub Actions may remain account-billing gated like the rest of the cohort."
      }
    },
    "betmgm_v2": {
      "display": "BetMGM (v2)",
      "tier": "superseded_variant",
      "dedicated_page": "/betmgm_v2-proof",
      "sources": {
        "cloudflare_worker": {
          "blocked": true,
          "reason": "Superseded alternate BetMGM iteration. Current BetMGM proof target is the flagship betmgm row, already published at /betmgm-proof with CF/HF/Oracle PASS and GH hard-403 documented."
        },
        "huggingface_space": {
          "blocked": true,
          "reason": "Superseded alternate BetMGM iteration. Current BetMGM proof target is the flagship betmgm row, already published at /betmgm-proof with CF/HF/Oracle PASS and GH hard-403 documented."
        },
        "oracle_vm": {
          "blocked": true,
          "reason": "Superseded alternate BetMGM iteration. Current BetMGM proof target is the flagship betmgm row, already published at /betmgm-proof with CF/HF/Oracle PASS and GH hard-403 documented."
        },
        "github_actions": {
          "blocked": true,
          "reason": "Superseded alternate BetMGM iteration. Current BetMGM proof target is the flagship betmgm row, already published at /betmgm-proof with CF/HF/Oracle PASS and GH hard-403 documented."
        },
        "_note_classification": "Superseded alternate BetMGM iteration. Current BetMGM proof target is the flagship betmgm row, already published at /betmgm-proof with CF/HF/Oracle PASS and GH hard-403 documented.",
        "_note_next_step": "No source-pill build required unless this row is intentionally redefined as a real sportsbook target."
      }
    }
  }
}
