3.6 KiB
Production Realtime SSE Patch Implementation Plan
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: Upgrade PolyWeather terminal charts from in-process best-effort SSE patches to a replayable, city-scoped, versioned realtime observation stream for PM highest-temperature prediction workflows.
Architecture: Keep HTTP APIs as the full snapshot/source-of-truth layer. Add a short-window SQLite event log for SSE replay, version observations as city_observation_patch.v1, fan out live events through the existing SSE manager, and let the frontend subscribe only to visible cities with since_revision reconnect replay.
Tech Stack: FastAPI, SQLite/WAL via DBManager, in-process asyncio.Queue SSE fanout, React/Next.js EventSource, TypeScript external store hooks.
Constraints
- Default replay retention is 6 hours because this event log is not the business history store.
- The retention can be raised with
POLYWEATHER_PATCH_EVENT_RETENTION_HOURS, but the product does not need all-day patch retention. - First production step is SQLite-only; Redis/Postgres pub/sub remains a later multi-instance extension.
- Existing legacy
city_patchingest and frontend handling must keep working during rollout.
Tasks
-
Backend schema tests
- Add tests proving legacy collector payloads normalize to
city_observation_patch.v1. - Cover runway point conversion from
amos.runway_obs.point_temperatures. - Cover invalid payload rejection when city and useful observation data are missing.
- Add tests proving legacy collector payloads normalize to
-
Backend schema implementation
- Add
web/realtime_patch_schema.py. - Normalize city/source/obs time/temp/max/runway payload fields.
- Keep payload small and JSON-serializable.
- Add
-
Event store tests
- Add tests for monotonic SQLite revisions.
- Add city-filtered replay tests.
- Add retention cleanup tests for stale replay rows.
-
Event store implementation
- Add
observation_patch_eventstable and indexes inDBManager. - Add
web/realtime_event_store.pyfor append, replay, latest revision, and cleanup. - Use
POLYWEATHER_PATCH_EVENT_RETENTION_HOURS=6as the default.
- Add
-
SSE replay tests
- Add tests for
/api/events?cities=...&since_revision=.... - Verify replay only returns subscribed cities.
- Verify replay over limit emits
resync_required.
- Add tests for
-
SSE implementation
- Update router to parse
cities,since_revision, and boundedreplay_limit. - Write normalized events to SQLite before broadcasting.
- Update manager to track per-connection city subscriptions while keeping heartbeat behavior.
- Update router to parse
-
Frontend SSE tests
- Extend architecture tests for v1 schema,
cities,since_revision, replay/resync handling. - Add chart merge coverage for v1 runway point payloads.
- Extend architecture tests for v1 schema,
-
Frontend SSE implementation
- Update
use-sse-patches.tsto normalize v1 and legacy patch events. - Track global
lastRevision. - Reconnect with visible-city
citiesandsince_revision. - Expose a resync signal for charts when the server cannot replay.
- Update
-
Chart/list integration
- Ensure visible charts register their city subscription.
- Keep terminal row patching lightweight: current temp, current max, local time, revision.
- Append v1 temp/runway points into existing chart series without forcing full-detail polling.
-
Verification
- Run targeted backend pytest files.
- Run
npm run test:business. - Run
npm run typecheck. - Run
npm run build.