diff --git a/docs/scrum4me-backlog.md b/docs/scrum4me-backlog.md index 3d37001..3d0350c 100644 --- a/docs/scrum4me-backlog.md +++ b/docs/scrum4me-backlog.md @@ -24,6 +24,7 @@ De MVP is klaar wanneer Lars — de primaire persona — de volledige cyclus kan | M5: Todo-lijst | Todo CRUD, promotie naar PBI/story; Data Table + detail-kaart | ST-501 – ST-506, ST-509 – ST-510 | | M6: Polish & Launch-ready | Foutafhandeling, toegankelijkheid, CI/CD, beveiliging | ST-601 – ST-612 | | M7: MCP-server voor Claude Code | Native MCP-laag bovenop Scrum4Me-DB (aparte repo `scrum4me-mcp`) | ST-701 – ST-710 | +| M8: Realtime Solo Paneel | Live updates voor stories/tasks via SSE + Postgres LISTEN/NOTIFY | ST-801 – ST-806 | --- @@ -515,6 +516,40 @@ Aparte repo: [`madhura68/scrum4me-mcp`](https://github.com/madhura68/scrum4me-mc - `scripts/smoke-test.ts` valideert read-tools tegen live DB - Done when: smoke-test groen; MCP Inspector toont 9 tools + 1 prompt +### M8: Realtime Solo Paneel + +Live updates voor stories en tasks in het Solo Paneel zonder pagina-refresh. Wanneer Claude Code (via MCP), Codex (via REST) of een andere browser-tab een task/story muteert, ziet de gebruiker het binnen 1–2 seconden in zijn kanban-bord. + +Transport: Server-Sent Events (Vercel ondersteunt geen stateful WebSockets). Bron: Postgres `LISTEN/NOTIFY` via row-level triggers op `tasks` en `stories`. Eén-richting (server → client) — mutaties blijven via Server Actions/REST/MCP. + +Filtering server-side: alleen events binnen de actieve sprint van een product waar de gebruiker eigenaar of lid van is, plus `assignee_id == userId` (eigen kolommen) of `assignee_id IS NULL` (claim-lijst). + +- [ ] **ST-801** Postgres LISTEN/NOTIFY-infrastructuur + - Migratie met `notify_solo_change()`-functie + `AFTER INSERT/UPDATE/DELETE`-triggers op `tasks` en `stories`; payload bevat `op`, `entity`, `id`, `product_id`, `sprint_id`, `assignee_id`, `fields` (gewijzigde kolommen) + - Done when: `psql $DIRECT_URL -c "LISTEN scrum4me_solo;"` toont een payload bij een UI-mutatie + +- [ ] **ST-802** SSE-route `/api/realtime/solo` + - `app/api/realtime/solo/route.ts`, `runtime: 'nodejs'`, `maxDuration: 300`; auth via iron-session, query-param `product_id`, opent `pg.Client` op `DIRECT_URL` met `LISTEN`; heartbeat 25s; hard close 240s; in-handler filtering op product/sprint/assignee + - Done when: `curl -N` op localhost levert binnen 1s een event op na een task-mutatie via UI + +- [ ] **ST-803** Client hook `useSoloRealtime(productId)` + - `lib/realtime/use-solo-realtime.ts`; opent `EventSource`, exponential backoff reconnect (1s → 30s); Page Visibility API voor pauseren/hervatten; cleanup op unmount + - Done when: tab wisselen sluit/opent connectie zichtbaar in DevTools Network + +- [ ] **ST-804** Solo-store realtime-acties + - `applyTaskUpdate`, `applyTaskCreate`, `applyTaskDelete`, `applyStoryAssignment`, `markPending`/`clearPending` om eigen optimistic-echo te onderdrukken + - Done when: unit-test op solo-store met gesimuleerde events laat juiste eindstate zien + +- [ ] **ST-805** Wire-up in SoloBoard + UI-indicator + - `components/solo/solo-board.tsx` roept de hook aan; klein "live"/"verbinden..."-statusindicator; toast bij langer dan 5s disconnected + - Done when: twee tabs van Solo Paneel — mutatie in tab A komt binnen 1–2s in tab B zonder refresh + +- [ ] **ST-806** Documentatie + acceptatietest + - Sectie "Realtime updates" in `docs/scrum4me-architecture.md` met diagram en filtering-regels; vermelding in `CLAUDE.md`; korte note over `/api/realtime/solo` in `docs/API.md`; handmatig E2E-scenario's gedraaid (zelfde gebruiker twee tabs, MCP-write, REST-write, story-claim, network-flap) + - Done when: alle scenario's lopen door zonder onverwachte gedragingen + +Volledig plan in `.Plans/2026-04-27-m8-realtime-solo.md` (lokaal, niet gecommit). + --- ## v2 Backlog (na MVP)