Skip to content

fix: retain the selected assistant and conversation after reconnect - #1795

Merged
shanselman merged 8 commits into
openclaw:mainfrom
paulcam206:draft/hub-continuity
Nov 3, 2026
Merged

shanselman merged 8 commits into
openclaw:mainfrom
paulcam206:draft/hub-continuity

Conversation

@paulcam206

@paulcam206 paulcam206 commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

What Problem This Solves

Fixes: reconnecting or reloading Hub data can move the visible assistant or conversation away from the user-selected target.

User Impact

User impact: users retain their intended assistant and conversation through transient roster loss. A Gateway that explicitly does not support agents.list can still show its legacy conversations and create a Gateway-default conversation rather than waiting forever for a roster.

Source tracing resolved the apparent composeTarget=agent:main:main discrepancy: that field is the Gateway handshake's canonical default-send target, not mounted-window selection readback. The native composer sends CurrentThread.Id explicitly. Local MCP without an explicit thread uses canonical ComposeTarget before remembered DefaultThreadId. No compose-target change or external Companion create/select API is introduced here.

Why This Change Was Made

Keep assistant/session selection with its existing state owner and preserve it across refresh and reconnection. Do not replace the authoritative connection manager or introduce a separate chat owner.

The introduced unsupported-listing gate failure is corrected with a typed observation through the real Gateway client and existing owners. Explicit unsupported fallback and a cached authoritative roster cannot coexist; a false/reset observation is not a fresh roster. Disconnected menus keep connection guidance without authorizing session creation. Lost native-handoff source-marker guards are replaced by actual held-response/full-app and shutdown behavior checks, not retargeted marker assertions.

Continuity and onboarding automation remove different, non-overlapping old cases in NativeCompletionPresentationTests.cs. Rebase whichever lands second before final review.

Evidence

Rebase on main (a7c170a5, current head)

