The Framework Stack

Core public methodology. Updated to June 2, 2026 canon.

This is the public-facing methodology hub for the core DataDunkNBA framework stack: what each framework measures, the formula in computable form, what's been backtested, and which claims carry caveats after the June 2 mass-substantiation pass. If a team page references "WEV" or "SLS" or "GPI" and you want to know what's actually under the hood, this is the page that shows it.

I built this stack across 2024–2026 as the analytical engine of DataDunkNBA. June 2 canon corrections are now applied here: WEV v3 is 0.30/0.60/0.10, OEV is a modern floor not a separator, PDR rejects two-way wing playoff elevation, CIS is era-readiness context rather than a standalone title engine, and Hybrid_WEV is a companion metric.

DataDunkNBA Research: consulting engagements

1. WEV — Winning Expected Value Validated

The headline composite. A 0–25 scale of a roster's championship signal.

WEV is the canonical team composite. It rolls offensive expected value, defensive expected value, and clutch expected value into a single 0–25 score that maps onto historical title contention. June 2 canon keeps WEV v3 as core, but no longer describes it as the single king metric: RQS owns the strongest Top-1 hit rate, and Hybrid_WEV is a companion layer.

WEV_v3 = (OEV × 0.30) + (DEV × 0.60) + (CEV × 0.10) // OEV = offensive expected value (lineup-weighted ORtg vs schedule-adjusted defense) // DEV = defensive expected value (lineup-weighted DRtg + STOCKS contribution) // CEV = clutch expected value (final-5-min net rating, possession-weighted) // June 2 canon: OEV is a modern floor metric, not a separator

Threshold bands

Title contender
WEV ≥ 18.5
Conference contender
16.0 – 18.4
Playoff team
13.0 – 15.9
Bubble / fringe
10.0 – 12.9
Lottery
< 10.0

Backtest — June 2026 validation

June 2 validation places WEV v3 at 7/24 Top-1 (29%), 15/24 Top-3 (62%), and 20/24 Top-5 (83%) across the modern champion test. It remains the canonical team composite, but its strength is best read with AQI, RQS, Interior Anchor, PDR, and Efficiency Tax.

OEV correction: Post-2017 OEV ≥ 13 remains a modern floor, with 2018 Golden State at 13.1 as the observed minimum. No enforceable pre-2017 OEV floor exists because 2004 Detroit won with OEV = 0.93.

What WEV doesn't do: It doesn't predict playoff seedings inside the top 5 — small WEV gaps don't translate cleanly to playoff outcomes once everyone's a contender. Use WEV to identify the contender tier, then use PDR + Clutch Paradox + roster-fit reads to handicap the bracket.

2. CPV — Complete Possession Value Directional

A multiplicative cross-check on WEV. Penalizes one-side rosters.

CPV is WEV's stricter cousin. Where WEV averages offense and defense, CPV multiplies them — so a team with elite offense and a 22nd-ranked defense gets penalized harder than the additive version would suggest. It's the metric that catches the "great offense, can't stop anyone in the playoffs" trap.

CPV = OEV × DEV // Multiplicative — punishes single-sided rosters // Same OEV/DEV inputs as WEV, but no clutch term and no weights

Use CPV when you want to ask: "is this roster two-way enough to survive a 7-game series against another top-10 team?" The 2017 GSW (KD-era) had the highest CPV in the dataset. The 2018 HOU and 2024 BOS are the two highest non-GSW marks across the past decade. Every championship roster since 2014 has cleared a CPV floor of roughly 6.5 (rough cut — sensitivity analysis is on the to-do list below).

Caveat: CPV's threshold band hasn't been quantitatively validated season-over-season the way WEV has. Use it directionally as a one-sided-roster filter, not as a hard contender threshold.

3. SLS — Shelf Life Score Validated

How well does this player project to age? The backbone of every extension call.

