-
Notifications
You must be signed in to change notification settings - Fork 303
[Bug] 2026.9.3: tray connects as node but no window ever opens — UI thread spins in InitialTailPositioner LayoutUpdated to StartBringItemIntoView loop #1409
Copy link
Copy link
Closed as duplicate of#1167
Labels
P0Emergency: data loss, security bypass, crash loop, or unusable core runtime.Emergency: data loss, security bypass, crash loop, or unusable core runtime.clawsweeper:needs-infoClawSweeper needs more reporter information before it can verify this issue.ClawSweeper needs more reporter information before it can verify this issue.clawsweeper:needs-maintainer-reviewClawSweeper marked this issue as needing maintainer review before automation.ClawSweeper marked this issue as needing maintainer review before automation.clawsweeper:no-new-fix-prClawSweeper does not recommend queueing a new automated fix PR for this issue.ClawSweeper does not recommend queueing a new automated fix PR for this issue.impact:crash-loopThis issue is about crashes, hangs, restart loops, or process-level availability.This issue is about crashes, hangs, restart loops, or process-level availability.impact:ux-release-blockerA non-technical user is blocked without terminal, logs, config, or support.A non-technical user is blocked without terminal, logs, config, or support.issue-rating: 🦐 gold shrimpDecent issue quality, but reproduction details are still incomplete.Decent issue quality, but reproduction details are still incomplete.
Milestone
Description
Activity
Metadata
Metadata
Assignees
Labels
P0Emergency: data loss, security bypass, crash loop, or unusable core runtime.Emergency: data loss, security bypass, crash loop, or unusable core runtime.clawsweeper:needs-infoClawSweeper needs more reporter information before it can verify this issue.ClawSweeper needs more reporter information before it can verify this issue.clawsweeper:needs-maintainer-reviewClawSweeper marked this issue as needing maintainer review before automation.ClawSweeper marked this issue as needing maintainer review before automation.clawsweeper:no-new-fix-prClawSweeper does not recommend queueing a new automated fix PR for this issue.ClawSweeper does not recommend queueing a new automated fix PR for this issue.impact:crash-loopThis issue is about crashes, hangs, restart loops, or process-level availability.This issue is about crashes, hangs, restart loops, or process-level availability.impact:ux-release-blockerA non-technical user is blocked without terminal, logs, config, or support.A non-technical user is blocked without terminal, logs, config, or support.issue-rating: 🦐 gold shrimpDecent issue quality, but reproduction details are still incomplete.Decent issue quality, but reproduction details are still incomplete.
Type
Fields
Priority
None yet
Projects
- StatusShow more project fieldsBacklog
Summary
On
2026.9.3,OpenClaw.Tray.WinUIstarts, shows its tray icon, and connects to the gateway as a node normally — but no window is ever created and clicking the tray does nothing. The UI thread pegs one core permanently inside an initial scroll-to-tail positioning loop in the chat list, and because that runs insideApplication.Start, window creation never completes.This does not reproduce on
2026.7.1.0, where the same machine's UI thread loop had a different signature (see "Regression range" below).Environment
ProductVersion 2026.9.3+84928c4370bc52d7f19127c65a637c7a28aab46e), Unpackaged install under%LOCALAPPDATA%\OpenClawTray\hello-ok,Node status: Connected)Symptoms
Process.MainWindowHandle == 0.OpenClaw.Tray.WinUIburns ~100% of one core indefinitely (439.6 s CPU across ~8 minutes of uptime).Win32_PerfFormattedData_PerfProc_Threadshows thread 0 at 97–99%, ThreadState 2 (Running).Evidence
Four
dotnet-stack reportsamples of the live process (three consecutive, plus one more after a deliberate revert-and-reproduce) all land on the same UI-thread stack:A second thread sits in
GC.RunFinalizers→WinRT.IObjectReference.Finalize(), consistent with WinRT wrappers being allocated and discarded at rate inside the loop.Reading:
InitialTailPositionerhandlesLayoutUpdatedand callsItemsView.StartBringItemIntoViewto position the chat at the newest message. That bring-into-view invalidates layout, which re-firesLayoutUpdated, which requests it again. The cycle never converges. Because it runs on the dispatcher insideApplication.Start, the window never finishes being created.Diagnostic trap worth noting
Process.RespondingreportsTruethroughout, which makes the app look healthy to any monitoring that checks it. .NET evaluatesRespondingagainst the main window, and withMainWindowHandle == 0there is no window to test, so it answers vacuously. Anyone triaging this should checkMainWindowHandlealongsideResponding.Relatedly, each tray click spawns a second process that logs
Previous session did not exit cleanlyand exits — it is trying to hand off to the pegged instance and failing. The log fills with what look like repeated crashes but are actually failed activations.Reproduction / confirmation
2026.9.3with node mode enabled and an existing agent session."UseLegacyWebChat": truein%APPDATA%\OpenClawTray\settings.jsonand restart → window appears, CPU drops to 3–6%.falseand restart → the failure reproduces immediately and identically, and a fresh stack sample lands on the same frames.Step 4 was run deliberately to confirm the workaround is load-bearing rather than coincidental.
What does NOT help
"ShowChatToolCalls": false— mitigated the previous 2026.7.x UI-thread loop on this machine; has no effect on this one.last-chat-state.jsonto prevent thread restore — still 100% CPU, stillMainWindowHandle == 0. The positioner runs regardless of restored state, so this is not per-session-state dependent.Workaround
"UseLegacyWebChat": truein%APPDATA%\OpenClawTray\settings.json. This routes chat through the WebView surface and takes the nativeItemsViewchat out of service. Window creation then completes and the app is usable.Regression range and probable culprit
ReactorItemsViewScrollControllerappears nowhere in this machine's2026.7.1.0stack captures (that build's loop was inReactorHostControl.RenderLoop→ReactorChatComposer/ToolCallCardRenderer→LocalizationHelper.GetString). So this looks introduced in 2026.9.3.The same class and
LayoutUpdatedhandling were reworked immediately before this release:Chat/ReactorItemsViewScrollController.cs,InitialTailPositioner,LayoutUpdated)Those changes were fixing "scroll settles in the wrong place"; this looks like the resulting "scroll never settles". A convergence guard on the tail request (bail once the target is satisfied, or cap re-entrant requests per layout pass) would likely close it.
Full
dotnet-stackcaptures (three concurring samples plus the post-revert confirmation) are available on request — happy to paste them or attach if useful.