diff --git a/specs/STATE.md b/specs/STATE.md index 11fa656..1f78f56 100644 --- a/specs/STATE.md +++ b/specs/STATE.md @@ -331,6 +331,74 @@ > **HELD:** edge_pct rescale/retirement (Order B) Β· board columns/contract unchanged Β· tier-keyed proxy > caching. Dashboard visual is auth-gated β†’ TAGGED FOR THE CHROME AUDIT, not faked. +> ## πŸ”¬ C1 β€” TAKEABLE FLOOR DERIVATION 2026-07-30 (report-only): **CANNOT DERIVE β€” the data does not support ANY floor number** +> Read-only. Nothing tagged, built, or changed. **The SHAPE (floor on minus, uncapped plus) is Kev's +> ratified call and is not in question β€” this order could not supply the NUMBER, and says so rather +> than dressing a guess as a derivation.** +> **0.1/0.2 POPULATION β€” VERIFIED.** MLB decided (hit/miss) **OVERS = 296**, Jul 11-30, and **100% +> carry `locked_odds`** (0 missing β€” the floor is about the price you could actually bet). **METHOD +> NOTE:** derived over ALL prices, NOT pre-filtered to the current βˆ’160..+200 band β€” pre-filtering +> would be CIRCULAR and would empty the very deep buckets the floor must judge. +> **PHASE 1 β€” ROI BY LOCKED PRICE (flat 1u, 95% CI on the mean return):** +> | bucket | n | hit% | breakeven% | **ROI%** | 95% CI | +> |---|---|---|---|---|---| +> | +200 and up | 39 | 20.5 | 22.0 | **βˆ’13.15** | [βˆ’68.6, +42.3] | +> | +100..+199 | 51 | 52.9 | 44.5 | **+19.31** | [βˆ’12.0, +50.7] | +> | βˆ’110..+99 | 8 | 62.5 | 51.3 | +21.60 | [βˆ’48.2, +91.4] **TOO THIN** | +> | βˆ’111..βˆ’135 | 32 | 50.0 | 55.8 | **βˆ’10.55** | [βˆ’42.1, +21.0] | +> | βˆ’136..βˆ’160 | 43 | 53.5 | 60.1 | **βˆ’11.68** | [βˆ’36.6, +13.2] | +> | βˆ’161..βˆ’200 | 71 | 69.0 | 64.6 | **+6.46** | [βˆ’10.3, +23.2] | +> | worse than βˆ’200 | 52 | 73.1 | 69.7 | **+4.75** | [βˆ’12.7, +22.2] | +> **πŸ”΄ THREE FINDINGS THAT BLOCK A DERIVED FLOOR:** +> **(1) EVERY 95% CI CONTAINS ZERO.** Not one bucket is statistically distinguishable from zero ROI. +> Phase 2 asked for "the deepest price where ROI is still positive WITH MARGIN" β€” **no such bucket +> exists.** Any floor drawn here is drawn through noise, which this order explicitly forbids. +> **(2) THE CURVE IS NON-MONOTONE AND RUNS OPPOSITE TO THE PREMISE'S MODEL.** The premise reasons that +> deep-negative prices are structurally βˆ’EV ("the price ate the edge"). The data shows the **deepest +> buckets are the POSITIVE ones** (βˆ’161..βˆ’200 β†’ +6.5%; worse-thanβˆ’200 β†’ +4.8%, hitting 73.1% against a +> 69.7% breakeven) while the **most negative ROI sits INSIDE the current takeable band** (βˆ’111..βˆ’160 β†’ +> β‰ˆ βˆ’11 to βˆ’13%). Read literally this data says "avoid βˆ’111..βˆ’160," which is almost certainly noise β€” +> and that is exactly why it must not be turned into a floor. +> **(3) A REAL CONFOUND: price bucket is entangled with MARKET.** +200-and-up is `doubles/home_runs` +> (rare-event longshots, avg line 0.53); the deep-negative buckets are `hits/total_bases` ("will he get +> a hit"). Holding the market constant (hits + total_bases only) the non-monotone shape PERSISTS +> (+100up +22.6 Β· βˆ’111..βˆ’135 **βˆ’13.4** Β· βˆ’136..βˆ’160 **βˆ’13.5** Β· βˆ’161..βˆ’200 +6.5 Β· worse-thanβˆ’200 +4.8), +> so the confound is not the whole story β€” but it means a price-only floor would partly be encoding +> "avoid HR/doubles props," which is a market rule, not a price rule. +> **POWER β€” how far the data runs out.** Rows needed PER BUCKET to resolve a 5-point ROI edge at 95%: +> **661-2,285.** Actual bucket sizes: **8-71.** We are 10x-100x short. At the observed accrual (18.5 +> decided MLB overs/day; 4.44/day into the βˆ’161..βˆ’200 bucket) reaching 828 rows in that ONE bucket +> takes **~187 days** β€” and the MLB season ends well before that, so it will not accrue continuously. +> **THE INHERITED βˆ’160 IS ALSO UNVALIDATED (neither confirmed nor refuted).** In-band (βˆ’160..+200) ROI +> **+3.84%** [βˆ’13.0, +20.7] vs out-of-band **βˆ’0.04%** [βˆ’16.1, +16.0] β€” a ~3.9-point gap with massively +> overlapping intervals. Post-fix-only (β‰₯2026-07-19, the model-version cutoff): in-band +7.91% +> [βˆ’11.7, +27.5] (n=102) vs out-of-band βˆ’2.07% (n=112). Directionally friendly to the current band, +> statistically silent. +> **PHASE 2.6 β€” THE NO-CEILING CALL IS NOT SUPPORTED BY THIS DATA EITHER (stated straight).** The +> +200-and-up bucket is the WORST performer (ROI βˆ’13.15%, hitting 20.5% against a 22.0% breakeven). +> It is confounded (doubles/HR) and n=39 with a [βˆ’68.6, +42.3] interval, so it does not REFUTE the +> no-cap call β€” but it certainly does not support it. **Uncapped plus-money remains a defensible +> design/risk choice; it should not be described as data-backed.** +> **RECOMMENDATION FOR C2 (so it is not blocked on a number that cannot be derived):** ship the floor +> as an explicitly-labelled **POLICY** floor β€” keep **βˆ’160** (inherited, already the band everywhere, +> and directionally the better half of the only comparison available) β€” and **label it in code and copy +> as a policy choice pending derivation, NOT as derived**. **RE-DERIVATION TRIGGER (so "provisional" +> cannot silently become permanent): re-run this order when ANY negative bucket reaches n β‰₯ 300, or at +> the end of the MLB regular season, whichever comes first β€” and only adopt a data-derived floor when a +> bucket's 95% CI EXCLUDES zero.** +> **0.3 β€” EVERY `takeable` DEFINITION SITE C2 MUST UNIFY (9):** **DEFINITIONS (2):** +> `src/config/valueEngine.js:21-22,30-35` (env-tunable `TAKEABLE_ODDS_CEILING`/`TAKEABLE_ODDS_MAX`, +> defaults βˆ’160/200) Β· `web/src/lib/valueState.js:42-43,72-77` (**HARDCODED βˆ’160/200**). +> **πŸ”΄ LIVE DRIFT HAZARD FOR C2:** the backend is env-tunable and the frontend is hardcoded, so +> changing `TAKEABLE_ODDS_CEILING` in prod TODAY would silently desync the two. **CONSUMERS (7):** +> `src/utils/gradeRanking.js:25,56` (hero + server board) Β· `src/services/heroPropService.js` (via +> gradeRanking) Β· **`src/services/intelligence/analyzeViaEngine1.js:567`** (stamps `legacy.takeable` +> onto every graded prop β€” this is the one that reaches the snapshot/ledger) Β· +> `src/config/valueEngine.js:40` (`isValue`) Β· `web/src/lib/slateAdapter.js:474,478` (client board) Β· +> `web/src/lib/valueState.js:82` (`isValue` mirror) Β· **`web/src/components/vyndr/PriceTriplet.tsx:9-10,68` +> (renders the band IN USER-VISIBLE COPY β€” "Takeable band βˆ’160 to +200", so a floor change is a copy +> change too).** + - **Redirect EXISTS + WIRED:** `closingCapture.buildCaptureRows`β†’`closing_captures` (append-only, provenance: captured_at/book/line_type/both-prices/missed_reason) via `intradayRefreshService:221` + internal endpoint; `ledgerService.attachClosingProb`β†’`closing_prob` (de-vigs both raw sides,