Session 56: Full audit — PropLine + boxscore + pipeline + sport coverage (2289 tests)

Research (verified against live MLB Stats / ESPN / The Odds APIs):
- specs/propline-audit.md — every stat_type mapped against our 4-layer pipeline;
  real MLB boxscore fields; sport coverage status; pipeline gap analysis.
- specs/vyndr-roadmap.md — priority-ordered Sessions 57–64 + coverage targets.
- scripts/propline-audit.js + specs/audit-data/ (raw capture).

Headline bug: oddsNormalizer mapped batter_rbis → 'rbis' while the whole
grade/feature/outcome chain keys on 'rbi' — every PropLine RBI prop silently
failed to grade AND settle. Fixed (+ regression test).

Phase 4 — wired missing MLB stats end-to-end:
- PropLine MLB markets 6 → 12 (+runs, walks, doubles, earned_runs, hits_allowed,
  outs — same request, no extra quota).
- doubles/outs/triples added to featureCache + outcomeService MLB_LOG_FIELD and
  all three grade whitelists (analyze/scan/validation.py).

Phase 6 — pipeline resilience:
- opsNotify.js: ntfy alerts (never throws, test-disabled). Snapshot success/
  stale/failure alerts; retry-once on hard odds error (not on empty slate).
- Missed-cron watchdog (mostRecentExpectedSlot/isSnapshotOverdue); status probe
  now returns `overdue`.

Coverage truth: MLB is the only end-to-end-live sport; outcome settlement is
MLB-only (WNBA/NBA/soccer never settle) — documented as the #1 roadmap gap.

Backend 2276 → 2289 tests (+13). Web build exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Kev
2026-07-10 17:00:29 -04:00
parent d09a06c054
commit 2ae8a5697e
21 changed files with 1607 additions and 11 deletions
+46 -3
View File
@@ -4,9 +4,52 @@
2026-07-10
## Current Phase
SHIP BUILD v55.0 — Product overhaul: the self-learning loop (outcome tracking +
accuracy) + the real-time layer (auto-refresh, freshness, live signals) + landing
top-signals preview. Founder-pricing expiry restored.
SHIP BUILD v56.0 — The full data audit: PropLine/boxscore/pipeline inventory,
rbis→rbi fix, +6 MLB markets, doubles/outs wired end-to-end, ntfy alerting +
retry + missed-cron detection, master roadmap.
## Session 56 (2026-07-10) — SHIPPED ✅ THE FULL AUDIT
Backend 2276 → **2289 tests** (+13), 197 suites. Web build clean (exit 0).
Docs: `specs/propline-audit.md`, `specs/vyndr-roadmap.md`,
`specs/audit-data/propline-audit-raw.json`, `scripts/propline-audit.js`.
### Research (Phases 13, 5) — verified against LIVE APIs
- Fetched real data: The Odds API `/v4/sports` (in-season now: MLB, WNBA, NFL
preseason, NBA summer league, 40+ soccer leagues; NHL dark), a real MLB boxscore
(Braves@Pirates 2026-07-09 — every settle field confirmed), ESPN WNBA/soccer
scoreboards. PropLine inventory derived from code (no dev keys).
- **Headline bug found:** `oddsNormalizer` mapped `batter_rbis → 'rbis'` but the
entire grade/feature/outcome chain keys on `'rbi'` → **every PropLine RBI prop
silently failed to grade AND settle.** Fixed.
- Coverage truth: **MLB is the only end-to-end-live sport.** Outcome settlement is
MLB-only (WNBA/NBA/soccer never settle → accuracy is MLB-only). Documented as
the #1 roadmap gap.
### Phase 4 — wired missing MLB stat types (a full vertical slice)
- `batter_rbis → rbi` (unblocks a market already requested).
- PropLine MLB MARKETS 6 → 12: +batter_runs, +batter_walks, +batter_doubles,
+pitcher_earned_runs, +pitcher_hits_allowed, +pitcher_outs (same request, no
extra quota; runs/walks/earned_runs/hits_allowed were already supported
downstream — just never asked for).
- `doubles` + `outs` (+`triples`) added to featureCache + outcomeService
MLB_LOG_FIELD AND all three grade whitelists (analyze/scan/validation.py).
### Phase 6 — pipeline alerting + resilience
- **`src/utils/opsNotify.js`** — ntfy.sh push (`vyndr-pipeline-kev2026`), never
throws, auto-disabled under test / `PIPELINE_ALERTS=0`. Injectable `fetchImpl`.
- `snapshotService.runSnapshot`: success alert ("✅ MLB snapshot: N graded, D
deltas, X% accuracy"), stale alert (empty slate), failure alert; **retry-once**
on a hard odds error/null (NOT on a legit empty slate — that's off-hours, not a
failure).
- **Missed-cron watchdog:** `snapshotScheduler.mostRecentExpectedSlot` +
`isSnapshotOverdue` (pure, tested); the tick alerts once per missed slot; the
status probe (`GET /api/internal/snapshot/status`) now returns `overdue`.
### Phase 7 — the master roadmap
`specs/vyndr-roadmap.md` — priority-ordered Sessions 5764 (WNBA/NBA settlement →
ESPN features → soccer e2e → live calibration → NFL/NBA readiness), stat-type +
sport coverage targets, operating invariants.
## Session 55 (2026-07-10) — SHIPPED ✅ SELF-LEARNING LOOP + REAL-TIME LAYER