You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Flicker + scroll-position bounce when interrupting a long subagent run.
Repro shape
Trigger a workflow that spawns multiple subagents — /security-review, /review, an init skill running parallel scans, anything that pushes a lot of streaming output through run_subagent while parent stays alive.
Let the output fill more than one viewport — so the chat is scrolled (pinned to bottom but maxScroll > 0, or the user scrolled up to inspect a finding).
Hit Esc to interrupt. Hit Esc again quickly (double-tap).
Observed: the screen flashes — sometimes the visible region jumps up, sometimes it bounces between two near-identical frames. The reporter describes it as "闪烁" with "滚动位置也会闪" (scroll position also flickers).
What's probably happening
Hypotheses, in order of likelihood — none verified yet:
Abort path tears down N subagent inflights in quick succession — each unmount fires a useReserveRows collapse + state.cards mutation; with N≥2 subagent cards collapsing at once, CardStream re-measures maxScroll several frames in a row, the pinned=true invariant snaps scrollRows each time, and the deltas oscillate visibly. Single-subagent runs hide this because there's only one frame.
Double-Esc isn't separately handled (App.tsx:1250-1263 only sees one key.escape && busy) but abortedThisTurn.current guards against double-execute. Still, the second Esc may hit the next handler — composer Esc — and clear input or trigger another render.
Flicker + scroll-position bounce when interrupting a long subagent run.
Repro shape
/security-review,/review, aninitskill running parallel scans, anything that pushes a lot of streaming output throughrun_subagentwhile parent stays alive.maxScroll > 0, or the user scrolled up to inspect a finding).Observed: the screen flashes — sometimes the visible region jumps up, sometimes it bounces between two near-identical frames. The reporter describes it as "闪烁" with "滚动位置也会闪" (scroll position also flickers).
What's probably happening
Hypotheses, in order of likelihood — none verified yet:
useReserveRowscollapse + state.cards mutation; with N≥2 subagent cards collapsing at once,CardStreamre-measuresmaxScrollseveral frames in a row, thepinned=trueinvariant snapsscrollRowseach time, and the deltas oscillate visibly. Single-subagent runs hide this because there's only one frame.App.tsx:1250-1263only sees onekey.escape && busy) butabortedThisTurn.currentguards against double-execute. Still, the second Esc may hit the next handler — composer Esc — and clear input or trigger another render.setMaxScrollcalls during teardown can interleave with the alt-screenclearTerminalwe now do per frame in a way that paints two distinct end-states before settling.Asking for ideal repro
reasonix --version, a description of which skill / how many subagents, terminal name + version.Related
useTickcallers and addReact.memoto tick-driven leaves — measure before optimizing #563 —useTickaudit (relevant if hypothesis feat: Allow user to press tab and add aditional context when denying. #1 holds and the cascade is render-driven)Filed proactively from a chat report; will pin down the exact repro before any rendering-layer changes.