Skip to content

refactor(chat): remove the standalone tray chat popup - #1688

Merged
karkarl merged 9 commits into
mainfrom
bkudiess-remove-tray-chat
Oct 20, 2026
Merged

karkarl merged 9 commits into
mainfrom
bkudiess-remove-tray-chat

Conversation

@bkudiess

@bkudiess bkudiess commented Oct 9, 2026 •

Copy link
Copy Markdown
Collaborator

What Problem This Solves

OpenClaw retains a separate compact chat popup and obsolete dual-host plumbing even though Workspace is the main chat experience.

User Impact

Chat opens in Workspace, including Local AI's Open chat action. The tray icon and its Chat shortcut remain. The compact popup is intentionally removed; native/WebView chat, URI aliases, saved configuration and background Gateway/MCP services remain.

Draft, not merge-ready: required local checks pass on the recorded recheck, but extended UI failures, two latest accessibility page-marker timeouts, missing shipped-app /new proof and unavailable final shared autoreview remain disclosed blockers.

Why This Change Was Made

One host removes duplicate prewarm, credential-refresh, disposal, voice/attachment, diagnostic and session-picker paths. Composer /new synchronizes Workspace sidebar/agent/history state without remounting; late completion on Notifications does not navigate away.

WindowManager remains the window owner, Workspace the navigation owner and ChatPage the UI/explicit setup-binding applicator. The app-owned provider and per-mount composer retain their lifetimes. No closed responsibility returns to App.

Evidence

  • Real current-head app, isolated synthetic Gateway, owned-window capture. Conversations/draft shown are fixture data, not user content.
  • UIA invoked the actual TrayMenuItemopenchat. Workspace focused with the draft retained. Composer session picker and old tray diagnostic override were absent.
  • Live authenticated MCP discovery/invocation confirmed chat/navigation tools and exactly one Go to Chat command in app.search {"query":"chat"}.
  • Hanselman: independent Claude Opus 5.5 and GPT-6 Astra/high reviews found no blocking introduced defect. Opus-only LOW unreachable Frame override was removed after approval, with a regression guard; its three-file post-review delta was verified separately.
  • ClawSweeper's exact-head review found no actionable findings, ready for maintainer review; overall/proof 3/6, patch quality 4/6. Notes about spelling-only guards and missing /new shipped-app sidebar/history proof remain dispositioned below. This is not merge approval.

Tray Chat action remains

Workspace after actual tray Chat invocation, draft retained and composer session picker absent

Diagnostics exposes only the Workspace chat override

All three URLs were fetched anonymously after embedding, returned HTTP 200/image PNG, and matched the source SHA256 values below.

Change Type

  • Bug fix
  • Feature
  • Refactor
  • Docs or instructions
  • Tests or validation
  • Security hardening
  • Chore or infrastructure

Scope

  • Tray or WinUI UX
  • Windows node capability
  • Local MCP or winnode
  • Gateway, connection, or pairing
  • Setup or onboarding
  • Permissions, privacy, or security
  • Tests, CI, or docs

Required proof pools

  • windows-winui-interactive: removed WinUI surface, navigation/composer consolidation, diagnostic/localized UI cleanup and native setup presentation. Current-head native UIA/capture is supplied; the entire pool is not claimed green.

No installer/signing, native dependency/RID, WSL setup/protocol, node command, GPU inference or MXC execution change. ARM64 is the actual host, not x64 emulation or release-candidate ARM64 acceptance.

Validation

Head: f71dd657ade5031e05162a094397f4b87839aeb8. Base: 037c17dcb581cbe427ab1939576515643b9e0707. Worktree root and isolated tray data are set explicitly; all reported runs have nonzero counts.

Exact command Result at the PR head
.\build.ps1 Passed, exit 0; Shared, CLI, WinNodeCLI, SetupEngine, WinUI rebuilt
dotnet test .\tests\OpenClaw.Shared.Tests\OpenClaw.Shared.Tests.csproj --no-restore 4,260 passed, 37 skipped, 0 failed; total 4,297
dotnet test .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csproj --no-restore Recorded recheck: 4,008 passed, 0 failed, 0 skipped
dotnet test .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csproj --no-restore --filter FullyQualifiedName~QueuedSend_InFlightAckWithoutLifecycle_RequeuesAndRetriesSameIdempotencyKey 1 passed, 0 failed
.\scripts\validate-docs.ps1 (included in build) Passed; 58 Markdown files, 7 pools
dotnet test .\tests\OpenClaw.Tray.UITests\OpenClaw.Tray.UITests.csproj -r win-arm64 -p:Platform=ARM64 --filter FullyQualifiedName~AccessibilityScanTests 18 passed, 2 failed, 0 skipped; VoiceSettingsPage/ConfigPage marker timeouts

