NBA 2025-26

Pregame Script

7-layer operator playbook for NBA prop analysis. Every claim query-grounded. No assumptions. Structured for both human operators and machine agents.

7 Layers 12 Steps DraftKings Board Supabase MCP JSON-LD Contract
0Resolve
1Board
L1Suppression
L2Defenders
2ATier
2BOpp Env
L3Ref
L4Structural
L5Blowout
L6Behavior
7Screen
CCanary

Global Rules

Data Source

Only use queried data. No assumptions. Run every query before making claims.

League

league_id = nba · sport = basketball

Join Key

match_id is the primary cross-table join.

Prop Side

Use side = 'under' and result IN ('won','lost') unless checking over leans.

Live Board

DraftKings as sportsbook source from player_prop_bets.

Conviction Rank

1) Sample quality → 2) Layer alignment → 3) Miss magnitude vs line.

Sample Thresholds

ContextMin Sample
Team-level market profile50 props
Defender tier profile10 props
Defender-driven opponent environment3 props
Blowout split3 games

League Baselines (Under %)

MarketBaseline Under %
Points52.8%
Assists53.5%
Rebounds52.8%
Threes Made55.5%
PRA53.4%
0

Resolve Game + Market Snapshot

Get match_id, spread, total, implied win probability. This anchors every downstream query.

SQL Query

SELECT m.id AS match_id, m.away_team, m.home_team,
  m.start_time AT TIME ZONE 'America/Los_Angeles' AS start_time_pt,
  m.odds_away_spread_safe AS away_spread,
  m.odds_home_spread_safe AS home_spread,
  m.odds_total_safe AS total,
  m.odds_away_ml_safe AS away_ml,
  m.odds_home_ml_safe AS home_ml
FROM matches m
WHERE m.sport = 'basketball' AND m.league_id = 'nba'
  AND m.away_team = '[AWAY]' AND m.home_team = '[HOME]'
  AND (m.start_time AT TIME ZONE 'America/Los_Angeles')::date = DATE '[YYYY-MM-DD]';

Output: GAME: [AWAY] @ [HOME] | Spread: [X] | Total: [X] | Win Prob: [X]%

1

Live Board Snapshot

Current DraftKings props: points, assists, rebounds, threes_made, pra.

SQL Query

SELECT pb.player_name, pb.bet_type, pb.line_value,
  MAX(CASE WHEN pb.side='over' THEN pb.odds_american END) AS over_odds,
  MAX(CASE WHEN pb.side='under' THEN pb.odds_american END) AS under_odds
FROM player_prop_bets pb
WHERE pb.sportsbook = 'DraftKings' AND pb.match_id = '[MATCH_ID]'
  AND pb.bet_type IN ('points','assists','rebounds','threes_made','pra')
GROUP BY pb.player_name, pb.bet_type, pb.line_value
ORDER BY pb.team, pb.player_name, pb.bet_type;

If no current line returned for a player/market → do not make a play on it.

L1

Team Suppression Profile

Defense/environment layer. Compare each team's opponent under rates to league baselines.

Key: Uses opponent as the team being profiled (defense layer). Min 50 props per market.

Output Format

[TEAM] suppresses [market] at [under_pct]% (+[delta] vs league)
[TEAM] boosts [market] at [under_pct]% ([delta] vs league)
L2

Defender Fingerprint

Elite defenders: starter ≥ 50%, avg min ≥ 20, avg (blocks+steals) ≥ 1.5, games ≥ 15.

Qualifiers from player_game_stats + espn_athletes join. Season = 2025-10-01+.

Sub-LayerWhatMin Sample
2A — Tier EffectOpp points under % by scorer tier (low <15 / mid 15-21 / high 22+)10 props
2B — Opp EnvironmentTomorrow's opp player prop perf when defender is active3 props

Classification

erase tier     = under_pct >= 60%
neutral        = 45% to 59%
suppression-proof = under_pct < 40%
2A

