Sharp Tightness — American-odds gap by mode
How sharp tightness works
The sharp-tightness gate blocks bets when the non-placement sharp books disagree among themselves on price by more than a configurable threshold (in American-odds cents). It is a consensus-coherence check, not a stale-line detector.
The check, end to end
- Build a sharp-odds snapshot from the books in
sharpBooksfor this market. - Drop the candidate (placement) book from the snapshot — controlled by
filters.sharpTightnessExcludeCandidateBook, hardcoded totrue(marked required). - If fewer than 2 sharps remain, skip the check (not enough signal).
- Compute
best= highest American odds,worst= lowest, in the remaining sharps. gap = americanOddsGap(best, worst).- Resolve the threshold: scoped match by book/league/market/mode/flow first, falling back to
filters.sharpTightnessMaxOddsDiffLive(live) orfilters.sharpTightnessMaxOddsDiffPregame(pregame). High-EV tail guard can tighten further. - If
gap > threshold→ FAIL. Otherwise PASS.
Worked example
Live MLB Cubs Over 13.5 placed at DraftKings −350. sharpBooks = [DraftKings, Pinnacle, FanDuel], with prices DK −350, Pinnacle −1389, FanDuel −1400. After excluding the placement book (DK):
- Remaining snapshot:
{ Pinnacle: −1389, FanDuel: −1400 } best = −1389,worst = −1400,gap = 11¢- Threshold (live, no scoped match):
50.11 ≤ 50→ PASS.
Note: the 1039¢ gap between DK (−350) and the consensus (~−1395) is invisible to this gate. That gap is the signal of a stale-line trap — but it is a candidate-vs-consensus distance, which this filter does not measure.
What this gate catches vs. doesn't
- Catches: markets where the (non-placement) sharps cannot agree among themselves on a price — a sign that fairOdds is being computed from noisy, contested, or stale inputs and is unreliable.
- Does not catch: markets where sharps tightly agree but the candidate book is a wild outlier vs. the consensus (the classic stale-line trap). For that pattern, use a separate candidate-vs-fair distance filter (not yet implemented).
- Skipped entirely for: player props (
isPlayerPropDomreturnstrue), markets with fewer than 2 remaining sharps, and any DOM lacking a current mode.
Threshold tuning
- Lower threshold = stricter consensus required. Cuts volume but raises ROI on what passes (the 14d sweep showed an empirical optimum around 28–30¢ on live; we run live at 50 as a compromise between coverage and tightness).
- Higher threshold = more tolerant. Lets through markets where sharps disagree more — fine if you trust the median sharp price, costly if disagreement signals stale data.
- Scoped overrides (in
filters.scopedSharpTightnessMaxOddsDiff) match by combinations ofbook,league,market,mode,flow, andminSharpCount. The most specific match wins; ties go to the lower (stricter) value. Use these to keep liquid markets loose and illiquid markets tight. - High-EV tail guard can tighten the live and pregame thresholds independently when the recent tail-health diagnostic flags as unhealthy and EV ≥
HIGH_EV_TAIL_GUARD.evCutoff. Effective threshold becomesmin(base, tightened).
Implementation: shouldSkipForSharpTightness, buildSharpTightnessSnapshot, getSharpTightnessMaxDiff in osd-auto-edge-bb.js. Gate call sites: the EV/arb evaluator (badge pipeline), the high-EV tail diagnostic, and the watch-list near-miss path.
Data
Controls
Run Settings
Guardrails
Minimum Bets, (2) pass enabled guardrails, (3) rank remaining candidates by Objective Metric. If all fail guardrails, the run falls back to score-only with a warning.
Data Quality & Output
Summary
| Param | Baseline | Best | Bets Kept (Best / Baseline) | Baseline Score | Best Score | Delta |
|---|
Charts
Distribution
| Parameter Value | Bets | Pass Rate | Distinct Days | Green Day % | Worst Day | Win Rate | ROI | Profit | Stake | Avg EV |
|---|