Repository navigation
Open
Labels
app/pm-stackpm-stack (Pad/Grist) in developing-today/codepm-stack (Pad/Grist) in developing-today/codeeffort/mMedium: expected under 1 day of workMedium: expected under 1 day of workkind/featureNew feature or capability requestNew feature or capability requestmeta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedIntake review done: acceptance criteria, links, and normalized labels addedpriority/normalOrdinary priority (the default)Ordinary priority (the default)source/creatorFiled by the new-issue-creator jobFiled by the new-issue-creator jobtask/triageQueue packet kind: verify, reproduce, and route this itemQueue packet kind: verify, reproduce, and route this item
Description
Part of epic #1184; design #1252. Design record: doc/2026-11-01T21-05-00Z_design_event_driven_freshness/2026-11-01T21-05-00Z_design_event_driven_freshness.md.
Add the browser delivery layer for the freshness invalidation journal from the source-outbox child of #1184. This is distinct from the /events audit/activity river in #1739/#1261: use /freshness/stream and /api/freshness-events.json, and do not create or expose activity history here.
Acceptance:
- A long-lived
GET /freshness/streamuses SSE/EventSource and the existing Datastar patch format to refresh only the affected open page/facets; dashboard mutations continue through their existing POST routes (no WebSocket). - Events have journal sequence IDs; reconnect honors
Last-Event-ID, replays retained notices, and asks the client for a complete refresh when the cursor is older than the bounded journal. - A heartbeat keeps idle connections alive; clients coalesce invalidations while rendering and reread canonical data instead of trusting notice payloads.
GET /api/freshness-events.json?after=&scope=exposes the same versioned envelope, cursor, reset state, and source health for machine clients; existing/api/*.jsonendpoints remain canonical.- Scope is server-derived/allow-listed and uses the same browser authorization as the page. No source payload, secret, caller-supplied actor, or token-in-URL is accepted.
- Tests cover scope filtering, patch delivery, reconnect/replay, reset/full-refresh, heartbeat, JSON/SSE envelope parity, and unauthorized access.
External browser access follows #1182; do not broaden the Access policy in this issue.
Metadata
Metadata
Assignees
Labels
app/pm-stackpm-stack (Pad/Grist) in developing-today/codepm-stack (Pad/Grist) in developing-today/codeeffort/mMedium: expected under 1 day of workMedium: expected under 1 day of workkind/featureNew feature or capability requestNew feature or capability requestmeta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedIntake review done: acceptance criteria, links, and normalized labels addedpriority/normalOrdinary priority (the default)Ordinary priority (the default)source/creatorFiled by the new-issue-creator jobFiled by the new-issue-creator jobtask/triageQueue packet kind: verify, reproduce, and route this itemQueue packet kind: verify, reproduce, and route this item
Activity
dezren39 commentedon Nov 1, 2026
🤖 Agent note · state: filed / parent-link blocked
ses_e5e671686ccffeQbtUrJqbsWZM, design task 4942developing-today commentedon Nov 3, 2026
agent-note:v1
state: triaged (coverage pass)
Coverage pass 2026-11-03: reviewed in the fleet-wide per-issue pass (drift / overlap / already-handled / stale / blockers / ordering). Verdict: still live; queued in repo-health-code-pilot as triage at priority 40 (priority/normal). If this is already handled at current main, the triage closes it with evidence; if it needs splitting, the triage files the split.
Found via: coverage pass 2026-11-03
dezren39 commentedon Nov 3, 2026
🤖 Agent note · picked up
ses_e5e5d0089abffeESkh4gjA8pWE, task 8314, lanebf419306-c4ef-470f-a553-beabf93239dedezren39 commentedon Nov 3, 2026
🤖 Agent note · triaged (task 8314)
ses_e5e5d0089abffeESkh4gjA8pWE, lanebf419306-c4ef-470f-a553-beabf93239de, task 831432d47f73b6912da8224144558188eb01af2c037f. The aggregator has the existing Datastar fragment helpers (server.ts:509,517) and page fragments refreshed on load/dashrefresh; no/freshness/stream,/api/freshness-events.json, or freshness journal implementation exists underpm-stack/aggregator.feed.ts:340still sets the 5-minute stale boundary.