{
  "_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": "https://abet-draftkings-browser-session-shard.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&concurrency=1",
        "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://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/draftkings/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm_props": "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/draftkings_mlb_props/scrape?include_raw=1&raw_mode=preview&sample_limit=100",
        "oracle_vm_all_depth": "https://finances-tolerance-pieces-tours.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://finances-tolerance-pieces-tours.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": "PASS 2026-07-14 through independent direct Cloudflare Browser Run. One normal-closing browser session fetched the active default DK league endpoint with HTTP 200, parseable JSON, 11,893 raw bytes, one event, one market, eight selections, and 5,838 ms worker latency. A separate four-endpoint shard executed in 4,168 ms and returned parseable DK `STDM-404-003` receipts proving those historical NASCAR/MMA/PLL league IDs are currently offline, not silently lost. The ordinary non-browser Worker remains upstream-403. Browser acquisitions are short-window limited to one at a time on the current free account; batch up to 12 endpoints inside each session. MLB props/all-depth auxiliary cells remain separate R2 work and are not turned green by this base-source receipt.",
        "_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://jackie-muslim-returns-declaration.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://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/fanduel/scrape/fanduel/football?mode=direct_api&include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/fanduel/scrape/fanduel/basketball?mode=direct_api&include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/fanduel/scrape/fanduel/baseball?mode=direct_api&include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/fanduel/scrape/fanduel/hockey?mode=direct_api&include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/fanduel/scrape/fanduel/football_cfb?mode=direct_api&include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://modifications-warranty-makeup-frontpage.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://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/betmgm/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://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/betmgm/scrape/betmgm/basketball?include_raw=0&fixtureIds=19766167,19766168,19799013,19799014&timeout_seconds=45",
        "oracle_vm_wnba_raw": "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/betmgm/raw/betmgm/basketball?fixtureIds=19766167,19766168,19799013,19799014&timeout_seconds=45",
        "oracle_vm": [
          "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/betmgm/scrape/betmgm/football?include_raw=1&raw_mode=full&sample_limit=100",
          "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/betmgm/scrape/betmgm/basketball?include_raw=1&raw_mode=full&sample_limit=100",
          "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/betmgm/scrape/betmgm/hockey?include_raw=1&raw_mode=full&sample_limit=100",
          "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/betmgm/scrape/betmgm/baseball?include_raw=1&raw_mode=full&sample_limit=100"
        ],
        "github_actions": true,
        "_note_cloudflare": "PASS re-proven 2026-07-13 under strict sweep R1-FRESH-50X4-20260713T193000Z. The initial all-sports receipt observed a transient upstream HTTP 403, but the exact canonical full-raw URL then passed four consecutive serial calls: three manual responses of 5,610,318-5,610,327 bytes in 4.982-5.011s and one strict monitor receipt of 5,610,327 bytes in 0.778s. Seven configured sports were accounted: five populated PASS, NASCAR/lacrosse explicit parseable EMPTY, zero FAIL. sample_limit=100 limits decoded preview rows only; raw_mode=full returns complete raw_json.",
        "_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://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/betrivers/scrape/football?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/betrivers/scrape/basketball?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/betrivers/scrape/baseball?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/betrivers/scrape/hockey?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/betrivers/scrape/basketball_cbb?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://modifications-warranty-makeup-frontpage.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://modifications-warranty-makeup-frontpage.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://modifications-warranty-makeup-frontpage.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",
      "dynamic_capture": {
        "type": "discovery_shards",
        "label": "Dynamic all-domain breadth and current-quote audit",
        "shard_size": 20,
        "active_states": [
          "new",
          "upcoming",
          "live"
        ],
        "active_scopes": [
          "single_event",
          "outright"
        ],
        "rate_limit_note": "Discovery is live and shard IDs are frozen from that manifest. Cold audits pace shards serially; current quote polling can reuse the discovered market graph.",
        "sources": {
          "cloudflare_worker": {
            "discovery_url": "https://abet-smarkets-cloudflare-proof.abetco.workers.dev/discover?shard_size=20",
            "shard_url_template": "https://abet-smarkets-cloudflare-proof.abetco.workers.dev/scrape/{domain}?include_raw=1&raw_mode=full&sample_limit=100&event_ids={event_ids}&shard={shard}&shard_size={shard_size}&include_trades=0"
          },
          "huggingface_space": {
            "discovery_url": "https://abetco-live-odds.hf.space/scrape/smarkets-discover?shard_size=20",
            "shard_url_template": "https://abetco-live-odds.hf.space/scrape/smarkets/{domain}?include_raw=1&raw_mode=full&sample_limit=100&event_ids={event_ids}&shard={shard}&shard_size={shard_size}&include_trades=false"
          },
          "oracle_vm": {
            "discovery_url": "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/smarkets/discover?shard_size=20",
            "shard_url_template": "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/smarkets/scrape/{domain}?include_raw=1&raw_mode=full&sample_limit=100&event_ids={event_ids}&shard={shard}&shard_size={shard_size}&include_trades=0&timeout_seconds=45"
          }
        }
      },
      "sources": {
        "cloudflare_worker": "https://abet-smarkets-cloudflare-proof.abetco.workers.dev/scrape/baseball?include_raw=1&raw_mode=full&sample_limit=100&shard=0&shard_size=2&include_trades=0",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/smarkets/baseball?include_raw=1&raw_mode=full&sample_limit=100&shard=0&shard_size=2&include_trades=false",
        "oracle_vm": "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/smarkets/scrape/baseball?include_raw=1&raw_mode=full&sample_limit=100&shard=0&shard_size=2&include_trades=0&timeout_seconds=45",
        "github_actions": true,
        "_note_standard": "Fast source buttons run a two-event current-quote shard. The dynamic audit panel discovers every currently active Smarkets domain and both single-event and outright/futures scopes, then produces deterministic event shards with events, markets, contracts, and every current bid/offer quote level.",
        "_note_cloudflare": "Version 20260716_v3_0_dynamic_breadth_current_quotes. Live /discover and arbitrary /scrape/{domain} shard routes; representative two-event baseball proof returned 114 markets / 760 contracts / 989 quote levels in 2.14s on 2026-07-16.",
        "_note_huggingface": "Version 20260716_v3_0_dynamic_breadth_current_quotes. Live /scrape/smarkets-discover and arbitrary domain shards; representative two-event baseball proof returned 114 markets / 760 contracts / 992 quote levels in 1.69s on 2026-07-16.",
        "_note_oracle": "Version 20260716_v3_0_dynamic_breadth_current_quotes. Oracle service on port 8785; public representative two-event baseball proof returned 114 markets / 760 contracts / 992 quote levels in 2.20s on 2026-07-16.",
        "_note_github": "PASS 2026-07-16 under the strict captured-manifest gate. Dynamic run 29516345349 discovered 722 active events across 16 domains and captured all 46 deterministic shards: 46/46 HTTP 200, JSON parseable, and capture_complete; 39,208 markets, 134,029 contracts, 238,523 current bid/offer quote levels, and 80,891,632 raw bytes. One ice-hockey shard was currently illiquid (zero quote levels) but still captured all 10 markets and 276 contracts. The preceding run 29515629968 exposed upstream quote HTTP 429 under burst scheduling; global Retry-After pacing and bounded retries corrected the scheduler without hiding the failure."
      }
    },
    "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://modifications-warranty-makeup-frontpage.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://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/rebet/scrape/nba?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/rebet/scrape/ncaab?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/rebet/scrape/mlb?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/rebet/scrape/nhl?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/rebet/scrape/nfl?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
          "https://modifications-warranty-makeup-frontpage.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://modifications-warranty-makeup-frontpage.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://modifications-warranty-makeup-frontpage.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 re-proven on 2026-07-13. Oracle unit abet-underdog-proof-server-v1-0 on port 8786 uses urllib direct VM egress plus one bounded scrape slot and streams the original JSON into raw_json with fast gzip. Canonical public receipt: HTTP 200, 9,922,877 wrapper bytes, 13.53 s, parseable full raw, SHA-256 c2634464561fadd70b0fc144a31678b21e9cf794d9d3ebcf3ef40c733eb09d8c.",
        "_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://modifications-warranty-makeup-frontpage.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://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/bovada/scrape/bovada/football?include_raw=1&raw_mode=full&sample_limit=100",
          "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/bovada/scrape/bovada/basketball?include_raw=1&raw_mode=full&sample_limit=100",
          "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/bovada/scrape/bovada/baseball?include_raw=1&raw_mode=full&sample_limit=100",
          "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/bovada/scrape/bovada/hockey?include_raw=1&raw_mode=full&sample_limit=100",
          "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/bovada/scrape/bovada/football_cfb?include_raw=1&raw_mode=full&sample_limit=100",
          "https://modifications-warranty-makeup-frontpage.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://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/mybookie/scrape/baseball?include_raw=0&sample_limit=100&timeout_seconds=30",
        "github_actions": true,
        "_note_standard": "Current v1.2 proof preserves public sportsbook HTML plus all parsed event/market/selection/offer layers, including no-itemscope futures groups, exact start_raw, strict start_utc, and source timezone provenance.",
        "_note_cloudflare": "PASS 2026-07-22 sweep R1-MYBOOKIE-20260722T212100Z. Worker v3d126fba returned HTTP 200, 2,177,973 response bytes in 0.703 s with parseable current raw.",
        "_note_huggingface": "PASS 2026-07-22 sweep R1-MYBOOKIE-20260722T212100Z. HF commit 50ce4d39 returned HTTP 200, 1,335,319 response bytes in 1.875 s with current parser/time contract.",
        "_note_oracle": "FAIL 2026-07-22. The registered quick-tunnel hostname no longer resolves and the shared Oracle VM is unreachable; retain URL as failure evidence until VM restore and durable ingress reproof.",
        "_note_github": "BLOCKED 2026-07-22. Canonical run 29958839334 and alternate-account run 29959094853 both had zero steps because the account billing/spend gate prevented job start. No capture green."
      }
    },
    "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://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/pinnacle/scrape?include_raw=1&raw_mode=full&sample_limit=100",
        "github_actions": true,
        "_note_standard": "Pinnacle uses two required Arcadia layers per configured league: /matchups for schedule/participants and /markets/straight for markets/prices. CF/HF/Oracle/GH now emit the same full raw_json {matchups,straight} contract. sample_limit affects decoded preview rows only; raw_mode=full is not truncated. This closes six-sport price-layer consistency, not dynamic all-sport/league exhaustive certification.",
        "_note_cloudflare": "PASS 2026-07-16. Worker version 20260716_v2_0_pinnacle_matchups_straight_prices fetched both layers concurrently. Fresh cache-busted baseball receipt: HTTP 200, 45 matchups, 80 straight markets, 367 prices, 255,615 response bytes, 1,687 ms portal-independent wall; both upstream layers HTTP 200.",
        "_note_huggingface": "PASS 2026-07-16. Space commit 6a9a93e serves Pinnacle-scoped version 20260716_v2_0_pinnacle_matchups_straight_prices. Fresh baseball receipt: HTTP 200, capture_complete=true, 45 matchups, 80 straight markets, 367 prices, 129,941 response bytes, 847 ms wall; raw keys matchups,straight.",
        "_note_oracle": "PASS 2026-07-16. Service abet-pinnacle-proof-server-v1-0 on port 8771 runs the two-layer curl_cffi+WARP contract. Three serial baseball calls passed 3/3 with identical 45 matchups, 80 markets, and 367 prices; wall times 6,112/1,400/3,638 ms. Quick-tunnel URL rotates on restart.",
        "_note_github": "PASS 2026-07-16. Run 29496921733 on commit db9b54b79e5 captured six files / 785,787 bytes in 0.739 s with a nonempty ::ABET-MANIFEST::. Totals: 349 matchups, 768 straight markets, 2,318 prices; every configured sport capture_complete=true."
      }
    },
    "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://modifications-warranty-makeup-frontpage.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 bot protection still blocks Cloudflare execution after fresh 2026-07-14 testing. Ordinary Worker remote-IAD returned six HTTP 403 challenge pages. Browser worker v1.1 then navigated the origin, opened a real cardpack, waited 12 seconds, reloaded the challenge, and fetched in the same session; origin, cardpack, and reload all stayed 403, only __cf_bm was issued, and baseball remained a 4,553-byte non-JSON challenge. HF, Oracle WARP, and GitHub remain independently parseable."
        },
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/fanatics?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": "https://modifications-warranty-makeup-frontpage.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": "OPEN REPAIR with fresh 2026-07-14 evidence. Ordinary direct Worker remote-IAD returned 6/6 HTTP 403 challenge HTML. Browser worker version 20260714_v1_1_0_origin_bootstrap_retry then navigated the content origin, opened baseball cardpack, dwelled 12 seconds, reloaded once, and retried inside one session. Bootstrap statuses were 403/403/403; cookie names contained only __cf_bm; baseball still returned HTTP 403, json_parse_ok=false, 4,553 challenge bytes in 19.5 s worker / 20.0 s wall. This rules out missing origin bootstrap and an insufficient five-second dwell. Do not green this cell without real cardpack JSON.",
        "_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://modifications-warranty-makeup-frontpage.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://modifications-warranty-makeup-frontpage.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://modifications-warranty-makeup-frontpage.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://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/thescore/scrape/basketball?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=80",
          "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/thescore/scrape/hockey?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=80",
          "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/thescore/scrape/baseball?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=80",
          "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/thescore/scrape/football?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=80",
          "https://modifications-warranty-makeup-frontpage.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 re-proven 2026-07-13: five per-sport endpoints passed 5/5 with 72,889,787 wrapper bytes in 64.455 s aggregate. This does not prove the authenticated sportsbook lane.",
        "_note_huggingface": "Public reference variant added to abetco/live-odds as /scrape/thescore/{sport}.",
        "_note_oracle": "Public reference variant re-proven 2026-07-13 on Oracle unit abet-thescore-proof-server-v1-0 port 8790 after bounded original-JSON streaming repair: five endpoints passed 5/5 with 43,253,090 wrapper bytes in 73.878 s aggregate. This does not prove the authenticated sportsbook lane.",
        "_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://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/atg/scrape?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
        "oracle_vm_wnba_depth": "https://modifications-warranty-makeup-frontpage.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.",
        "cloudflare_worker_soccer_mls_depth": "https://abet-atg-cloudflare-proof.abetco.workers.dev/scrape/soccer_mls?include_raw=1&raw_mode=preview&sample_limit=20",
        "huggingface_space_soccer_mls_depth": "https://abetco-live-odds.hf.space/scrape/atg/soccer_mls?include_raw=1&raw_mode=preview&sample_limit=20",
        "oracle_vm_soccer_mls_depth": "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/atg/scrape/soccer_mls?include_raw=1&raw_mode=preview&sample_limit=20&timeout_seconds=45"
      }
    },
    "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://modifications-warranty-makeup-frontpage.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://modifications-warranty-makeup-frontpage.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://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/betparx/scrape?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
        "oracle_vm_wnba_depth": "https://modifications-warranty-makeup-frontpage.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.",
        "cloudflare_worker_soccer_mls_depth": "https://abet-betparx-cloudflare-proof.abetco.workers.dev/scrape/soccer_mls?include_raw=1&raw_mode=preview&sample_limit=20",
        "huggingface_space_soccer_mls_depth": "https://abetco-live-odds.hf.space/scrape/betparx/soccer_mls?include_raw=1&raw_mode=preview&sample_limit=20",
        "oracle_vm_soccer_mls_depth": "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/betparx/scrape/soccer_mls?include_raw=1&raw_mode=preview&sample_limit=20&timeout_seconds=45"
      }
    },
    "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://modifications-warranty-makeup-frontpage.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": "regional_dynamic_context_partial",
      "dedicated_page": "/betsafe-proof",
      "sources": {
        "cloudflare_worker": "https://abet-betsafe-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&preview_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/betsafe?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/betsafe/scrape/betsafe?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=60&transport=direct",
        "github_actions": true,
        "_note_standard": "Betsafe Cloudflare is repaired through an independent Worker placed in aws:eu-north-1. It dynamically bootstraps the current anonymous user context, then fetches four official sportsbook widget families in parallel and returns every captured raw payload inline. HF, Oracle, and GH remain independently blocked until their own egress paths produce populated odds JSON.",
        "_note_cloudflare": "PASS 2026-07-13. abet-betsafe-cloudflare-proof returned HTTP 200, json_parse_ok=true, four full raw widget payloads, 21 events, 29 markets, 34 priced selections, 202,563 raw bytes, and 545 ms worker latency. Cloudflare cf-placement=remote-ARN proves execution in the configured Stockholm region. preview_limit/sample_limit affects only decoded_preview; full raw is never truncated.",
        "_note_huggingface": "EXECUTABLE RED refreshed 2026-07-14. Space commit 6c1d412 dynamically bootstraps the current anonymous Betsafe context, then calls five current official widget endpoints with curl_cffi Chrome impersonation. The bootstrap succeeds, but every widget returns HTTP 302 to betsafe.com/country-blocked.html from the free US-only Space runtime; result version 20260714_v2_1_dynamic_context_country_block_evidence records UPSTREAM_COUNTRY_BLOCKED, zero payloads, and exact redirect locations. The endpoint remains callable from the proof page and must stay red until populated raw odds JSON is returned.",
        "_note_oracle": "EXECUTABLE RED refreshed 2026-07-14. Oracle service version 20260714_v2_0 executes the current dynamic user-context plus five-parallel-widget contract. Direct egress returned HTTP 302 country-blocked, zero payloads, 1,414 raw receipt bytes, and 1,120 ms source latency; explicit WARP transport returned the same blocker in 1,164 ms. Both paths are callable through the public mux and stay red until populated odds JSON is returned.",
        "_note_github": "EXECUTABLE RED refreshed 2026-07-14. Hosted run 29297752563 on commit 620e976b3ab executed py_betsafe_diagnostic_probe and emitted an identity-matched ::ABET-MANIFEST:: with scraper_executed=true, captured=false, HTTP 302, 1,414 raw receipt bytes, json_parse_ok=false, and UPSTREAM_COUNTRY_BLOCKED. GitHub billing was operational for this run; the failure is the sportsbook country policy, not an account billing gate.",
        "_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": "Cloudflare Stockholm proves the protocol works. HF, Oracle direct/WARP, and GitHub-hosted egress all independently execute the same protocol but are country-blocked. Closing those red cells requires a permitted regional execution option native to each source or an upstream policy change; relaying through the green Cloudflare Worker must not be mislabeled as independent parity. R2 still requires categories -> region -> events-table -> event-market expansion."
      },
      "recipe_source": "python/betsson_family_dynamic_capture_20260714_v1_0_0.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://modifications-warranty-makeup-frontpage.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\u00c3\u00adnea | 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://modifications-warranty-makeup-frontpage.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://modifications-warranty-makeup-frontpage.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://modifications-warranty-makeup-frontpage.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://modifications-warranty-makeup-frontpage.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://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/grosvenor/scrape?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
        "oracle_vm_wnba_depth": "https://modifications-warranty-makeup-frontpage.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.",
        "cloudflare_worker_soccer_mls_depth": "https://abet-grosvenor-cloudflare-proof.abetco.workers.dev/scrape/soccer_mls?include_raw=1&raw_mode=preview&sample_limit=20",
        "huggingface_space_soccer_mls_depth": "https://abetco-live-odds.hf.space/scrape/grosvenor/soccer_mls?include_raw=1&raw_mode=preview&sample_limit=20",
        "oracle_vm_soccer_mls_depth": "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/grosvenor/scrape/soccer_mls?include_raw=1&raw_mode=preview&sample_limit=20&timeout_seconds=45"
      }
    },
    "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://modifications-warranty-makeup-frontpage.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://modifications-warranty-makeup-frontpage.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://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/marathonbet/scrape/basketball?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=60",
          "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/marathonbet/scrape/baseball?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=60",
          "https://modifications-warranty-makeup-frontpage.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://modifications-warranty-makeup-frontpage.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": "regional_dynamic_context_partial",
      "dedicated_page": "/nordicbet-proof",
      "sources": {
        "cloudflare_worker": "https://abet-nordicbet-cloudflare-proof.abetco.workers.dev/scrape?include_raw=1&raw_mode=full&preview_limit=100",
        "huggingface_space": "https://abetco-live-odds.hf.space/scrape/nordicbet?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/nordicbet/scrape/nordicbet?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=60&transport=direct",
        "github_actions": true,
        "_note_standard": "NordicBet Cloudflare is repaired through an independent Worker placed in aws:eu-north-1. It dynamically bootstraps the current anonymous user context, then fetches four official sportsbook widget families in parallel and returns every captured raw payload inline. HF, Oracle, and GH remain independently blocked until their own egress paths produce populated odds JSON.",
        "_note_cloudflare": "PASS 2026-07-13. abet-nordicbet-cloudflare-proof returned HTTP 200, json_parse_ok=true, four full raw widget payloads, 12 events, 19 markets, 26 priced selections, 145,509 raw bytes, and 553 ms worker latency. Cloudflare cf-placement=remote-ARN proves execution in the configured Stockholm region. preview_limit/sample_limit affects only decoded_preview; full raw is never truncated.",
        "_note_huggingface": "EXECUTABLE RED refreshed 2026-07-14. Space commit 6c1d412 dynamically bootstraps the current anonymous NordicBet context, then calls five current official widget endpoints with curl_cffi Chrome impersonation. The bootstrap succeeds, but every widget returns HTTP 302 to nordicbet.com/country-blocked.html from the free US-only Space runtime; result version 20260714_v2_1_dynamic_context_country_block_evidence records UPSTREAM_COUNTRY_BLOCKED, zero payloads, and exact redirect locations. The endpoint remains callable from the proof page and must stay red until populated raw odds JSON is returned.",
        "_note_oracle": "EXECUTABLE RED refreshed 2026-07-14. Oracle service version 20260714_v2_0 executes the current dynamic user-context plus five-parallel-widget contract. Direct egress returned HTTP 302 country-blocked, zero payloads, 1,422 raw receipt bytes, and 2,522 ms source latency; explicit WARP transport returned the same blocker in 884 ms. Both paths are callable through the public mux and stay red until populated odds JSON is returned.",
        "_note_github": "EXECUTABLE RED refreshed 2026-07-14. Hosted run 29297788645 on commit 620e976b3ab executed py_nordicbet_diagnostic_probe and emitted an identity-matched ::ABET-MANIFEST:: with scraper_executed=true, captured=false, HTTP 302, 1,422 raw receipt bytes, json_parse_ok=false, and UPSTREAM_COUNTRY_BLOCKED. GitHub billing was operational for this run; the failure is the sportsbook country policy, not an account billing gate.",
        "_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": "Cloudflare Stockholm proves the protocol works. HF, Oracle direct/WARP, and GitHub-hosted egress all independently execute the same protocol but are country-blocked. Closing those red cells requires a permitted regional execution option native to each source or an upstream policy change; relaying through the green Cloudflare Worker must not be mislabeled as independent parity. R2 still requires categories -> region -> events-table -> event-market expansion."
      },
      "recipe_source": "python/betsson_family_dynamic_capture_20260714_v1_0_0.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://modifications-warranty-makeup-frontpage.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://modifications-warranty-makeup-frontpage.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://modifications-warranty-makeup-frontpage.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",
      "lifecycle": {
        "status": "retired",
        "wagering_ended_utc": "2026-05-25T23:59:59-04:00",
        "platform_access_removed_utc": "2026-06-26T00:00:00-04:00",
        "reason": "Sporttrade officially exited online sports betting; wagering ended May 25, 2026 and platform access was removed June 26, 2026. Live proof endpoints are retained as historical evidence and now return upstream name-resolution failures because no active wagering service remains.",
        "evidence_url": "https://sporttrade.zendesk.com/hc/en-us/articles/5763095209115-Important-Update-Sporttrade-OSB-Markets-Closing-May-25-2026"
      },
      "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://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/sporttrade/scrape?include_raw=1&raw_mode=preview&sample_limit=5",
        "github_actions": true,
        "_note_standard": "RETIRED. Sporttrade officially ended online wagering on 2026-05-25 and removed platform access on 2026-06-26. The former SSE collector and all four source endpoints remain archived for reproducibility; current first-party routes return HTTP 503 name resolution failed. See lifecycle.evidence_url.",
        "_note_cloudflare": "HISTORICAL PASS 2026-05-25: 6/6 snapshots, 1052 markets, 1685 outcomes. CURRENT RETIRED: fresh 2026-07-13 receipt observed upstream HTTP 503 name resolution failed.",
        "_note_huggingface": "HISTORICAL PASS 2026-05-26: 6/6 snapshots, 1052 markets, approximately 5s. CURRENT RETIRED: fresh 2026-07-13 receipt observed upstream HTTP 503 name resolution failed.",
        "_note_oracle": "HISTORICAL PASS 2026-05-26: 6/6 snapshots, 1052 markets, approximately 14s. CURRENT RETIRED: fresh 2026-07-13 receipt observed upstream HTTP 503 name resolution failed.",
        "_note_github": "HISTORICAL runner py_sporttrade_probe and workflow retained. CURRENT RETIRED: fresh sweep run 29285612392 failed because the first-party Sporttrade service no longer resolves; the cell is archived rather than treated as a live repair."
      }
    },
    "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://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/svenskaspel/scrape?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
        "oracle_vm_wnba_depth": "https://modifications-warranty-makeup-frontpage.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.",
        "cloudflare_worker_soccer_mls_depth": "https://abet-svenskaspel-cloudflare-proof.abetco.workers.dev/scrape/soccer_mls?include_raw=1&raw_mode=preview&sample_limit=20",
        "huggingface_space_soccer_mls_depth": "https://abetco-live-odds.hf.space/scrape/svenskaspel/soccer_mls?include_raw=1&raw_mode=preview&sample_limit=20",
        "oracle_vm_soccer_mls_depth": "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/svenskaspel/scrape/soccer_mls?include_raw=1&raw_mode=preview&sample_limit=20&timeout_seconds=45"
      }
    },
    "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://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/tabtouch/scrape?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
        "oracle_vm_wnba_depth": "https://modifications-warranty-makeup-frontpage.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.",
        "cloudflare_worker_soccer_mls_depth": "https://abet-tabtouch-cloudflare-proof.abetco.workers.dev/scrape/soccer_mls?include_raw=1&raw_mode=preview&sample_limit=20",
        "huggingface_space_soccer_mls_depth": "https://abetco-live-odds.hf.space/scrape/tabtouch/soccer_mls?include_raw=1&raw_mode=preview&sample_limit=20",
        "oracle_vm_soccer_mls_depth": "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/tabtouch/scrape/soccer_mls?include_raw=1&raw_mode=preview&sample_limit=20&timeout_seconds=45"
      }
    },
    "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://modifications-warranty-makeup-frontpage.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://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/unibet_au/scrape?include_raw=1&raw_mode=full&sample_limit=100&timeout_seconds=45",
        "oracle_vm_wnba_depth": "https://modifications-warranty-makeup-frontpage.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.",
        "cloudflare_worker_soccer_mls_depth": "https://abet-unibet-au-cloudflare-proof.abetco.workers.dev/scrape/soccer_mls?include_raw=1&raw_mode=preview&sample_limit=20",
        "huggingface_space_soccer_mls_depth": "https://abetco-live-odds.hf.space/scrape/unibet_au/soccer_mls?include_raw=1&raw_mode=preview&sample_limit=20",
        "oracle_vm_soccer_mls_depth": "https://modifications-warranty-makeup-frontpage.trycloudflare.com/oracle/unibet_au/scrape/soccer_mls?include_raw=1&raw_mode=preview&sample_limit=20&timeout_seconds=45"
      }
    },
    "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://modifications-warranty-makeup-frontpage.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://modifications-warranty-makeup-frontpage.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://modifications-warranty-makeup-frontpage.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."
      }
    },
    "bookmaker": {
      "display": "BookMaker",
      "tier": "expansion",
      "dedicated_page": null,
      "onboarded_utc": "2026-08-14T21:00:00Z",
      "recipe_source": "python/bookmaker_scraper_isolated.py",
      "sources": {
        "cloudflare_worker": "https://abet-bookmaker-cloudflare-proof.abetco.workers.dev/scrape/bookmaker?include_raw=1&raw_mode=full&sample_limit=100",
        "huggingface_space": "https://abetco-bookmaker-live-odds.hf.space/scrape/bookmaker?include_raw=1&raw_mode=full&sample_limit=100",
        "oracle_vm": [
          "https://range-wise-telephony-thick.trycloudflare.com/scrape/bookmaker/football?include_raw=1&raw_mode=full&sample_limit=100",
          "https://range-wise-telephony-thick.trycloudflare.com/scrape/bookmaker/baseball?include_raw=1&raw_mode=full&sample_limit=100",
          "https://range-wise-telephony-thick.trycloudflare.com/scrape/bookmaker/basketball?include_raw=1&raw_mode=full&sample_limit=100",
          "https://range-wise-telephony-thick.trycloudflare.com/scrape/bookmaker/hockey?include_raw=1&raw_mode=full&sample_limit=100"
        ],
        "github_actions": true,
        "_note_standard": "Judged on the EXACT DraftKings/FanDuel flagship standard: binary PASS/FAIL. PASS = source executes + HTTP 200 + parseable. BookMaker serves odds on lines.bookmaker.eu (server-rendered HTML, no geo-block from these egresses).",
        "_note_oracle": "PASS. BookMaker Oracle VM proof server runs on this host, exposed via Cloudflare tunnel (range-wise-telephony-thick.trycloudflare.com). LIVE-PROVEN: HTTP 200, raw_sha256, real decoded games (e.g. WSH@NYM ML +245/-317). This is the one egress BookMaker trusts.",
        "_note_cloudflare": "DEPLOYED LIVE (abet-bookmaker-cloudflare-proof.abetco.workers.dev). Worker fires a real fetch; BookMaker returns HTTP 404 'Page not Found' because it IP-tiers the Cloudflare edge (datacenter IP). Same class of block as DraftKings on Bovada's CF Worker. Source is correct and live; the book blocks that egress.",
        "_note_huggingface": "APP BUILT (huggingface_spaces/bookmaker_depth_proof_20260814_v1_0) but NOT DEPLOYED: new Docker Spaces require HuggingFace PRO (canPay:false on this account). Shared abetco-live-odds Space does not support bookmaker. Blocked on plan, not code.",
        "_note_github": "WORKFLOW BUILT (.github/workflows/20260814_091500_BOOKMAKER_GH_ACTIONS_RAW_SNAPSHOT_PROOF_v1_0_0.yml) but GitHub Actions account BLOCKED on both orgs (failed billing, even after limit reset) \u2014 same as Bovada. INELIGIBLE until account restored."
      }
    }
  }
}