Current head a7c170a5e69267df75daff7d1d464f02c6a0b8ae is 99e9597b rebased cleanly onto main at 2ff4d168 (includes #1941, #1791 and #1797); no conflicts and no content changes. Local: ./build.ps1 passed; OpenClaw.Shared.Tests 4812 passed, 25 skipped, 0 failed; OpenClaw.Tray.Tests 4799 passed, 0 failed; OpenClaw.Tray.UITests compiles; docs validation passed. Throwaway crabbox Hyper-V guest (lease cbx_0333aede319c, exact head): fixture profile/app 34/34. Fixture UI 45/47:

  • The continuity cases pass.
  • SidebarSwitchesRealHistoriesAndShowsMessage240AtBothWidths needs a wider display than the 1024x768 guest.
  • ReconnectKeepsDefinitelyUnsentQueuedMessageFailedAndVisible failed 1 of 5 reruns on this head and 3 of 4 on main in the same guest, so it is pre-existing.

Hosted CI on this head is green. The current-head proof below is from 99e9597b, which has the same product and test content.

Proof on 99e9597b (pre-rebase)

Head 99e9597b63774b9c0ba509330b818f8e4e442e9d = the rebase on main (90dd8b83) plus a test-only commit. That commit adds an ordinary composer send to SelectedAssistantAndConversationSurviveTransientRosterLossButNotAuthoritativeRemoval after the held/released roster reconnect, and requires the fixture Gateway to record a completed chat.send for the restored conversation. Product code is unchanged from 90dd8b83.

Local on this head: ./build.ps1 passed; OpenClaw.Shared.Tests 4810 passed, 25 skipped, 0 failed; OpenClaw.Tray.Tests 4778 passed, 0 failed; OpenClaw.Tray.UITests compiles; scripts/validate-docs.ps1 passed.

Run in a throwaway crabbox Hyper-V guest (lease cbx_cbc09cb6594f, Windows 11 Insider 10.0.29683 x64, 1024x768, interactive session, WindowsAppRuntime 2.6.4). The head was cloned and pinned by commit and tree; the app was built in-guest (AppVersion ...Sha.99e9597b).

  • scripts/test-gateway-fixture.ps1 -Screenshots: fixture profile/app 34/34; fixture UI 44/46. The continuity cases pass: SelectedAssistantAndConversationSurviveTransientRosterLossButNotAuthoritativeRemoval (including the new send), UnsupportedAgentListing_PreservesLegacySessionsAndDefaultCreation and VerifiedSetupBindingClearsBeforeNewConversationResponse. Two failures are not continuity cases. SettingsDisconnectPruning_...(connection) failed once on a blank-capture check and passed 3/3 when rerun without screenshots. SidebarSwitchesRealHistoriesAndShowsMessage240AtBothWidths reports "The host did not provide two meaningfully different window widths", because the guest display is 1024x768 and too narrow for that case; it is environmental. CI runs both cases.
  • Settings-host integration: a guest-only harness, not part of this PR (source), passed 1/1. The flow selects the research assistant and conversation, then opens Settings, which renders inside the same Workspace window with one app window throughout. It then closes the fixture connections while agents.list is held, releases the roster and returns to chat. The same assistant and conversation are selected. Finally it sends through ChatComposerInput and ChatComposerPrimaryAction. The fixture Gateway's record ends with chat.send session=agent:research:fixture-other outcome=ok (request log).
Settings in Workspace Roster held during reconnect Chat restored Ordinary send after reconnect
settings open roster held chat restored sent after reconnect
Roster pending (selector disabled) Same assistant/conversation returned Unsupported agents.list: legacy sessions + default creation Authoritative removal requires reselection
transient returned unsupported removed

All data is synthetic fixture data. More captures and UIA metadata are on assets-only commit b244f35d (1795/). The guest has been deleted.

Rebase on main (90dd8b83, product code unchanged at the head above)

Current head 90dd8b83fa384752d12582d5bb8c56435b202fd9 is a rebase of 182aee93 onto main at 4cbbe51c; it adds no new behavior. Conflicts came from #1911 (Settings and Chat in one Companion window): WorkspaceWindow keeps main's retained Settings host and replaces _agentId with WorkspaceAgentSelection/SelectedAgentId everywhere, including the Settings and command-catalog agent fallbacks; 59c47b16 became empty because that routing is now in the first commit. The source-inspection test NativeChatHandoff_UsesWorkspaceBindingWithoutReopeningCompanionChat stays deleted as in the original change. GatewayFixtureWarningUiTests keeps main's progress-window/Workspace checks plus the new binding-invalidation case; docs/ARCHITECTURE.md and docs/ACCESSIBILITY.md keep both sides. On this head: ./build.ps1 passed; OpenClaw.Tray.UITests compiles; OpenClaw.Shared.Tests 4810 passed, 25 skipped, 0 failed (includes SessionRosterWireTests 3/3); OpenClaw.Tray.Tests 4778 passed, 0 failed (includes WorkspaceNavigationTests). Windowed UI and GatewayFixture cases were not rerun locally (no desktop windows); CI runs them. Real-app evidence below is from 182aee93.

Pre-rebase head: 182aee9334edacb5291b7b13a8ee43deb5fb4b92, based on main 2b7cfce17bb496ec5d8f0c563fb71ebb46e015fa. Published SDK 1.0.0 pins are unchanged. Current-head CI has 15 successful checks, zero failed checks, including full UI.

New standalone real-pixel proof: the independent 182aee93 executable ran on the authorized Default-desktop slot with its own throwaway profile and disposable loopback Gateway fixture. No startup/fixture sibling changes are in this executable. The earlier combined preflight remains separate and is not relabeled.

The native selector and conversation were chosen through UIA. The actual Gateway WebSocket closed/reconnected while agents.list was held and then released. The same agent/conversation returned. An ordinary native composer send, not app.chat.send and with no explicit send-thread override, reached that conversation's actual Gateway session key. A controlled fixture reply rendered in the retained thread.

Independent182 before reconnect: Fixture Research and its conversation selected

Independent182 after actual reconnect: the same assistant and conversation selected

Independent182 ordinary native send and controlled reply in the retained conversation

Inspect the actual selected UIA state and routing record, binary/image/cleanup provenance and capture qualification. All three public image URLs returned HTTP200 and byte-identical sanitized files. Visible content is entirely synthetic fixture data; inspection found no endpoint, credential or real user information. PNG metadata was removed without changing any RGBA pixels.

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: visible assistant/session selection and reconnect continuity.
  • windows-wsl-gateway-e2e: actual paired Gateway reconnection and continued selected-session routing.

Validation

Independent current source retains its complete mandatory closeout:

Command or lane Result
.\build.ps1 PASS
dotnet test .\tests\OpenClaw.Shared.Tests\OpenClaw.Shared.Tests.csproj --no-restore 4,638 passed, 0 failed, 25 configured skips
dotnet test .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csproj --no-restore 4,459 passed, 0 failed, 0 skipped; owned private desktop
Pre-rebase head (182aee93) hosted Build and Test, including full UI PASS
Fresh independent182 real application, reconnect, ordinary native send and three owned-HWND captures PASS at 2026-10-21T22:35:30Z; exact app PID 29172 then exited and was independently verified absent

The current app was rebuilt with -r win-x64 -p:Platform=x64 -p:DevBuild=false.
Its embedded version contains the complete 182aee9 SHA and its actual binary hash is
in the public diagnostics. The visible run used an explicit 90-second expiry,
quiet error-mode/WER controller scopes, inherited error-mode flags, no shell
error dialog and exact PID/path/start binding. Capture was strict-nonblank
PrintWindow of the owned HWND only, never a desktop capture. The slot was
released immediately after exact cleanup, before sanitization/publication.

Earlier outcomes remain attributed: combined291 executed7with6passes/1startup
token-read sharing error, then separate same-source handoff1pass; combined2dcf
native menu2passes and later driver preflight passed. Neither is this standalone
run. Both earlier introduced popup-query CI races were fixed in182and their
failed runs remain retained.

A separate startup-only baseline control failed at the new pending-roster
disablement check. It did not complete the after-reconnect/send sequence, so it
is not credited as a full base-failure/head-pass comparison for that
contract. The current independent runtime evidence above is direct; no missing
baseline result is invented.

Real Behavior Proof

  • Environment tested: actual independent182 source executable on the authorized Windows Default desktop, its own throwaway profile, actual native UIA controls and owned synthetic loopback Gateway transport. No installed Hub/Gateway, port 18789, real provider or existing/user credentials; only the owned fixture's ephemeral loopback auth.
  • PR head or commit tested: current head 99e9597b63774b9c0ba509330b818f8e4e442e9d (see "Current-head proof"). The older real-app items below are from pre-rebase 182aee93, not combined2dcf. Full AppVersion and binary hash are in the linked diagnostics.
  • Exact steps or command run: native assistant selection and conversation activation; real WebSocket close/reconnect with the returning roster held/released; ValuePattern.SetValue on ChatComposerInput; normal Invoke on ChatComposerPrimaryAction; observe the actual Gateway request; publish a controlled owned-fixture reply and observe it in the native timeline.
  • Evidence after fix: actual copied UIA observations:
22:35:26.5208239Z before:
  assistantSelectorEnabled=true
  selectedAssistant=[WorkspaceAgent:research, "Fixture Research, research"]
  conversation="Fixture: research conversation"; conversationSelected=true
22:35:28.508839Z pending fresh roster:
  assistantSelectorEnabled=false
22:35:28.6426005Z after reconnect:
  assistantSelectorEnabled=true
  selectedAssistant=[WorkspaceAgent:research, "Fixture Research, research"]
  conversation="Fixture: research conversation"; conversationSelected=true

Actual safe record produced by the owned Gateway after ordinary native Send:

{
  "Method": "chat.send",
  "SessionKey": "agent:research:fixture-other",
  "Outcome": "ok",
  "origin": "Native composer ValuePattern and primary Invoke. No app.chat.send call or explicit send-thread override."
}

The origin string is the driver's invocation annotation; Method, SessionKey and
Outcome come from the actual Gateway request record. After the controlled reply
rendered, native UIA still reported the same assistant and selected
conversation at 22:35:29.8146461Z. Exact app PID 29172 exited by 22:35:30.5526281Z.

  • Observed result: the chosen native assistant/conversation survives actual reconnect and ordinary Send reaches its session. The reply is explicitly fixture-generated; no real model/provider success is claimed.
  • Screenshot or artifact links verified? Yes: three inspected owned-window frames and sanitized actual UIA/routing/provenance JSON are public and verified. No endpoint, token, user path or raw profile was uploaded.
  • Not verified or blocked: real paired Gateway/provider behavior, WSL-specific E2E and whole proof-pool qualification are not claimed. A complete unmodified-base red/green run is not supplied. The former standalone-current-head visible reconnect/routing gap is now addressed directly.

ComposeTarget remains the canonical handshake default-send target, not mounted
selection readback. This proof uses native UIA for selection and the actual
ordinary-send wire record for routing; it introduces no external Companion
create/select API and does not equate ambient Gateway ownership with UI choice.

Security Impact

  • New permissions or capabilities? No
  • Secrets or tokens handling changed? No
  • New or changed network calls? No
  • Command or tool execution surface changed? No
  • Data access scope changed? No
  • If any answer is Yes, explain the risk and mitigation: No new capability, token handling, network endpoint or data-access scope. Existing authenticated chat/connection owners are preserved. Native selected-target reconnect and ordinary-send proof is supplied above; canonical MCP default-target semantics are unchanged.

Compatibility and Migration

  • Backward compatible? Yes. Existing authenticated connection, consent and ownership contracts remain authoritative.
  • Config or environment changes? No persistent source-contract change.
  • Migration needed? No
  • If yes, list the exact upgrade steps: N/A. The separate local environment path repair is not a migration or private-file workaround shipped by this PR. Published SDK1.0.0 pins are unchanged.

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.

Pre-rebase head (182aee93) hosted review passed: Overall diamond lobster (5/6), Proof diamond lobster (5/6), Patch diamond lobster (5/6). No merge is authorized.

@clawsweeper

clawsweeper Bot commented Oct 21, 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.

@clawsweeper clawsweeper Bot added clawsweeper:intake:bug Preliminary submission classification; full source review pending. clawsweeper:intake:needs-repro Preliminary submission classification; full source review pending. P2 Normal priority bug or improvement with limited blast radius. merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. and removed clawsweeper:intake:bug Preliminary submission classification; full source review pending. clawsweeper:intake:needs-repro Preliminary submission classification; full source review pending. labels Oct 21, 2026
@clawsweeper

clawsweeper Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

Codex review: needs maintainer review before merge.

What this changes

Preserves assistant and conversation selection across reconnects while retaining legacy session access when assistant listing is unsupported.

Example: Reconnect while using assistant research and conversation agent:research:fixture-other.

  • Before: Temporary roster clearing discards the assistant selection and can select the Gateway default when data returns.
  • After: The research selection returns, and ordinary composer Send reaches agent:research:fixture-other.

Review scores

Measure Result What it means
Overall readiness 🐚 platinum hermit (4/6) A useful, correct repair with direct native behavior evidence and distinct regression coverage; no remaining actionable finding.
Proof confidence 🦞 diamond lobster (5/6) ✨ media proof bonus Sufficient (linked_artifact): Inspected native Workspace captures and receiving-Gateway output demonstrate held-roster reconnect, restored research selection, and ordinary composer delivery to agent:research:fixture-other on Windows with a synthetic loopback Gateway; exercised owners and continuity-test blobs match this head, whose reported native continuity cases also pass.
Patch quality 🐚 platinum hermit (4/6) No actionable review findings were identified.

Product

Kind: Bug fix · Worth it: Yes · Fix scope: Complete
User problem: Reconnecting can move the visible assistant or conversation away from the user's chosen target.
Reason: Restores the documented selection-continuity contract while preserving legacy Gateway behavior requested in the discussion.

Merge readiness

✅ Ready for maintainer review

Keep this PR: current main still loses the remembered assistant during transient roster clearing, and the patch provides a useful, tested repair with no actionable findings.

Priority: P2
Reviewed head: a7c170a5e69267df75daff7d1d464f02c6a0b8ae

Before merge

None.

Findings

None.

Tests

  • Missing end-to-end proof: A complete base-failure/head-pass comparison was not supplied; direct native reconnect and ordinary-send evidence covers the repaired path.
Agent review details

How this fits together

The authenticated Gateway client publishes roster observations through GatewayService and AppState; Workspace projects those observations into assistant selection, conversation rows, and creation readiness.

flowchart LR
  Gateway[Authenticated Gateway] --> Client[Operator client]
  Client --> Service[GatewayService]
  Service --> State[AppState]
  State --> Selection[Workspace selection]
  Selection --> Window[Workspace controls]
  Window --> Composer[Native composer]
  Composer --> Gateway
Loading

Technical review

Best possible solution:

Land the focused continuity repair through the existing client, application-state, and Workspace owners.

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

Current-main source shows disconnect clearing the roster and selection projection returning null; submitted native proof exercises the repaired reconnect path, but this review ran no target code.

Is this the best way to solve the issue?

The patch separates remembered intent from roster availability in one focused owner, preserves explicit unsupported-method fallback, and avoids a second connection or chat implementation.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning medium; reviewed against 2ff4d168588d.

Provenance checked

  • Workspace assistant selection changes intended behavior with a stated reason (3a58bf3: The original Workspace feature restores exact session identity and explicit assistant selection; transient cache clearing accidentally discards that intent.)
  • GatewayService and AppState forwarding keeps the original intent (cff1033: A single observable application model owns client event forwarding and disconnect cache clearing; the patch adds typed capability observation through that same path.)
  • Session roster parsing changes intended behavior with a stated reason (5164faa: Existing parsing supports envelopes and session thinking defaults; the patch retains those formats and prevents metadata-only summaries from deleting roster entries. The parser's earliest introduction remains unknown at the historical boundary.)
  • Native handoff coverage and Settings hosting keeps the original intent (4e31031: Settings and Chat share a retained Workspace host; behavioral handoff tests replace retired source-marker assertions while preserving that hosting boundary.)

Testing

Proof path: shipped entry point.

Security

None.

Evidence

What I checked:

Likely related people:

  • Karen: Raw commit 3a58bf3 adds src/OpenClaw.Tray.WinUI/Presentation/WorkspaceProjection.cs:44 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/WorkspaceProjection.cs)
  • Ranjesh Jaganathan: Raw commit cff1033 adds src/OpenClaw.Tray.WinUI/Services/GatewayService.cs:444 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: medium; commits: cff1033b3bb3; files: src/OpenClaw.Tray.WinUI/Services/GatewayService.cs)