SLS asks: across the next 3–4 years of a contract, what's the probability the player still produces at this level? It composites archetype (skill-driven games age, athleticism-driven don't), age, current efficiency, and career mileage.

SLS = (0.30 × archetype_factor) + (0.25 × age_factor) + (0.30 × efficiency_factor) + (0.15 × mileage_factor) // archetype_factor: skill/IQ/shooting → 1.0; athleticism-dependent → 0.4–0.6 // age_factor: 1.0 at 25, declining linearly past 30, steep drop past 33 // efficiency_factor: TS% relative to position + USG-adjusted // mileage_factor: career minutes + injury history penalty

Threshold bands

Extend at max
SLS ≥ 0.80
Extend at sub-max
0.70 – 0.79
Short-term only
0.55 – 0.69
Walk away
< 0.55

Backtest — 14 supermax/max deals, 2017–2025

I ran SLS retroactively on every supermax extension and every $200M+ max deal signed 2017–2025. The results were the cleanest signal in the entire framework stack:

PlayerYear signedSLS at signingOutcome
Stephen Curry20170.8002 titles, MVP, validated
Nikola Jokić20220.8981 title, 3 MVPs, validated
Shai Gilgeous-Alexander20240.8532025 title + MVP, validated
Giannis Antetokounmpo20200.7922021 title — borderline pass
Damian Lillard20190.738POR never advanced; trade required
Bradley Beal20220.621WAS rebuild, traded at loss
John Wall20170.541Total cap albatross
Russell Westbrook20170.576Traded 3x, bought out

Result: every supermax with SLS ≥ 0.80 won a title. Every supermax with SLS < 0.70 became a cap problem. The 0.80 threshold separates "extend at max" from "do not extend" cleanly across the 14-deal sample. The 0.70–0.79 band is the genuine judgment-call zone.

Caveat: 14 deals is a meaningful sample for supermax-tier contracts but not a huge one in absolute terms. Sensitivity analysis on the four input weights (0.30 / 0.25 / 0.30 / 0.15) is queued — initial gut check is the rankings stay stable but the magnitude could shift ±0.05.

4. GPI — Ghost Points Index Validated

How much of this player's scoring is empty calories?

GPI flags the high-volume scorer whose box-score line doesn't translate to wins. It's a multiplicative composite — a player only registers ghost points if they have both high volume and a penalty trigger (poor efficiency, losing team, sub-replacement PER). An efficient star on a winning team scores GPI = 0 regardless of how many points they put up.

GPI = volume_signal × (eff_penalty + win_penalty + per_penalty) volume_signal = (PPG / 25) × (USG% / 28) eff_penalty = max(0, lg_TS player_TS) × 8 win_penalty = max(0, 0.500 team_win_pct) × 1.5 per_penalty = max(0, (18 PER) / 8)

2025-26 top of the ghost cohort

RankPlayerTeamUSG / PPG / TS%GPI
1Dillon BrooksPHO28.6 / 20.2 / .5400.651
2Pascal SiakamIND30.1 / 24.0 / .5620.545
4Cooper FlaggDAL26.9 / 21.0 / .5480.423
5Michael Porter Jr.BRK30.5 / 24.2 / .5950.405
7Keyonte GeorgeUTA27.9 / 23.6 / .6090.327
11LaMelo BallCHO32.0 / 20.1 / .5460.233
13DeMar DeRozanSAC22.8 / 18.4 / .5940.223

2025-26 bottom — ghost-free elite

Jokić, SGA, Luka, Wembanyama, Edwards, Booker, Mitchell, Towns, Harden — every one of them lands at GPI = 0 despite top-of-league volume, because efficiency × winning team neutralizes the ghost component. The metric correctly distinguishes high-volume production from high-volume empty calories.

Multi-season validation (10 seasons, 2016–2025)

The single-season cross-section is now validated against a 582 player-season historical sample. Players appearing in top-quartile GPI ≥3 seasons across the decade:

