Deep slate diagnosis — 20260921
- Games: 3 · hits 1 · misses 2 · winner accuracy 0.3333
- Mean total-run bias on losses: 2.0 (negative = under-projected)
- Mean team-run error on losses: 3.0 · mean Brier on losses: 0.289
Loss primary drivers
- Starting-pitcher projection was wrong: 1
- Genuine toss-up that flipped: 1
High-level causal issue register
[CRITICAL] Published probability differs materially without a recorded transformation
- Domain:
probability_lineage· affected: WAS@DET - Evidence: 1 game(s) have an unexplained ≥2pp calibrated-to-published delta
- Action: Block any promotion until the missing probability transformation is recorded and reconciled.
- Do not infer: Do not assume the probability governor was bypassed until you have traced the pick-side math.
[HIGH] Blocking canonical artifact error
- Domain:
artifact_integrity· affected: 20260921_WAS@DET - Evidence: structural audit totals: {'critical': 0, 'error': 2, 'warning': 0, 'info': 22}
- Action: Exclude this slate from parameter learning until the artifact-generation step that wrote the broken file is fixed.
- Do not infer: A malformed artifact is a file bug, not proof the prediction model was wrong; do not blame accuracy changes on it.
[HIGH] An intermediate stage materially degraded winner direction
- Domain:
pipeline_stages· affected: WAS@DET - Evidence: historical_ml → variance_applied changed winner accuracy by -0.3333 (-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: MIN@SF, TOR@BAL, WAS@DET - Evidence: weighted absolute calibration error 0.2028 across 3 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: MIN@SF, TOR@BAL, WAS@DET - Evidence: home/away/total R² = 0.0187/0.0317/0.0089
- 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: MIN@SF, TOR@BAL, WAS@DET - Evidence: 3/3 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] Simulation produced no winner-direction intervention on this slate
- Domain:
simulation· affected: MIN@SF, TOR@BAL, WAS@DET - 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: 20260911, 20260912, 20260913, 20260914, 20260915, 20260916, 20260917, 20260918, 20260919, 20260920, 20260921 (10 prior slates loaded)
- Highest-confidence pick loss streak: 1 slate(s)
- Actionable pattern detected: True
Escalated persistent patterns
- pipeline_winner_instability — 4 consecutive slates (5 in window)
- Target lever(s): code/diagnostic — no parameter
- Direction: preserve base_ml_winner before integer rounding (code fix)
- Guardrail: pipeline_winner_instability has persisted 4 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.
- 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 — 3 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 3 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 — 11 consecutive slates (11 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 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.
Metric direction across the window
winner_accuracy: regressing · series [0.6667, 0.5333, 0.6, 0.7, 0.4, 0.6667, 0.4444, 0.6667, 0.7333, 0.6, 0.3333]weighted_calibration_error: flat · series [0.2091, 0.1711, 0.0827, 0.2812, 0.2795, 0.1661, 0.1016, 0.1247, 0.3458, 0.3184, 0.2028]margin_bias: regressing · series [-2.933, -2.667, -1.8, -0.4, -1.667, -1.133, -2.111, -2.0, -0.667, -1.533, -2.667]mean_team_run_error_on_losses: improving · series [5.0, 6.143, 5.0, 6.333, 5.556, 6.4, 3.6, 5.2, 6.5, 6.5, 3.0]
Pipeline stage quality
historical_ml: winner 1/3 (0.3333), team-run MAE 1.9153, margin MAE 3.7913variance_applied: winner 0/3 (0.0), team-run MAE 2.0, margin MAE 4.0enhanced_prediction: winner 1/3 (0.3333), team-run MAE 2.0, margin MAE 4.0embedded_savant_run_environment: winner 1/3 (0.3333), team-run MAE 2.0, margin MAE 4.0fundamental_edge_target_review: winner 1/3 (0.3333), team-run MAE 2.0, margin MAE 4.0capped_target: winner 1/3 (0.3333), team-run MAE 2.0, margin MAE 4.0simulation_result: winner 1/3 (0.3333), team-run MAE 2.0, margin MAE 4.0published_final: winner 1/3 (0.3333), team-run MAE 2.0, margin MAE 4.0
Probability lineage
- MIN@SF: raw 0.5702 → calibrated 0.5848 → published 0.5675; no recorded transformation explains the publication delta
- TOR@BAL: raw 0.5 → calibrated 0.5073 → published 0.5053; published probability matches the calibrated/governed value
- WAS@DET: raw 0.572 → calibrated 0.5774 → published 0.5358; no recorded transformation explains the publication delta
Every game, in detail
MIN@SF — ❌ miss
- Predicted MIN 5-4 (conf -0.14, moderate) · actual SF 2-5
- Root cause: Starting-pitcher projection was wrong
- Secondary cause: Backed the wrong side with real conviction
- Errors: winner WRONG · Brier 0.32206 · team-run err 4.0 · total bias +2
- Contributing factors:
- MIN offense over-projected by 3
- Zebby Matthews (MIN) allowed 4 more ER than projected (5 vs 1)
- committed to MIN at 0.14 confidence and it lost
TOR@BAL — ❌ miss
- Predicted TOR 5-4 (conf -0.01, toss_up) · actual BAL 3-4
- Root cause: Genuine toss-up that flipped
- Errors: winner WRONG · Brier 0.255285 · team-run err 2.0 · total bias +2
WAS@DET — ✅ hit
- Predicted DET 4-5 (conf +0.07, lean) · actual DET 2-9
- Root cause: right_winner_wrong_score
- Errors: winner correct · Brier 0.215473 · team-run err 6.0 · total bias -2
- Contributing factors:
- DET offense under-projected by 4
- DJ Herz (WAS) allowed 3 more ER than projected (4 vs 1)
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: 1 helped vs 0 hurt
- Would help:
- MIN@SF (miss): lost a 0.14-confidence pick; wider tails lower overconfidence
player.pitcher.v4 form weights / player.pitcher_prior_games
- Targets: starter_er_mae, starter_outs_mae
- Net: 2 helped vs 0 hurt
- Would help:
- MIN@SF (miss): starter ER off by 4
- WAS@DET (hit): starter ER off by 3
recent. / season. run-mean weighting
- Targets: team_run_mae, total_run_mae, accuracy
- Net: 2 helped vs 1 hurt
- Would help:
- MIN@SF (miss): team runs off by 4
- WAS@DET (hit): team runs off by 6
- Would hurt / risk:
- TOR@BAL (miss): team runs already close (off 2); reweight risks disturbing it