Review metrics

Metric Value Why it matters
Change distribution Production +146/-37; tests and fixtures +616/-72; documentation +64/-1 Most growth protects distinct protocol, selection-ordering, native rendering, legacy compatibility, and handoff lifecycle failures.

Labels

Label changes:

No label changes.

Label justifications:

  • P2: Repairs disruptive assistant and conversation drift during reconnect without evidence of a broader availability or data-loss emergency.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR.
  • proof: sufficient: Contributor real behavior proof is sufficient.

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 execution lanes are retired.

History

Review history (5 earlier review cycles)
  • reviewed 2026-10-21T04:26:46.734Z sha 59c47b1 :: needs real behavior proof before merge. :: [P1] Preserve session access when agent listing is unsupported | [P3] Restore the independent native handoff guard
  • reviewed 2026-10-21T21:04:18.794Z sha 182aee9 :: needs real behavior proof before merge. :: none
  • reviewed 2026-10-21T23:00:40.801Z sha 182aee9 :: needs changes before merge. :: none
  • reviewed 2026-10-29T23:40:55.993Z sha 90dd8b8 :: needs real behavior proof before merge. :: none
  • reviewed 2026-10-30T17:59:16.900Z sha 99e9597 :: needs maintainer review before merge. :: none

Reviewed November 2, 2026, 5:46 PM ET / 22:46 UTC (Revision 6).

