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) <noreply@anthropic.com>
This commit is contained in:
Sam Valladares 2026-07-08 11:07:14 -07:00
parent a046c620c8
commit e886d4e5e7
2 changed files with 13 additions and 3 deletions

View file

@ -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();

View file

@ -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;