Sophisticated framework finding: Some popular "anti-math" players don't actually qualify under the strict formula — Lillard, DeRozan, John Wall all had decent enough TS% that high volume on bad teams didn't trigger ghost. The framework correctly distinguishes "real volume on a fragile team" (Lillard) from "empty volume on a fragile team" (Westbrook post-OKC).

Refinement queue: GPI vs salary regression (joining with multi-year salary data) is the most actionable extension. Pre-2015 historical extension would catch earlier canon cases (Carmelo NYK, Aldridge POR).

5. PDR — Playoff Decay Rate Validated (with reformulation)

Which archetypes regress against playoff defense, and which don't?

PDR measures the change in TS% and PER from regular season to playoffs, binned by player archetype. June 2 canon rejects the old binary "improvers vs. decayers" model. Every archetype tends to regress; the useful question is which archetypes regress least, and which get punished hardest when playoff defenses remove easy options.

2026 R1 sample (n = 124, ≥ 50 playoff minutes)

ArchetypenAvg ΔTS% (pts)Avg ΔPERFramework prediction
3PT-heavy creator10−2.88−2.96−3% to −6% (validates floor)
Foul-drawer20−1.65−1.16−4% to −8% (direction right, magnitude lighter)
Catch-and-shoot16+0.39−0.41−5% to −8% (direction wrong this sample)
Two-way wing12−7.67−1.79+2% to +5% (prior — contradicted, see reformulation)
Playmaking big40.00+0.85+3% to +5% (prior — mixed, see reformulation)
Rim finisher13−4.61−0.38neutral (drop larger than expected)

Specific case-level validations: Jalen Duren (foul-drawer, DET) collapsed from .688 TS to .517 — a textbook framework prediction. Jalen Suggs (3PT-heavy creator, ORL) PER dropped 9.1 points. Brandon Ingram (mid-range) dropped 8.4 PER, contradicting the "mid-range stable" claim.

Multi-season validation (10 seasons, 2016–2025)

Ran the full backtest against 1,392 RS→PO player-pairs over 10 years. The result forced a framework reformulation:

ArchetypenAvg ΔTS%Avg ΔPERPredictedVerdict
3PT-heavy creator95−3.52−3.26−3% to −6%✓ Validates floor
Catch-and-shoot209−3.36−1.86−5% to −8%△ Direction right, lighter magnitude
Foul-drawer99−1.49−1.90−4% to −8%△ Direction right, lighter magnitude
Two-way wing182−2.39−1.81−2% to −3% (regressor)✓ Confirmed (reformulated)
Playmaking big66−2.62−2.53−2.5% to −3% (regressor)✓ Confirmed (reformulated)
Mid-range scorer26−2.42−1.17−1% to 0%△ More negative than predicted
Rim finisher140−1.53−1.81neutral△ Slight regression vs neutral

The honest reformulation: the framework's binary "improvers vs. decayers" claim is invalidated by the 1,392-pair sample. The accurate story is every archetype regresses in playoffs — the question is which regress least. Two-way wings do not elevate: the June 2 two-way wing sample is 182 seasons with mean ΔPER = −1.81, worsening from −1.35 (2016–2020) to −2.41 (2021–2025). The framework still differentiates archetypes, but the asymmetric improver/decayer model is gone.

What this means for confidence: the multi-season sample is large enough that this isn't noise. The reformulation is the framework's value-add: the old two-way-wing elevation intuition is now explicitly rejected.

6. SSR — Sunrise / Sunset Ratio Validated (with reformulation)

Which archetypes age gracefully? Which fall off a cliff?

SSR is the aging-curve framework. The claim: skill-driven archetypes (shooting, IQ, playmaking, footwork) age well; athleticism-driven archetypes (rim-running, transition speed, vertical pop) collapse hard at 30. The metric is the ratio of average production at age 22–26 to average production at age 30–34, binned by archetype.

2025-26 cross-section