@shanselman

shanselman commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator

Update from GitHub Copilot triage (not Scott personally): I closed this draft during a batch review without first getting Scott's approval. That was my mistake, and the PR is open again. Sorry for the confusing message.

The selected-assistant and conversation continuity problem is worth solving. The current review asks that gateways without agents.list keep their existing session behavior, and that the native handoff test coverage remain in place. This is still a draft, so please take the time you need. No action is required because of my earlier comment.

@paulcam206

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

🦞👀
Exact review queued.

Re-review progress:

@clawsweeper clawsweeper Bot removed the merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. label Oct 21, 2026
@paulcam206

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

🦞👀
Exact review queued.

Re-review progress:

@clawsweeper clawsweeper Bot added proof: sufficient Contributor real behavior proof is sufficient. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Oct 21, 2026
@paulcam206
paulcam206 marked this pull request as ready for review October 21, 2026 23:05
@paulcam206

Copy link
Copy Markdown
Contributor Author

Native Windows validation of roboclaw/validate-pr-1795-20261027, run per the Oct 27 validation handoff in a throwaway Hyper-V guest. Report below follows the handoff's 7-point format. files\evidence\... bundles (TRX, logs, captures) are kept locally and available on request.

#1795 Windows validation report (roboclaw/validate-pr-1795-20261027)