Generic Defender Tier Effect

Opponent points under performance when defender starts + plays 15+ min. Bucketed by scorer tier.

Tier Buckets

low  = line < 15
mid  = line >= 15 AND < 22
high = line >= 22

Join: player_prop_outcomes × player_game_stats on match_id where defender is starter with 15+ min.

2B

Defender-Driven Opponent Environment

Tomorrow's opponent player props when this defender is in-game. Min 3 props.

If no rows clear sample threshold → No validated defender-driven opponent environment effect found (sample < 3).

L3

Ref Profile

Primary official tendency: under, neutral, or over ref. Amplifies or cancels defender effect.

ClassificationUnder RateEffect
Under Ref≥ 55%Amplifies defender effect
Neutral51–54.9%No modifier
Over Ref≤ 50%Cancels defender effect

Source: game_officialsofficial_tendencies. Use official_order = 1 (crew chief).

L4

Team Structural Profile / Venue

Team over rate vs closing totals. Judges whether the book is inflating or suppressing scorer lines.

ClassificationOver Rate
Over Team≥ 55%
Neutral46–54%
Under Team≤ 45%

Source: game_context × matches. Uses closing_total for accuracy.

L5

Blowout State

Only if spread ≥ 8. Favorite starter minute splits + underdog prop blowout sensitivity.

Gate: Only activate when projected spread is 8+ points. Blowout = margin ≥ 15.

ClassificationCondition
Blowout-SensitiveUnder rate swings by 15+ points between states
Blowout-ProofSwing < 10 points
L6

Star Behavioral State

Back-to-back, injury returns, usage disruption. Direct evidence only — no inference.

Valid Flags (direct evidence only)

back-to-back    → team appears in prior local date query
injury return   → injury rows reference the player being analyzed
usage disruption→ injury rows show non-active teammate whose absence changes role

If evidence is indirect or not returned by query: No validated behavioral-state flag found.

7

Candidate Prop Screen

Final screen: exact-line sample, opponent sample, avg miss vs line, current price, under/over direction.

Joins player_prop_bets (board) × player_prop_outcomes (exact-line history + opponent history).

Over lean requirements: under_pct < 50% AND positive avg_actual − line AND at least one supporting team/structural/blowout layer.

C

Live Canary

In-game suppression health check. Role player, not star-dependent noise.

cold at half     → suppression holding   → stay
hot at half      → suppression failing   → hedge / exit
1-7 pts above pace → system break
8+ above pace    → individual heater; lower confidence
GAME: [AWAY] @ [HOME] Spread: [X] | Total: [X] | Win Prob: [X]% Team Profiles: • [TEAM A] suppresses [market] at [X]% (+[delta]) • [TEAM B] suppresses [market] at [X]% (+[delta]) • [TEAM A] boosts [market] at [X]% ([delta]) Defender Fingerprints: • [DEFENDER]: Tier effect — [erase/neutral/proof], avg line [Y], avg actual [Z] • [DEFENDER]: Opp env — [PLAYER] [market] [under%] in [N] props Top Plays: 1. [PLAYER] [market] under — [2-3 stacked layers] 2. ... 3. ... Canary: • [NAME] — cold at half → [action] | hot at half → [action] Skip: • [PLAYER] — [reason] • [PLAYER] — [reason] Game Total: [lean] — [rationale from both teams + blowout state] Behavior: [flag or "No validated behavioral-state flag found."] Ref: [NAME] — [under/neutral/over] — [effect on reads]

Over Lean Protocol

Gate 1

under_pct < 50% on historical under-side query

Gate 2

Positive avg_actual − line

Gate 3

At least one supporting team / structural / blowout layer

All three gates must clear for an over lean. If no validated play clears the evidence bar — say so explicitly.

Output Limits

Top Plays

Maximum 3 conviction plays

Skip Players

Maximum 2 skip players with reason

No Play

If nothing clears the evidence bar, state explicitly