#149361·openclaw

WebUI: continuous performance and stability study with real-Gateway evidence

Author: vyctorbrzezowskiCreated Sep 15, 2026Updated Sep 17, 2026
LabelsmaintainerP3issue-rating: 🌊 off-meta tidepoolimpact:other

OpenClaw WebUI performance and stability study

Continuous work on startup, navigation, rendering, scrolling, loading, optimistic actions and repeated use. No study correction is accepted or merged. Small fixes remain held for a coordinated batch; private preparation and draft PRs are not completion. Gateway implementation findings are related evidence, outside the WebUI fix scope.

The full preceding body is preserved and verified at the complete historical checkpoint. Detailed issues and coverage comments remain authoritative for artifacts, hashes, exclusions and proof boundaries. Earlier archive and history study remain available.

Reference baseline: original index-WRUzz5GW.js; the held nine-file #149727/#149894 candidate is under controlled live comparison. Combined source has 322 selected tests/checks/build, not acceptance. A warmed native-End resize now reproduces an uncovered follow-lock case on both original and candidate. Logs remains private; preliminary original/candidate/reversal render samples are recorded, but differing live appends and host storage pressure prevent an accepted speedup. Original serving identity and the four PR states below were rechecked on 2026-09-17; their older behavioral evidence does not imply current-main validation.

Recorded drafts: #150008 (partial #149618), #150259 (#150229), #150325 (#150293). Existing #149708 covers #149566; no duplicate. The operator authorizes material, reproduced and validated fixes as draft PRs, assigned to the operator, with remaining validation stated explicitly. No merge is authorized.

Findings and current holds

Severity is absolute: demonstrated user impact, reach and practical recovery determine the level. It is independent of this list's other entries, patch size, PR readiness, test results and the order in which work was investigated. The ratings apply to the observed finding, not every possible scope of the linked issue.

  • P0 — critical emergency: widespread loss of essential operation or immediate, severe and irreversible data impact.
  • P1 — high: a demonstrated severe failure of an essential workflow, substantial data risk or major sustained performance collapse; urgent attention is justified by observed reach and impact.
  • P2 — medium: a reproduced functional defect disrupts normal navigation, reading, result discovery or user work, with a practical recovery or workaround.
  • P3 — low: limited visual/focus friction, transient geometry changes or bounded extra work without demonstrated substantial user impact. For an optimization opportunity, P3 is a backlog classification, not proof that a user-facing defect exists.

No finding currently has evidence supporting P0 or P1. Unmeasured worst cases do not raise severity. Ratings may change when new evidence demonstrates a different impact; uncertainty and validation gaps remain separate from severity.

