Matchup axis report + plan reconciled: three challengers now accruing
Records the verification that matters: firing measured on a real prod snapshot rather than inferred. environment 248/293 (84.6%) -- also its FIRST confirmed ledger write, which the previous session could only infer -- and matchup 243/293 (82.9%) on tier batter_own_split. Both were 0/634. Collinearity guard passed at n=243: r = -0.003 vs the projection, +0.074 vs p_win, +0.003 vs line, -0.068 vs environment, -0.150 vs opportunity. The axis is not re-encoding recent form. The nudge distribution is also the right SHAPE -- mean +0.0007, 123 positive / 120 negative -- a balanced two-sided signal; a one-sided distribution would have suggested a sign or baseline error. Plan reconciled in place: arch-v1 condition axes marked firing, three challengers listed with coverage and their own holdout queries, and the next-order pointer moved to connecting the still-dormant layers (similarity, Bayesian, distribution ladder) with archetype_x_archetype as the named alternative. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QJs13VsyiSKYQP6rj3NNmc
This commit is contained in:
+18
-19
@@ -29,28 +29,27 @@ stay provisional until re-run** · documented ≠ verified.
|
||||
|
||||
## ▶ NEXT EXECUTABLE ORDER
|
||||
|
||||
**BUILD THE MATCHUP (PLATOON) AXIS on `challengerProjection` (arch-v1).**
|
||||
Sourcing verified 2026-08-01 by VALUE, not endpoint presence:
|
||||
**CONNECT THE STILL-DORMANT LAYERS** — similarity, Bayesian, and the distribution
|
||||
ladder (`projection/distribution.js`, proj-v1.1, built and unconnected). Same
|
||||
pattern that just worked three times: audit what is actually firing, repair the
|
||||
joins, add as a labelled challenger, prove on an axis-filtered holdout.
|
||||
|
||||
| input | coverage | source |
|
||||
|---|---:|---|
|
||||
| opposing probable starter | **29/30 team-sides** | schedule `hydrate=probablePitcher` |
|
||||
| pitcher hand (L/R) | **1342/1342** | `pitchHand.code` |
|
||||
| batter hand (L/R/S) | **1342/1342** | `batSide.code` (L 416 / R 848 / S 78) |
|
||||
*Blocked on nothing.* The alternative next order is
|
||||
**`archetype_x_archetype`** — the matchup ladder's upper rung, which needs the
|
||||
opposing starter classified per game.
|
||||
|
||||
**One shared dependency unlocks it:** `/sports/1/players` — a list we already
|
||||
fetch and cache — carries `currentTeam.id`, `batSide` **and** `pitchHand`.
|
||||
**SOURCE-LINEUPS-first is NOT needed.** Archetype-level reach on the opposing
|
||||
starter is also available (the SP resolves to a player id, so the existing
|
||||
classifier applies) — noted, not built.
|
||||
### THREE challengers accruing in parallel — do NOT re-run early
|
||||
Verified firing on a real prod snapshot (293 grades), not inferred:
|
||||
|
||||
*Blocked on nothing.*
|
||||
| axis | coverage | mean \|nudge\| | holdout query |
|
||||
|---|---:|---:|---|
|
||||
| **environment** | **84.6%** | 0.057 | *(shares the arch-v1 pattern)* |
|
||||
| **matchup** (`batter_own_split`) | **82.9%** | 0.015 | `scripts/matchup-axis-holdout.sql` |
|
||||
| **opportunity** | 30.0% | 0.142 | `scripts/opportunity-axis-holdout.sql` |
|
||||
|
||||
### Accruing in parallel — do NOT re-run early
|
||||
- **`opportunity_drift`** — live, 142 rows/slate, orthogonal (r ≈ 0 vs every
|
||||
projection input). Verdict n-blocked; `scripts/opportunity-axis-holdout.sql`.
|
||||
- **`environment`** — resolver fixed and verified (105/120), **first ledger write
|
||||
is tomorrow's slate** (same-day rows dedupe by design and cannot backfill).
|
||||
All three orthogonal (r ≈ 0 vs projection, `p_win`, line and each other). Each
|
||||
promotes ONLY on its own axis-filtered holdout, and ONLY if **reliability AND
|
||||
resolution** improve. **This is time, not code.**
|
||||
|
||||
Both promote only on their own axis-filtered holdout, and only if **reliability
|
||||
AND resolution** improve.
|
||||
@@ -76,7 +75,7 @@ AND resolution** improve.
|
||||
| ✅ **calibration** | **DECIDED** — ruler-independent; MLB isotonic **DECIDED**, not provisional | `specs/mlb-recalibration-vs-consensus-ruler.md` |
|
||||
| ✅ **grade cap** | DONE — 25 → 500; board **7 → 365+** graded props | `specs/grade-cap-and-refusal-diagnosis.md` |
|
||||
| ✅ **S59 join invariant** | **ARMED** — root cause was `searchPlayer` returning `team: null` (`currentTeam` has no `name`); fail-safe: drops only on a positive not-in-game | `tests/unit/slateJoinInvariant.test.js` |
|
||||
| **arch-v1 condition axes** | **env + matchup fired on 0/634 prod rows** — `team` was null on 416/416, so the venue join had no key. **Environment FIXED** (joins on the game; resolves 105/120). **Matchup still dead** — needs opposing SP + both hands, three separate absences | `specs/arch-v1-axis-audit.md` |
|
||||
| ✅ **arch-v1 condition axes** | **BOTH NOW FIRING** — environment 84.6%, matchup 82.9% (`batter_own_split`). Was: env + matchup on 0/634 prod rows — `team` was null on 416/416, so the venue join had no key. **Environment FIXED** (joins on the game; resolves 105/120). **Matchup still dead** — needs opposing SP + both hands, three separate absences | `specs/arch-v1-axis-audit.md` |
|
||||
| **opportunity_drift** | built, orthogonal (r≈0), live as a challenger on 142 rows/slate | verdict n-blocked; `scripts/opportunity-axis-holdout.sql` |
|
||||
| **opportunity layer** | **NOT BUILT** — `ab_per_game` is display-only; engine1 has no usage factor; MLB batting order unavailable in every wired source | Step 0 stopped before wiring. Recommended instead: an `opportunity_drift` axis on the EXISTING `challengerProjection` (arch-v1). See `specs/connect-opportunity-step0.md` |
|
||||
| **MLB board size** | **7 → 365 graded props** (52×) in 114s | the 25-cap discarded 95.7% of the slate. Raised to 500 on measured cost. Refusals were **43.8% deliberate policy suppression**, not a data gap |
|
||||
|
||||
Reference in New Issue
Block a user