1. Identity

  • PR fix: retain the selected assistant and conversation after reconnect #1795 (fix: retain the selected assistant and conversation after reconnect)
  • Branch roboclaw/validate-pr-1795-20261027, head 47c2a5ca89a4ffbcbd8523300b9e87cc80df6716, tree 994e7eaa07063550423c78be3cf16d45ee4d7b13 (verified on host and in-guest clones, before and after).
  • Parents: 182aee9334edacb5291b7b13a8ee43deb5fb4b92 (original PR head), 48cb8a18fdb5820e731b82df616e6e5b3f954cf0 (main). Co-author trailer present.
  • Comparators (failure-owner isolation only): main 48cb8a18 and original head 182aee93, each built with build.ps1 in disposable local clones in the same guest.
  • No additional changes; no tests added. git status --porcelain empty before and after all lanes.

2. Host

  • Throwaway Hyper-V guest, crabbox hyperv, lease cbx_4b1664424425, VM crabbox-63a4-cand1795-d574dbd1, pinned crabbox 6bd7156a-win-scope, template windows-readiness-template-v3.
  • Windows 11 Enterprise Insider Preview 10.0.29683 x64, 6 vCPU / 8 GB, display 1024x768. Jobs ran in interactive console session 1 (guest crabbox admin, elevated) via scheduled task.
  • .NET SDK 10.0.403, runtime 10.0.14, PowerShell 7.6.9, Windows SDK 10.0.26100, VS 2022 BuildTools (VC.Tools.x86.x64 + VC.Redist.14.Latest, CRT 14.44.35112), WindowsAppRuntime 2.5.1 (2.6.4 also present from Store servicing).
  • App under test: src\OpenClaw.Tray.WinUI\bin\Debug\net10.0-windows10.0.22621.0\win-x64\OpenClaw.Tray.WinUI.exe, sha256 CF05380224B34365DADA8AA631304F07B53847866779701CD6565169B0F2625F, version 2026.10.8-roboclaw-validate-pr-1795-20261027.1+150...Sha.47c2a5ca. Same hash before and after the fixture lane.

