Problem
Opening the Workflow TUI dashboard during a run causes severe keyboard/navigation lag. The dashboard animation timer runs every 120 ms but calls refresh() -> loadRunEntries() on each tick. That loader synchronously reads every persisted workflow and hydrates result/transcript artifacts before filtering by session and request time.
Observed evidence
- Configured local runtime:
c8f2c13d49f2e6cd3b389dfff72ccc2eaca970c1.
- The live Pi process reached approximately 101% CPU. A macOS sample captured the main thread inside a timer callback, with string processing, JSON parsing, file opens and GC; JavaScript function names were not available in that sample.
- Calling the real
loadRunEntries(new Map(), "diagnostic-no-session", new Set(), Date.now()) against approximately 13 MB of local history returned zero entries but took 3522, 3327 and 3952 ms under Node. Bun measurements were 3764, 2138 and 1942 ms. These are exploratory local measurements under concurrent load, not a formal benchmark.
- The reported run had eight children. Raw sessions, transcripts and screenshots are private local evidence and are not attached.
Expected behavior / acceptance
- Animation ticks and keyboard navigation must not repeatedly scan or hydrate historical artifacts.
- Filter unrelated runs before expensive normalization/hydration; load transcript artifacts only when the user opens the corresponding detail.
- Preserve live updates, terminal transitions, historical navigation and canonical recovery semantics.
- Add deterministic regression coverage for filesystem work on animation ticks and lazy artifact loading.
- Run
bun run check, bun run test, and repeat the local read-only timing probe.
The separate ordinary conversation view may have additional performance costs; this issue targets the reproduced dashboard path.
Problem
Opening the Workflow TUI dashboard during a run causes severe keyboard/navigation lag. The dashboard animation timer runs every 120 ms but calls
refresh()->loadRunEntries()on each tick. That loader synchronously reads every persisted workflow and hydrates result/transcript artifacts before filtering by session and request time.Observed evidence
c8f2c13d49f2e6cd3b389dfff72ccc2eaca970c1.loadRunEntries(new Map(), "diagnostic-no-session", new Set(), Date.now())against approximately 13 MB of local history returned zero entries but took 3522, 3327 and 3952 ms under Node. Bun measurements were 3764, 2138 and 1942 ms. These are exploratory local measurements under concurrent load, not a formal benchmark.Expected behavior / acceptance
bun run check,bun run test, and repeat the local read-only timing probe.The separate ordinary conversation view may have additional performance costs; this issue targets the reproduced dashboard path.