← All findingssource · memory/project_daily_props_tool.md
Built daily_props.py (2026-06-01) so we STOP hand-rolling ad-hoc Python every
day. User explicitly asked: "I ask this every day, why not a re-usable flow?"
Why: the daily flow was the same 6 steps each time (games → snapshots →
scout↔diagnostic↔injury join → de-vig → discipline gates → ranked board).
How to apply: one self-contained, stdlib-only CLI:
python3 daily_props.py [league] [YYYY-MM-DD] (defaults wnba/today). It:
- data-hydrator games-by-date → snapshots (force-refresh).
- odds-service
/api/v1/odds/props/bulk(see reference_odds_service_wnba_route) → Pinnacle-first de-vig. - Joins scout pick ↔ recency line_edges ↔ injuries ↔ sharp de-vig.
- Verdicts: VALUE (+EV vs sharp), LEAN (agree but juiced), WATCH (recency↔market gap = role shift), FADE (thin/stale/line-moved), CONFLICT (sharp disagrees). Encodes feedback_active_tonight_gate, project_methodology_lockdown, feedback_check_line_edges_before_quoting, feedback_model_edge_calibration.
CRITICAL BUG caught + fixed during the build: de-vig must only compare book
prices AT THE SAME LINE you're betting. v1 grabbed the "best" under price across
books regardless of each book's line — a soft book's under-8.5 at +104 got scored
as a +4.4% edge on an under-9.5 bet. That manufactures fake +EV plays EVERY day.
Fix: odds_for() filters quotes to the market current_line and reports
SCOUT@x→MKT@y when the scout's captured line is stale. Lesson generalizes:
never compare prices across different lines/props.
STILL TODO: pick install location (user's call) + optional /props skill wrapper;
optional --file mode to grade saved pre-game snapshots vs results. Currently at
/tmp/daily_props.py. Related to project_disciplined_slate_card_prototype.