Retained failed/blocked results, not replaced by earlier passes:

  • Initial exact-head Tray: 4,007 passed/1 failed in the unchanged queued-send test named above. It waits for send-call count before later queue-snapshot publication. Focused reproduction and one full recheck passed; original failed TRX remains. No source/assertion change or failures omitted.
  • Earlier source-equivalent accessibility: 20 passed. Latest head: two marker waits timed out after readiness acknowledgement. An initial build lock from an owned fixture host was released before the actual test run.
  • Earlier component UI: 75 passed/25 failed/2 opt-in skips. Unchanged base: 77 passed/identical 25 failures/same skips; two retired session-menu cases account for the pass-count difference. Failures: 20 exact 44-DIP comparisons against 43.999996, 3 minimum 32-DIP comparisons against 31.999998, 2 reasoning-popup contrast checks.
  • .\scripts\test-gateway-fixture.ps1 -AppPath <explicit Debug app> -Configuration Debug -Screenshots and pre-commit Release equivalent: each 31 profile/MCP passed; 13 UI passed/1 wide-width message-240 visibility failure. Full unchanged-base UI class reproduced that failure (13/1). An isolated base case passed; fixed-three changed-source diagnostics had 1 pass/2 failures, all retained, not retry-to-green. Separate investigation: #1437.
  • Mixed in-process WinUI/real-app UIA aborted at COM finalizer teardown after ten cases, before finishing its filter. Separate runners passed; the aborted result remains failed proof.
  • Pre-commit source-equivalent .\build.ps1 -Project WinUI -Configuration Release passed; not exact-commit Release proof.
  • Shared scripts/autoreview preflight passed with --mode local --base 037c17dcb581cbe427ab1939576515643b9e0707 --engine codex --max-priority P3 --no-web-search. Actual review: reviewer_unavailable, exit 1, HTTP 401; Codex not logged in, no report. Hanselman/ClawSweeper are independent evidence, not a fabricated helper success.

Real Behavior Proof

  • Environment tested: Windows 11 build 28120.0, native ARM64 process/OS, .NET 10.0.401, Windows SDK 10.0.26100.0, WebView2 155.0.4283.45. Synthetic Gateway; isolated tray/roaming/local roots; execution/external integrations disabled.
  • PR head or commit tested: f71dd657ade5031e05162a094397f4b87839aeb8.
  • Exact steps or command run: dotnet <built OpenClaw.GatewayFixtureHost.dll> --app <current Debug OpenClaw.Tray.WinUI.exe> --duration-seconds 300 --artifacts <owned directory>. Authenticated local MCP initialize, tools/list, app.navigate {"page":"chat"}. Enter fixed synthetic draft via UIA. Forward openclaw://tray-menu in the same profile and invoke TrayMenuItemopenchat. app.navigate {"page":"debug"}; expand Chat surface overrides and inspect DebugPageChatOverride; invoke app.search {"query":"chat"} and app.status.
  • Evidence after fix: three inspected and byte-verified screenshots plus safe copied assertions below.
  • Observed result: tray Chat focused populated Workspace, draft retained, session picker/old tray override absent, single Workspace diagnostic override. MCP: Connected operator, node execution off, five sessions, singular Chat command. Separate synthetic fixture tests cover draft/history and setup recovery/authority rejection, not real Gateway /new.
  • Screenshot or artifact links verified? (Yes/No/N/A): Yes, three anonymous HTTP 200/image PNG fetches with exact SHA256.
  • Not verified or blocked: shipped-app /new sidebar/agent/Back-Forward synchronization and late completion on Notifications; real Gateway /new/streaming; speech devices/voice-hotkey cold start; runtime WebView pending key; gateway switch on Notifications; real high contrast; specialized keyboard/pointer; full green UI pool; final shared autoreview authentication. Browse fixture rejects sessions.create; policy/controller tests are not a substitute.
Copied safe live MCP/owned-window proof
{
  "head": "f71dd657ade5031e05162a094397f4b87839aeb8",
  "operatorState": "Connected", "nodeConnected": false, "sessionCount": 5,
  "chatSearch": { "Title": "Go to Chat", "Subtitle": "Open chat" },
  "discoveredTools": ["app.navigate", "app.status", "app.search", "app.chat.snapshot", "app.chat.send", "app.chat.reset", "app.chat.queue.list", "app.chat.queue.cancel"],
  "assertions": ["TrayMenuItemopenchat focused Workspace", "Synthetic draft retained", "ChatComposerSessionPicker absent", "DebugPageTrayChatOverride absent", "DebugPageChatOverride present"],
  "captureMethod": "PrintWindow owned HWND only; focused crops exclude unrelated UI",
  "imageSha256": {
    "workspace-after-tray-chat.png": "e1b9667c33ebb9a9321da54aebaab22aa37caa68ff24d80652872a4f76ee88b0",
    "tray-chat-action.png": "108159f6ca6d0bb8a5e43e720d2db634ce474396e1a89ded8bef8c5bb17ccc43",
    "workspace-diagnostic-override.png": "3f4573d5dccf8ff03b916e4dc6d1cf07d0635a523ba94e0042bb25ae74536df7"
  }
}

No token, identity, registry, settings file, user-profile path, real conversation or unrelated desktop content is published.

Security Impact

  • New permissions or capabilities? (Yes/No): No.
  • Secrets or tokens handling changed? (Yes/No): No new handling; obsolete popup cache/prewarm removed, credential precedence/setup authority retained.
  • New or changed network calls? (Yes/No): No new calls/protocols; hidden surface no longer starts.
  • Command or tool execution surface changed? (Yes/No): No new/renamed node/MCP command/schema; duplicate standalone-chat catalog entry removed.
  • Data access scope changed? (Yes/No): No.
  • If any answer is Yes, explain the risk and mitigation: N/A; public proof excludes real user data/credentials.

