Rules Coverage & Accuracy
Exactly what the engine models, what's approximate, and what isn't modeled yet — verified by 100 unit tests against the CBA's own text, and by replaying real 2026 free-agency moves through the engine. No hand-waving.
✓
Modeled & tested
(30)Enforced by the rules engine and covered by unit/golden tests.
- ✓2026-27 official thresholds: cap, luxury tax, first apron, second apron, MLEs, BAE, minimums
- ✓All exception / tier amounts cross-checked against the CBA's own %-of-cap formulas (BAE 3.32%, NT-MLE 9.12%, Room MLE 5.678%, Taxpayer MLE, min-team 90%, max 25/30/35%)
- ✓Trade salary matching — expanded bands (200%+$250k / outgoing+$7.5M / 125%+$250k)
- ✓Apron teams limited to 100% matching (no 110%)
- ✓Below-cap absorption capped at cap+$250k (or standard matching if larger)
- ✓Hard-cap triggers: NT-MLE / BAE / sign-and-trade → first apron; Taxpayer MLE → second apron
- ✓Second apron: no aggregation (bin-packing combination test), no cash out; exact-boundary tiers use strict 'exceeds'
- ✓Exception gating by apron tier: cap room, NT-MLE, Taxpayer MLE, Room MLE, BAE, minimum, Bird
- ✓Maximum-salary tiers by years of service (25% / 30% / 35%)
- ✓Bird / Early-Bird / Non-Bird re-signing ceilings (175% / 120%-of-prior-or-min, etc.), with each FA's real Bird-rights status and UFA/RFA designation
- ✓Multi-year committed-salary cap sheet (4 seasons per team)
- ✓Veteran extension & extend-and-trade first-year ceilings (140% / 120% of prior-or-estimated-average)
- ✓Renegotiation ceiling (under-cap teams only, raise limited to cap room) and the stretch provision (2N+1 years, 15%-of-cap guardrail)
- ✓Renounce free-agent cap holds to drop below an apron / open cap space; a kept own-FA hold converts to salary on re-sign (no double-count), and renouncing forfeits Bird rights
- ✓Contract extensions add future years at the veteran-extension ceiling (140% rule, 8% raises)
- ✓Free-agent cap holds by Bird status (Non-Bird 120% / Early-Bird 130% / Bird 150–190%)
- ✓Trade eligibility: a free agent signed this offseason is trade-restricted; a just-acquired player can't be aggregated for ~2 months
- ✓MLE / exception consumption tracking within an offseason session
- ✓Sign-and-trade acquisition: second-apron block + first-apron hard cap on the acquiring team
- ✓Base-year compensation: re-sign your own FA to a >20% raise over the cap, then trade — outgoing value = max(50% of new salary, prior salary)
- ✓Trade kicker bonus boosts the acquiring team's incoming matching value (applied when kicker data is present)
- ✓Sign-and-trade outgoing leg: build a return package to the FA's old team — validates both the acquirer's first-apron hard cap and the old team's salary matching
- ✓Pick-ownership ledger: executed trades actually transfer draft picks; boards show real inventory
- ✓Ted Stepien rule against full pick inventory — sees picks traded in PRIOR moves, not just the current proposal
- ✓Restricted free agents: Gilbert Arenas first-year cap (1-2 YOS → NT-MLE) and a real match flow — the original team can match your offer sheet and keep the player at your terms
- ✓Roster limits: 21-player offseason hard cap on signings, 15-by-opening-night warning
- ✓Sign-and-trade contracts enforce the 3–4 season term (§8(e)(1)(ii)) AND the acquirer must have room or match salary with the return package (§8(e)(1)(vii))
- ✓Trade freezes per Art. VII §8(d)/(f): rookie signings 30 days; FA signings Dec 15; over-cap Bird re-signs at >120% until Jan 15; extensions beyond extend-and-trade limits 6 months; matched RFA offer sheets one year (§5(j))
- ✓Renegotiation Mar–Jun blackout window
- ✓Validated against reality: every real July 1, 2026 trade, sign-and-trade, and signing replays as legal through the engine (see lib/realmoves.test.ts)
~
Approximate
(7)Directionally correct; limited by available data. Flagged in-app.
- ~Bird sub-type is sourced from public free-agent listings for ~half of free agents; the rest default to full Bird
- ~Rookie-scale salaries are scaled estimates until the official 2026 scale posts
- ~Team salary totals include some non-guaranteed / dead-money rows from the source
- ~Years of service covers ~91% of players; the rest default to a mid-career value
- ~Early-Bird / extension average-salary alternative uses an estimated figure until the official one posts
- ~Trade-value numbers (5–99) estimate production vs. contract — wins produced, dollar-valued, against salary, term, and age — calibrated to real 2026 deals; directional, not gospel
- ~Draft-pick trade values project the origin team’s slot from roster strength (mean-reverting for far-out years) onto a rookie-contract surplus curve — same units as player values
✗
Not yet modeled
(7)Real CBA rules on the roadmap — the honest gap to front-office-complete.
- ✗Pick protections & swap rights on ledger picks (protections shown in deal text; the ledger tracks unprotected ownership)
- ✗The >10%-renegotiation-blocks-a-later-extension rule
- ✗Traded-player exceptions as separate expiring objects
- ✗Likely vs. unlikely incentives in matching / apron math
- ✗Second-round pick exception & two-way contracts as signing mechanisms (reconciled from real data, not user-simulable)
- ✗Poison-pill provision (engine function exists; not wired to the trade UI — needs structured extension data)
- ✗Designated-player criteria (All-NBA/MVP triggers, 6-year DV extension length)