Phase 1 of the prove-before-live alignment. The backtest engine now mirrors
the live signal path instead of hardcoding HOLD/NEUTRAL:
- predict_batch (signal_classifier): vectorized per-bar AI signals reusing the
exact live predict() pipeline (class-index mapping, conf<0.5 -> HOLD)
- backtester: per-bar time-aligned AI lookup (M15 close = signal-available
time, searchsorted, no lookahead), exogenous H4 regime plan with dynamic
confluence-key deltas, AttentionMarketScorer alignment, per-strategy entry
cooldown, max-hold timeout exit, breakeven + trailing capped at TP, running-
equity pnl_pct (was: static initial balance)
- fix: store direction.value on entry (Enum vs str compare silently disabled
every exit - no trade ever closed)
- fix: _check_mode_sync only clears override on genuine mode transition (grid
threshold injection was wiped on first read)
- SignalAggregator(use_adaptive_weights=True): backtest uses pure config
weights so garbage live adaptive weights can't contaminate gate scores
Co-Authored-By: Claude Code <noreply@anthropic.com>