Primary finding
ATH gate state update on non-baseline higher price omits `announced_at` clock for dedup
mediumbugmedium
- skills/price-threshold-alert/SKILL.md:121-132
- skills/price-threshold-alert/SKILL.md:188-196
Step 4 says to use `last_alerts.ath` for the 4h dedup window, but the suppression-on-baseline path only sets `state.ath.announced_at = NOW` — not `state.last_alerts.ath`. Conversely, the normal ATH-fired path is not explicitly described as updating `last_alerts.ath`; the doc references the 4h dedup against `last_alerts.ath` but never lists the write. Without explicit instructions to set `last_alerts.ath = NOW` on real ATH fires, an implementer could leave dedup wide open and refire ATH on every minutely tick. The mix of `ath.announced_at` vs `last_alerts.ath` further muddies which clock authoritatively gates ATH dedup.
Recommendation
In Step 4, explicitly state: 'On notify, set `state.last_alerts.ath = NOW` and `state.ath.announced_at = NOW`.' Pick one clock (preferably `last_alerts.ath`) and reference it consistently as the dedup authority.