Compatibility and Migration

  • Backward compatible? (Yes/No): Yes for settings/aliases; intentional popup removal opens Workspace instead.
  • Config or environment changes? (Yes/No): No; persisted UseLegacyWebChat and optional WebView remain.
  • Migration needed? (Yes/No): No.
  • If yes, list the exact upgrade steps: N/A; no user history/profile/identities/registry/settings deleted.

Review Conversations

  • I replied to or resolved every bot review conversation addressed by this PR.
  • I left unresolved only conversations that still need maintainer judgment.

ClawSweeper found no actionable introduced defect. Its spelling-guard suggestion is not applied as an unrelated publication-time rewrite; its /new runtime-proof gap remains blocked. CI is running, not claimed green.

Maintainer access: same-repository head branch is directly editable by maintainers. GitHub rejects the fork-only collaboration toggle for same-repository PRs; branch access is not denied.

Remove compact tray chat and obsolete multi-host/picker plumbing. Preserve tray launchers, native/WebView behavior and background services. Synchronize composer-created sessions with Workspace navigation and protect retired paths with regression guards.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@clawsweeper

clawsweeper Bot commented Oct 9, 2026 •

Copy link
Copy Markdown

🦞👀
ClawSweeper picked this up.

Pull request received. I will update this pull request when review starts.

ClawSweeper review complete

ClawSweeper finished reviewing this revision. The review result is being finalized.

View the workflow run.

@bkudiess bkudiess added status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. status: 🚢 actively landing A maintainer or agent is actively driving this item through implementation, validation, or merge. labels Oct 9, 2026
@clawsweeper clawsweeper Bot added P3 Low-risk cleanup, docs, polish, ergonomics, or speculative feature. merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Oct 9, 2026
@clawsweeper

clawsweeper Bot commented Oct 9, 2026 •

Copy link
Copy Markdown

Codex review: needs maintainer review before merge.

What this changes

The PR removes the compact chat popup, routes chat actions to Workspace, and synchronizes composer-created conversations with Workspace navigation.

Example: The user selects Local AI's Open chat action.

  • Before: A separate compact OpenClaw Chat popup opens.
  • After: Chat opens in Workspace.

Review scores

Measure Result What it means
Overall readiness 🦐 gold shrimp (3/6) Useful consolidation with credible app-entry evidence and no concrete defect, but incomplete session-handoff coverage and low-value tests limit confidence.
Proof confidence 🦐 gold shrimp (3/6) This collaborator-authored PR is outside the external-contributor proof gate. Inspected exact-head Windows ARM64 screenshots and authenticated MCP observations demonstrate tray activation into populated Workspace, retained draft, and the single diagnostic override; the new /new navigation handoff remains unverified through the shipped app. Stored settings and data contracts are unchanged, so no migration is needed.
Patch quality 🐚 platinum hermit (4/6) No actionable review findings were identified.

Product

Kind: Refactor · Worth it: Yes
User problem: Local AI can open a separate compact chat window while other chat actions use Workspace, leaving users with two conversation surfaces.
Reason: The author has prior merged ownership work in the affected window and composer areas and records the intentional cutover. Consolidating the hosts removes substantial maintenance overhead while retaining the established Workspace experience.

Merge readiness

✅ Ready for maintainer review

Keep open: this collaborator-authored PR contains useful, owner-backed consolidation absent from main. No actionable introduced defect was found.

Priority: P3
Reviewed head: f71dd657ade5031e05162a094397f4b87839aeb8

Before merge

None.

Findings

None.

Tests

  • Low-value test tests/OpenClaw.Tray.Tests/WorkspaceChatRemovalContractTests.cs: RetiredChatCallbacksAndRoutes_DoNotReturnToTheirOwners: Remove the cases banning ShowWebChat and ShowHubChatAndStartVoice: they pin renamed identifiers rather than retired behavior; retain the substantive ownership guards.
  • Low-value test tests/OpenClaw.Tray.Tests/ChatSurfaceResolverTests.cs: BuildChatUrl_PreservesTransportSecurityAndTokenEscaping: Remove the added wrapper test because GatewayChatHelperTests already covers the unchanged builder's scheme, token escaping, and transport restrictions.
  • Missing end-to-end proof: The new /new handoff lacks a current-head shipped-app demonstration of sidebar, agent, and Back/Forward synchronization, including late completion on Notifications; base-fail/head-pass execution was not run in this read-only review.
Agent review details

How this fits together

Windows Companion displays Gateway conversations and accepts chat actions from the tray, Settings, and local automation. Workspace owns conversation navigation while the Gateway connection and shared chat provider run independently of its window.

flowchart TD
  A[Tray and Local AI chat actions] --> B[Window routing]
  B --> C[Workspace conversation navigation]
  C --> D[Saved renderer preference]
  D --> E[Native chat]
  D --> F[Embedded Gateway web chat]
  E <--> G[Existing Gateway connection]
  F <--> G
Loading