3. Commands and results (attempt 2, evidence 1795-366661ff77724d018d356bee28e5212e)

Lane Command Exit TRX total/executed/passed/failed/skipped
prereq diag setup-dev.ps1 -CheckOnly 0 n/a
build .\build.ps1 0 n/a
Shared dotnet test ...Shared.Tests --no-restore (trx) 0 4677 / 4652 / 4652 / 0 / 25 not run (integration-gated)
Tray dotnet test ...Tray.Tests --no-restore (trx) 0 4585 / 4585 / 4585 / 0 / 0
docs validate-docs.ps1 0 n/a
roster wire run-proof-tests.ps1 ... SessionRosterWireTests 0 3 / 3 / 3 / 0 / 0
navigation run-proof-tests.ps1 ... WorkspaceNavigationTests|NativeCompletionPresentationTests 0 135 / 135 / 135 / 0 / 0
native continuity run-proof-tests.ps1 UITests, handoff filter, -RuntimeIdentifier win-x64, OPENCLAW_RUN_GATEWAY_FIXTURE_UI=1, screenshots on 0 3 / 3 / 3 / 0 / 0
broader smoke (optional) test-gateway-fixture.ps1 -AppPath <exe> -Screenshots 1 profile/app 32/32 passed; fixture-ui 34 / 34 / 30 / 4 / 0 (classified below)

