| canonical_public_result | FIXED | Public winner and score now come from final_prediction. | The simulation remains preserved as diagnostic evidence and can no longer overwrite the accepted public decision. |
| signed_confidence_contract | FIXED | Confidence now means home_win_probability minus away_win_probability. | pick_probability and calibration_probability remain separate winner probabilities for learning and calibration. |
| signed_confidence_learning_separation | FIXED | Brier, calibration buckets, thresholds, and expected-hit math never consume the signed UI edge. | Away favorites use pick_probability/calibration_probability in the 0-1 probability domain while retaining a negative public confidence edge. |
| official_starter_precedence | FIXED_FOR_NEXT_SAFE_GENERATION | A current official MLB probable pitcher replaces a conflicting local starter. | The source and replacement reason are recorded; post-first-pitch artifacts are not silently rewritten. |
| starter_only_history | FIXED | Starter matchup quality excludes relief appearances. | Starter flags/pitching order are preferred, with a conservative innings fallback when role flags are absent. |
| starter_workload_weighting | FIXED | Starter quality is weighted by expected innings and the remaining bullpen share is neutral. | A starter-only factor is preserved for audit while the game receives the workload-adjusted factor. |
| hourly_source_refresh | FIXED | Long-running workers refresh schedule and pitcher caches when source revisions change. | Revision-aware cache keys cover daily starters, player stats, pitcher performance, recent rows, and matchup splits. |
| learning_artifact_merge | FIXED | Postgame learning reads root final/simulation fields together with nested game analysis. | Final-versus-simulation contradictions and signed probability edges enter the learning evidence packet. |
| dynamic_starter_learning_rows | FIXED | Daily and rolling learning rebuild starter rows for the actual selected dates. | The obsolete hard-coded August 1–3 starter report is no longer the normal pipeline input; each historical date resolves its own archived slate for the separate 120-game adaptive window. |
| official_settlement_safety | FIXED | Official actuals refresh until the slate is final and doubleheaders settle by game number. | In-progress starter lines are excluded, final cache payloads are reusable, and game 1/game 2 cannot overwrite or cross-pair their starters. |
| temporal_leakage_guard | FIXED | Adaptive results require timestamp proof that the artifact was generated before first pitch. | Missing, post-start, or overwritten artifacts are excluded from packets, ledgers, evaluations, and proposal sample counts. |
| adaptive_evidence_binding | FIXED | Promotion evidence is bound to evaluator mode and exact champion/candidate hashes. | Promotions reload a content-addressed system evaluation artifact and verify its hash; unsupported modes, unrelated metrics, partial normalized weight groups, and unimplemented auto-promotion fail closed. |
| starter_projection_evaluator | FIXED | Starter-only form variables now use frozen prospective replay and official starter outcomes. | Promotion is based only on starter ER/outs MAE paired by game, side, and MLB ID; generic game Brier evidence is rejected. |
| phase_aware_trace_storage | FIXED | Prediction traces are request-local, atomically saved, and versioned after first pitch. | Concurrent requests cannot share a tracer, same-second reruns receive unique revision names, and the canonical pregame trace is preserved. |