Technical review

Best possible solution:

Keep Workspace as the single conversation owner while preserving renderer preferences, mount-local drafts, verified setup binding, and independent background services.

Do we have a high-confidence way to reproduce the issue?

Not applicable: this PR consolidates working chat surfaces rather than fixing a reported behavioral failure.

Is this the best way to solve the issue?

Yes: removing the duplicate host and using the established Workspace, provider, and composer owners provides a maintainable cutover without another configuration option.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning medium; reviewed against 037c17dcb581.

Provenance checked

Testing

Proof path: shipped entry point.

Security

None.

Evidence

What I checked:

Likely related people:

  • Barbara Kudiess: Raw commit 3a097bc adds src/OpenClaw.Tray.WinUI/Services/WindowManager.cs:33 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: high; commits: 3a097bc85f7b; files: src/OpenClaw.Tray.WinUI/Services/WindowManager.cs)
  • Karen: Raw commit 3a58bf3 adds src/OpenClaw.Tray.WinUI/Presentation/WorkspaceNavigation.cs:82 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: high; commits: 3a58bf34902f; files: src/OpenClaw.Tray.WinUI/Presentation/WorkspaceNavigation.cs)

Review metrics

Metric Value Why it matters
Production and test footprint Production +113/-1,528 lines; tests +414/-401 lines The single-host cutover substantially reduces production code; counts exclude documentation and localized resources.

Labels

Label changes:

  • add proof: 📸 screenshot: Contributor real behavior proof includes screenshot evidence.

Label justifications:

  • P3: This is an owner-backed consolidation without an established urgent user-facing failure.
  • merge-risk: 🚨 compatibility: The compact popup and independent diagnostic override intentionally disappear under recorded area-owner direction, while saved renderer preferences and URI aliases remain.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦐 gold shrimp and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR.
  • proof: 📸 screenshot: Contributor real behavior proof includes screenshot evidence.

Rank-up moves

Optional improvements that raise the rating; they are not merge blockers.

  • Demonstrate /new in the current-head app with sidebar, agent, Back/Forward, and late Notifications completion visible; redact private information.

Rating scale

6/6 🦀 challenger crab · 5/6 🦞 diamond lobster · 4/6 🐚 platinum hermit · 3/6 🦐 gold shrimp · 2/6 🦪 silver shellfish · 1/6 🧂 unranked krab. Overall follows the weaker of proof and patch quality; ✨ marks media proof (a screenshot, video, or linked artifact) that directly shows the changed behavior.

Workflow

ClawSweeper edits this one comment on every review. Comment @clawsweeper re-review for a fresh review only; repair and merge need explicit maintainer commands such as @clawsweeper autofix or @clawsweeper automerge.

History

Review history (2 earlier review cycles)
  • reviewed 2026-10-09T06:40:32.664Z sha f71dd65 :: needs maintainer review before merge. :: none
  • reviewed 2026-10-09T06:59:30.865Z sha f71dd65 :: needs changes before merge. :: none

Reviewed October 9, 2026, 1:38 PM ET / 17:38 UTC (Revision 3).

@bkudiess

bkudiess commented Oct 9, 2026

Copy link
Copy Markdown
Collaborator Author

Current-head proof publication is complete: the tray Chat control was invoked through UIA, Workspace retained the synthetic draft, the composer session picker and obsolete tray diagnostic override were absent, and MCP advertised one Chat command. The three owned-window screenshots are embedded in the PR body and were fetched anonymously with HTTP 200 and exact PNG SHA256 verification.

Disposition of the advisory test notes: the /new shipped-app sidebar/Back-Forward/Notifications proof gap remains explicitly unverified. The pure policy and controller tests are not claimed as that proof. The renamed-identifier spelling-guard suggestion is acknowledged and left for maintainer judgment; the substantive retired-host ownership/authority guards remain. No publication-time production or test rewrite was made to improve a review score.

The PR remains draft. The exact-head build and Shared suite pass; the recorded Tray recheck passes, with the initial unchanged queued-send synchronization failure retained. Latest accessibility has two marker timeouts, extended baseline UI failures remain disclosed, and the final shared autoreview helper is blocked by Codex authentication. ClawSweeper's source review and ready-for-maintainer label do not waive those proof gates. No merge or automatic-fix command is requested.

@bkudiess bkudiess removed the status: 🚢 actively landing A maintainer or agent is actively driving this item through implementation, validation, or merge. label Oct 9, 2026
@bkudiess

bkudiess commented Oct 9, 2026

Copy link
Copy Markdown
Collaborator Author

CI publication closeout: the exact-head workflow completed successfully for f71dd65. Current checks: 17 successful, 7 skipped, none failed or pending. Run: https://github.com/openclaw/openclaw-windows-node/actions/runs/37894256075 . This hosted result does not waive the explicitly documented local UI/proof and autoreview-authentication blockers; the PR remains draft.

@bkudiess
bkudiess marked this pull request as ready for review October 9, 2026 17:34
@clawsweeper clawsweeper Bot added the proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. label Oct 9, 2026
@karkarl

karkarl commented Oct 9, 2026

Copy link
Copy Markdown
Collaborator