Native continuity cases that passed: SelectedAssistantAndConversationSurviveTransientRosterLossButNotAuthoritativeRemoval, UnsupportedAgentListing_PreservesLegacySessionsAndDefaultCreation, WindowManagerNativeHandoffTests.ShutdownRejectsNativeHandoffWithoutOpeningAWindowOrWaitingForConnection.

4. Controls

5. Inspected evidence (fixture-backed: real Companion/client/UI, synthetic loopback Gateway, no provider or pairing)

  • continuity-before.png: Fixture Research selected; "Fixture: research conversation" selected with accent bar.
  • continuity-transient.png (agents.list held): selector shows "No agents loaded" and is disabled (UIA IsEnabled=false asserted); transcript stays visible; session list shows "No conversations to show".
  • continuity-returned.png: same assistant and conversation restored; UIA asserted selector enabled and session selected.
    • Observation: the accent bar is on Home, and the conversation row has only the selected-gray fill. In before, the bar was on the conversation. UIA selection assertions pass. This may be the selection indicator still animating at capture time. A settled recapture would decide whether it's a stale navigation highlight. Not classified as a defect.
  • continuity-removed.png: authoritative roster without Research leaves "Select assistant" and requires a fresh choice.
  • continuity-unsupported-*.png: agents.list unsupported keeps legacy sessions listed and creates "new conversation 1" with the default target.
  • Protocol (gateway-requests.jsonl, continuity run): 3 connect, 7 agents.list, plus history/sessions/models reads, all ok; no chat.send, no errors.
  • Captures are owned-HWND PrintWindow of the app window with synthetic data only. No redaction needed.