Age bandnAvg PERAvg BPMAvg WS/48
22–26 (ascending)13215.16+0.400.110
27–29 (peak)6215.68+0.780.121
30–34 (declining)4716.12+1.390.124
35+ (tail)1617.18+1.440.102

Counter-intuitive finding: Older bands have higher mean PER. That's survivorship bias — only the players who remain elite past 30 are still earning rotation minutes. Young players include lots of marginal rotation guys; older players are filtered down to the ones who kept their jobs. This is a methodology caveat, not a framework refutation.

The list of names tells the right story

Graceful agers (35+, PER ≥ 16): Jimmy Butler (36, 23.5), Curry (37, 22.6), Harden (36, 21.7), Durant (37, 21.1), LeBron (41, 20.8), DeRozan (36, 17.8), Paul George (35, 16.7). All skill-driven. LeBron is the singular athleticism-driven outlier — and he's been documented as such for a decade.

Declining-warning cohort (30–34, PER < 16): Khris Middleton (34, 10.9), Tobias Harris (33, 15.0), Jordan Clarkson (33, 11.6), Schröder (32, 12.9), Caldwell-Pope (32, 11.0), Marcus Smart (31, 9.9). Each is a contract-decision flag for their current team.

Longitudinal validation (10 seasons, 2016–2025)

The cross-section is now backed by a true longitudinal: 86 players appearing in BOTH age 22–26 AND age 30–34 windows in the dataset.

Archetype-aging claim — empirically supported

