Desktop Material

No-op renderer update suppression

Behavior

Changes and History share compare-form state. Selecting either repository section used to send showBranchList: false after every section change, even when the branch list was already closed. The store then merged the identical value, emitted a global update, and made the root React tree render a second time for one click.

Section navigation now dispatches the close request only while the branch list is actually open. AppStore also checks partial compare-form updates against the current values and returns without mutating or emitting when every supplied field is identical. The store boundary protects keyboard, focus, and future callers in addition to the navigation rail.

The semantic behavior is unchanged: an open branch list still closes when the user leaves it, and real filter or visibility changes still update immediately.

Configuration

There is no setting. Suppression is automatic and applies only when filterText and/or showBranchList are exactly unchanged.

Failure modes

Security considerations

The check compares local UI state only. It does not inspect repository content, credentials, remote URLs, or network responses, and it cannot suppress a Git operation.

Verification

The exact released build for 9bdfdb8b25e458e4834bdaa26473d44a5602621d was exercised through Lowlevel MCP on an off-screen Win32 desktop. Its idle workspace held 122 sampled frames at an average 16.51 ms with no frame over 25 ms, while twelve warmed Changes/History switches measured 56–104 ms and generated six 59–67 ms long tasks. A single Changes click produced 166 DOM mutation records and a 104 ms event duration.

compare-form-update-test.ts proves identical and empty updates are rejected while both meaningful fields still update. The focused responsiveness, progressive-loading, lifecycle, and navigation gate passes 42/42.

Post-fix built-app timing is recorded in docs/verification/renderer-responsiveness-2026-07-28/ when the exact release is available.