fix(panel): skip live-append re-render while the full-message overlay is open (#85) - #99
Merged
Merged
Conversation
… is open (#85) Every appended event on a live timeline rebuilt the whole panel — including a fresh SelectList for the open full-message overlay, resetting its scroll and selection. The overlay's content comes from the stable fullMessageEvent and nothing beneath it is visible, so the live subscription now skips renderShell while it is open. Data stays current (runTimeline/selectedEventIndex still update); closing the overlay triggers the next full render, which picks up every accumulated append. Behavioral tests (real RunLog + headless FleetPanel): overlay body-list identity stable across appends; tail-follow preserved when the overlay is closed; post-close render includes events appended underneath. 824/824.
This was referenced Sep 2, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes the churn half of #85 (part 1). Part 2 (widget conversation tail) is dispositioned on the issue per its own note.
Problem
While the full-message overlay was open on a LIVE timeline, every appended event fired
renderShell(), rebuilding the entire panel — including a fresh SelectList for the overlay body, which resets the user's scroll position and selection on every append. Watching a live run while reading one of its messages was unusable.Fix (surgical, at the churn source)
openRunTimeline's live-append subscription now skipsrenderShell()whilefullMessageEventis set:fullMessageEvent— a rebuild renders identical output while churning scroll/selection.runTimeline+selectedEventIndexstill update per append; closing the overlay (esc) triggers the next full render, which picks up every accumulated append.renderShell— a top-level guard would also swallow the render immediately after settingfullMessageEvent(the open action), so the overlay would never appear.Why a guard in renderShell was rejected
Considered and rejected:
if (this.fullMessageEvent) returnat the top of renderShell breaks the open path (tl.onSelectsetsfullMessageEventthen callsrenderShell()— the early-return would eat exactly that call). It would also silently suppress store-refresh re-renders mid-overlay, entangling unrelated call sites. The subscription is the only site with the churn.Tests (behavioral — real RunLog, real headless FleetPanel, real key driving)
messageBodyListidentity stable, children untouched,runTimelinestill growsRED was verified first: the churn test failed against
mainwith exactly the identity assertion. 824/824 (was 821),pnpm typecheckclean — both standalone. (The first cut passed tsx tests but failed typecheck —Panelishmissing a key + a tautological assert; both gates caught it, per the house rule.)Part 2 disposition
Widget conversation tail: the issue itself notes it's "only worth doing when a consumer asks; the live overlay covers the need today" — proposing close-wontfix-until-consumer on the issue.