6. Failures retained and classified

  • Attempt 1 (1795-81b97e2a...): build.ps1 and setup-dev -CheckOnly exit 1 ("Missing compatible Visual Studio C++ Redistributable"). Tray had 4584/4585 pass, 1 failure: NativeSpeechStackRuntimeTests.TestHost_AppLocalVCRuntime_MeetsOnnxRuntimeFloor (fallback CRT 14.29 < 14.38). Environmental: my guest prereq installed VC.Redist.14.Latest without the x64 CRT payload. Fixed by adding VC.Tools.x86.x64. Attempt 2 is fully green.
  • Broader smoke, 4 of 34 failed. Each was rerun on the same guest at the candidate, main 48cb8a18, and original head 182aee93:
    • ComposerNew_InitialConversationBackAndForward and ComposerNew_DelayedCompletionRetainsNotifications fail on all three (unexpected projects.list returning METHOD_NOT_FOUND). This is a proven base failure on main, not caused by fix: retain the selected assistant and conversation after reconnect #1795. projects.list callers exist in both parents (ChatPlacement.cs); the fixture doesn't serve it.
    • SidebarSwitchesRealHistoriesAndShowsMessage240AtBothWidths fails on all three ("host did not provide two meaningfully different window widths"). Environmental: the guest is 1024x768.
    • BackgroundMediaRetransmitAndRetainedToolOutcomePreserveNewerNativeTurn timed out once in the full smoke, then passed on the candidate rerun and both comparators. Retained as an unresolved timing/order issue, not reproduced in isolation.

7. Reviews, decisions, unrun lanes

  • No new source. No repair proposed for fix: retain the selected assistant and conversation after reconnect #1795.
  • Ordinary composer send into the retained conversation after reconnect: UNVERIFIED at 47c2a5c. No existing fixture test covers it. ReconnectKeepsDefinitelyUnsentQueuedMessageFailedAndVisible covers a different case: a pre-reconnect queued app.chat.send that fails visibly. Earlier send evidence belongs to 182aee9 and stays historical. No test was added, per instructions.
  • Follow-ups outside this PR: the main-branch projects.list fixture gap breaks the ComposerNew_* fixture tests. Settled recapture of the returned sidebar indicator.
  • Unrun: ARM64, live provider/pairing (not needed for this fixture contract), larger-display rerun of AtBothWidths.

8. Cleanup

  • Guest released via crabbox stop --provider hyperv cbx_4b1664424425; crabbox list and Get-VM confirm it's gone.
  • Evidence: files\evidence\1795\evidence-1795.zip (sha256 B94F95B60945751FF2989E948015A0ABBEFC364A18A7FF1180C09D0E396C8F6C), unpacked under files\evidence\1795\unpacked, sidebar crops under files\evidence\1795\crops. No credentials (synthetic fixture tokens only).

@paulcam206
paulcam206 force-pushed the draft/hub-continuity branch from 182aee9 to 90dd8b8 Compare October 29, 2026 23:36
@paulcam206

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

🦞👀
Exact review queued.

Re-review progress:

@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. and removed proof: sufficient Contributor real behavior proof is sufficient. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. labels Oct 29, 2026
@paulcam206

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Oct 30, 2026 •

Copy link
Copy Markdown

🦞👀
Exact review queued.

Re-review progress:

@clawsweeper clawsweeper Bot added proof: sufficient Contributor real behavior proof is sufficient. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. 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. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. labels Oct 30, 2026
@paulcam206
paulcam206 force-pushed the draft/hub-continuity branch from 99e9597 to a7c170a Compare November 2, 2026 22:07
@paulcam206

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

🦞👀
Exact review queued.

Re-review progress:

@shanselman
shanselman merged commit ffc54d6 into openclaw:main Nov 3, 2026
26 checks passed
bkudiess added a commit that referenced this pull request Nov 4, 2026
Resolve conflicts with the assistant-selection refactor (#1795): pins and Home now resolve against SelectedAgentId, and the sidebar projection keeps this PR's HomeSessionKey and Sessions(mainSessionKey) next to main's IsAgentSelectionReady.

Retire the Skills pin because main removed the Skills page (#1932): the catalog drops skills (a saved skills tag stays persisted but hidden, like bindings), and the pin tests, fixture UI test and ARCHITECTURE ledger follow.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

P2 Normal priority bug or improvement with limited blast radius. proof: sufficient Contributor real behavior proof is sufficient. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. 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.

2 participants