← All findingssource · memory/project_kelly_staking.md
nightlyhoops_build_plan.md §8's core principle: "the stake IS the grade — no separate A/B/C system that can disagree with the math." Before this, nightly-picks' served stake was a hand-authored 1u/0.5u table keyed by which FORMULA produced a pick (core vs list), completely disconnected from grade_v2's calibrated p_hit — the exact anti-pattern the plan forbids, which was already shipping in prod.
Shipped grading-service commit c13ef1d + nightly-picks commit d78fae0 (2026-07-09). New internal/kelly package (quarter-Kelly, f* = (p*b-(1-p))/b, off internal/grademodel's p_hit) wired through all 3 capture paths (fanout Runner, manual picks, slate capture) and both read APIs (/picks/nightly, /clv/picks). Migration v20 adds bet_clv.kelly_stake_units. Frontend (nightly-picks/src/lib/picks-data.ts) prefers it via stakeFor(), falling back to the legacy tier default only for unscored rows (!= null check, since 0 is a real "don't stake this" answer).
NOT yet parameter-uncertainty-adjusted — fractional Kelly off the point p_hit only, not a full posterior (that data doesn't exist upstream; project_market_anchored_simulator is the eventual source once it produces real distributions instead of point estimates). Built despite the Pass-1 kill gate saying neither model currently beats market-echo — user explicitly approved building #7-9 "anyway" as infra-ahead-of-model, same posture as project_wnba_eb_shrinkage.