Issue Severity Observation Status
#147512 P3 Startup profile/config appearance race Existing issue; desktop/narrow request/font/reflow proof. #130587 not live-validated here; no competing PR.
#150049 P3 Pin/Unpin keyboard focus loss Keyboard Pin/Unpin loses focus; Escape returns it. Held, no candidate/PR.
#150030 P2 Settings focus conflicts with target scroll Same-page focus candidate supported; cross-entry async growth unresolved. Check merged #150006 separately; held, no PR.
#150021 P3 Returning Session Sources collapses/re-expands Six predecessor returns retain sources; final pending-disabled refinement passes four tests/checks/build but awaits live, failure/reconnect and visual proof. Slow sample/interrupted reversal retained; held.
#149727 P2 Measurement creates false history intent Matched 2,072-message native-clamp controls: original/held candidate 81.5/116.5 px; reversible diagnostic 0/0.5 px, reversal fails again. New main owners differ and require reconciliation. No accepted fix or PR.
#149904 P3 Reconnect composer grows 45 px 45 px composer growth reproduces on both variants; status subtype and stable presentation unresolved. No fix.
#149894 P2 Home/prepend retains automatic end command Auto-end writer attribution and cancellation exercised; final-source Home proof retained. Timing/images unresolved; unaccepted.
#149619 P3 Prepend displaces message 82.5 px 82.5→0.5 px transient correction; predecessor held on hidden call cost. Presentation-aware follow-up has limited foreground/hidden proof; unaccepted.
#149772 P3 Hidden history measures synchronously Hidden synchronous measurement observed; foreground stable. Low-priority, no accepted fix.
#149618 P2 Show earlier loses loading focus 3/3 original focus losses versus 0/3 saved candidate. Error/task-detail/mobile/images gaps; draft #150008, not in history candidate.
#149566 P2 Hovercard intercepts narrow clicks Seven browser cases, ten narrow switches and keyboard controls pass; timing mixed, sibling/images gaps. Saved candidate; existing #149708, no duplicate.
#149534 P3 Warm switch readiness/work Separate Chrome/IAB warm-switch retention and CPU studies; no accepted optimization.
#149556 P3 Unused favicon background read One-line favicon candidate measured, discarded and restored; no consistent gain.
#149557 P3 Repeated system-chrome synchronization Original route CPU/color controls retained. Private box preparation failed before inspection (sandbox loopback EPERM); no candidate/build/check result. Net benefit and lifecycle proof remain open; held for batch, no PR.
#150202 P3 Empty outbox rebuilds transcript Warm input comparison: first-key medians 112→48 ms (3/variant); first/final draft transitions 2→0 full builds. Focus/geometry stable in measured sequences; startup layout hold remains, no PR.
#150229 P3 No-change revalidation rebuilds groups Draft #150259, assigned to operator. 324 tests/checks/build/review pass; provider/live-main/layout/mobile/images gaps remain.
#150252 P3 Roster reference invalidates rows Same three IDs/four identity fields; eight context callbacks, no forwarded groups. Held, no candidate.
#150261 P3 Image settlement invalidates shared context Local image settles before eight shared-context callbacks; other media/QR contracts need preservation. Held, no candidate.
#150266 P3 Empty Usage refresh mounts dashboard Refined six refreshes and error/populated controls pass; V1 rejected. Build confound/current-main/loading/images gaps; held, no PR.
#150289 P3 Narrow Usage hint clipping 320/390 px clipping, fits 768 px. Original defect; held, no candidate/PR.
#150293 P2 Automation draft lost on navigation Draft #150325. 10 router + 483 adjacent tests; live candidate/physical-mobile gaps. No completion.
#149484 P3 Tiny modules can grow after compression Tiny assets grow after compression; very low priority, no visible gain.
#150319 P3 Repeated transcript search normalization Three CPU profiles/fixed-history controls. Private box preparation; matched candidate timing/live proof pending. Held, no PR.
#150462 P2 Split width-cycle reader drift Matched +21/0/+21/0 px original/diagnostic reversals identify stale measurement. Private preparation; dependency/version/cost/regression proof open, no PR.
#150147 P2 Latest loses keyboard continuation Original and history candidate reproduce. Held for batch; no correction or PR.
#150345 P2 Skills group collapse state transfers Desktop/narrow reproduction; group-key candidate held for batch, no accepted fix or PR.
#150351 P3 Loading label moves Skills inventory Two natural-response captures. Held for batch; no candidate recorded.
#150359 P3 Native skill-editor confirmations User screenshot/source verified. Draft dispatch held pending publication-scope clarification; no PR recorded.
#150367 P3 Late support-path validation Draft/error retained; corrected path saved/applied through real Gateway. UI guidance correction held for batch.
#150370 P2 Same-size Skill Card stays stale Desktop/narrow repro; reload corrects. Invalidation/race proof pending; held.
#150374 P2 Long code widens reader Narrow body 345/2038 px; same prose without code fits. Reversible grid diagnostic isolates containment; compiled candidate/siblings/images pending.
#150383 P3 Empty Devices inventory reloads Initial entry 2 node.list calls; reentry 3, including legitimate route revalidation plus two empty-result loads. Held for batch; preserve normal poll/event/reconnect behavior.
#150387 P3 Repeated Logs time formatting Live candidate/reversal: median 1.9/11.4 ms with different real appends; no exact-input speedup claim. 249 real timestamps match original contract. Private; checks/reconnect/images pending.
#150390 P2 Lazy CSS clips mobile Logs Eight-size native reachability: candidate tail reachable in all; original clips portrait/short-landscape. Desktop containment and empty Activity covered. Resize follow is #150693. Private, unaccepted.
#150693 P2 Resize silently loses Logs tail following O24/C6: no reader input, native resize scroll changes following true→false while Auto-follow stays checked. Private box correction preparation started; three consumers include Activity and update progress. No accepted fix/PR.
#150885 P3 Logs Refresh drops keyboard focus Native Enter blurs on pending disable; focus stays on BODY after success in original desktop/narrow and existing candidate. Next Tab still reaches Export. Held for batch; no PR.
#150398 P3 Activity Live clips Clear Original controls/diagnostic; held, populated/candidate/images pending.
#150500 P3 Split close remounts closed session 3/3 original reproductions; extra startup/subscription work. No proven painted flash. Private preparation; live correction and draft eligibility pending. Distinct from normal three-slot retention.
#150571 P3 Unchanged hydration rewrites snapshots Three exact-identity captures; two 2,803-message reloads rewrite IndexedDB without content change. Variable synchronous cost, no latency gain claimed. Private preparation started; held for batch, no PR.
#150603 P3 New Session landscape cap conflicts Native 12-line A/B/A: outer composer overflow 302/138 → 110/110 → 302/138 px; 119 characters/focus preserved. Temporary CSS attribution only; ten-line desktop/portrait controls retained. Private box preparation started; held for batch, no built fix or PR.
#150614 P3 Command arrows differ from visual order Native desktop/New Session and desktop/narrow Chat reproduce category-order jumps; active rows remain visible. One ordering owner needed; held for batch, no candidate/PR.
#150615 P3 Filtering leaves active command offscreen After 18 arrow moves and /he, active index zero stays above the menu in three settled captures. Focus/draft preserved; narrow New Session hover interaction kept separate. Held for batch, no candidate/PR.
#150620 P3 Stationary pointer changes command selection Slash alone selects displayed option 6 with zero pointer movement; boundary-event diagnostic retains 0, reversal returns 6. Same 116.59 px welcome movement throughout. Shared menu interaction owner; held for batch, no candidate/PR.
#150895 P3 Stationary pointer overrides model-picker highlight Desktop twice and narrow once: Escape restores row 0, then trusted mouseenter changes it to 1 with zero pointer movement. Three pointer-outside controls retain 0. Selected model/focus/composer unchanged; shared model/target/account owner. Held for batch; no candidate/PR.
#150902 P3 Queued-message edit loses keyboard focus Enter save and Escape cancel leave BODY focus in desktop/narrow; next Tab reaches Remove. Queue text, newer draft, composer geometry and 2,072 message references preserved. Real offline transport; zero chat.send before/after cleanup and reconnect. Held for batch; no candidate/PR.
#150926 P3 Resolved queue edit warning remains visible Real same-conversation split panes reproduce successful edit retry with stale conflict alert. Four shared-custody controls and save propagation preserve queue/state. Existing PR #150220 covers the edit-warning owner; candidate not executed here, no competing PR.
#150679 P3 Global palette filter hides active option Native ArrowUp then s reproduces on desktop/narrow; clean controls retain scrollTop 199.5/233.5 px with active option wholly above the list for about 1 s. Separate owner from #150615; held for batch, no accepted fix or PR.
#124363 P3 Mixed attachment rejections lose one notice Existing broader issue; four mixed-batch reproductions in core Chat/New Session, with empty-only control. P3 applies to this subcase. Related draft #128270 not live-validated; held, no competing PR.

