Methodology statement, version 2026-09-21.2. Last modified 2026-09-21. Machine-readable at sharp-unit.com/api/methodology.json.
How SharpUnit measures, grades, and states what it cannot establish
Every pick is a stored row with a confirmation timestamp. Every figure on the site is derived from stored rows by the rules on this page, and every field a row does not carry is rendered as an absence with a token and a sentence, never as a filled value.
Source: SharpUnit pick record; odds and the event clock from The Odds API; scores from the feed or citation recorded on each pick.
What is measured
| Measure | Definition | Read from | Rule | Absent when |
|---|---|---|---|---|
| Line at publish | The side and number in the pick text as published. Read from the pick text only; the stored entry_line column is never rendered. | picks.pick_text | SR-40, SR-41, SR-43 | line.atPublish:not-displayable |
| Close | The consensus closing line captured in the 30 minutes before the scheduled start, Pinnacle where it prices the market and the consensus of books otherwise. Shown only where its side can be tied to the pick. | picks.close_line, picks.close_benchmark_src (capture-closing-lines) | SR-46, SR-47, R400 | line.close:not-captured, line.close:not-provable, line.close:price-observed-no-line |
| Closing line value | The change in the de-vigged probability of the pick between the price at publish and the price at close, in percentage points, against the named benchmark. Never a points figure on a fixed line. | picks.entry_prob, picks.close_prob, picks.clv_prob (compute-clv) | SR-44, SR-45, SR-47 | clv:not-observed, clv:not-provable, clv:not-computed |
| Lock | Whether the confirmation timestamp strictly precedes the scheduled start of the event, on the market's clock. Claimed per pick where it holds; never claimed for every pick. | picks.confirmed_at against market_data.start_time (the event clock; never picks.game_date or picks.game_time) | LOCK-3, R389, R406 | lock:no-confirmation, lock:no-event-clock, lock:confirmed-at-or-after-start |
| Anchored movement | The consensus home spread at four requested instants — 72 hours, 24 hours and 3 hours before kickoff, and at close — captured from the historical odds endpoint with the vendor's returned instant and the drift recorded in seconds. A move is the change between the first and last captured anchors; nothing is observed between anchors and nothing is interpolated. A move needs two anchors. | historical_odds_snapshot (anchored-capture) | R320 | movement.anchored:PENDING, movement.anchored:not-captured-for-sport |
| De-vigged price series | The de-vigged probability of the home side at six fixed marks before the start, from the every-30-minute consensus snapshots. Shown only where at least three marks were observed with at least three distinct values; observed-no-change and observed-nothing are stated as different facts. | market_data_snapshots (sync-market-data) | R83, R320 | movement.cadence:not-observed, movement.cadence:observed-no-change, movement.cadence:observed-too-few |
| Percentile context | Where the game’s T-72h to close consensus spread move ranks, by magnitude, among every completed-season fixture of the same sport in this corpus (US-region books, at least three books at both instants, no home/away swap between them). One number, one denominator, the season range stated; a rank within this corpus, never a cause. The corpus mixes capture regimes — 14–19 responding books through 2023, 9–11 since 2024 — and the sentence carries the per-season range as scope; a fixed magnitude ranks up to about six points differently between regimes, which no correction is applied for. | historical_odds_snapshot (the anchored cells) against src/lib/market/move-population.generated.ts, built from the same predicate | Ruled 2026-09-20: denominator A (completed seasons), n ≥ 250, both floors, magnitude only | percentile:not-enough-anchors, percentile:interval-not-comparable, percentile:sport-not-captured, percentile:population-too-small, percentile:below-book-floor, percentile:orientation-changed |
| Outcome | Win, loss or push against the final score for a scoreline sport; the winning corner for a fight, where a fight has a winner and never a scoreline. A result is written only once a score or corner is recorded. | picks.result, picks.home_score, picks.away_score (grade-picks, backfill-scores, the manual grade form) | R407, the two-step combat grade | outcome:pending, outcome.score:result-without-score, outcome.gradeSource:not-recorded |
- No model probability and no internal score figure is rendered on any public surface; the score that orders picks is a heuristic over the market price and is not a forecast.
- No promotional headline or offer figure from any sportsbook is published; a card links the operator's own terms.
- No situational context — rest, travel, officials — is captured or claimed.
SharpUnit, sharp-unit.com/methodology, version 2026-09-21.2. Source: SharpUnit pick record; odds and the event clock from The Odds API; scores from the feed or citation recorded on each pick.
What graded means, by sport
| Sport | How | Source | Note |
|---|---|---|---|
| NFL | Automated from the scores feed by sport and day | The Odds API /v4/scores; the ESPN scoreboard sweep as a fallback | |
| NCAAF | Automated from the scores feed by sport and day | The Odds API /v4/scores; the ESPN scoreboard sweep as a fallback | |
| MLB | Automated from the scores feed by sport and day | The Odds API /v4/scores; the ESPN scoreboard sweep as a fallback | |
| UFC | Automated from the ESPN MMA scoreboard or the scores feed; the winning corner is recorded, not a score | ESPN scoreboard; The Odds API /v4/scores | A fight is graded by its winner. The corner flag is resolved by name against the market row, never by position. |
| Boxing | Manual, against a named publication's per-card results, with the citation stored on the pick | The citation on the row (a results page, an official body, or a live-results report) | No automated boxing feed returns completed bouts (checked 2026-08-17 and 2026-08-18). A boxing grade with no citation is refused. |
| Soccer | Automated from the scores feed; no new soccer picks are drafted | The Odds API /v4/scores | Drafting retired (R249): the moneyline is a three-way market and the de-vig model does not cover the draw. |
Where no automated results feed exists, a grade is a human assertion and must carry where it was confirmed: the citation is stored on the pick row and shown on its receipt (R269, R333). A citation cannot forge feed provenance — a hand-typed feed prefix is rejected.
SharpUnit, sharp-unit.com/methodology, version 2026-09-21.2. Source: SharpUnit pick record; odds and the event clock from The Odds API; scores from the feed or citation recorded on each pick.
The record
A pick counts in the record when it is published, from the live lane, not a backfill, graded win, loss or push, not excluded from the record, and created on or after 2026-06-17. Excluded picks still render their own receipt; the receipt population is not the record population. Every receipt states whether its pick is in the record; an excluded pick carries the stated reason, or says that none is recorded.
- published
- data_source = 'Live'
- is_backfill = false
- result in ('W', 'L', 'P')
- excluded_from_record = false
- created_at >= 2026-06-17 (the integrity gate)
R378 (migration 091) — the graded record has one definition, keyed on the column that means it. Every record figure on this site renders with its sample size and its window in the same sentence. No win rate is shown without its n.
This pick is one of 1105 graded picks in the public record (17 Jun – 27 Oct 2026: 605–473–27). See the record.
SharpUnit, sharp-unit.com/methodology, version 2026-09-21.2. Source: SharpUnit pick record (pick_stats).
Provenance and the boundary
Score sources have been recorded on every grade since 2026-08-19. Picks graded before that date carry no recorded score source and are rendered as an absence — "score source not recorded" — not filled in from inference. The boundary is the artifact.
PROV-2 (2026-08-19), R411.
SharpUnit, sharp-unit.com/methodology, version 2026-09-21.2. Source: SharpUnit pick record; odds and the event clock from The Odds API; scores from the feed or citation recorded on each pick.
The absence vocabulary
| Token | Meaning | Description |
|---|---|---|
| [x] | not available | The value was not captured or not observed. The row could have carried it and does not. |
| [z] | not applicable | The measure does not apply to this bet or sport — a moneyline has no points line; anchored capture does not cover this sport. |
| [w] | none recorded | A row was expected and none was written — a missing anchor cell, a result without a score, a closing line value never computed. |
| [u] | not provable | A value is stored but cannot be tied to the pick's side, so it is not shown. |
| [p] | provisional | Provisional — the pick is not yet graded, or the anchors are not yet captured. |
SharpUnit, sharp-unit.com/methodology, version 2026-09-21.2. Source: SharpUnit pick record; odds and the event clock from The Odds API; scores from the feed or citation recorded on each pick.
Cadences
| What | When | Lane |
|---|---|---|
| Consensus price snapshots | Every 30 minutes for every listed game, from the day the market is listed until the start | sync-market-data |
| Anchored captures | At 72 hours, 24 hours and 3 hours before kickoff and at close, for NFL and NCAAF, in the us and eu regions | anchored-capture |
| Close capture | Every 10 minutes; a pick is captured inside the window from 30 minutes before to 10 minutes after the scheduled start | capture-closing-lines |
| Grading | Every four hours from the scores feeds, with a daily sweep. Grading is lumpy: a weekend slate grades on Monday and Tuesday | grade-picks, backfill-scores |
| Weekly recap | Sent for a Monday-to-Sunday window only once every record pick with a kickoff in it has a result — on completeness, not on a clock | weekly-recap |
SharpUnit, sharp-unit.com/methodology, version 2026-09-21.2. Source: SharpUnit pick record; odds and the event clock from The Odds API; scores from the feed or citation recorded on each pick.
What is not claimed
- No every-pick lock claim (checklist item 14)Each pick's timestamp is checked against the event's start on the market's clock, and the result is stated on that pick alone. No sentence states it for the whole record, and the delivery promise (a pick in your inbox ahead of the start) is a different claim about delivery, not about the record.
- Never "open" or "opening line" (checklist item 11)Capture began on 2026-08-26. The earliest snapshot for any game is the first price this system saw, not where the market opened. The first anchor is named as such.
- No time claim from the slate date (checklist item 9)picks.game_date is a publication and slate date and is early by up to 144 days on measured rows; picks.game_time is a frozen copy of the market clock at draft. Neither is an event clock. Kickoff is market_data.start_time.
- No early-versus-late closing-line-value claim (checklist item 12)The captures do not support a claim that publishing earlier or later changes closing line value.
- No claim attributing a difference to bet type (checklist item 13)Spread, moneyline and total picks are not compared as if bet type explained a difference.
- Uncited grades are "uncited", not arbitrary — and not claimed as sourced (checklist item 8)A grade without a recorded source is rendered as an absence with the provenance boundary, never as a sourced grade.
- No re-execution reproducibility claim (checklist item 3)The record is re-derivable from the stored rows. The answers that produced a pick are not re-executable, and are not claimed to be.
- "Not known to be affected" is never "verified complete" (checklist item 2)A check that ran is reported as the check that ran and what it compared, not as a fact independently established.
- No completeness claim from a dated attestation (checklist item 4)Nothing on the site is described as complete on the strength of an attestation over a bounded input set.
- No attestation continuity across the lineage boundary (checklist item 1)Timestamp proofs are cited only for the lineage they cover.
- No uncertainty claim on withdrawn rows (checklist item 5)Rows withdrawn from the record are not used to state confidence about the ones that remain.
- No Manifold-derived claim in a commercial context (checklist item 6)Pending a licence.
- No Kalshi-derived claim (checklist item 7)Pending authorization.
- The first cohort was selected without price discovery (checklist item 10)Comparisons across cohorts carry that caveat.
- "Verified" (a phrasing)Usually means a check ran, not that a fact was independently established. The site names the check and what it compared.
- "Complete" (a phrasing)Every completeness claim in this system is bounded by a cap, a window or a lineage. The site names the bound.
- "Reproducible" (a phrasing)True of the record, false of the answers. The site says "re-derivable from the stored record".
SharpUnit, sharp-unit.com/methodology, version 2026-09-21.2. Source: PUBLICATION_CLAIMS_CHECKLIST, the standing rulings named on each line.
Sources
- The Odds API: consensus and per-book prices, the event clock (start_time), the historical anchored captures, and the scores feed.Book-level prices are not redistributed; every published series is derived (de-vigged or consensus).
- ESPN scoreboard: final results for MMA and the fallback sweep for scoreline sports.
- Named publications: boxing results, cited per bout on the pick row.
- SharpUnit pick record: the picks, their confirmation timestamps, their grades and every derived figure.
SharpUnit, sharp-unit.com/methodology, version 2026-09-21.2. Source: SharpUnit pick record; odds and the event clock from The Odds API; scores from the feed or citation recorded on each pick.
Corrections
Corrections are append-only: a published pick is never edited in place; a correction is a new row in pick_corrections with its reason, and the findings ledger records every ruling that changed a public claim. Withdrawing an unsupported claim is always permitted; restating a published number requires independent verification.
SharpUnit, sharp-unit.com/methodology, version 2026-09-21.2. Source: pick_corrections, findings_ledger.