Global triage: HOLD_FOR_AUTHOR. Take confidence 20%; recommendation confidence 98%; effort large; risk high.

Reviewed exact head f71dd657ade5. GitHub currently reports CLEAN with 38 passing, 1 failing, and 0 pending checks. proof pools are declared. Durable automated signal: Codex review: needs maintainer review before merge..

Author: investigate the 1 failing check(s), establish whether each failure is branch-owned, and publish a green exact-head CI Gate before reconsideration.

This is a triage classification, not a merge action. No branch changes were made.

@karkarl karkarl added the status: 🚢 actively landing A maintainer or agent is actively driving this item through implementation, validation, or merge. label Oct 16, 2026
karkarl and others added 5 commits October 16, 2026 14:06
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: e1104e70-db86-4f2a-8a9f-917dc0aad334
Carry the effective previous thread through the composer handoff, bind unresolved Home before adding the new conversation, and preserve delayed Notifications behavior. Add regression tests and opt-in fixture-backed composer proof.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: e1104e70-db86-4f2a-8a9f-917dc0aad334
The bell opens a flyout; activate its Open notifications action before asserting delayed composer completion preserves the full page.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: e1104e70-db86-4f2a-8a9f-917dc0aad334
A history acknowledgement can precede the welcome-state settling timer. Require the rendered welcome text so new/forward screenshots do not capture the loading placeholder.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: e1104e70-db86-4f2a-8a9f-917dc0aad334
Wait for the created thread's actual history request before asserting Notifications remains visible. Returning Home must still render that new thread. The MCP provider default is not the mounted Workspace selection contract.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: e1104e70-db86-4f2a-8a9f-917dc0aad334
@larroy
larroy self-requested a review October 17, 2026 00:07
@karkarl

karkarl commented Oct 20, 2026 •

Copy link
Copy Markdown
Collaborator

Merge conflicts resolved and pushed; required local validation and hosted CI passed. Current head: b8057177aa7fb2bf9d56a28b9a1facda261ffe3e, tree 63901f3f996dd1c615ed5a8833b74a9216b32593. Merge commit 26941fd4138beac48c766d629642e95191898ca4 integrates main 0131e4ce1f7937b22c69b289564087061687fa14 without rewriting contributor history. The subsequent main commit 431bd8f9c1aabd2b0c933afcbee82a07ac0646a8 also merges cleanly in a read-only merge preview. At 2026-10-20T18:37:58Z, GitHub reports mergeable: true, mergeable_state: clean, OPEN and unmerged. No merge authorization is inferred.

The standalone popup remains removed. The composer still captures the previous effective thread before handing off the new selection, and the existing Workspace navigation owner binds unresolved initial Home to that predecessor before adding the new conversation. The conflict resolution also preserves main's newer placement and navigation-revision fencing. A pending /new completion must not override navigation committed while it was pending: after opening Notifications, Home retains the original conversation A, and the newly created B remains available for explicit sidebar selection.

The older screenshots below are historical 73e879ba evidence, not proof of the current head. Main changed the welcome and delayed-navigation contract. The two-case regression was updated accordingly; new-head native execution is still awaiting a separately authorized desktop slot.

Required proof pools

  • windows-winui-interactive: current-head focused composer/navigation proof is not yet run, blocked on coordinated desktop admission.
  • windows-11-arm64: current-head native ARM64 compilation passed. Current-head interactive execution is not yet run. Neither entire proof pool is claimed complete.

Validation

All results in this table are from clean b8057177 in the user-authorized standalone validation checkout with independent Git metadata. GitVersion and assembly metadata remained enabled, without a runtime-selection override. OPENCLAW_REPO_ROOT identifies that checkout and OPENCLAW_TRAY_DATA_DIR isolates test settings.

Command Result
.\build.ps1 Passed all projects and the documentation gate.
dotnet build .\tests\OpenClaw.Shared.Tests\OpenClaw.Shared.Tests.csproj Passed, initializing test assets before --no-restore.
dotnet test .\tests\OpenClaw.Shared.Tests\OpenClaw.Shared.Tests.csproj --no-restore 4,488 passed, 35 ordinary skips, 0 failed. Actual TRX counters checked.
dotnet build .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csproj Passed.
dotnet test .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csproj --no-restore 4,320 passed, 0 skipped, 0 failed. Actual TRX counters checked.
dotnet build .\tests\OpenClaw.Tray.UITests\OpenClaw.Tray.UITests.csproj -r win-arm64 -p:Platform=ARM64 -p:DevBuild=false Passed; one existing generated-XAML obsolete-Icon warning. This is compilation, not UI execution.

The batch ran 18:05:09.2177000Z to 18:13:38.7370826Z on October 20. At 18:14:08Z, an independent audit verified runner PID 60160 gone and no active validation-checkout dotnet/testhost/app process. The bulk slot was explicitly released. No desktop, Gateway, WSL, or VM was launched for this batch.

An earlier merge-candidate run at 26941fd passed the full build and Shared suite, then failed Tray compilation because two incoming placement test fixtures still supplied the removed channel-list constructor argument. b8057177 removes only those two obsolete arguments, preserving every assertion. The entire required batch was rerun successfully; the failed run is not counted as a Tray/UI pass.

