diff --git a/specs/STATE.md b/specs/STATE.md index e5c6af4..de83e66 100644 --- a/specs/STATE.md +++ b/specs/STATE.md @@ -1,5 +1,5 @@ # VYNDR โ€” STATE OF THE WORLD -### As of `7ac6aa7` (main, DEPLOYED + fingerprinted live), 2026-07-21. This file opens every future session. **Start with the CURRENT STATUS + OPEN ITEMS block below.** +### As of `474ebc5` (main, DEPLOYED + fingerprinted live), 2026-07-21. This file opens every future session. **Start with the CURRENT STATUS + OPEN ITEMS block below.** --- @@ -131,6 +131,84 @@ exist locally; harmless, the data restores completely. `specs/snapshot-retention.md` (Phase 2 report + schema) ยท `specs/audit-data/grade-collapse.md` ยท `specs/audit-data/gate-simulation.md`. +--- + +# ๐ŸŸข SESSION 70 โ€” LAYER 3 STEP 0+1: THE MEASUREMENT INSTRUMENT (2026-07-21) + +## ๐Ÿ”ด STEP 0 FINDING โ€” WE HAVE BEEN FLYING WITHOUT AN INSTRUMENT +**"Is the projection calibrated / does it beat the market" has NEVER been +answerable.** Three separate causes: +- `model_snapshots` holds `p_win` but has **0 settled rows** (settle writes to + `ledger_entries` only) and only spans 07-19โ†’07-20. +- `ledger_entries` settles 642 rows but carries **no probability at all**. +- `closing_captures` has the close but **no link to a result**. + +The whole measurable universe was **35 rows**, recovered by a lossy in-memory +join. Harness agrees: `INSUFFICIENT_HISTORY, scored 35, joined 404`. + +### The 35-row reading (NOT conclusive โ€” reported for the record) +| | Brier โ†“ | Directional | +|---|---|---| +| Our projection | **0.2682** | 18/35 | +| Market (de-vigged) | **0.2650** | 16/35 | +| Coin flip | 0.2500 | โ€” | + +**Both score worse than a coin flip; ours is marginally worse than the market.** +Mean model p **0.566** vs actual hit rate **0.486** โ†’ **systematically +overconfident ~8 pts** (same `PROB_CEIL` overconfidence flagged in EV). +At n=35 the SE is ~8.5 pts โ€” **noise. We have no evidence the projection beats +the market, and none that it doesn't.** Every segment (max n=28) is honest-absent. +**Every settled row has archetype `(none)`** โ€” Layer 2 postdates all of them. + +## ๐Ÿ”ด THE PROJECTION IS NAIVE โ€” verified, not assumed +`probabilityEstimator` = **game-log frequency over the line, 0.6/0.4 recency +blend, opponent nudge**. Zero archetype, zero mechanism data. Grep confirms. + +## Step 1 โ€” instrument wired (migration 033) +**The four-tuple now lands on ONE row** (`ledger_entries` โ€” the row that +actually settles): `p_win` + `fair_prob_lock` + `archetype_vector` + +`projection_locked_at` at LOCK; `closing_prob` + `closing_captured_at` from +`closing_captures`; `outcome` at settle. Calibration and market-comparison +become plain SQL instead of a join that drops 90% of rows. +- **IMMUTABLE** โ€” written once via the existing `ignoreDuplicates` upsert, never + re-derived at settle (that would measure a projection we never made). +- **VECTOR not label** โ€” a text column cannot attribute "did archetype help?". +- **Honest-absent BOTH ways**: past game + no capture โ†’ `market_unavailable_reason`, + never an imputed line (calibration still scores); **future game โ†’ NOT marked**, + because a close can still arrive and premature absence is as dishonest as + imputation. +- **Closing coverage verified BEFORE reuse:** 83/83 = **100%** on graded props + since capture began. The 56,890 refusals are ungraded candidates, not our props. + +## ๐Ÿ”ด TWO BUGS CAUGHT BY INDUCING +1. **Scheduler hook iterated `SPORTS`, which does not exist in that scope.** + Inside its try/catch it would throw `ReferenceError` every tick and silently + never run โ€” **the instrument would have looked wired and captured nothing.** + Now `cadence.ALL_SPORTS`. +2. **`attachClosingProb` selected a `fair_prob` column `closing_captures` does + not have.** It stores raw `over_odds`/`under_odds` ON PURPOSE (S64) so the + de-vig runs later. First live run: **642 rows marked market-unavailable, 0 + closes attached.** De-vig now runs via `devigTwoWay`. **Repair checked, not + assumed:** all 642 are pre-capture-era games, so the absence is TRUE; **0 + capture-era rows wrongly marked.** The bug would have mis-marked every future row. + +## โš ๏ธ THE BASELINE ACCRUES FORWARD โ€” and does NOT backfill +Historical `p_win`/closes are gone. **Immutability means today's already-locked +rows never gain `p_win`** โ€” the instrument starts recording at the **next NEW +lock** (verified: 0 new rows during induction because every prop was already +locked). Check with: +`select count(p_win) from ledger_entries where user_id is null;` + +**Volume to a real baseline** (~100 settled/day): blended nโ‰ˆ500 โ†’ **~5 days**; +per-segment nโ‰ˆ200 โ†’ **2โ€“4 weeks**. + +## Layer 3 sequencing โ€” RECOMMENDATION +The order proposed building archetype-awareness then proving it. **We cannot +prove anything yet**, so an adjuster shipped today is unmeasurable for weeks and +we would be back to shipping on plausibility. **Fix retention first (done), let +volume accrue, then build adjusters** โ€” each measurable from its first settled row. + + --- # ๐ŸŸข SESSION 69 โ€” LAYER 2: MULTI-AXIS ARCHETYPES (2026-07-21)