Skip to main content
Audit
Transparency Commitment

How We Track Results

Every number on this site comes from the same pipeline described on this page. No exceptions. No cherry-picks.

Live record

501 graded picks

Tracking since June 18, 2026

62.6%win rate
304W–182L15 push

The Grading Pipeline — Step by Step

1

Pick is logged before game start

When a pick is published it receives a UTC timestamp. Any pick published after the game's scheduled start time is rejected by the pipeline — it cannot count toward the record.

2

Final results fetched — automatically where a feed exists

After a game ends, the grade-picks cron calls the Odds API /v4/scores endpoint for the sport and date, and a second sweep cross-checks ESPN final scores. It reads the official home_score and away_score and writes them to the pick row. Boxing has no automated results feed on either source, so boxing picks are graded manually against published fight results, and the source is recorded on the pick row alongside the grade.

3

Grade computed from the real final score

Win/loss/push is determined by comparing the actual margin to the spread line embedded in the pick text. For moneylines, the winning team is compared directly. For totals, the combined score is compared to the published over/under.

4

Result written — only once a verified score exists

A pick's result field is set to W, L, or P only after home_score IS NOT NULL. A pick with no confirmed score stays in "pending" indefinitely — it never counts in any stat.

5

The citation is stored with the grade — from 2026-08-20

Every pick graded from 2026-08-20 onward stores the exact source of its result on the row: the scores endpoint and date it was read from, or, for a manual grade, the published report it was read from. Picks graded before that date came through the same pipeline and the same feeds, but the citation was not written at the time — those rows carry the result without the reference. We are stating that rather than implying every grade has always carried its source.

6

Stats views recalculate on every query

The pick_stats, sport_performance, and confidence_tier_performance database views filter on is_backfill=FALSE AND home_score IS NOT NULL AND result IN ('W','L','P') every time they are read. There is no cached or pre-computed win rate — it reflects the live table state.

What Counts — and What Does Not

Included in all stats

Real scored pick — published=TRUE, is_backfill=FALSE, home_score IS NOT NULL, result IN ('W','L','P') — except the de-vig quarantine below.

Always excluded

Scoreless picks — any pick where home_score IS NULL. This includes picks that are still pending, games that were postponed, and any pick that was erroneously given a result without a verified final score.

Unpublished picks (published=FALSE) — internal test picks or picks that failed the quality check before release.

Pending picks — picks where the game has not yet ended or the score endpoint has not yet returned a confirmed final score.

De-vig quarantine (spread / run-line) — otherwise-real graded spread/run-line picks whose no-vig line cannot yet be verified from real market data (record_excluded_reason = unverified_spread_devig). Held out of the headline record pending verification. Nothing is deleted: these rows stay queryable and the live count is shown on /results.

What We Will Not Do

No fabricated records. We will never hand-enter a result or count a pick that was not graded against a real, API-confirmed final score.

No cherry-picked samples. The record on /results includes every published live pick — wins and losses. We never remove a pick because it lost. The only hold-outs are the de-vig quarantine above — a verification hold on certain spread/run-line bet types, never a result-based one — and its count is disclosed on /results, never hidden.

No win rate shown below 30 real graded picks. Until the sample reaches 30 real scored picks, every stat surface shows "Building record" instead of a win rate. Percentages from small samples are statistically meaningless and misleading.

No AI/ML performance claims. SharpUnit does not deploy a trained machine-learning model in production. Picks are scored by a heuristic signal engine — see "Conviction Scoring" below. We will not claim otherwise.

No deleted losses. The pick log is append-only. Historical picks are never removed — even if a pick was wrong, poorly timed, or graded in a sport we no longer cover.

Signal Inputs — What the Scorer Uses

Signal inputs

Cross-book price spread
Cross-book line dispersion
Bookmaker count

These three are what the scoring engine actually consumes. Two more are captured but do not move a pick: injury reports feed scoring on only one of our two generation paths and currently cover MLB only, and weather is collected but has matched no game on a recent slate. Line movement from open to current is tracked and shown on the pick page, but it is not an input to scoring. We do not ingest bet percentages, handle percentages, ticket counts, or steam/reverse-line-movement data, so we publish no sharp-money signal. Also not captured: situational context (rest, travel, referee tendencies).

Closing Line Value (CLV)

Where available, we record the closing line at game time and compute Closing Line Value (CLV) — the difference between our posted odds and the closing market line. Positive CLV indicates the pick was published before the market moved in our direction. CLV describes the market, not the result, and is displayed on the /results page alongside standard win/loss data.

CLV is available only for picks where we captured an opening and closing line. It is never fabricated or back-filled.

The short version

A pick is real when it was published before the game started AND a real final result was confirmed — automatically from the Odds API and ESPN where a feed exists, and manually against published fight results for boxing, which has no automated feed. Everything else is excluded from every stat on this site. Every exception is named above and its count is public.