Edge Scanner Display Spec — All Markets
Version: 4.0
Date: 2026-04-03
Status: APPROVED (column reorder overhaul 2026-04-03)
Applies to: Game scanners (totals, spreads, moneylines) + Player prop scanners (NBA, MLB)
Page Layout (top to bottom)
1. Header + Date Filter
- Page title with source name and total row count
- Breadcrumb back to dashboard
- Date picker with Apply/Clear buttons
- Default: show today's data only in the main table
- Clear button shows all data (up to 10,000 rows)
2. Live Summary Bar
- Compact stats bar between the date picker and the data table
- Recalculates live whenever column filters are applied — shows stats for visible (filtered) rows only
- Stats shown:
- Rows — visible row count after filters
- Settled — rows with settlement data
- Win% — wins / settled (green if >55%, red if <45%)
- Avg Edge — average net edge of the best side
- PnL/bet — average profit per settled bet in cents (green/red)
- ROI — total PnL / total risked (green/red)
- YES W% — win rate for YES-side bets only
- NO W% — win rate for NO-side bets only
- Best Edge — maximum net edge in visible rows
- Executable — count of executable edges
- Opposite row (below separator): Shows what results would have been betting the opposite side
- PnL formula: Win = (1 - execPrice) * 0.93, Loss = -execPrice
3. Data Table Controls
- Export CSV button — exports visible (filtered) rows with raw values
- Collapse/Show Data Table button — toggle table visibility to access analytics below
4. Main Data Table
- Shows raw edge data for selected date
- Up to 5,000 rows per date, 10,000 for "show all"
- Google Sheets-style column filters on every column header (click triangle to open):
- Sort Ascending / Sort Descending
- Range filter (min/max) for numeric columns
- Checkbox list for each unique value with counts
- Select All / Clear / Reset links
- Active filters shown with green indicator and green header background
- Filters combine with AND logic
- Visible row count updates live in the header
Column Order — Game Scanners (sports_edges)
Left-side priority columns (visible without scrolling):
id, scan_type, game_id, pinnacle_anchor, threshold,
yes_model_prob, no_model_prob,
yes_net_edge, no_net_edge,
yes_exec_price, no_exec_price,
spread_cents,
actual_outcome, settled_result
Right-side columns (scroll to see):
market_type, sport, best_side, confidence,
final_total*, result*, settled_at, detected_at,
executable, tail_confidence,
last_trade_age_min, trade_volume, yes_taker_pct, consensus_count,
de_vig_method,
pinnacle_closing_prob, pinnacle_move,
closing_price, clv, ticker,
steam_detected, steam_magnitude, steam_direction
final_total and result only appear on totals pages
Column Order — Player Prop Scanners (player_prop_edges_as_sports)
Left-side priority columns (visible without scrolling):
id, scan_type,
player_name, prop_type,
anchor_line, threshold,
yes_model_prob, execution_price, yes_net_edge,
spread_cents, rung_distance,
actual_stat, actual_outcome, settled_at
Right-side columns (scroll to see):
home_team, away_team, detected_at,
yes_price, yes_raw_edge,
kalshi_bid, kalshi_ask,
executable, tail_confidence,
distribution_type,
fd_fair_prob, fd_vig, dk_fair_prob, fd_dk_divergence,
closing_price, clv, ticker
Column Order — MLB Prop Scanners (mlb_prop_edges)
Left-side priority columns:
id, snapshot_type, scanned_at,
player_name, market,
best_side, kalshi_price,
yes_fair_prob, no_fair_prob,
yes_net_edge, no_net_edge
Right-side columns:
fd_fair_prob, raw_edge, net_edge,
fd_line, fd_over_odds, fd_under_odds,
dk_fair_prob, fd_dk_divergence,
alt_lines_count, curve_edge,
kalshi_ticker, event_id
Enriched Columns (computed, not in DB)
- final_total (game totals only): Derived from settlement crossover — midpoint between highest win threshold and lowest loss threshold for that game. Falls back to live_game_scores if no settlement data.
- result (game totals only): YES if final_total >= threshold, NO otherwise
- settled_result (game scanners only): How the Kalshi contract resolved — YES or NO, independent of which side we bet. Derived from best_side + actual_outcome.
Hidden Columns (in DB but not displayed)
- Game scanners: kalshi_mid, kalshi_bid, kalshi_ask, prompt_version, model_prob, execution_price, raw_edge, net_edge, side, yes_depth, no_depth, is_longshot
- Player props: sport, kalshi_mid, no_model_prob, yes_exec_price, no_exec_price, no_net_edge, side, confidence, no_depth, yes_depth
5. Analytics Section (below the data table)
Analytics tables always show the full dataset for the selected date. They do not respond to data table column filters.
5a. YES Model Calibration (by Time Window)
- 20 probability buckets (0-5% through 95-100%)
- Columns per time window (8AM, 10AM, 2PM, Pre-Game, Closing): count, win %, calibration error, and with-edge stats
- Early vs Close delta column (Early = 8AM + 10AM, Close = Closing scan)
- Game scanners: YES + NO calibration tables; Player props: YES only
5b. Win Rate by Edge Size
- Edge brackets: 0-2%, 2-4%, 4-6%, 6-8%, 8-10%, 10-12%, 12-15%, 15-20%, 20%+
- Columns per time window: count, wins, win %, confidence, book depth, PnL/bet, ROI
- Game scanners use best_edge (max of yes/no); Player props use yes_net_edge
5c. Confidence Breakdown
- Rows: High, Medium, Low confidence levels
- Columns per time window: count, settled, win %, PnL/bet, ROI
- Game scanners: 3-signal system (spread + recency + consensus); Player props: tail_confidence (rung distance)
5d. CLV Summary (Closing Line Value)
- Game scanners: model_prob vs pinnacle_closing_prob
- Player props: model_prob vs FanDuel closing odds
5e-5g. Optional Tables
- Model Weights — de-vig method performance comparison (if data exists)
- Meta-Labels — feature combo win rates (if data exists)
- Alpha Decay — 16-week trending of strategy profitability (if data exists)
Scanner Rules
Player Props
- NBA props use N+ format (X or more, not greater than X)
- Model uses curve.exceedance(threshold - 1) to compute correctly
- NBA props are YES/Over only — no Under/NO contracts
- Other sports: contract format not yet verified on Kalshi
- FanDuel anchor line de-vigged (Shin method) for fair over probability
- Distribution types: Normal (points, sigma=6.5), NegBin (rebounds, assists), ZIP (blocks, steals), ZINB (threes)
- Ticker date validated in ET (not UTC) to prevent stale contract pollution
Game Scanners
- Pinnacle odds de-vigged (Shin method) for fair over probability at anchor line
- NBA sigma = 14 (council ruling 2026-04-02)
- Other sports: default sigma = 11 (pending calibration)
- Closing scans scoped to that game group only — does not scan tomorrow's games
Settlement
- System crontab: 4AM/10AM/4PM ET
- Checks Kalshi API for settled markets, marks edges as win/loss
- Captures closing prices for CLV calculation
Game Scanner vs Player Prop Differences
| Feature |
Game Scanners |
Player Props |
| Sides |
YES + NO |
YES/Over only |
| Calibration tables |
2 (YES + NO) |
1 (YES only) |
| Edge calculation |
best_edge (max of yes/no) |
yes_net_edge |
| CLV benchmark |
Pinnacle closing prob |
FanDuel closing odds |
| Confidence source |
3-signal (spread, recency, consensus) |
tail_confidence (rung distance) |
| Final total column |
YES (derived from settlement) |
NO (actual_stat instead) |
| Settled result column |
YES |
YES |
Color Coding
- Calibration error: green (<5%), yellow (5-10%), red (>10%)
- PnL/ROI: green if positive, red if negative
- Win rate: green if above bucket midpoint, red if below
- Edge values: green if positive, red if negative
- Early vs Close deltas: green if early is better, red if closing is better
- Column filter indicators: green when active, gray when inactive
Source: ~/edgeclaw/docs/edge-scanner-display-spec.md