From e886d4e5e7faaf08cdc0d61481c2fc91239bf163 Mon Sep 17 00:00:00 2001 From: Sam Valladares Date: Wed, 8 Jul 2026 11:07:14 -0700 Subject: [PATCH] fix(observatory): dense real memory field + hold the verdict card Two demo-readiness fixes so the Observatory reads as a living brain doing real work, not a sparse placeholder: 1. Graph query switched from sort=recent to sort=connected (max_nodes 200). 'recent' centered on the newest memory, a lonely node whose depth-3 neighborhood is only ~12 nodes, so the field looked empty. 'connected' surfaces the populous hotspot: ~148 real memories and ~2865 real edges, laid out as two dense clusters. Verified live on recall-path and salience-rescue: 148 nodes / 2865 edges at 110-119fps. 2. Verdict card now holds. The 'root cause found' card faded fully out by frame 660 in a 720-frame (12s) loop, so it flashed for ~1s then vanished. Widened the default fade window to [600,620,705,719]: it fades in, holds fully readable through the field's decay to rest, and only fades out just before the seamless loop wrap. ~1.75s of readable verdict instead of a blink. GPU envelopes and the seam-zero loop test are unaffected (DOM overlay window is independent of the sim). Verified live against the real brain: 96 observatory tests green, zero console errors, verdict readable at frames 660 and 695 (both blank before). Co-Authored-By: Claude Opus 4.8 (1M context) --- .../src/lib/observatory/overlays/RescueVerdict.svelte | 7 ++++++- apps/dashboard/src/routes/(app)/observatory/+page.svelte | 9 +++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/apps/dashboard/src/lib/observatory/overlays/RescueVerdict.svelte b/apps/dashboard/src/lib/observatory/overlays/RescueVerdict.svelte index 489c3e7..aca3c96 100644 --- a/apps/dashboard/src/lib/observatory/overlays/RescueVerdict.svelte +++ b/apps/dashboard/src/lib/observatory/overlays/RescueVerdict.svelte @@ -28,7 +28,12 @@ let { frame = 0, verdict, - fadeWindow = [600, 615, 645, 660], + // Hold the verdict on screen for the REST of the loop, not a ~1s flash. + // Fade in over 600→620, hold fully readable through the field's decay to + // rest, then fade out just before the seamless wrap (705→719, back to 0 + // at 719 so the loop seam stays clean). This is the demo money-card: the + // viewer needs seconds to read "root cause found", not a blink. + fadeWindow = [600, 620, 705, 719], tone = 'triumph' }: Props = $props(); diff --git a/apps/dashboard/src/routes/(app)/observatory/+page.svelte b/apps/dashboard/src/routes/(app)/observatory/+page.svelte index 0f50505..78dc362 100644 --- a/apps/dashboard/src/routes/(app)/observatory/+page.svelte +++ b/apps/dashboard/src/routes/(app)/observatory/+page.svelte @@ -62,10 +62,15 @@ loading = true; error = ''; try { + // Pull the DENSE real subgraph (the well-connected hotspot), not the + // newest-memory neighborhood — 'recent' centers on a lonely fresh node + // (~12 nodes), while 'connected' surfaces the populous, edge-rich field + // (~150 real memories, thousands of edges) so the Observatory reads as + // a living brain doing real work, not a sparse placeholder. const data = await api.graph({ - max_nodes: 300, + max_nodes: 200, depth: 3, - sort: 'recent' + sort: 'connected' }); graphData = data; nodeCount = data.nodeCount;