Skip to content

Audit

Anchored before.Verifiable after.Public forever.

During the public alpha, every prediction landed in a public, immutable ledger before kickoff — hashed, salted, and anchored to Bitcoin. That record is sealed and verifiable forever; the official SplitWinner ledger opens with its first anchor when the pipeline restarts.

Live

Receipts530
24h0
LedgerPublic
  • Live picks anchored

    530

  • Conformal pass rate

    13.4%

  • Anchored picks settled

    70

  • Immutable since

    May 20, 2026

Live · /v1/audit/summary + /v1/quant

Outside the sealed ledger — disclosed, never blended

The live pipeline has run since 2026-02-16. 926 settled picks sit outside the sealed ledger — most predate public anchoring, the rest fell on days without an anchor. Immutable database timestamps; verifiable to us, not verifiable to you — excluded from every figure above.

Two repos. One protocol.

The record splits at the rebrand: the alpha's evidence is sealed and archived; the official chain carries the practice forward under a redesigned verifier. Every link on this page tells you which one it opens.

Sealed alpha · May 19 – Jun 25, 2026

The evidence, archived read-only

29 anchors, both verifier generations, every disclosure stated in ALPHA.md — byte-identical to the record at sealing, Bitcoin attestations intact. This is where every existing receipt lives.

github.com/SplitWinner/audit_trail_alpha (opens in new tab)

Official ledger

The chain that opens at restart

The redesigned protocol: one verifier for the whole chain forever, day-linked anchors, reports bound in, a public SPEC registry. Opens with its first MLB anchor; other sports join at their season starts.

github.com/SplitWinner/audit_trail (opens in new tab)

§ 01Two records

Before, the boundary, and after.

We're new. We don't hide it. Here's the full chronology — characterisation, deployment, and the live record since. Both eras are public; we never blend the figures.

  1. Before

    Backtest characterisation

    The model run on historical games. Same pipeline that powers live today — but recorded after the games settled. Useful for characterising the model; never dressed up as a live call.

    17,043 backtest predictions

  2. The boundary

    Anchoring begins

    Audit trail deployed. From this day, every live morning pick on an anchored day was timestamped before kickoff, SHA-256 hashed, committed to a public GitHub ledger, and OpenTimestamps-anchored to Bitcoin.

    May 20, 2026

  3. After

    Live + anchored

    Every alpha-era live pick on an anchored day is in the sealed public ledger — timestamped before kickoff, upgraded to a Bitcoin attestation, and refusable-by-design if a single byte moved. Picks outside the ledger are disclosed above, never blended in.

    530 live picks anchored

§ 02What a tout can't do

Industry norm vs. our pipeline.

Ten properties most prediction services skip. Each one of ours maps to a mechanism anyone can check.

Industry norm vs SplitWinner — property by property
PropertyIndustry normSplitWinner
Predictions can be edited after the factYes — usually a mutable tableNo — append-only with DB trigger
Third-party-verifiable timestampNoYes — -anchored daily
Independently auditableNoYes — public GitHub mirror
Model artifacts have a content hash on fileNoYes — SHA-256 in immutable table
Training environment recordedNoYes — Python / library / CPU / BLAS captured
Inference byte-reproducible across runsNoYes — tier-3 determinism
BLAS thread pools pinned for determinismNoYes — set before Python starts
End-to-end reproducibility CI-verifiedNoPlanned — input capture shipped, harness pending
Backtest reads point-in-time dataAlmost neverYes — point-in-time, no lookahead leakage
Abstention is mechanically groundedNo — arbitrary confidence cutoffsYes — every prediction is ; what clears the bar is delivered, the rest is a disclosed skip

§ 03How it works

Five steps. Reproducible end-to-end.

From inference to public commitment, the whole flow is reproducible — and the verifier needs nothing from us.

  1. 01

    Compute

    The model emits a calibrated probability plus its conformal set.

  2. 02

    Hash

    The full prediction payload is hashed with SHA-256 to a stable fingerprint.

  3. 03

    Commit

    The hash is committed to the public audit_trail ledger before the game starts.

  4. 04

    Reveal

    The full prediction is published to the same ledger before the game starts; the salted manifest hash binds it.

  5. 05

    Verify

    Anyone can re-hash the published prediction and check it matches the pre-game salted manifest.

§ 04How the rigor is enforced

Six receipts the engineering can't fake.

What the build actually does — named, sourced, and verifiable. Each card is a mechanism that only exists when the rest is also real.

  1. 01

    Deterministic hash payload

    The audit hash is computed over a named-field subset of each prediction, canonicalised with json.dumps(sort_keys=True, separators=(",",":")), then SHA-256. Same bytes in, same hash out — across hosts, across years. The hash isn't asserted; it's re-derivable from the published row.

    audit_trail row · field set documented under contract

  2. 02

    Content-addressed model artifacts

    Every training artifact lives in Supabase Storage at a path keyed by its own SHA-256 (models/[artifact_sha256].tar.gz). On every inference, the artifact is re-downloaded, re-hashed, and compared. Mismatch fails loudly — not a determinism bug; a bucket corruption or a swap.

    audit_models.artifact_sha256 · audit_models.artifact_storage_path

  3. 03

    Per-model env fingerprint

    Every audit_models row records python_version, package_versions (jsonb), blas_variant, and thread_env (jsonb). NULL on any of these is itself disclosed — those rows aren't valid reproducibility sources, and the daily CI refuses to use them as goldens.

    audit_models columns · python_version · package_versions · blas_variant · thread_env

  4. 04

    Append-only, enforced in CI

    Every push and PR to the public audit_trail repo runs the integrity workflow. It blocks any modification, rename, or deletion of an anchored audit_trail row, model registration, or .ots proof — the append-only guarantee is a passing build, not a written promise. The workflow runs on every commit, not on a schedule.

    audit_trail/.github/workflows/integrity.yml

  5. 05

    Point-in-time correctness

    Backtests don't read today's state of mutated tables. Three layers of mutation are explicitly audited — ingest UPSERTs, Redis in-place rewrites, in-path code reads — and seven specific code sites are named for as_of_date retrofit. Snapshots content-addressed by SHA-256.

    Snapshot tables · mutation-site audit under contract

  6. 06

    Calibration safety rejection

    If post-calibration metrics on held-out data are worse than the raw model, calibration is rejected entirely. Stacking is leakage-aware — base models, meta-learner, and calibration each train on strictly separated folds. The rule is named, not a marketing line.

    Calibration + stacking discipline · documented under contract

All six are mechanisms, not assertions. None of them work without the rest of the build also being real.

§ 05Activity

The ledger, recent.

Each day the prediction pipeline ran, a manifest landed in the public ledger and was upgraded to a Bitcoin attestation. The sealed alpha holds 29 anchors (May 20 – Jun 25, 2026); the official ledger continues the practice from its first anchor.

  • Live anchors

    530

  • Anchoring since

    May 2026

  • Promotion rate

    13.4%

Recent anchors

Live · syncing with /v1/audit/summary

View all anchors on GitHub (opens in new tab)
  • 95a29c4ccbaded85

    Disclosed skip

    Jun 25 · 12:00 UTC

  • 52912fe37470f35e

    Disclosed skip

    Jun 25 · 12:00 UTC

  • 656e8ef4dadb30e4

    Disclosed skip

    Jun 25 · 12:00 UTC

  • e0277ba8f6fafa15

    Disclosed skip

    Jun 25 · 12:00 UTC

  • a1fd43054638260f

    Disclosed skip

    Jun 25 · 12:00 UTC

  • 9c0e05b33b8054fd

    Disclosed skip

    Jun 25 · 12:00 UTC

  • df8fc2d8c5e363f4

    Disclosed skip

    Jun 25 · 12:00 UTC

  • ca2059ce10e79bb1

    Disclosed skip

    Jun 25 · 12:00 UTC

  • 5edc313fb630c54f

    Disclosed skip

    Jun 25 · 12:00 UTC

  • cfec7d82f712bd8a

    Promoted

    Jun 25 · 12:00 UTC

§ 07Verify it yourself

Three steps. No account.

The verifier is plain Python. Clone, run, read the output.

  1. 01

    Clone the public repo

    git clone https://github.com/SplitWinner/audit_trail_alpha
  2. 02

    Run the verifier

    cd audit_trail && python verify.py content --predictions sample/predictions_full.json
  3. 03

    Read the output

    Anchor timestamp · content hash · match status (per prediction)

§ 08Uncertainty

Conformal coverage

Where the model commits to one outcome and where it hedges between two. Live and backtest side by side — the same procedure across both records.

Promotion rate (live)

13.4%

  • Single class
  • Two classes

Live

Backtest

Math, not a hunch.

§ 09MonitoringLive only

Calibration drift

