v0.9.5 β π EWMA City Pulse, AI Transparency & Feed Integration
What's New
π EWMA-based status & trend detection
Replaced the 7-day rolling average with Exponential Weighted Moving Average (Ξ±=0.3) for both status classification and trend detection. Long-running alerts naturally fade into the baseline, eliminating the cross-hour comparison problem. Works from the first pulse β no 7-day warm-up needed.
π Pulse references & AI transparency
- LLM returns the top 3 alerts that most influenced the summary β shown as clickable deep links with source icons in the pulse overlay
- Always-visible AI disclaimer toggle: "AI-generated summary Β· verify before acting β Click for sources & methodology"
- Collapsible section reveals referenced alerts, EWMA methodology explanation, and How it works link
π City Pulse feed card
City Pulse now appears as a pinned card at the top of the alert feed β same layout as other alerts with summary title, timestamp, and green ONGOING pill. Click resets the map to default view and opens the pulse overlay. Works on both desktop and mobile.
π€ Deterministic pipeline improvements
travel_ok, category statuses, and trends are all script-computed β the LLM only writes the summary and recommendationget_city_pulseMCP tool for programmatic access- Prompt rewrite: synthesis hierarchy, spatial awareness, no alarmist tone, 300-char limit
π Bug fixes
- Duplicate pulse notifications β pulse was sent every 10 minutes for the full hour due to missing dedup; now tracks
last_pulse_atper subscriber and sends only once - Stale pulse at hour mark β dispatch could send the previous hour's pulse before the new one was generated; now verifies
generated_atmatches the current hour - Pulse references not rendering β
window.alertswas undefined because alerts arelet-scoped; fixed to use direct variable references - Strike dark theme missing for filter pill and card hover states
π¨ UI polish
- Two-line centered disclaimer with dotted underline clickable affordance
- Mobile UX: city view toggle, pulse auto-show, fade animation
- Dark theme consistency across all components