STATE: Session 70 — measurement instrument wired; the baseline accrues forward
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VCNgGSt5qvcLxaeQqa7Zpj
This commit is contained in:
+79
-1
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user