TheOddsAPI NRL expansion v1

Kubernetes collection is bucket-first: fetch, validate, upload immutable
response.json.gz, upload normalized ticks.ndjson.gz, and write _run.json.
The pod does not read or write DuckDB and does not run movement detection. VM
reconciliation stages the objects; VM-only detection and CLV tasks run after.

The active provider is selected by ODDS_PROVIDER through
data.odds_provider.active_provider():

  • default theoddsapi: requires ODDS_API_BUSINESS;
  • explicit the_odds_api: requires ODDS_API_KEY (legacy fallback).

Business odds use data.theoddsapi_business.normalize_business_odds, which
handles the flat event_id/start_time/books/book/market payload, preserves
provider timestamps and cache metadata, and emits canonical h2h, line, and
total rows. data.odds_archive derives deterministic earliest-open and
closest-to-T-60 close views without deleting raw captures and exposes blocking
snapshot DQ checks.

NRL props are collect-only. Try-market rows retain unresolved player names with
a name: fallback key and resolution status; no prop model or recommendation
is produced. Vendor fair/value/edge outputs remain validation observations.

VM handoff

  1. Run run_cluster_task.sh reconcile --round N to stage pending manifests.
  2. Rebuild the staging/dbt layer on the VM.
  3. Run run_cluster_task.sh odds-detect --round N and/or odds-clv --round N.
  4. Inspect provider, endpoint, market, book, rate-limit, and DQ fields before
    downstream use.

The production deployment still needs go-cicd-ops to carry
ODDS_API_BUSINESS, active-provider settings, bucket-first collector args, and
the separate VM reconciliation schedule.