← All findingssource · memory/project_slip_builder.md
Building a slip builder on nightlypicks.com: user taps game → player → prop → side → line → their book, each leg gets GREEN/AMBER/RED, plus slip-level checks no single-bet tool can do (same player twice, same game same direction, total exposure). Chosen over a CLI because that's where bets actually get built and it works from a phone.
Why this and not more modeling (from the 2026-07-24 11-agent audit — see project-decision-layer-audit): price is the only signal that survives significance in ~21k graded bets (realized CLV<0 → n=603, 49.3%, −12.58% ROI, t=−3.44). grade_v2's out-of-time Brier beats its own raw market input by 0.00009. So price-vs-consensus blocks; every model signal is advisory.
User decisions (locked 2026-07-25):
- One-book lines → AMBER (warn, let through), not red.
- Tipped games → hard RED, no in-play checking.
- v1 covers props AND game lines (moneyline/spread/total).
- Defaults taken: guests see color + one sentence, numbers gated; slip is device-local; ledger logging deferred until the manual-pick scoring bug is fixed.
Where the logic lives: grading-service Go (internal/verdict), NOT the
Next.js frontend. The exact consensus rule already exists correct in
internal/formulas/grade_market.go; a TypeScript copy would be a fifth
divergent implementation (nightly-mcp verify.py, sport-agents blog_generator.py,
debate-service-v2 orchestrator.go, grading-service disciplined.go already
disagree). grading-service has wildcard CORS so a browser calls it directly.
Phases: 1) board + picker page (~3d) · 2) price verdict (~1.5d) · 3) slip-level checks (~1d) · 4) hardening + gating (~1d) · 5) tune on first live slate · 6) optional ledger logging.
SHIPPED 2026-07-25 — phases 1-3 done, NOTHING PUSHED OR DEPLOYED.
grading-service, branch slip-verdict-engine (2b8fb4f, 2121e04, bb67cef):
internal/oddsclient (first exported odds reader + 60s TTL/single-flight),
internal/verdict (latch, board, price, sanity, ladder, slip-level checks).
Routes: GET /verdict/board?league&date&as_of, POST /verdict/slip.
21 tests incl. a 102-real-leg sweep. Full suite green.
nightly-picks, branch slip-builder-page (1925557, ec8acab): /slip page,
/api/slip/check proxy, src/lib/slip-format.ts (types+pure) vs
slip-board.ts (server-only fetch), DIME-native CSS.
as_of replay (RFC3339) rewinds the market to before tip — the only way
to exercise this between slates, and it corroborates the latch (at 20:00Z the
two 18:00Z matinees read started, the four evening games don't).
Verified: A'ja Wilson o23.5 pts FanDuel -118 → "DON'T — 4 books put this at about 51%, but -118 needs 54%. DraftKings has -115." (-3.3pp).
Remaining: phone viewport UNVERIFIED (window wouldn't shrink); game lines (moneyline/spread/total) not built — props only so far; guest gating; deploy; ledger logging (still blocked on picks_manual.go:246).
Related: feedback-devig-phantom-edge, feedback-check-line-edges-before-quoting, feedback-model-edge-calibration, project-multi-formula-clv-harness.