PageHinkleyDecay hard-kill over-killed daily crypto returns: not scale-invariant,
unbounded inception statistic, dead consecutive-day re-arm. Replace it in both live
forward sleeves with WindowedEdgeHealth (EWMA t-stat of trailing risk-adjusted drift):
scale-invariant, bounded, naturally re-arming. Kill when health() < kill_floor.
- Swap PageHinkleyDecay -> WindowedEdgeHealth in ts_trend_strategy + stablecoin_strategy
- Param migration: decay_lam/decay_reenter_days -> decay_window=63, kill_floor=0.15
- State carried under extra["weh"]; old extra["ph"] is migrated to a fresh WEH (no crash)
- assets.py callers pass no decay params, so no caller changes were needed
- PageHinkleyDecay kept in edge_decay.py (other code/tests reference it)
- Rewrote behavioral tests: healthy never killed, sustained-negative killed within
~window, recovery re-arms within ~window, old-format extra does not crash
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>