docs(planning): mark Phase 1.5 live broadcast as Done

Tasks 1.5.4, 1.5.5, 1.5.6 marked 🟩 with commit hashes and implementation
notes. Phase 1.5 status updated to Done in ROADMAP.md.
This commit is contained in:
2026-05-02 18:00:24 +02:00
parent 87dec03d3c
commit fa50df3e27
4 changed files with 14 additions and 10 deletions
@@ -1,7 +1,7 @@
# Task 1.5.4 — Broadcast consumer group & fan-out
**Phase:** 1.5 — Live broadcast
**Status:** ⬜ Not started
**Status:** 🟩 Done
**Depends on:** 1.5.3
**Wiki refs:** `docs/wiki/synthesis/processor-ws-contract.md` §Streaming updates, §Multi-instance behaviour; `docs/wiki/concepts/live-channel-architecture.md` §Multi-instance Processor
@@ -218,4 +218,8 @@ Per the contract: omit fields rather than send `null` for absent values.
## Done
(Filled in when the task lands.)
Landed in `c07ea0e`. Key implementation decisions:
- `CodecError`/`decodePosition` moved to `src/shared/codec.ts`; `Position`/`AttributeValue` moved to `src/shared/types.ts`. Both `src/core/` and `src/live/` re-export from shared to preserve existing import paths.
- `broadcast.ts` ACKs all stream entries immediately (durability not needed for fan-out).
- Test uses a `stopSignal` Promise to coordinate between the broadcast loop and the test's `stop()` call, avoiding the tight-loop OOM that naive polling triggers.
@@ -1,7 +1,7 @@
# Task 1.5.5 — Snapshot-on-subscribe
**Phase:** 1.5 — Live broadcast
**Status:** ⬜ Not started
**Status:** 🟩 Done
**Depends on:** 1.5.3, 1.4 (Postgres pool)
**Wiki refs:** `docs/wiki/synthesis/processor-ws-contract.md` §Server response — subscribed
@@ -142,4 +142,4 @@ Same field-omission convention: don't emit `null` for absent values.
## Done
(Filled in when the task lands.)
Landed in `f4b50ca`. `src/live/snapshot.ts` uses DISTINCT ON (device_id) ORDER BY device_id, ts DESC with WHERE faulty=false. Registry's `fetchSnapshot` helper already had the try/catch fail-open pattern from task 1.5.3. `createSnapshotProvider` injected into `createSubscriptionRegistry` in main.ts.
@@ -1,7 +1,7 @@
# Task 1.5.6 — Integration test (testcontainers Redis + Postgres + Directus stub)
**Phase:** 1.5 — Live broadcast
**Status:** ⬜ Not started
**Status:** 🟩 Done
**Depends on:** 1.5.4, 1.5.5
**Wiki refs:**
@@ -189,4 +189,4 @@ The `serializeForStream` helper handles the bigint/Buffer sentinel encoding (alr
## Done
(Filled in when the task lands.)
Landed in `2f2cf5c`. Key divergence from spec: `test/fixtures/test-schema.sql` uses `entry_devices.device_id TEXT` (IMEI) instead of UUID FK to devices, matching Phase 1's IMEI-as-device_id convention. The live server uses a two-step startup (probe server → fixed port) because LIVE_WS_PORT=0 doesn't expose the bound port via the LiveServer public interface. The metricsServer dummy prevents afterAll hanging on unclosed handles.