Hosted CI

  • Build and Test, run 39473133591: passed for exact head b8057177. Core/CLI, Tray/setup/integration, UI/functional/accessibility, all three WSL Gateway E2E lanes, x64 publish smoke, x64/ARM64 MSIX artifacts, and the multi-architecture bundle passed.
  • CodeQL, run 39473134332: passed for that same head.
  • The required ruleset check CI Gate passed. The final exact-head check inventory has no pending or failed check; workflow-conditioned release/promotion jobs were skipped as intended. This is actual product CI evidence, not a dispatch-only result.

Real behavior proof

Current-head focused local cases: not verified yet. A replacement process-bounded two-case runner is under source review, with no new desktop admission. It must run Delayed alone first. History may start in a separate process only after a fresh TRX proves one executed pass with zero skips, independent owned-resource cleanup succeeds, and at least 180 seconds of execution budget remain. No automatic retry or second case after failure is authorized. Passing hosted UI/accessibility jobs do not establish that these opt-in local fixture cases ran.

The new Delayed case requires Notifications to remain visible, Home itself to remain selected while rendering original conversation A, explicit selection of created B to render its current welcome, exactly one sessions.create, and zero chat.send. The History case still requires Back to restore the initial transcript and Forward to restore B. No guard or assertion was weakened to preserve the obsolete delayed-selection behavior.

Current frozen binaries, whose ProductVersion includes exact source SHA b8057177:

Artifact SHA256
ARM64 app EXE FDE3EC1961F92D452605759FD08B77FA78CE7F0CEBF2828B0A20BA68EA88F62F
App assembly 9AF5B86382E858F65FAC212178A204F6B547E0A04C5F4743210012FD910696D2
UI test assembly B7D490718C083ECCCF35B35079AA6D066F7DDEEC338C78B3F98DCCB7EB60DB2C

Historical passing proof at 73e879ba

Both isolated cases passed at 73e879baa7ee98e481c1b1026c46f89ef485b36e (tree c26e7212010fcafbc287d0355c1ed9df37aa2ff7), before integrating the new navigation fence. Delayed executed one passing test, zero skips, in 11 seconds; History independently executed one passing test, zero skips, in 5 seconds. Each wire receipt recorded one sessions.create, zero chat.send, and one accepted new-thread history response. These historical results are retained but are not relabeled as current-head proof.

The historical exclusive window began 16:57:32.1766549Z, with execution cutoff 17:03:32.1766549Z and cleanup cutoff 17:04:32.1766549Z. All owned processes and six isolated profile/roaming/local roots were independently verified gone; release was early at 16:58:52.1907181Z. No retries or guard bypasses were used.

Run 99ad0c41165c407aa66d51ec37178e60 used app PID 39648 / HWND 0xB415A6; run 2664fd1e321049e891a9c4f728b7b09d used app PID 13836 / HWND 0xB615A6. Seven owned-window PNG hashes matched capture metadata. Four selected hosted images were anonymously downloaded, returned HTTP 200/image/png, and matched local SHA256 values.

Historical 73e879ba Back proof: original synthetic transcript restored and Forward enabled

Historical 73e879ba Forward proof: new conversation selected with the previous welcome design

Historical 73e879ba delayed proof: Notifications remained visible after creation

Historical 73e879ba Home proof: retained new conversation before main added the newer-navigation fence; not the current expected behavior

The Back screenshot caught the blue selection-indicator animation between rows; the original transcript and enabled Forward button were visible, and the test separately confirmed the main row selected. Historical EXE SHA256: AF9D9E0314152FFFC1D104B26B502F140D39F2C55DE88378FEB887F973C3EB07; DLL SHA256: EDC4802A906B5FED8F048B749D2A6DA3BCB08E808253457402A797EBB07DACCE. Its ProductVersion bound the exact source SHA; the independent clone's prerelease label was not a release-package/version-parity claim.

Historical normal validation at that head passed full build, Shared 4,316 passed / 35 ordinary skips, Tray 4,099 passed / 0 skips, and ARM64 UI compilation. These counts are separate from the new-head results above.

