{ "description": "Admin app event vectors: the update stream (release notes posted into the Admin thread in place of the retired Announcer bot). Ensures the fold + chat projection stay consistent. Source of truth: web/static/apps/admin.js", "app": "admin", "source": "web/static/apps/admin.js", "state_shape": { "seen": ["string (changelog entry id)"] }, "notes": [ "admin.note posts one release note as a bubble from Admin; `seen` (posted ids) is the cross-device watermark.", "admin.baseline marks every current entry seen WITHOUT posting — the first-run 'no backlog blast' rule.", "The Chat view is read-only (chatReadOnly): the app posts, members never do. Native renders this thread via the webview, so there is no native fold to keep in sync — these vectors pin the web contract." ], "vectors": [ { "name": "admin_note", "description": "A release note is posted: its id joins `seen`, and it projects as a message bubble from Admin (not an action line).", "event": { "type": "admin.note", "id": "2026-07-08-read-sync", "text": "Unread dots now sync across your devices.", "name": "Paul", "ts": 1700000000000 }, "initial_state": { "seen": [] }, "expected_state_update": { "seen": ["2026-07-08-read-sync"] }, "expected_chat_projection": { "text": "Unread dots now sync across your devices.", "action": false } }, { "name": "admin_note_duplicate", "description": "Re-folding a note whose id is already seen leaves state unchanged (idempotent — two devices may race the same entry).", "event": { "type": "admin.note", "id": "2026-07-08-read-sync", "text": "Unread dots now sync across your devices." }, "initial_state": { "seen": ["2026-07-08-read-sync"] }, "expected_state_update": { "seen": ["2026-07-08-read-sync"] } }, { "name": "admin_baseline", "description": "First-run baseline: every current entry id is recorded as seen, nothing is posted, and the projection is silent (null).", "event": { "type": "admin.baseline", "ids": ["2026-07-07-member-apps", "2026-07-08-read-sync"] }, "initial_state": { "seen": [] }, "expected_state_update": { "seen": ["2026-07-07-member-apps", "2026-07-08-read-sync"] }, "expected_chat_projection": null }, { "name": "admin_baseline_merge", "description": "A second baseline merges (set union, order-preserving) rather than duplicating ids.", "event": { "type": "admin.baseline", "ids": ["2026-07-08-read-sync", "2026-07-08-text-size"] }, "initial_state": { "seen": ["2026-07-08-read-sync"] }, "expected_state_update": { "seen": ["2026-07-08-read-sync", "2026-07-08-text-size"] } } ] }