koala73 / koala73/worldmonitor
epic(ux): durable continuity — persistent read-state, catch-up module, story following, high-severity push, since-cursor for agents (Bet 5)
- Dominant language
- TypeScript
- Stars
- 86.6k
- Forks
- 13.1k
- Avg merge
- 8h 4m
- Merged PRs (30d)
- 825
Description
From the 2026-07-05 strategic review: every visit is a stateless snapshot — the opposite of "staying in tune".
## Evidence (verified 2026-07-05)
- Read-state is an in-memory Set (`src/services/activity-tracker.ts:8`), never persisted; first render marks EVERYTHING seen (`NewsPanel.ts:537-542`) — a returning user sees zero NEW tags for what happened while away.
- No "while you were away": no cross-session diff, no unread counters surviving reload; breaking-banner dismissals also in-memory (BreakingNewsBanner.ts:31).
- Story phases (BREAKING→DEVELOPING→SUSTAINED→FADING) are tracked server-side (`derivePhase`, story:track:v1) but there is no follow-a-story subscription.
- Realtime push is coerced to critical-only (`scripts/notification-relay.cjs:766-770`); "high" severity can never push live, only appear in the next digest. `IMPORTANCE_SCORE_LIVE` off (:866).
- MCP/REST news tools have no `since`/cursor param — agents must full-poll and diff (api/mcp/registry/cache-tools.ts get_news_intelligence).
## Work items
a) **Persistent read-state**: last-visit timestamp + seen story-cluster ids in localStorage always, Convex for signed-in users; NewsPanel stops marking-all-seen on first render — items newer than last visit render NEW.
b) **Catch-up module**: on return after >2h away, a "While you were away" strip: top clusters (by importance) that emerged or escalated since last visit.
c) **Follow a story**: per-cluster follow button persisting cluster hash; followed clusters surface phase changes (DEVELOPING→BREAKING etc.) as in-app alerts.
d) **High-severity push**: allow rules to opt into high (not just critical) in notification-relay; respect quiet hours.
e) **since cursor**: `since` (ISO or epoch) param on get_news_intelligence + REST list-feed-digest; response includes `nextSince`; agents stop full-polling.
Contributor guide
Research direction
Start with src/services/activity-tracker.ts, NewsPanel.ts, BreakingNewsBanner.ts, scripts/notification-relay.cjs, and api/mcp/registry/cache-tools.ts. Trace the existing read-state, notification, story-tracking, and news-tool flows before splitting the epic into separately testable work items. Done means the listed persistence, catch-up, following, high-severity push, and since-cursor behaviors work without the current full-polling or first-render limitations.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- api, backend, frontend, full-stack
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100