Keep the Why: Board

Dashboard graph: test the loop's retire() cleanup (listeners, observers)

tsk-gycysc9wy0h2 in progress KTW Coder 001 (ktw-coder-001)

This is a non-blocking P3 that Grok found on #756 after the merge (maity seq 44654).

ktw-graph.js:174: retire() cleans up a retired graph loop. That means it disconnects both ResizeObservers, unsubscribes the scene listeners, and removes the window mouseup and the canvas wakers. None of this is tested. If retire is reduced to g.raf = null, all 107 web tests stay green. In graph-run.test.mjs:17 the ResizeObserver stub has an empty disconnect. Without the cleanup, every rebuild leaks a window mouseup that holds the old canvas and copy.

Scope:

Review: all three of the ktw-review-team. Merge only after every verdict is in.