Daily live calibration tracked over time. Vertical markers are retrains — drift triggers retraining, not the other way around. Backtest has no drift to track (it's a static replay).

  • ECE
  • Brier
  • Threshold
  • Retrains

§ 10Training cadence

When the models trained — and what they trained on.

Every model registration writes a row to the immutable audit_models ledger. The last few here — when each landed, what training-window it covers, and the commit SHA you can grep for in audit_trail.

  • Last registration

    Jun 11, 2026

  • In last 30 days

    0

  • Reproducible

    100%

Recent registrations

Newest first. Source: the audit_models ledger written by the box pipeline.

  • mlbSP 2Recovered

    Data through Dec 2026b6c98039

    Jun 11, 2026

  • mlbSP 1Recovered

    Data through Dec 2026b6c98039

    Jun 11, 2026

  • nhlSP 2Recovered

    Data through Dec 2025b6c98039

    Jun 11, 2026

  • nhlSP 1Recovered

    Data through Dec 2025b6c98039

    Jun 11, 2026

  • nhlML 2Recovered

    Data through Dec 2025b6c98039

    Jun 11, 2026

  • nbaML 2Recovered

    Data through Dec 2025b6c98039

    Jun 11, 2026

  • nhlML 1Recovered

    Data through Dec 2025b6c98039

    Jun 11, 2026

  • nbaML 1Recovered

    Data through Dec 2025b6c98039

    Jun 11, 2026

  • nhlSP 2Recovered

    Data through Dec 20258ca5360d

    May 19, 2026

  • nhlSP 1Recovered

    Data through Dec 20258ca5360d

    May 19, 2026

Lineage canvasEvery model plotted in time across the slots it served — pan, zoom, click.

§ 11We hide nothing

What we've disclosed.

Honesty is the product. A buyer who finds a limitation we already disclosed trusts us more, not less.

Enterprise readiness scorecard

Six axes, honest. The two BASIC ones are tracked, ordered, and owned in the public roadmap — not dressed up.

  • Integrity / verifiability

    Strong

    Immutable ledger, Bitcoin anchoring, public verifier.

  • Operations

    Strong

    OPERATIONS.md, single-operator reality disclosed.

  • Security

    Strong

    Key custody, API hardening, read-only seam.

  • Quant rigor

    Strong

    Calibration, conformal, point-in-time, determinism.

  • Data compliance

    Basic

    Data-lineage anchoring + formal docs not yet built.

  • Commercial

    Basic

    NDA / MSA / SLA / pricing sheet / DPA not yet productized.

Conformal coverage policy

The conformal coverage target, per (sport, season_type). Every prediction row in the public audit_trail commits the applied value into its content_hash; every daily anchor publishes the policy block. If we change the rule, you'll see it on the next anchor.

Default
90%
Postseason all sports
80%
Verify on the public audit_trail (opens in new tab)
  1. 01

    Single operator

    The system is run by one operator today. Key custody, hosting, backups, recovery times, and known gaps are documented in audit_trail/OPERATIONS.md. No pretense of a SOC-2'd team we don't have.

  2. 02

    16 bootstrap models marked recovered=true

    The 16 production models predate the audit ledger. They were registered after-the-fact and are explicitly marked recovered=true on every row. The first anchor (May 2026) marks the start of unimpeachable live capture.

  3. 03

    Disclosed anchor incidents

    Two disclosed incidents in audit_trail/incidents/, under a 7-day disclosure protocol. The immutability guard prevents recurrence of the first; ingestion monitoring is the work for the second.

  4. 04

    Enterprise data-compliance + commercial axes are BASIC

    Data-lineage anchoring and formal data-handling docs are not yet built. NDA / MSA / SLA / pricing sheet / DPA are not yet productized. Tracked in the public roadmap; we don't claim what we haven't built.

§ 12Questions

For the skeptic.

What a vendor questionnaire asks, plainly answered.

  • Why anchor to Bitcoin and not just a public database?

    A database we control can be edited, even if we promise not to. Bitcoin's block history isn't under our control — anyone can independently verify a hash was committed by a specific block. Same property regulators look for in tamper-evident logs.

  • What happens if the daily salts are lost?

    The salt is held server-side (the `salt` column on `audit_anchors`) and revealed alongside the day's predictions once the anchor is published. Lose it before reveal and that day's manifest can't be re-verified; lose it after and verification still works from the published salt. The public repo carries the manifest hash and the OpenTimestamps proof; the integrity claim travels through Bitcoin even if our DB is gone.

  • Can the pipeline anchor more than once per day?

    Yes. The cadence is one anchor per prediction run, which is once per day while the pipeline runs. The integrity model doesn't care about cadence — every anchor is a standalone tamper-evident commitment.

  • Why should I trust the single operator?

    You shouldn't. The whole point of the audit-trail design is to make trust unnecessary. The single-operator constraint is disclosed; the integrity primitives don't depend on the operator being honest after the fact.

  • Do you offer SLAs?

    Not productized yet. We document everything we'd commit to in audit_trail/OPERATIONS.md so a security team can evaluate before we sign anything formal.

Open verifier. Open ledger.

No accounts, no payment, no permission. Clone, run, check.

https://github.com/SplitWinner/audit_trail_alpha (opens in new tab)

If we vanished tomorrow, the proof would still stand.

Sandbox first. Then the beta.

A key in minutes — the full API surface, mocked plausibly-live, no card, no NDA. When it holds up on your desk, the 2026 beta cohort is a direct conversation: a limited set of desks, a fixed seasonal price in writing.

No card · no NDA · fixed price in writing