STATE: Session 75 — weather modulation composed onto park; venue gap still open
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:
+65
-1
@@ -1,5 +1,5 @@
|
|||||||
# VYNDR — STATE OF THE WORLD
|
# VYNDR — STATE OF THE WORLD
|
||||||
### As of `f33091d` (main, DEPLOYED + fingerprinted live), 2026-07-21. This file opens every future session. **Start with the CURRENT STATUS + OPEN ITEMS block below.**
|
### As of `9f60ceb` (main, DEPLOYED), 2026-07-21. This file opens every future session. **Start with the CURRENT STATUS + OPEN ITEMS block below.**
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -131,6 +131,70 @@ 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 75 — WEATHER MODULATION (2026-07-21)
|
||||||
|
**Built + tested + deployed. NOT reaching live props** (same venue gap as park).
|
||||||
|
`effective_environment = park_base × weather_mod`.
|
||||||
|
|
||||||
|
## Phase 0 — both feeds free + keyless
|
||||||
|
statsapi `/venues?hydrate=location` → lat/lon for every park, ONE call.
|
||||||
|
Open-Meteo hourly (temp / wind speed / wind direction), **available hours before
|
||||||
|
first pitch** = when we project. Verified live.
|
||||||
|
|
||||||
|
## 🔑 THE SPINE — two weather values, NEVER crossed
|
||||||
|
| Value | Purpose | Lands in |
|
||||||
|
|---|---|---|
|
||||||
|
| **FORECAST** at projection time | **drives** the live adjustment **AND is what the instrument measures** | `ledger_entries.wx_forecast` + `env_*` |
|
||||||
|
| **ACTUAL** at game time | future SELF-DERIVED weather factors ONLY | `game_context.wx_*` |
|
||||||
|
Using the actual to measure tonight = **scoring ourselves on information we
|
||||||
|
didn't have**. The actual comes from Open-Meteo's **ARCHIVE** endpoint — asking
|
||||||
|
the *forecast* endpoint after the fact returns a re-forecast, not what happened.
|
||||||
|
|
||||||
|
## 🔴 WIND SIGN — the easiest error in the file
|
||||||
|
`wind_direction` is METEOROLOGICAL (where it comes FROM). Blowing OUT to centre
|
||||||
|
= arriving FROM the opposite bearing → **`(from + 180) % 360`** before comparing
|
||||||
|
to the CF bearing. **Getting this backwards inverts every wind adjustment.**
|
||||||
|
Pinned by a test on straight-out / straight-in / crosswind.
|
||||||
|
`CF_BEARING` (30 parks) is **public geometry**, same class as the dome list. A
|
||||||
|
park missing from it gets **no wind effect** (keeps temperature).
|
||||||
|
|
||||||
|
## Three honest do-nothing states — all 1.0, distinct
|
||||||
|
- **`dome_na`** — weather doesn't apply; **the PARK factor STILL does** (verified:
|
||||||
|
domed venue keeps its sub-1.0 base while weather stands down).
|
||||||
|
- **`forecast_absent`** — none available for this park/time.
|
||||||
|
- **`sub_threshold`** — real forecast below a meaningful bar (a 0.3% nudge on a
|
||||||
|
light breeze is false precision).
|
||||||
|
Plus `not_applicable` for stats weather says nothing about (strikeouts).
|
||||||
|
|
||||||
|
## Conservative + ledger-tunable
|
||||||
|
Every magnitude is an env var (`WX_WIND_PER_MPH` .006 · `WX_TEMP_PER_DEG` .003 ·
|
||||||
|
thresholds 5 mph / 8°F), total **capped ±12%**. Nothing asserted — a nominated
|
||||||
|
challenger that earns its place or is cut.
|
||||||
|
|
||||||
|
## Induced (Wrigley, CF bearing 32°)
|
||||||
|
`wind FROM 212° @15mph → 15mph straight OUT · wx 1.12 × park 1.06 = 1.187 ·
|
||||||
|
δ +0.043` · under mirrors · **pitcher HR-allowed moves WITH hitter HR** (both are
|
||||||
|
P(over) on a ball leaving the park) · wind IN → 0.955 · calm/dome/no-forecast all
|
||||||
|
→ 1.0 by three different routes, park base still applying.
|
||||||
|
|
||||||
|
## ⚠️ ORDER CORRECTION (recorded)
|
||||||
|
The order described wind-out as helping the hitter and **hurting** the pitcher's
|
||||||
|
HR-allowed as "opposite sides." In PROP terms both go the **same** way — the
|
||||||
|
HR-allowed OVER is also more likely. **The sign lives in the STAT**, as already
|
||||||
|
established for park. Implementation follows that, not the phrasing.
|
||||||
|
|
||||||
|
## 🔴 STILL OPEN (unchanged)
|
||||||
|
1. **Neither park nor weather reaches live props** — `snapshotService` still
|
||||||
|
doesn't attach venue+first-pitch per prop and pass `environment` into
|
||||||
|
`attachChallenger`. Everything else is ready; this one link is missing.
|
||||||
|
2. **No settled row carries `p_win`** — all six adjusters remain unmeasurable.
|
||||||
|
```sql
|
||||||
|
select count(p_win) champion, count(p_win_challenger) challenger
|
||||||
|
from ledger_entries where user_id is null;
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# 🟢 SESSION 74 — PARK BASE (public, pluggable) + GAME-LEVEL CAPTURE (2026-07-21)
|
# 🟢 SESSION 74 — PARK BASE (public, pluggable) + GAME-LEVEL CAPTURE (2026-07-21)
|
||||||
|
|||||||
Reference in New Issue
Block a user