
Determinism fix for the AM-PRESERVE warm-preservation gate. upsert_pattern_history wrote last_seen_at from wall-clock, ignoring the pipeline's today — so the warm carve-out (_is_warm: today − last_seen_at) only held when today==wall-clock; deterministic/backdated runs and the local/UTC evening-skew window broke it (negative days → a warm-at-peak antibody eroded a level per wrap). Fix: last_seen_at is anchored to the pipeline's logical date (new seen_at kwarg, normalized + validated). Full apparatus (L1 + codex L3); the previously-red end-to-end warm-preservation test is green. 1463 tests, mypy clean. See CHANGELOG.
