STATE: Session 77 — dormant adjusters wired; env non-null proven, ledger row pending
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:
+67
-1
@@ -1,5 +1,5 @@
|
|||||||
# VYNDR — STATE OF THE WORLD
|
# VYNDR — STATE OF THE WORLD
|
||||||
### As of `6dd6f59` (main, DEPLOYED), 2026-07-21. This file opens every future session. **Start with the CURRENT STATUS + OPEN ITEMS block below.**
|
### As of `7b25d97` (main, DEPLOYED), 2026-07-21. This file opens every future session. **Start with the CURRENT STATUS + OPEN ITEMS block below.**
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -131,6 +131,72 @@ exist locally; harmless, the data restores completely.
|
|||||||
`specs/snapshot-retention.md` (Phase 2 report + schema) ·
|
`specs/snapshot-retention.md` (Phase 2 report + schema) ·
|
||||||
`specs/audit-data/grade-collapse.md` · `specs/audit-data/gate-simulation.md`.
|
`specs/audit-data/grade-collapse.md` · `specs/audit-data/gate-simulation.md`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 🟢 SESSION 77 — DORMANT ADJUSTERS WIRED LIVE (2026-07-21)
|
||||||
|
The four-order plumbing gap is CLOSED. park + weather + platoon now reach live
|
||||||
|
grades. Pure input-wiring — **the 5 adjuster files are byte-identical** (verified
|
||||||
|
`git diff --quiet`).
|
||||||
|
|
||||||
|
## Phase 0 gate — all three inputs AVAILABLE at build
|
||||||
|
| Input | Availability | Source |
|
||||||
|
|---|---|---|
|
||||||
|
| Venue | **ALWAYS** 15/15 | schedule game object |
|
||||||
|
| First-pitch | **ALWAYS** | schedule `gameTime` |
|
||||||
|
| Opposing-SP hand | **declared 30/30 this afternoon** (morning locks precede it → platoon absent, correct) | probable `pitcherId` → statsapi hand |
|
||||||
|
Batter hand (`statcast.bats`) + MLBAM id were already on each grade.
|
||||||
|
|
||||||
|
## What was built
|
||||||
|
**`src/services/environmentContext.js`** (the wiring; adjusters untouched).
|
||||||
|
Fetches ONCE per snapshot: schedule, probable pitchers, ONE batched handedness
|
||||||
|
call, ONE Open-Meteo forecast per home park, batter splits per hitter.
|
||||||
|
`PARK_COORDS` (30 parks) lives here as public geometry (like the dome list), NOT
|
||||||
|
in an adjuster. Best-effort throughout — any failure → that prop archetype-only,
|
||||||
|
never a pipeline break.
|
||||||
|
**`attachChallenger` is now async** + takes `contextFor(grade)` → `{environment,
|
||||||
|
matchup}` → `adjust()` (which already accepted both).
|
||||||
|
|
||||||
|
## Independent attribution (each of 4 measurable separately)
|
||||||
|
Ledger columns `env_multiplier / env_park_base / env_weather_mod /
|
||||||
|
env_weather_state` + `challenger_adjustments` jsonb keeping archetype /
|
||||||
|
environment / matchup as SEPARATE entries. Not one blended delta.
|
||||||
|
|
||||||
|
## Combined bound (tested)
|
||||||
|
Coors slugger + wind-out + favourable platoon, all at once → **δ < 0.12**. Every
|
||||||
|
layer capped, total nudge clamped. Stacks lean, never re-forecast.
|
||||||
|
|
||||||
|
## ✅ PASS CONDITION MET — env_multiplier non-null (was 0 for 4 orders)
|
||||||
|
Proven END-TO-END on the live slate (buildContext + adjust against real feeds):
|
||||||
|
`venues_with_weather 15 · opp_declared 30 · pitchers_with_hand 30`.
|
||||||
|
| Park | env | compose |
|
||||||
|
|---|---|---|
|
||||||
|
| PHI | **1.179** | park 1.09 × wx 1.082 → **δ +0.041** |
|
||||||
|
| COL/ATL | >1 | hitter parks |
|
||||||
|
| CLE 0.929 · KC 0.937 | <1 | pitcher parks |
|
||||||
|
| **TOR/MIL** | park only | `wx 1 [dome_na]` — weather stands down, **park still applies** |
|
||||||
|
|
||||||
|
## 🔴 THE ONE HONEST GAP — not yet on a LEDGER ROW
|
||||||
|
Immutability refused to rewrite today's already-locked props (`ignoreDuplicates`),
|
||||||
|
so re-inducing wrote 0 new rows and **`env_multiplier` is still 0 on ledger rows**.
|
||||||
|
The wiring is PROVEN to produce the value (above); it lands on a row at the **next
|
||||||
|
NEW MLB lock**. Verify then:
|
||||||
|
```sql
|
||||||
|
select count(*) filter (where env_multiplier is not null) with_env,
|
||||||
|
count(*) filter (where challenger_adjustments::text like '%matchup%') with_platoon
|
||||||
|
from ledger_entries where user_id is null;
|
||||||
|
```
|
||||||
|
|
||||||
|
## Point-in-time / no lookahead
|
||||||
|
Weather = FORECAST for first pitch fetched at projection time. Platoon = split
|
||||||
|
entering the game. Neither reads settle-time.
|
||||||
|
|
||||||
|
## Still open (unchanged, NOT this order)
|
||||||
|
- **No settled row carries `p_win`** — all adjusters still unmeasurable until
|
||||||
|
tonight's locks settle.
|
||||||
|
- Read-card triplet gap · mappingHarness nomination flow · A/D emission ·
|
||||||
|
EV overconfidence · zero-push bug · edge_pct surfaces · 3 key rotations.
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# 🟡 SESSION 76 — PLATOON SPLITS (regressed) (2026-07-21)
|
# 🟡 SESSION 76 — PLATOON SPLITS (regressed) (2026-07-21)
|
||||||
|
|||||||
Reference in New Issue
Block a user