Product identity + widen books for DISPLAY, model input byte-identical

IDENTITY (CLAUDE.md top + MASTER-PLAN header). VYNDR is a PREDICTIVE MODEL:
it projects what a player will DO and picks accurately. Market edge is a
BYPRODUCT of a good prediction, never the success criterion. Success =
the forecast is honest about its own confidence AND still ranks --
calibration and resolution, both. No edge/CLV term belongs in a pass/fail
gate; they are diagnostics we report, not thresholds a model must clear.
A model tuned to beat a closing line has been fitted to the market instead
of to the game.

Per-sport doctrine (Phillips 2022, classify by what players DO not by
position): each sport is its own model -- own variables, archetypes,
conditions, calibration, honest ceiling. Shared across sports: ONLY the
Bayesian inference math.

Truth Law: no fabricated data; honest-absent over invented; label
limitations in-band; provisional stays provisional until re-run;
documented is not verified.

PHASE 2 -- AGGREGATOR WIDENING (live). normalizeProps now emits every
DISPLAY book instead of 5 of 18. Before this we discarded 13 books of our
own accord and 64.8% of the MLB slate was invisible to users. Every prop
carries book_role (both/takeable/reference/dfs/offshore) so the display
layer can say WHAT a price is -- a fixed-payout DFS number and a two-way
sportsbook price are not interchangeable objects. Unknown books are still
dropped.

PHASE 3 -- MODEL GATE (the model does not move). bookRoles splits
MODEL_BOOKS (the legacy allow-list, character for character) from
DISPLAY_BOOKS. Both model paths re-filter before they pick a line:
gradeSlateService.dedupeProps (before first-row-wins AND before the limit)
and intradayRefreshService.indexOddsProps (which RE-GRADES at the current
line -- without the gate, widening would have silently moved locked lines
onto books the model has never been calibrated against). A test asserts
the graded set is byte-identical through the widening.

CURRENT_RULER_VERSION stays v1_first_book. The gate lifts only when the
MLB calibration is re-run on the consensus ruler and v2 is promoted.

HONEST FRAMING, recorded in the plan: this is an AGGREGATOR win and it
does NOT fix the model. WNBA still abstains -- a model problem, not a
coverage problem; it is better covered than MLB. MLB isotonic still
provisional. The consensus is MARKET, not SHARP: pinnacle, matchbook and
polymarket are 0% on both sports, so no sharp anchor exists in our feed.

Two superseded tests updated to stronger properties rather than deleted:
roleOf now names the KIND of book, and the normalizer test asserts the
display set widens WHILE the model set does not.

Gates: 4,027 tests / 322 suites green; next build exit 0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QJs13VsyiSKYQP6rj3NNmc
This commit is contained in:
Kev
2026-08-01 00:50:54 -04:00
parent 1372e6bcf7
commit f0543b57a4
9 changed files with 278 additions and 18 deletions
+59 -1
View File
@@ -1,6 +1,64 @@
# VYNDR — MASTER PLAN
**Single source of truth. Sessions EXECUTE against this and UPDATE it in place.**
Created 2026-07-31 by consolidation. Nothing built in this pass.
Created 2026-07-31 by consolidation. Last updated 2026-08-01.
---
## 🔷 PRODUCT IDENTITY — the thing being built
**VYNDR IS A PREDICTIVE MODEL.** It projects what a player will **DO** and picks
accurately — reading and pulling the market apart. Student of the game, and an
aggregator.
**Market edge is a BYPRODUCT of a good prediction, NEVER the success criterion.**
> **SUCCESS = the forecast is honest about its own confidence AND still ranks.**
> Calibration *and* resolution. **No edge/CLV term belongs in a pass/fail gate** —
> they are diagnostics we report, not thresholds a model must clear to ship.
**PER-SPORT DOCTRINE** (Rashad Phillips, *Basketball Position Metric*, 2022 —
classify players by **what they do**, not position labels): each sport is its OWN
model, with its own variables, archetypes, conditions, calibration and honest
ceiling. Shared across sports: **only the Bayesian inference math.**
**TRUTH LAW:** no fabricated data anywhere · honest-absent over invented · label
limitations in-band ("market consensus, **not sharp**") · **provisional results
stay provisional until re-run** · documented ≠ verified.
---
## ▶ NEXT EXECUTABLE ORDER
**The MLB calibration RE-RUN against the consensus ruler.** Everything
model-shaped is downstream of it:
- MLB isotonic `p_win` cannot promote until re-run (it was calibrated against
`v1_first_book`).
- The newly-visible props cannot feed the model until it promotes.
- Every edge/CLV number resets to `ruler_version = v2_consensus` at that boundary
and **must not be pooled** with what came before.
*Blocked on nothing. This is the next build.*
---
## 📍 STATE AS OF 2026-08-01 (Order Zero, measured on prod with the real key)
| finding | number | what it means |
|---|---|---|
| **MLB slate invisible to us** | **64.8%** | our own allow-list, not the feed — now widened for DISPLAY |
| **books/prop, MLB** | 3.61 feed → 0.57 after filter | the filter cost, quantified |
| **books/prop, WNBA** | **4.21** feed → 1.20 | **WNBA is BETTER covered than MLB** |
| **consensus ruler** | **MARKET, not SHARP** | `pinnacle`/`matchbook`/`polymarket` = **0%** on both sports. No sharp anchor exists in our feed. Permanent limitation, not a milestone |
| **ruler delta** (consensus incumbent) | MLB mean +1.50 pts, median 0, **17% of props move ≥5 pts** | rulers genuinely differ; "better" is unproven |
| **MLB isotonic `p_win`** | **PROVISIONAL** | calibrated on the bent ruler; does not promote until re-run |
| **WNBA** | **still abstains** | a MODEL problem, not a coverage problem — coverage was never its constraint |
| **soccer** | **settles** — ~15 competitions, 30d | "grades into a void" is a **$19/mo Pro-tier** problem, not a data problem |
| **CLV + results feeds** | `/odds/closing` + `/movement` **redacted**; `/results` + `/exports/resolved-props` **403** | free tier behaving exactly as its contract says |
| **accrual clock** | **sequential, post-completion** | see §11. Pre-completion data does not count and is never pooled |
**The honest framing:** widening books is an **AGGREGATOR** win. **It does not fix
the model.** Do not let the free-side win read as model progress.
> **HOW TO USE:** this supersedes ad-hoc re-derivation. Before any order, read the
> phase you're in. After any order, tick the item and add one line. **Do not