Deep slate diagnosis — 20261007
- Games: 4 · hits 3 · misses 1 · winner accuracy 0.75
- Mean total-run bias on losses: 0.0 (negative = under-projected)
- Mean team-run error on losses: 2.0 · mean Brier on losses: 0.296
Loss primary drivers
- Several errors of similar size: 1
High-level causal issue register
[HIGH] An intermediate stage materially degraded winner direction
- Domain:
pipeline_stages· affected: MIL@SD - Evidence: historical_ml → variance_applied changed winner accuracy by -0.2500 (-1 hits)
- Action: List the exact games whose winner flipped at this stage, and keep both the before-stage and after-stage picks in the trace.
- Do not infer: Even if a later stage recovers the pick, this unstable step is still a risk; do not treat it as harmless.
[HIGH] Published confidence buckets were poorly aligned on this slate
- Domain:
calibration· affected: CLE@CHW, LAD@ATL, MIL@SD, TB@NYY - Evidence: weighted absolute calibration error 0.2272 across 4 games
- Action: Watch the same confidence buckets over the full rolling window before changing any calibration weight.
- Do not infer: A single slate has far too few games to establish a stable calibration curve.
[HIGH] Validated run models explain very little holdout variance
- Domain:
model_validation· affected: CLE@CHW, LAD@ATL, MIL@SD, TB@NYY - Evidence: home/away/total R² = 0.0021/0.0309/0.0024
- Action: Treat exact run scores as low-confidence estimates, and look for stronger features or a better target before tuning the score tails.
- Do not infer: A small positive R² only means the model beats guessing the average; it does not make the exact scores reliable.
[INFO] Every settled game received structural QA
- Domain:
coverage· affected: CLE@CHW, LAD@ATL, MIL@SD, TB@NYY - Evidence: 4/4 games structurally audited
- Action: Keep the per-game audit receipt in every report.
- Do not infer: Full audit coverage does not cancel the findings raised inside the audited games.
[INFO] Material calibrated-to-published movements have recorded lineage
- Domain:
probability_lineage· affected: TB@NYY - Evidence: 1 material movement(s), all explained by named score-coherence and/or recency transformations
- Action: Keep showing every probability layer and the named transformation between them.
- Do not infer: A published probability above the calibrated one is not a governor bypass when a recorded transformation explains it.
[INFO] Simulation produced no winner-direction intervention on this slate
- Domain:
simulation· affected: CLE@CHW, LAD@ATL, MIL@SD, TB@NYY - Evidence: flip candidates 0; published flips 0
- Action: Measure the simulation's contribution across rolling slates, separating score realization from winner flipping.
- Do not infer: Zero winner flips is not a defect and does not mean the simulation did no score-reconciliation work.
Cross-slate trends (persistent-pattern memory)
- Window: 20260927, , 20260929, 20260930, 20261001, , 20261003, 20261004, 20261005, 20261006, 20261007 (10 prior slates loaded)
- Highest-confidence pick loss streak: 1 slate(s)
- Actionable pattern detected: True
Escalated persistent patterns
- simulation_inert_on_slate — 11 consecutive slates (11 in window)
- Target lever(s): simulation.allow_score
- Direction: confirm the simulation module is running, not silently no-oping
- Guardrail: simulation_inert_on_slate has persisted 11 consecutive slates; this is no longer single-slate noise. Treat it as an actionable pattern and raise the code/diagnostic action named; do not force a parameter move.
- single_slate_calibration_instability — 5 consecutive slates (8 in window)
- Target lever(s): confidence.empirical_max_weight, confidence.base_cap, confidence.moderate_cap
- Direction: increase empirical shrinkage
- Guardrail: single_slate_calibration_instability has persisted 5 consecutive slates; this is no longer single-slate noise. Treat it as an actionable pattern and propose a bounded shadow experiment against a target lever.
- weak_run_model_signal — 5 consecutive slates (9 in window)
- Target lever(s): training.xgb.n_estimators, training.xgb.max_depth, training.xgb.learning_rate
- Direction: investigate features/target via isolated training backtest (manual)
- Guardrail: weak_run_model_signal has persisted 5 consecutive slates; this is no longer single-slate noise. Treat it as an actionable pattern and raise the code/diagnostic action named; do not force a parameter move.
Metric direction across the window
winner_accuracy: flat · series [0.6429, None, 1.0, 0.75, 1.0, None, 1.0, 0.5, 0.0, 1.0, 0.75]weighted_calibration_error: improving · series [0.1031, None, 0.4792, 0.2317, 0.4832, None, 0.4705, 0.4806, 0.5291, 0.4642, 0.2272]margin_bias: regressing · series [-1.571, None, -4.25, -2.75, -3.0, None, -0.25, 0.0, -0.5, -0.5, -1.75]mean_team_run_error_on_losses: improving · series [4.8, None, None, 2.0, None, None, None, 2.0, 3.5, None, 2.0]
Pipeline stage quality
historical_ml: winner 3/4 (0.75), team-run MAE 1.8898, margin MAE 2.6745variance_applied: winner 2/4 (0.5), team-run MAE 1.875, margin MAE 2.75enhanced_prediction: winner 2/4 (0.5), team-run MAE 2.0, margin MAE 3.0kpi_layer: winner 2/4 (0.5), team-run MAE 2.0, margin MAE 3.0embedded_savant_run_environment: winner 2/4 (0.5), team-run MAE 2.125, margin MAE 2.75fundamental_edge_target_review: winner 3/4 (0.75), team-run MAE 2.375, margin MAE 2.25capped_target: winner 3/4 (0.75), team-run MAE 2.375, margin MAE 2.25simulation_result: winner 3/4 (0.75), team-run MAE 2.375, margin MAE 2.25published_final: winner 3/4 (0.75), team-run MAE 2.375, margin MAE 2.25
Probability lineage
- CLE@CHW: raw 0.5846 → calibrated 0.5486 → published 0.5351; score coherence followed by matchup-recency guardrail
- LAD@ATL: raw 0.5097 → calibrated 0.5084 → published 0.5072; published probability matches the calibrated/governed value
- MIL@SD: raw 0.5 → calibrated 0.505 → published 0.505; published probability matches the calibrated/governed value
- TB@NYY: raw 0.6185 → calibrated 0.5665 → published 0.544; score coherence followed by matchup-recency guardrail
Every game, in detail
CLE@CHW — ✅ hit
- Predicted CLE 5-4 (conf -0.07, lean) · actual CLE 9-3
- Root cause: right_winner_wrong_score
- Errors: winner correct · Brier 0.216105 · team-run err 5.0 · total bias -3
- Contributing factors:
- total runs under-projected by 3 (9 vs 12)
- CLE offense under-projected by 4
LAD@ATL — ✅ hit
- Predicted LAD 6-4 (conf -0.01, toss_up) · actual LAD 4-1
- Root cause: toss_up_went_our_way
- Errors: winner correct · Brier 0.242875 · team-run err 5.0 · total bias +5
- Contributing factors:
- total runs over-projected by 5 (10 vs 5)
- ATL offense over-projected by 3
MIL@SD — ✅ hit
- Predicted MIL 6-5 (conf -0.01, toss_up) · actual MIL 3-1
- Root cause: toss_up_went_our_way
- Errors: winner correct · Brier 0.245025 · team-run err 7.0 · total bias +7
- Contributing factors:
- total runs over-projected by 7 (11 vs 4)
- MIL offense over-projected by 3
- SD offense over-projected by 4
TB@NYY — ❌ miss
- Predicted NYY 3-4 (conf +0.09, lean) · actual TB 4-3
- Root cause: Several errors of similar size
- Errors: winner WRONG · Brier 0.295953 · team-run err 2.0 · total bias +0
Cross-game lever tension
Each candidate fix, with the games it would help and the games it would hurt. A lever that repairs one game and breaks two is visible here before it is proposed.
score.variance_multiplier / score.variance_floor (widen run distributions)
- Targets: brier_score, calibration_error
- Net: 0 helped vs 0 hurt
player.pitcher.v4 form weights / player.pitcher_prior_games
- Targets: starter_er_mae, starter_outs_mae
- Net: 0 helped vs 0 hurt
recent. / season. run-mean weighting
- Targets: team_run_mae, total_run_mae, accuracy
- Net: 3 helped vs 1 hurt
- Would help:
- CLE@CHW (hit): team runs off by 5
- LAD@ATL (hit): team runs off by 5
- MIL@SD (hit): team runs off by 7
- Would hurt / risk:
- TB@NYY (miss): team runs already close (off 2); reweight risks disturbing it