← All findingssource · memory/project_disciplined_slate_card_prototype.md
User wants a disciplined per-game player-props card ("Top Plays — survived everything") surfaced to users on nightly-picks (the picks site / thesweat.app), NOT nightlyhoops (which is editorial-only by design brief). Decision 2026-05-30: prototype across one full slate first, then decide on wiring.
Slate result 2026-05-30: discipline held — out of ~35 players it promoted exactly 2 (both WNBA Pinnacle rebound leans). NBA G7 best = ~3% Pinnacle reb/ast leans (the dedicated run surfaced Fox REB o3.5 as lone survivor).
STATUS 2026-05-30 (steps 3+4 BUILT, code only, on grading-service branch disciplined-formula-clv, UNCOMMITTED, NOT deployed):
- CLV (A): added TWO formulas to grading-service project_multi_formula_clv_harness. (1)
disciplined= deterministicboth_agree+ odds-sanity gate (median-consensus miskey/extreme-juice/book-disagreement kill) —internal/formulas/disciplined.go, registered inDefaultAutoFormulas()(cron auto-runs it). (2)disciplined_llm= participant stub (disciplined_llm.go) for the LLM-verified projection card, added to theallowedManualFormulaswhitelist inhandlers/picks_manual.go; picks POST to/api/v1/picks/manual. Three-way A/B: both_agree vs disciplined vs disciplined_llm. Builds +go testpass (runner_test updated to expect 5 auto-formulas). - CLV UI: added a "by formula (A/B)" view toggle to the existing
/clvdashboard (handlers/clv_ui.go) — fetches/api/v1/clv/by-formula, flattens leagues→formulas, renders per-formula rows (n / n_close / n_settled / ROI / hit / avg CLV / CI95 / traffic-light status) so both_agree vs disciplined vs disciplined_llm compare side-by-side on the SAME games. (Before:/clvonly showed league×prop_type; per-formula data was API-only.) Builds; embedded JS node --check clean. - [internal detail removed]
- Producer/injector (in /tmp/slate, ephemeral):
disciplined_writer.py(→disciplined_picks display table, lives),clv_inject.py(→bet_clv as disciplined_llm:--emit-sqlbackfill OR--post-jsonfor the endpoint).
GATED ON DEPLOY (user infra): all of A+B is code; nothing runs until grading-service branch deploys. Then: cron auto-runs disciplined; producer POSTs disciplined_llm to the live endpoint; nightly-picks reads the live /disciplined API. NOTE: raw-SQL insert into the shared bet_clv table was correctly BLOCKED by the auto-mode classifier — use the sanctioned POST /api/v1/picks/manual (now whitelisted) post-deploy, not raw SQL. The isolated disciplined_picks table write WAS allowed (G7 row live).
REMAINING: (a) commit + deploy the grading-service branch; (b) run the producer/injector on the live endpoint once deployed; (c) optionally set nightly-picks DISCIPLINED_FORMULA_ID + promote G7 row status draft→published to view; (d) WNBA still blocked on projections-engine port (Phase 11, project_wnba_projections_playbook) + thin Pinnacle — NBA-only for now.
Why: validates that the both_agree + survived-verification gate produces honest, sparse output instead of the over-claimed edges the existing best_bets path tends to surface (see feedback_check_line_edges_before_quoting, feedback_model_edge_calibration). Connects to project_multi_formula_clv_harness (the empirical successor) and project_projections_engine_state.