Skip to content

feat(web): graph SSE live layer — glow/pulse on touched nodes (TASK-1736) - #704

Merged
xarmian merged 2 commits into
mainfrom
feat/graph-sse-live
Jun 5, 2026
Merged

feat(web): graph SSE live layer — glow/pulse on touched nodes (TASK-1736)#704
xarmian merged 2 commits into
mainfrom
feat/graph-sse-live

Conversation

@xarmian

@xarmian xarmian commented Jun 5, 2026

Copy link
Copy Markdown
Collaborator

Summary

PLAN-1730 phase 4, first slice — the ambient-liveness layer:

  • Glow/pulse: SSE item events flash the corresponding node toward white, fading back over 45s. Idle graphs run no timers (the prune interval self-stops). Pulse composes before focus-dim so a touched node still reads in focus mode.
  • Structural liveness: created/archived/restored/updated events debounce into one refetch (1.5s trailing) through the existing stale-token path; new items arrive glowing; a selected node that vanishes deselects cleanly.
  • Correlation: SSE events carry item UUIDs, nodes are keyed by ref — GraphNode now emits id (UUID) and the page keeps a uuid→ref bridge per payload.
  • comment_created = glow-only touch; reactions/comment-edits/workspace events ignored.

Context

Implements TASK-1736 under PLAN-1730. Leaves TASK-1737 (blocker tracing) and TASK-1738 (layout tuning) to close the plan.

Test plan

  • make check — all green (svelte-check 0 errors)
  • svelte-autofixer — only the documented CONVE-1688 advisories
  • Visual pass post-merge via make install (watch a pad item update light up the graph)

xarmian added 2 commits June 5, 2026 23:23
…736)

The graph now feels alive while agents work: item events from the
workspace SSE stream flash the touched node toward white and fade it
back over 45s (a lazy 2s prune interval animates the decay and stops
itself when idle). Structural events (created/archived/restored) and
item_updated fold into one trailing-debounced refetch (1.5s) through
the existing loadGraph stale-token path; comment_created is glow-only.
New items arrive glowing via a pending-uuid stash resolved when the
refetch lands. Pulse composes before focus-mode dimming so touched
nodes still flicker subtly in the dimmed crowd. Selection clears when
the selected item leaves the payload (archived under focus mode).

Events correlate via a uuid→ref bridge rebuilt per payload — the
graph endpoint now emits each node's item UUID alongside the ref.

Parent: PLAN-1730.
items_bulk_updated and replay-buffer gaps route through onSyncRequired,
not onItemEvent — the graph stayed stale after bulk archive/move/assign
until the next single-item event. Fold both into the existing debounced
refetch.
@xarmian
xarmian merged commit 1bd3e52 into main Jun 5, 2026
4 checks passed
@xarmian
xarmian deleted the feat/graph-sse-live branch June 5, 2026 23:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant