ArmedTrigger stamps price_ts on each update; update_price(None) (a failed batch price fetch) now CLEARS the price instead of leaving the last value live; and fires() requires the price to be fresher than max_price_age_s (env TRIGGER_PRICE_MAX_AGE=12). A stalled feed can no longer fire a breakout into a name that has already reverted. Tests: stale price blocks fire, fresh re-enables, None clears; 18 pass. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>