The P2 distinctions are behavioral: #149727 breaks history/follow intent, #149894 overrides an explicit Home action, and #150462 leaves cumulative reader drift. #149566 intercepts navigation clicks and #150030 misses the requested Settings target. #149618/#150147 interrupt keyboard continuation in the transcript. #150293 loses an unsaved automation draft; #150345 hides an existing search result; #150370 displays stale saved Skill Card content; #150374 makes the reader overflow; #150390 leaves the latest log entry unreadable at the stream's reported bottom; #150693 silently stops tail following after resize. These are recoverable, scoped defects, not critical incidents.

P3 includes #150500 because extra mounts/requests are proven but a painted wrong conversation or substantial interaction cost is not. Likewise, render-work counts or CPU attribution alone do not elevate the cache/formatting opportunities to P1/P2, and transient appearance/layout defects are not treated as data loss.

Coverage and interpretation checkpoints

  • Shared queue custody: #150926 records real offline split-pane controls: peer edit, remove, reorder and crossing the edited row reject visibly without changing queue/storage/unsaved correction. Cancelling releases custody; saving from the peer preserves position and the untouched row. Both 2,072-message arrays, clients and main textareas stay identical at sampled boundaries. Complete wire proof is unavailable after the cleanup automation reset its CDP buffer; do not infer zero sends from this capture. Synthetic queue/drafts were removed before observed reconnect and single-pane layout restored. Existing #150220 is linked for the P3 stale edit warning, without candidate acceptance.

  • System chrome: O1–O4 route profiles and color controls extend #149557. Desktop helper residence 16.951/30.753 and 22.418/19.369 ms is sampled attribution, not removable time. Mobile Light distinguishes Chat/Settings colors; both metas follow and original Dark is restored. Private preparation failed before source inspection because sandbox setup returned loopback EPERM; no candidate or accepted savings. Net rendering benefit and theme/lifecycle proof remain open. B1–B6 without CPU profiling record Settings-click Event Timing medians128ms desktop/136ms narrow, three controls each, with owners/content/geometry preserved. Original baseline only; not INP or a candidate speedup.

  • Core offline queue: #150902 contains Q1–Q3 real-transport controls: original/edited queue text and newer 20-character draft survive save/cancel; durable replacement and Cancel semantics retained. Desktop/narrow owners and 2,072 message references remain stable at sampled boundaries. Composer geometry stays fixed while the queue takes 43 px from the transcript. Removed test rows are absent from memory/storage before reconnection; zero chat.send frames in complete wire collection. Focus loss is P3. No successful send, reconnect drain, attachments, failure, physical keyboard or latency/paint acceptance. R1–R3 retained-route controls preserve two-row order, separate draft and unsaved edit through Settings and Back in desktop/narrow. R2/R3 long tasks up to 180/96 ms remain unattributed; no fast-navigation claim.

  • Core model picker: Original keyboard/account/shared-consumer controls preserve visible-row cycling, collapsed-account exclusion, empty-query behavior, selected model, composer geometry and Escape/focus in New Session and Chat. Real account inventory returns zero; populated/paginated accounts remain open. #150895 records stationary-pointer highlight takeover in New Session; Chat two-model clear is a negative control. No candidate, model commit, large-catalog, touch/pen/IME or paint acceptance.

  • Snapshot persistence #150571: S3/S6/S7 preserve ordered message references and envelope but replace array/snapshot identity; S6/S7 readonly database reads confirm redundant writes. S5 differs after controlled CPU slowdown and must still write. Preserve revalidation, pending/live messages, weak retention and the separate #147088 invalidation work. No accepted correction or pooled timing claim.

  • History #149727/#149894: Final-source SPA pairs prevent two unintended loads per original. Direct startup 2,072 may instead be persisted snapshot plus zero delta. Normal/controlled 4× CPU hydration distinguishes admission from intentional timeout/token retirement; does not retroactively explain O2. Unreliable marker excluded. Auto-end cancellation has direct writer proof, including 2/3 exercising predecessor trials; no timing inference.

  • Responsive follow: Matched same-conversation split controls and causal reversal reproduce the marker-null branch on original and held candidate (81.5 px narrow / 116.5 px return). Temporary provenance marking reaches 0/0.5 px, then removal restores the defect. ArrowUp reaches the same geometry predicate; original and both diagnostics retain reader lock, so no final regression is claimed from that sample. Single-pane controls reach 0/0.5 px with different geometry. New main 162d0fc changes maintenance/input owners; these old-base live cells are not current-main proof. Existing startup, 80.5 px reader-anchor drift, physical-input, recovery, timing and image gaps remain. S8 native Tab moves focus and scrolls to top before geometry; reader mode is retained. Its history grows and narrow sampling does not settle, so it is separate focus coverage, not another matched clamp comparison.

  • Retention/eviction: R1–R4/H1: three-slot LRU and retained