Pain points:AudienceType.ALL resolves to [] (announcement.service.ts:144-146)
— broadcast-all currently carries no resolved targets; unread-laggard export is a gap;
expiry/priority (planned).
Open "My announcements" (list) → pick one → receipt breakdown:
total targeted (targetUserIds.length), read count (readBy.length), unread
(targetUserIds − readBy.userId). All derivable from GET /announcements/:id/reads
targetUserIds from list payload.
Note:reads returns receipts but not the target list; client needs both
(announcement.service.ts:104-107).
Threads list → open thread (GET /threads, GET /threads/:id) → send
(POST /messages); realtime delivery via WebSocket (planned),
docs/IMPLEMENTATION_PLAN.md:119. (Messages are secondary surface in this package;
see 04_Information_Architecture.md.)