Part of PAR-357. Builds on the instant-feel data layer task.
Problem
Nothing pushes changes to the browser. When a teammate, the MCP API or the Discord triage bot creates or edits an issue, open tabs stay stale until a manual reload. For a product whose headline is "turns chat into issues", watching a new issue appear in Triage the moment someone posts in Discord is the demo moment. Today it doesn't happen.
Do
- The backend publishes issue, comment and vote change events (Postgres
LISTEN/NOTIFY → SSE or WebSocket endpoint under /api/public/…, with auth and per-workspace channels).
- The client applies events into the shared cache, so lists, board, detail and inbox update in place, with a subtle highlight on rows that just changed. A new triage item shows a toast ("New issue from #bug-reports in Discord").
- Presence: avatars of who else is viewing the issue in the header, and a "Rían is typing…" indicator on comments.
- Conflict handling for the description: last write wins, plus a toast if someone else saved while you were editing (with a diff link).
- Reconnect with backoff; badge the tab title or favicon when Inbox or Triage gets new items while the tab is in the background.
PR: https://github.com/ParadauxIO/taskl.ie/pull/72. SSE at /api/public/w/{slug}/events from the committed issue.activity outbox delivery, permission-filtered (guest never gets private-team events, tested), resume via Last-Event-ID, in-memory hub (1 replica; LISTEN/NOTIFY TODO documented). Latency ~outbox poll (2s).