From c98338ef23f17ff2c54c4e43adfd86f3714cfc90 Mon Sep 17 00:00:00 2001 From: Kev Date: Fri, 31 Jul 2026 22:35:16 -0400 Subject: [PATCH] =?UTF-8?q?plan:=20add=20=C2=A710=20=E2=80=94=20aggregator?= =?UTF-8?q?=20+=20paid-model=20gaps,=20and=20the=20one=20root=20cause=20be?= =?UTF-8?q?hind=20both?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Answers "what makes this the top product, not just a finished one." THE REFRAME: the aggregator gap and the model gap are the SAME gap in two places. Our "market" is often ONE book — MLB props are 73% single-book, and proplineAdapter sends only {apiKey, markets} with NO regions/bookmakers param (:152), so we take PropLine's default response. That single fact causes four problems we had been treating as unrelated: no line shopping (the category's #1 free hook), a fair_prob_lock that is a de-vigged single soft book rather than a consensus (the bent ruler the model is judged against), weak CLV (cannot measure beat-the-close against one book), and no steam/disagreement detection (needs >=2 books to exist). So the highest-leverage unblocked action in the whole plan is a cheap API test: does PropLine return more books with a regions/bookmakers param on our tier? One request, and if it works it upgrades the free product, the model's denominator and the CLV instrument simultaneously. Aggregator gaps catalogued: book breadth, true consensus, historical odds archive (started — closing_captures 844k rows, lock_lines new, but in-grade history capped at 24 points, so no full open->close series), market breadth (11 live vs the category's 50+), ingested alt-line ladders, injury/lineup wire, player news. Paid-model gaps catalogued: distribution instead of a point (distribution.js already computes survival probabilities and rungs but is proj-v1.1, ledger-only and lost to the champion); opportunity/playing-time projected FIRST with its own uncertainty (the single biggest available modelling gain); per-stat models instead of one additive index; matchup granularity that actually reaches the grade; applied calibration; a backtest harness (blocked by the archive gap — you cannot backtest a price you never stored); CLV as north star. THE PATTERN: almost every model capability is ALREADY BUILT AND DISCONNECTED. VYNDR does not have a building problem, it has a connection-and-proof problem plus one genuine ingestion gap that starves both halves. The expensive part is largely done, but no new feature fixes it. Ordering principle recorded: get MLB genuinely good BEFORE replicating across six sports — a copied-six-times thin model is six times the maintenance for the same absent edge. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01QJs13VsyiSKYQP6rj3NNmc --- specs/MASTER-PLAN.md | 101 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/specs/MASTER-PLAN.md b/specs/MASTER-PLAN.md index 31c17cc..d70b95e 100644 --- a/specs/MASTER-PLAN.md +++ b/specs/MASTER-PLAN.md @@ -241,3 +241,104 @@ at adequate n*, on one sport, with a projection whose best layers aren't connect accrued data that we cannot rush** — and the discipline to report that verdict honestly if it says the edge isn't there. The plan above builds the machine. Only time and honest measurement decide whether the machine is right. + + +--- + +# 10. TO BE A REAL AGGREGATOR *AND* A MODEL PEOPLE PAY FOR + +*Kev's question: what makes this the top product, not just a finished one. The +answer that matters most: **the aggregator gap and the model gap are the SAME gap +in two places.** Fix the data breadth and both halves improve at once.* + +## 10.1 The one finding that reframes everything + +**Our "market" is often ONE book.** MLB props are **73% single-book** (2.18 audit). +And `proplineAdapter` sends only `{ apiKey, markets }` — **no `regions`, no +`bookmakers` param** (`:152`). We take PropLine's *default* response. + +That single fact causes four separate problems we have been treating as unrelated: +1. **No line shopping** — the #1 free-tier hook in this category needs many books. +2. **`fair_prob_lock` is a de-vigged SINGLE SOFT BOOK**, not a consensus. That is + the ruler the model is judged against — a bent one. (Flagged as T1; never run.) +3. **CLV is weak** — you cannot measure "beat the close" against one book's close. +4. **No steam/disagreement detection** — needs ≥2 books to even exist. + +**So the highest-leverage unblocked action in the whole plan is a cheap API test: +does PropLine return more books with a `regions`/`bookmakers` param on our tier?** +It is one request. If yes, it upgrades the free product, the model's denominator, +and the CLV instrument simultaneously. + +## 10.2 What a real DATA AGGREGATOR has that we don't + +| capability | ours | gap | +|---|---|---| +| **Book breadth** | 5 MLB / 2 WNBA, 73% single-book | the category runs 10–20. **Root gap (10.1)** | +| **True consensus / no-vig line** | single-book de-vig | needs breadth first | +| **Historical odds archive** | **STARTED** — `closing_captures` 844k rows, `lock_lines` (033) new, in-grade history capped at **24 points** | no full open→close series per prop. This is what makes CLV and backtesting real | +| **Market breadth** | 11 live markets | the category ships 50+ (alt lines, combos, innings, quarters) | +| **Alt-line ladders from books** | we *compute* a ladder; we don't *ingest* the books' | users shop rungs | +| **Injury / lineup wire** | partial (`depthChart`, confirmed-vs-projected) | no real-time news wire | +| **Player news** | `NewsWire` on Explore | not beat-level, not per-prop | + +**None of this is model work. It's ingestion.** And it is the half competitors +compete on hardest, because it is visible to a free user in five seconds. + +## 10.3 What a prediction model people PAY for has that we don't + +1. **A distribution, not a point.** We project a point (l5/l20 average) and take + an empirical `P(over)`. Paid-tier models simulate a **full distribution per + stat** (negative-binomial / Poisson / MC). **We already have this** — + `projection/distribution.js` computes real survival probabilities and a rung + ladder — but it is **proj-v1.1, ledger-only, and it lost to the champion.** The + asset exists; it is unconnected and unproven. +2. **Opportunity modelled FIRST.** In props, playing time is the dominant driver — + plate appearances, snaps, minutes, batting-order slot. We carry `ab_per_game` + and minutes as *features*, not as a **projected opportunity** with its own + uncertainty. This is the single biggest modelling upgrade available. +3. **Per-stat models.** Hits, strikeouts and total bases have different shapes. + One additive factor index across all of them is why the ladder is meaningless. +4. **Matchup granularity that actually reaches the grade.** Arsenal, handedness, + park, weather, platoon — **all built, all challenger-only, none feed the grade.** +5. **Calibrated probabilities with honest intervals.** Measured (isotonic + qualifies on MLB) — **not applied.** +6. **A backtest harness on real historical odds.** Blocked by 10.2's archive gap: + you cannot backtest a price you never stored. +7. **CLV as the north-star metric**, published honestly. Instrument built, + guard-blocked, and weak until book breadth lands. + +## 10.4 The uncomfortable pattern + +**Almost every model capability above is ALREADY BUILT and DISCONNECTED**: +similarity, Bayesian, archetypes, park/weather/platoon, the distribution ladder, +calibration. VYNDR does not have a *building* problem. It has a **connection and +proof** problem — plus one genuine ingestion gap (book breadth) that starves both +halves at once. + +That is good news: the expensive part is largely done. But it also means **no new +feature fixes this.** Connecting the layers and proving them on held-out data is +the work. + +## 10.5 If I had to order it for "top product" + +1. **Book breadth test + consensus fair line** (10.1) — one API call to find out; + upgrades aggregator, model denominator and CLV together. +2. **Opportunity projection** (10.3.2) — the biggest genuine modelling gain. +3. **Per-stat distributions** — connect `distribution.js`, prove per stat. +4. **Connect the built layers** (Phase 1) — each proven on held-out or left off. +5. **Full odds archive** — store every book's open→close; unlocks backtesting. +6. **Market breadth** — 11 → 50+ markets is mostly ingestion + the 4-layer wiring. +7. **Then** the sports rollout, on a template that is actually worth replicating. + +**The ordering principle:** do not replicate a thin model across six sports. Get +MLB genuinely good first — a copied-six-times thin model is six times the +maintenance for the same absent edge. + +## 10.6 The honest caveat on "top product" + +The category's leaders are judged on one number: **do their picks beat the closing +line, at scale, published.** We cannot claim that yet — not because the product is +unfinished, but because **we have not measured it at adequate n on a market we can +trust.** Book breadth + the odds archive + accrued settlements are what make that +claim *possible*. Everything in §10 is in service of being able to make it — or of +being able to say honestly that we can't.