Retained failures, review, and limits

  • An earlier eb6e31bf attempt unexpectedly submitted literal ab/new, producing rejected chat.send rather than intended sessions.create. The input source remains unknown. It does not prove a product Notifications/history defect or success. Its second case reached creation and Back but was stopped after unexpected-input evidence was found; it is partial, not a completed Back/Forward pass. Owned cleanup was verified, with release at 15:20:24Z.
  • That interrupted Back capture remains historical partial evidence.
  • A later eb6e31bf Delayed-only run failed because its test expected a session row selected after clicking Home. The documented contract selects Home. The test-only 73e879ba correction retained mounted-thread/history/welcome checks and added Home-selected/session-not-selected assertions. Owned cleanup was verified at 15:54:39Z; History was not launched after failure. Main's subsequent navigation fence is a separate intentional behavior change, preserved by the present merge.
  • Earlier harness failures concerned opening only the Notifications flyout, capturing before welcome settled, and treating MCP's provider-default thread as mounted Workspace selection. Those attempts remain failures, not passing proof.
  • Earlier linked-worktree test attempts failed before execution in GitVersion, including AbandonedMutexException. Read-only diagnostics identified shared common-Git mutex contention. No peer process was stopped or lock manipulated. Normal independent-checkout validation supersedes that environment blocker without disabling metadata.
  • The shared autoreview helper returned HTTP 401. An independent source-only fallback found no significant P0-P3 issues in merge integration at 26941fd; the later two-line test-fixture correction is covered by successful full validation. This is not helper-isolated review or native UX proof.
  • Fixture proof uses the real ARM64 WinUI app, provider, authenticated local MCP, and composer UI Automation against a synthetic loopback Gateway. It does not prove physical-keyboard input, real Gateway pairing, inference, or node.invoke.
  • Broader voice-hotkey/cold-start, WebView pending-key, native keyboard/pointer, high-contrast, and whole-pool proof have not been rerun. The author's disclosed broader ARM64 UI/accessibility failures are not erased by these focused cases.
  • The former dirty mergeability report is resolved by the actual main integration, and required hosted CI passed. Current-head focused local native proof remains blocked on runner review and separate desktop authorization. No PR merge, force push, global settings change, or unrelated runtime change was performed.

Keep the rendered created-thread assertion after delayed completion, but require Home itself to be selected after invoking Home, as documented in CONNECTION_ARCHITECTURE.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: e1104e70-db86-4f2a-8a9f-917dc0aad334
@karkarl karkarl added status: 🚢 actively landing A maintainer or agent is actively driving this item through implementation, validation, or merge. and removed status: 🚢 actively landing A maintainer or agent is actively driving this item through implementation, validation, or merge. labels Oct 20, 2026
Preserve Workspace-only chat and predecessor history while integrating current welcome, placement, and delayed-navigation fences. Adapt regression fixtures to the current Home and welcome contracts.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: e1104e70-db86-4f2a-8a9f-917dc0aad334
Remove the retired channel-list argument from placement tests introduced by main. Preserve all placement assertions.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: e1104e70-db86-4f2a-8a9f-917dc0aad334
@larroy

larroy commented Oct 20, 2026

Copy link
Copy Markdown
Collaborator

ELI5 with 2 screenshots what is removed. I still don't get it.

@karkarl karkarl left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved.

I accept Barbara's testing and supplied proof as satisfying the human-testing requirement for this review. An additional agent-run native replay is not a prerequisite for this approval.

The standalone tray chat popup is removed while Workspace remains the chat/navigation owner. The repair preserves the initial /new predecessor history, Back/Forward behavior, and main's newer-navigation fence. Merge conflicts are resolved without rewriting contributor history.

Validation at b8057177aa7fb2bf9d56a28b9a1facda261ffe3e:

  • Full local build passed.
  • Shared tests: 4,488 passed, 35 ordinary skips, 0 failures.
  • Tray tests: 4,320 passed, 0 skips or failures.
  • ARM64 UI compilation passed.
  • Build and Test, including CI Gate and CodeQL passed. No checks remain pending or failed, and GitHub reports clean mergeability.

Evidence provenance: Barbara's published tray/Workspace screenshots cover the earlier contributor head. The later 73e879ba two-case captures also remain historical after main's navigation changes. This approval records my explicit acceptance of the supplied human testing and proof; it does not claim that an additional agent-run /new/Back/Forward/Notifications replay occurred at b8057177, or that every native proof pool was executed.

Verdict: approve on the reviewed implementation, green exact-head validation, and maintainer-accepted human proof.