Of the 21 players who aged well (SSR < 1.0), 15 are skill/IQ-driven — shooters, playmakers, defensive specialists (Caruso, Butler, Brogdon, Derrick White, Royce O'Neale, Marcus Morris). Of the 14 heavy decliners (SSR ≥ 1.30), 9 are athleticism-dependent guards/wings (Bradley, Bullock, Bledsoe, Bazemore, Wall, Hayward, Rozier).

Skill-driven players age into the SSR < 1 cohort at a 4:1 ratio over the heavy-decline cohort. That's the framework's archetype claim, validated quantitatively.

Magnitude reframing: "1.8x" is the worst-case ceiling, not the typical ascending profile. Most players are mildly declining (SSR 1.05–1.20). Hub language updated to reflect this.

7. CSG — Cap Space Ghost Directional

What you're paying for the games a player didn't play.

CSG is the simplest framework in the stack. It quantifies the dollar cost of every game a high-priced player missed during the season — the literal cap dollars allocated to a roster spot that produced zero on-court value.

CSG = (games_missed × annual_salary) / 82 // Pure availability metric. Doesn't penalize quality of play — // just measures dollars-per-empty-roster-spot.

2025-26 worst CSG figures (rotation tier)

PlayerTeamSalaryGames missedCSG
Trae YoungWAS$46.0M77$43.2M
Anthony DavisWAS$54.1M62$40.9M
Joel EmbiidPHI$55.2M44$29.6M
Paul GeorgePHI$51.6M45$28.3M

CSG pairs naturally with SLS — the question isn't just "is this player good" but "is this player available?" The 2025-26 Wizards illustrate the framework cleanly: AD and Trae's combined CSG was approximately $84M, on a team whose total cap was $185M. ~45% of the team's salary produced zero on-court value across the season.

Caveat: CSG doesn't distinguish between long-term injury (real recovery) and load-management absences (planned rest). For a maximally rigorous framework, you'd weight differently. The current version is the blunt-force read.

8. CIS — Championship Identity Shift Era Context

How modern is your team's offensive identity?

CIS measures the gap between a team's 3-point attempt rate and the league-average 3-point attempt rate that season. It is useful as era-readiness context, not as a standalone champion predictor.

CIS = (team_3PA / team_FGA) (league_3PA / league_FGA) // Positive = above league average in 3PA share // Negative = mid-range/post-up identity (era-mismatched in modern game)

26-season backtest (2000–2025)

What CIS doesn't measure: Shot quality. A team can take a lot of bad threes and post a high CIS while losing. Pair with eFG% on 3PA, PDR, and possession-sovereignty reads for a quality-adjusted view.

9. Clutch Paradox Pending

Why shot-quality models systematically underrate ISO creators in the final two minutes.

The Clutch Paradox claim: shot-quality models (xPPP, EPV, Second Spectrum's open-shot models) all converge on "ISO is a bad play call" because ISO's PPP across all situations averages 0.886 — well below the 1.088 league-average possession value. But in the final two minutes of a close game, the alternative isn't a clean spot-up corner three — it's a broken-play turnover or a shot-clock violation. Stable closers (SGA, Brunson, Lillard, Curry) outperform model expectation precisely because they execute ISO when models say they shouldn't.

The framework's prediction: a player's gap between clutch FG% and regulation FG% is a stable, repeatable trait — not random noise. Plus-gap players are real "closers"; minus-gap players are not.

Why this one is tagged Pending

Clutch Paradox needs per-player clutch-time performance data (final 2 minutes, within 5 points). That's not in the basketball-reference scrape and isn't publicly available without hitting NBA.com Stats's leagueclutchplayerstats endpoint, which requires header-spoofing (User-Agent, Origin, Referer, x-nba-stats-token) — well-documented but not yet verified from this environment.

Methodology is documented and ready to run as soon as the data layer comes online: pull clutch player stats for 2015-16 through 2025-26, compute Δ FG% (clutch − regulation) for every player with ≥100 clutch FGA, run year-over-year repeatability test (framework predicts r > 0.3), then test against shot-quality model predictions. Estimated time once unblocked: 3–4 hours.

Until the backtest runs: Any team page that references Clutch Paradox frames it as documented framework, not yet quantitatively validated. No magnitude claims (e.g., "3.1% gap") get cited until the backtest is published.

10. Efficiency Tax Validated

Top-3 payroll concentration vs. championship outcomes — the structural fragility filter.

Efficiency Tax measures roster fragility through the lens of payroll concentration. The hypothesis: there's a sweet-spot band of top-3 player concentration that historical champions have lived inside, and rosters above the band are structurally fragile.

Threshold bands

Fragile
> 70% top-3 share
Sweet spot
55–70%
Under-concentrated
< 55%

26-season backtest (2000–2025)

Using top-3 player Win Share share as a proxy for payroll concentration (because pre-2010 historical salary data is incomplete), the result was the cleanest validation in the framework:

2025-26 RED zone (top-3 share ≥ 70%)

TeamTop-3 shareWinsNRtgTop-3 players
PHI74.9%45−0.1Embiid + George + Maxey (all availability flagged)
BOS71.4%56+8.1Tatum + Brown + White (Tatum Achilles, framework in real time)
GSW70.6%37−0.6Curry + Butler + Porzingis (missed playoffs at $200M+)

The 2025 OKC champion landed at 59.3% — right in the historical sweet spot. SGA at $38.3M (well below market value), Holmgren and Williams on rookie scale producing at All-Star level. This is the championship blueprint of 2025: concentration earned by performance, not assumed by salary.

What's not separately validated: The original framework specifies Efficiency Tax = top-3 share × top-3 injury risk. The concentration component is validated; the injury-risk multiplier is qualitative. The 2025-26 RED teams (PHI, BOS, GSW) all carry severe injury exposure on their top-3 — which is what actually triggers the fragility outcome the framework predicts.

How the stack composes

No single framework drives a recommendation. Every team-page call uses 3–4 of them in combination, organized around the kind of decision being made.

Contract / extension decision

SLS + GPI + CSG

SLS asks "will this player still be good in 3 years?" GPI asks "is the production real or empty?" CSG asks "are they actually on the floor?" A green-light extension passes all three. A walk-away fails any two.

Roster construction

Efficiency Tax + CIS + WEV

Efficiency Tax sets the concentration ceiling. CIS sets the era-fit floor. WEV scores the resulting roster against historical contender bands. The 2025 OKC build hits all three perfectly.

Playoff projection

PDR + Clutch Paradox + CPV

PDR identifies which archetypes will regress. Clutch Paradox identifies who actually closes vs. who fades in the final 2 minutes. CPV catches one-sided rosters that get exposed once defenses lock in over 7 games.

Aging / horizon

SSR + SLS

SSR is the cohort-level aging-curve read by archetype. SLS is the individual-player projection. Same underlying claim — skill ages, athleticism doesn't — viewed from cohort and player angles.

When a team page says "the framework call on this player is X," what's actually happening is 3–4 of the metrics above being applied in sequence and converging on a single read. If they don't converge, the page says so — and explains which framework is pulling which way.

Honest gaps in the stack

I'd rather you know the holes up front than discover them later. Three buckets:

Still blocked

  • Clutch Paradox — NBA.com Stats endpoint is firewalled at the analysis-environment level (verified 2026-04-30). Methodology fully documented; the unblock requires running the scrape from a residential connection or sourcing from a third-party clutch aggregator. Estimated 3–4 hours once unblocked.

Sensitivity work (refinement, not gap)

  • The four-input weights for SLS (0.30 / 0.25 / 0.30 / 0.15) are first-pass. Initial gut check: rankings stable, magnitudes could shift ±0.05.
  • The GPI penalty weights (×8 / ×1.5 / ÷8) are first-pass. Top-quartile rankings stable across the 10-year multi-season validation; mid-distribution is where weights matter most.
  • The WEV v3 component weights are now 0.30 / 0.60 / 0.10. DEV carries the heavier load because defensive identity is the more consistent championship separator; OEV is retained as a modern floor metric, not a separator.

Methodology extensions (would tighten confidence further)

  • GPI vs salary regression — joining GPI with multi-year salary data to flag overpaid empty-volume contracts. Most actionable extension queued.
  • Pre-2015 historical extension — the multi-season scrape covers 2016–2025. Extending to 2010–2015 would catch earlier canon cases (Carmelo NYK pre-2014, Aldridge POR, Drummond DET).
  • CSG v2 should weight long-term injury vs. load-management differently (current version is blunt).
  • CIS should incorporate shot quality (eFG% on 3PA), not just volume share.
  • The PDR archetype tagger uses a heuristic — a hand-validated archetype tag would catch borderline cases (Mikal Bridges currently mis-bucketed).

The 2026-04-30 multi-season scrape closed every multi-season backtest gap (GPI, PDR, SSR) and produced the most important framework finding in the methodology stack — the PDR reformulation that says all archetypes regress in playoffs, the question is which regress least. The remaining items on this page are sensitivity refinements and one off-sandbox unblock (Clutch Paradox), not foundational gaps.

DataDunkNBA Research

For teams, agencies, media desks, and decision-makers who need the framework applied to a real choice, DataDunkNBA Research offers one focused engagement: pre-draft, mid-season, or playoff framework reports for a single contracted team per cycle.

This is not a broad subscription product. Engagements are intentionally limited so the work can stay specific, useful, and conflict-aware. Read the consultancy page or email directly: bobby@datadunknba.com.

A note on what this is

This stack isn't proprietary genius. The component metrics (PER, BPM, WS/48, TS%, USG%, shot-share) all come from public data — basketball-reference, NBA.com, Cleaning the Glass. What I've built is the composition: which inputs go into which composite, what the threshold bands are, and what the historical signal looks like when you backtest the whole thing across 26 seasons of champions.

I do this because I love it. I'm a stay-at-home dad in San Diego with a Celtics season ticket habit, a Substack (DataDunkNBA), and roughly 1,000 hours of basketball-reference scraping behind me at this point. The framework stack is the artifact of that work. If it's useful to a front office, that would be the highest possible return on the time. If it's just a fun read for another GM nerd, that's enough too.

Either way — thanks for reading this far.

— Bobby Morong, June 2026