@karkarl
karkarl merged commit c1d8953 into main Oct 20, 2026
26 checks passed
@karkarl
karkarl deleted the bkudiess-remove-tray-chat branch October 20, 2026 19:16
@karkarl karkarl removed the status: 🚢 actively landing A maintainer or agent is actively driving this item through implementation, validation, or merge. label Oct 20, 2026
larroy added a commit to larroy/openclaw-windows-node that referenced this pull request Oct 27, 2026
main openclaw#1688 removed compact chat (IsCompact, ChatVisuals.CompactSessionBreakpoint, ChannelGroup.cs). Drop the strip's IsCompact prop, keep its narrow context-bar breakpoint local, and remove the stale ChannelGroup.cs test include.
larroy added a commit to larroy/openclaw-windows-node that referenced this pull request Oct 28, 2026
main openclaw#1688 removed compact chat (IsCompact, ChatVisuals.CompactSessionBreakpoint, ChannelGroup.cs). Drop the strip's IsCompact prop, keep its narrow context-bar breakpoint local, and remove the stale ChannelGroup.cs test include.
joelagnel pushed a commit that referenced this pull request Oct 29, 2026
…er (#1748)

* feat(chat): show tokens/sec and context usage below the composer

Add a slim strip under the native Reactor chat composer (tray ChatWindow and
Hub ChatPage) showing current tokens/sec with mean (μ) and p95 over the last
50 measured replies per session, plus a context-window bar with used/total.

- ChatThroughputTracker: per-thread, in-memory. Live value is a chars/4
  estimate over streamed thinking/assistant text. Exact samples are one model
  call's output tokens over its streaming window, closed by the gateway
  `usage` agent event (run-cumulative outputTokens, diffed per call); the final
  assistant message's OutputTokens is the fallback when no usage stream exists.
- ChatEventMapper reads `thinking` deltas and `usage` totals, which are not
  timeline events.
- The strip subscribes to provider ThroughputChanged so thinking/usage updates
  re-render only the strip, not the timeline.
- ChatUsageFormatter resolves context usage once for both the existing pill
  and the bar; existing Format outputs are unchanged.

* fix(chat): keep throughput samples honest across missed or buffered run starts

Address rubber-duck review of the throughput strip:
- Start a run for lifecycle starts opened from the reset buffer
  (HandleOpenedLifecycle), not only for directly processed start events.
- Track whether the run's cumulative token baseline is known. A usage total
  for a run whose start was missed (provider created mid-run, ended run) only
  becomes the baseline, instead of being recorded as one call's tokens.
- End runs on lifecycle end/error: close usage-run segments so aborted runs
  cannot leave a stale window open; keep the fallback segment for the final
  message that arrives after lifecycle end.
- Strip reads stats from the provider in Render with a render-token
  subscription, so a session switch never shows the previous session's tps.
- Tooltip: samples are per model call, not per reply.
- Tests for thinking receipts, usage parsing, missed starts, and EndRun.

* test(chat): cover buffered post-reset throughput baseline reset

ClawSweeper's review of d9d8692 asked for a provider test of the
start-before-send-result ordering with a prior measurement. After
sessions.reset, a lifecycle start buffered until chat.send is accepted
must record the new run's tokens, not the delta from the previous run.

* fix(chat): align throughput strip with retired compact chat after rebase

main #1688 removed compact chat (IsCompact, ChatVisuals.CompactSessionBreakpoint, ChannelGroup.cs). Drop the strip's IsCompact prop, keep its narrow context-bar breakpoint local, and remove the stale ChannelGroup.cs test include.

* fix(chat): invalidate throughput baselines across reconnects

A connection transition can drop lifecycle start/end events, so a pre-disconnect run baseline was subtracted from a post-reconnect run total ((5000 - 100) / 2 = 2450 tps). OnStatusChanged now calls ChatThroughputTracker.InvalidateRuns on disconnect/reconnect: open windows close and baselines become unknown; completed samples are kept.
larroy added a commit to larroy/openclaw-windows-node that referenced this pull request Oct 30, 2026
…er (openclaw#1748)

* feat(chat): show tokens/sec and context usage below the composer

Add a slim strip under the native Reactor chat composer (tray ChatWindow and
Hub ChatPage) showing current tokens/sec with mean (μ) and p95 over the last
50 measured replies per session, plus a context-window bar with used/total.

- ChatThroughputTracker: per-thread, in-memory. Live value is a chars/4
  estimate over streamed thinking/assistant text. Exact samples are one model
  call's output tokens over its streaming window, closed by the gateway
  `usage` agent event (run-cumulative outputTokens, diffed per call); the final
  assistant message's OutputTokens is the fallback when no usage stream exists.
- ChatEventMapper reads `thinking` deltas and `usage` totals, which are not
  timeline events.
- The strip subscribes to provider ThroughputChanged so thinking/usage updates
  re-render only the strip, not the timeline.
- ChatUsageFormatter resolves context usage once for both the existing pill
  and the bar; existing Format outputs are unchanged.

* fix(chat): keep throughput samples honest across missed or buffered run starts

Address rubber-duck review of the throughput strip:
- Start a run for lifecycle starts opened from the reset buffer
  (HandleOpenedLifecycle), not only for directly processed start events.
- Track whether the run's cumulative token baseline is known. A usage total
  for a run whose start was missed (provider created mid-run, ended run) only
  becomes the baseline, instead of being recorded as one call's tokens.
- End runs on lifecycle end/error: close usage-run segments so aborted runs
  cannot leave a stale window open; keep the fallback segment for the final
  message that arrives after lifecycle end.
- Strip reads stats from the provider in Render with a render-token
  subscription, so a session switch never shows the previous session's tps.
- Tooltip: samples are per model call, not per reply.
- Tests for thinking receipts, usage parsing, missed starts, and EndRun.

* test(chat): cover buffered post-reset throughput baseline reset

ClawSweeper's review of d9d8692 asked for a provider test of the
start-before-send-result ordering with a prior measurement. After
sessions.reset, a lifecycle start buffered until chat.send is accepted
must record the new run's tokens, not the delta from the previous run.

* fix(chat): align throughput strip with retired compact chat after rebase

main openclaw#1688 removed compact chat (IsCompact, ChatVisuals.CompactSessionBreakpoint, ChannelGroup.cs). Drop the strip's IsCompact prop, keep its narrow context-bar breakpoint local, and remove the stale ChannelGroup.cs test include.

* fix(chat): invalidate throughput baselines across reconnects

A connection transition can drop lifecycle start/end events, so a pre-disconnect run baseline was subtracted from a post-reconnect run total ((5000 - 100) / 2 = 2450 tps). OnStatusChanged now calls ChatThroughputTracker.InvalidateRuns on disconnect/reconnect: open windows close and baselines become unknown; completed samples are kept.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. P3 Low-risk cleanup, docs, polish, ergonomics, or speculative feature. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants