Skip to content

fix(chat): cancel pending effort changes when chat closes - #2046

Draft
bkudiess wants to merge 1 commit into
openclaw:mainfrom
bkudiess:bkudiess-ui-ci-crash-investigation
Draft

bkudiess wants to merge 1 commit into
openclaw:mainfrom
bkudiess:bkudiess-ui-ci-crash-investigation

Conversation

@bkudiess

@bkudiess bkudiess commented Nov 6, 2026 •

Copy link
Copy Markdown
Collaborator

Related: #2028 (feat: support Sandbox-backed Windows file transfers). This is an independent lifetime fix, not the file-transfer implementation or a claim that its silent native CI crash is resolved.

Draft validation blocker: the fresh standalone full UI run aborted with a native finalizer-thread access violation. The new lifetime regression and subsequent real Companion input/lifecycle journeys passed, but this candidate is not merge-ready.

What Problem This Solves

Fixes: a queued effort-selection callback can run after its chat view is disposed.

User Impact

User impact: closing a chat view cancels pending effort input and releases its native slider handlers; the picker layout and live selection behavior are unchanged.

Why This Change Was Made

Reactor host disposal runs component effect cleanup without guaranteeing element OnUnmount. The picker now uses the same idempotent retirement function from both paths, clearing native handlers and invalidating the existing queued-input revision. No dependency update, retry, timeout increase or weakened assertion is involved.

Evidence

The new real-WinUI regression first commits a live "low" selection, then queues "high" and disposes the host in the same dispatcher callback. Before the production change it failed with Collection: ["high"] after disposal; afterward it passed while preserving the live-selection control.

Real Companion proof with two verified screenshots and copied live output now separately exercises the unchanged application executable: native pointer and Ctrl+Left input, closing/reopening the actual Workspace, and Slider-to-single-choice-to-Slider replacement. Both fixture app runs exited 0. The producer only seeds valid synthetic Gateway session metadata; it does not patch app controls or call selection handlers. These journeys complement, rather than replace, the queued-callback regression.

Claude Opus 5.5 and GPT-6 Astra independently reviewed the three-file patch and found no actionable issues. Review scope was the byte-identical local fix atop 2d0b530e5689506bd75a79c5420c46d42f2b70b1; the standalone rebase preserved all three reviewed file blobs. This is carried-forward source review, not a newly executed review of the new ancestry.

Three earlier unchanged-source runs on runtime 2.6.4 did not reproduce the original silent native crash. However, the fresh standalone full UI run did fail with 0xC0000005 in Marshal.Release -> NativeObjectWrapper.Release -> Finalize -> GC.RunFinalizers. Its active case was WorkspaceWindowProofTests.SettingsChatLink_ReturnsToRetainedChatInSameWindow, not the new lifetime test. Whether this is the same failure as the original silent crash remains unproven. Independent exact-base and historical comparison retains the distinction: the exact-base run had two Workspace timing assertions and no native fault, while historical main had a matching finalizer stack. Neither clears this candidate's failed native validation.

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: native reasoning-slider lifetime and disposal. The mounted regression and real Companion input/lifecycle journeys exercise the changed contract on disposable Windows desktops; no visual layout changed. This does not claim the entire visual/accessibility pool is complete.

Validation

Fresh checks on standalone commit da045817f15cff77ba99a49f7a5e6a0c5c1627b4:

Command Result
.\build.ps1 Passed
dotnet test .\tests\OpenClaw.Shared.Tests\OpenClaw.Shared.Tests.csproj --no-restore --logger 'trx;LogFileName=shared-pr.trx' --results-directory '<proof>\closeout\TestResults' Passed: 4,819; skipped: 25; failed: 0
dotnet build .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csproj -c Debug Passed
dotnet build .\tests\OpenClaw.Tray.UITests\OpenClaw.Tray.UITests.csproj -c Debug -r win-x64 -p:ProduceReferenceAssembly=false Passed, zero warnings/errors
dotnet test .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csproj --no-restore --no-build --logger 'trx;LogFileName=tray-pr.trx' --results-directory '<proof>\TestResults\Tray' Passed: 5,234; skipped: 0; failed: 0
dotnet vstest '<staged-ui>\OpenClaw.Tray.UITests.dll' '--TestCaseFilter:Category!=Accessibility&Category!=NativeOnboardingProof&Category!=GatewayFixture' '--Logger:trx;LogFileName=ui-pr.trx' '--ResultsDirectory:<proof>\TestResults\UI' '--Blame:CollectHangDump;HangDumpType=none;TestTimeout=300s' Failed / aborted: native testhost access violation after 620 passed and 3 skipped; no failed assertion records, incomplete inventory
dotnet Launcher.dll <exact-App.exe> <owned-output> and dotnet Launcher.dll <exact-App.exe> <owned-output> contrast Both passed / exited 0 after actual native input, close/reopen, and verified app snapshots. Session-only data producer launches the unchanged Companion executable, not an in-process UI test.
git diff --check Passed

The full build includes documentation validation. Tray/UI execution uses prebuilt, hashed outputs in a writable disposable guest checkout. --no-build is explicit; fresh TRX inventories are checked to prevent successful no-op commands from being counted as passes. No test filters were weakened. The separate hosted UI job also failed: run 42270201206, attempt 1, UI job 128074377968, tested merge 2834b4c1414b6fc766b80382c907786dcc705a17. Its silent abort has no native stack and is not equated with the local finalizer AV.

Real Behavior Proof

  • Environment tested: disposable Windows Sandbox, Windows App Runtime 2.6.4.0, .NET SDK 10.0.403/runtime 10.0.14, x64. No production profiles mapped; networking, clipboard, camera and microphone redirection disabled. Guest stopped after successful fixture cleanup. Host metadata changed during concurrent unowned app activity; no unchanged-host-profile claim is made.
  • PR head or commit tested: da045817f15cff77ba99a49f7a5e6a0c5c1627b4. The guest verifies the exact source commit, changed-file blobs and staged test/app DLL hashes. Real app DLL SHA256: 077C3A6520AB07A24EB3976788AC705C2FBB8071C29877426C0520B3F88906CC.
  • Exact steps or command run: the full native UI command above includes ReasoningPicker_HostDisposalCancelsQueuedValueChange. It verifies a live slider change, queues a second change, disposes the host before the queued callback executes, and confirms no post-disposal selection. Separately, the real-app launcher commands above exercise native pointer and keyboard input via computer-use, actual Workspace close, existing app.navigate reopen, normal Slider replacement by a one-choice button, host disposal, and new Slider input afterward. Existing app.chat.snapshot and app.status corroborate session levels and Connected state.
  • Evidence after fix: ReasoningPicker_HostDisposalCancelsQueuedValueChange passed in the exact-commit full UI TRX. Before the production change, the identical regression failed with Collection: ["high"] after disposal. Real Companion journeys show Low retained across close/reopen and successful input on the new Slider; the contrast session remains High. The fresh full UI run later crashed in native finalization.
  • Observed result: the selected lifetime contract and real application journeys passed; the overall native UI run failed. The separate full Tray suite passed all 5,234 cases.
  • Screenshot or artifact links verified? (Yes/No/N/A): Yes. Current-head real-app screenshots and copied live output. These are after-fix runtime frames, not a visual before/after comparison or a screenshot of the queued callback itself.
  • Not verified or blocked: native UI acceptance is blocked by the fresh finalizer-thread access violation. Original silent native CI crash attribution; disposal during a held pointer and private handler-list inspection; native ARM64 and full custom visual/accessibility proof remain unverified. The synthetic fixture does not prove live-provider behavior, real Gateway pairing, or node invocation. No claim that passing these focused contracts resolves either native crash.

Copied fresh run signal:

The active test run was aborted. Reason: Test host process crashed : Fatal error.
0xC0000005
at System.Runtime.InteropServices.Marshal.Release(IntPtr)
at System.Runtime.InteropServices.ComWrappers+NativeObjectWrapper.Release()
at System.Runtime.InteropServices.ComWrappers+NativeObjectWrapper.Finalize()
at System.GC.RunFinalizers()

UI TRX SHA256: 0D22C558D3702E288ACC17C03604EBFD9CDC05E5C4F94224000670196721DBF1. Blame names the active Workspace test but explicitly warns it may not be the crash source. No native dump was collected by this validation invocation.

Security Impact

  • New permissions or capabilities? (Yes/No): No
  • Secrets or tokens handling changed? (Yes/No): No
  • New or changed network calls? (Yes/No): No
  • Command or tool execution surface changed? (Yes/No): No
  • Data access scope changed? (Yes/No): No
  • If any answer is Yes, explain the risk and mitigation: N/A

Compatibility and Migration

  • Backward compatible? (Yes/No): Yes
  • Config or environment changes? (Yes/No): No
  • Migration needed? (Yes/No): No
  • If yes, list the exact upgrade steps: N/A

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.

Retire native reasoning slider handlers and queued selections from component effect cleanup as well as ordinary element unmount. Add a mounted regression with a live selection control and document the lifecycle contract.

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

clawsweeper Bot commented Nov 6, 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. P2 Normal priority bug or improvement with limited blast radius. 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 clawsweeper:intake:bug Preliminary submission classification; full source review pending. labels Nov 6, 2026
@clawsweeper

clawsweeper Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

Codex review: needs maintainer review before merge.

What this changes

This PR cancels queued effort selections and detaches native slider handlers when a chat host is disposed.

Example: Commit Low, queue High, then dispose the chat host before its dispatcher drains.

  • Before: The queued callback emits High after disposal.
  • After: The callback is canceled, leaving Low as the last committed selection.

Review scores

Measure Result What it means
Overall readiness 🐚 platinum hermit (4/6) The focused fix has strong changed-path proof and no actionable source findings; the complete local native pass strengthens validation without explaining earlier aborts or replacing the failed hosted gate.
Proof confidence 🦞 diamond lobster (5/6) Sufficient (live_output): Exact-head Companion journeys exercise native input, ordinary slider unmount, Workspace disposal and reopening against synthetic Gateway metadata, with inspected screenshots and copied state output; the mounted regression separately proves cancellation of the same-dispatcher queued callback.
Patch quality 🐚 platinum hermit (4/6) No actionable review findings were identified.

Product

Kind: Bug fix · Worth it: Yes · Fix scope: Complete
User problem: Closing chat can leave pending effort input active after its view is disposed.
Reason: The maintainer-authored direction repairs an existing lifetime contract without adding preferences, configuration or a competing owner.

Merge readiness

✅ Ready for maintainer review

Keep open: this focused lifecycle fix remains necessary on main, and no introduced defect was found; the draft hold and failed hosted UI gate still prevent landing.

Priority: P2
Reviewed head: da045817f15cff77ba99a49f7a5e6a0c5c1627b4

Before merge

None.

Findings

None.

Agent review details

How this fits together

The native effort picker receives advertised choices and user input, then forwards accepted selections to the existing chat controller; Reactor owns its mounting and disposal.

flowchart TD
A[Advertised effort choices] --> B[Native effort picker]
C[Pointer and keyboard input] --> B
B --> D[Existing input revision policy]
D --> E[Chat controller]
F[Unmount or host disposal] --> D
F --> B
Loading

Technical review

Best possible solution:

Retain one picker-owned retirement function that invalidates pending input and removes native handlers from both supported teardown paths.

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

Current-main source permits queued callbacks to survive host disposal, and the supplied native before/after regression records that exact failure; this read-only review ran no target code.

Is this the best way to solve the issue?

The patch is the smallest complete repair at the existing picker owner: preserve live selections while making unmount and disposal invalidate pending work through the same cleanup function.

AGENTS.md: found and applied where relevant.

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

Provenance checked

  • Effort-picker input retirement keeps the original intent (5164faa: The native chat modernization introduced advertised effort controls with pointer cancellation and element-unmount cleanup.)

Testing

Proof path: shipped entry point.

Security

None.

Evidence

What I checked:

  • Focused production repair: The introduced diff extracts the existing slider retirement logic and invokes it from both element unmount and unconditional component effect cleanup, without changing selection rules or defaults. (src/OpenClaw.Tray.WinUI/Chat/ChatReasoningPicker.cs:43, da045817f15c)
  • Current-main behavior: Fetched main still retires the picker only through OnUnmount, while queued selection callbacks rely on the retained slider reference and input revision. (src/OpenClaw.Tray.WinUI/Chat/ChatReasoningPicker.cs:142, b6f158ab257a)
  • Pinned dependency lifecycle contract: The application imports Reactor preview.16 and the repair depends on its disposal contract, providing an affirmative dependency-policy signal. At that tag, ReactorHostControl.Dispose runs hook cleanup and Reconciler.Dispose runs nested component cleanup without generally traversing element unmount callbacks; the dependency's complete root instructions were read. (src/Reactor/Core/Reconciler.cs:5744, 459f7234dc2b)
  • Distinct native regression: The added mounted test first verifies a live Low selection, then queues High and disposes the host in the same dispatcher callback. The body records the intended pre-fix failure and post-fix pass. (tests/OpenClaw.Tray.UITests/ReactorChatLayoutProofTests.cs:2194, da045817f15c)
  • Shipped application evidence: The contributor's discussion at fix(chat): cancel pending effort changes when chat closes #2046 (comment) records native pointer and keyboard input, ordinary slider replacement, Workspace close/reopen, and retained session levels in the exact-head Companion executable. Downloaded screenshots were inspected and show the single-choice High popup and reopened Medium slider. (da045817f15c)
  • New complete native validation: The new report at fix(chat): cancel pending effort changes when chat closes #2046 (comment) records 638 passes, zero failures and seven permitted skips without a debugger, including the added regression and all current-value variants. This resolves the earlier incomplete uninstrumented inventory, but does not establish the cause of prior crashes or clear hosted CI. (da045817f15c)

Likely related people:

  • Barbara Kudiess: Raw commit 5164faa adds src/OpenClaw.Tray.WinUI/Chat/ChatReasoningPicker.cs:28 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: high; commits: 5164faab1df6; files: src/OpenClaw.Tray.WinUI/Chat/ChatReasoningPicker.cs)
  • Karen: Raw commit 814e732 adds docs/CHAT_VISUAL_DESIGN.md:7 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: medium; commits: 814e732e2e90; files: docs/CHAT_VISUAL_DESIGN.md)

Preflight source

Source unknown. Source comparison at the observed PR snapshot only. Completion is self-reported; body, policy, tests, execution, and report bytes are not verified.

Review metrics

Metric Value Why it matters
Focused change size Production +30/-20; tests +55; documentation +4 Growth adds one lifecycle hook and one distinct native regression while reusing existing cleanup and fixtures.

Labels

Label changes:

  • add rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • add status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR.
  • remove rating: 🦐 gold shrimp: Current PR rating is rating: 🐚 platinum hermit, so this older rating label is no longer current.

Label justifications:

  • P2: A bounded chat-input lifetime defect merits normal-priority repair; the patch is not proven to resolve the broader native crash investigation.
  • 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 (4 earlier review cycles)
  • reviewed 2026-11-06T18:36:38.881Z sha da04581 :: needs maintainer review before merge. :: none
  • reviewed 2026-11-06T19:23:26.939Z sha da04581 :: blocked before merge. :: none
  • reviewed 2026-11-06T21:13:12.791Z sha da04581 :: blocked before merge. :: none
  • reviewed 2026-11-06T21:45:23.249Z sha da04581 :: blocked before merge. :: none

Reviewed November 7, 2026, 1:11 AM ET / 06:11 UTC (Revision 5).

@bkudiess

bkudiess commented Nov 6, 2026

Copy link
Copy Markdown
Collaborator Author

@clawsweeper re-review

Additional verified baseline and CI evidence for unchanged head da045817f15cff77ba99a49f7a5e6a0c5c1627b4. Please reassess the evidence and rating without treating the UI failure as passed or waiving its uncertainty.

  • Public pre-PR main failure: run 40756973141, UI job 123059738037 is an October 28 push run on main, head 854fa7e6db4f80f627e6de8c25dc47a5c8269045. Its retained raw log reports 0xC0000005 in Marshal.Release -> ComWrappers.NativeObjectWrapper.Release -> Finalize -> GC.RunFinalizers, the same error code and managed finalizer stack as this PR's local standalone validation. This is historical signature evidence, not proof of an identical native root cause or an exact-current-base failure.
  • Exact-base comparison: pristine fc777f2f855289bb862c14166d9956181eccaebe was built independently and run in a disposable Windows Sandbox with runtime 2.6.4. The full original UI filter completed 635 passed, 2 failed, 7 permitted skips. The failures were NativePagesAndOwnerLinks_StayInOneWorkspaceWindow timing assertions (729/770 ms against a 500 ms bound). There was no captured native fault. This comparison does not reproduce the finalizer failure and does not justify lifting native acceptance. Base TRX SHA256: AF9CC0A21BF907C4893F81A3A4F968C2E19077C62AFAE8B3DE4C06AEEA7280BE.
  • Fresh hosted PR result: run 42270201206, UI job 128074377968 tested merge 2834b4c1414b6fc766b80382c907786dcc705a17 of this head into fc777f2f.... It aborted after 184 passes / 7 skips, with the current-value reasoning-picker test active. It emitted no native stack, so it cannot be equated with the local finalizer crash. The active-test warning explicitly says the test may not be the source.

The scoped before/after regression remains meaningful: the original picker dispatched "high" after disposal, while the unchanged fix cancels it and preserves a live "low" selection. Full local Shared/Tray results and the failed standalone native result remain disclosed in the PR body.

No code, test assertions, rating labels, or draft state were changed for this reassessment. Native pointer/key teardown, combined unmount/disposal, and conclusive original-crash attribution remain unverified. A real-app smoke attempt was not counted as changed-behavior proof because its fixture did not advertise slider choices.

@clawsweeper

clawsweeper Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

🦞👀
Exact review queued.

Re-review progress:

@clawsweeper clawsweeper Bot added clawsweeper:intake:bug Preliminary submission classification; full source review pending. and removed status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. clawsweeper:intake:bug Preliminary submission classification; full source review pending. labels Nov 6, 2026
@bkudiess

bkudiess commented Nov 6, 2026

Copy link
Copy Markdown
Collaborator Author

Additional real Companion lifecycle proof

The unchanged Companion executable, not an in-process renderer test, was exercised through computer-use and its existing local MCP entry points in a disposable Windows Sandbox with Windows App Runtime 2.6.4.0. Both real-app fixture runs exited successfully. The fixture supplied only valid synthetic thinkingLevels / thinkingDefault session data; it did not modify the app, call its selection handlers, or set Slider.Value.

Exact app: OpenClaw.Tray.WinUI.exe built from da045817f15cff77ba99a49f7a5e6a0c5c1627b4. App DLL SHA256: 077C3A6520AB07A24EB3976788AC705C2FBB8071C29877426C0520B3F88906CC; EXE SHA256: E27F0C6E4EA310B0C19B6F0F730BD93E1B1A14FD679518AFB9B4CCE197EF6BF7.

Actual shipped UI journey Observed result
Open a real five-choice Effort flyout and drag its native thumb The popup and app show High; a subsequent pointer change commits Low through the normal controller/Gateway path.
With the native slider focused, use Ctrl+Left from High The rendered popup changes to Medium; live app.chat.snapshot independently reports thinkingLevel: medium.
Close the actual Workspace with the Low effort flyout open The native window disappears; the app remains connected and the session level stays Low.
Reopen through the shipped app.navigate local MCP command {"navigated":true,"page":"chat"} is followed by an actually rendered new Workspace and Low flyout, not just API success. Its new slider accepts High input normally.
Switch from a five-choice session to a valid one-choice session The real app replaces the Slider with its High choice button while keeping the host alive, exercising ordinary Slider unmount.
Close that host, reopen it, return to the five-choice session, and drag again The new Slider retains Low and commits Medium normally. Both session states remain unchanged during disposal, and no teardown exception was reported.

Copied live app state for agent:main:fixture-empty in the first run:

initial                           off       Connected
after native keyboard             medium    Connected
after native pointer              low       Connected
after Workspace close             low       Connected
after reopen and new pointer       high      Connected

The contrast run similarly reports Empty=Low / Long=High before normal Slider unmount and after host disposal; the reopened five-choice Slider then commits Empty=Medium / Long=High. The normal-unmount and effect-cleanup paths are mapped by the unchanged ChatReasoningPicker / ReactorHostControl source, rather than inferred from a changed test-only callback.

The session-only launcher command was dotnet Launcher.dll <exact-App.exe> <owned-output> [contrast]. Its only in-app commands were the existing app.navigate, app.chat.snapshot, and app.status; pointer/key changes were native computer-use operations. Fixture source data uses the session schema parsed by ThinkingMetadata.Read. The helper uses fixture-only construction to seed that data and recalculate its fingerprint. This proves the real application UI/client/controller boundary against synthetic Gateway data, not a live provider, real pairing, or node execution.

Verified state-journal SHA256s: first journey 1765DAE31D6AE2B465923818B2E5FF5548BCF805E1DB33A6EC859E2670812E9B; contrast journey 84D12BCCDB78168813925300EBB2F41CD7E2A6528A4DFE7A6CCD3B24CE2E57E3.

The two attached, unmodified computer-use frames show the one-choice High popup after ordinary Slider replacement (20:01 UTC) and the five-choice Medium Slider responding after Workspace disposal/reopen (20:06 UTC). They are after-fix runtime frames, not a before/after visual comparison or evidence of the original queued callback failure.

Limits remain: the same-dispatcher queued-callback before/after proof is still the separate mounted native regression. The manual app journeys do not inspect private native handler lists or inject disposal during a held pointer. The full native UI testhost failure remains failed and unexplained; these passing shipped-app journeys do not override CI or establish the finalizer crash's cause. Host profile metadata changed during concurrent unowned app activity, so no unchanged-host-profile claim is made. The guest mapped no production profiles and was stopped after both app runs exited 0.

Real Companion one-choice High popup after Slider replacement

Real Companion Medium Slider after close and reopen

@bkudiess

bkudiess commented Nov 6, 2026

Copy link
Copy Markdown
Collaborator Author

@clawsweeper re-review. New current-head evidence is in the updated body and #2046 (comment): unchanged Companion executable, actual pointer/keyboard input, ordinary Slider replacement, Workspace disposal/reopen, verified live session state, and two inspected runtime screenshots. Head remains da04581. Both real-app runs exited 0. Failed local and hosted native UI validation remain disclosed; the original crash is not claimed fixed. Please reassess the new proof, without treating passing focused journeys as a complete native CI pass.

@clawsweeper

clawsweeper Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

@clawsweeper re-review. new current-head evidence is in the updated body and https://github.c is retired; ClawSweeper now only reviews.

@bkudiess

bkudiess commented Nov 6, 2026

Copy link
Copy Markdown
Collaborator Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

🦞👀
Exact review queued.

Re-review progress:

@clawsweeper clawsweeper Bot added the proof: sufficient Contributor real behavior proof is sufficient. label Nov 6, 2026
@bkudiess

bkudiess commented Nov 6, 2026

Copy link
Copy Markdown
Collaborator Author

Complete exact-candidate native capture, without erasing earlier failures

One additional full native UI invocation completed on unchanged head da045817f15cff77ba99a49f7a5e6a0c5c1627b4 in a fresh owned Windows Sandbox, App Runtime 2.6.4.0. It used byte-identical test/app/Reactor/WinRT assemblies and the original filter under a private process-scoped native debugger. This was a single fault-capture attempt, not repeated runs until green.

dotnet vstest '<same-ui-payload>\OpenClaw.Tray.UITests.dll' '--TestCaseFilter:Category!=Accessibility&Category!=NativeOnboardingProof&Category!=GatewayFixture' '--Logger:trx;LogFileName=candidate-ui.trx' '--ResultsDirectory:<owned-output>\TestResults\UI' '--Blame:CollectHangDump;HangDumpType=none;TestTimeout=300s'

Result: failed, but complete. All 645 result records are present: 635 passed, 3 failed assertions, 7 existing permitted skips. The new queued-disposal regression and all seven current-value reasoning variants passed. The testhost exited 0; the runner exited 1 for assertions. No native fault or dump was captured.

Failed assertion Actual result Comparison
NativePagesAndOwnerLinks_StayInOneWorkspaceWindow, Light 822 ms against 500 ms The independent exact-base run previously failed the same case/bound at 729 ms.
Same case, Dark 624 ms against 500 ms Exact base previously failed this case/bound at 770 ms.
PathologicalGeometry_BoundedByRenderTimeout 12.675 s against 10 s The exact-base run passed this case. A separate pre-existing main occurrence of this contract is recorded in docs/CI_FAILURES.md and run 41737007496; this is context, not a proven common cause.

The affected Workspace, SVG and UI fixture source files are byte-unchanged between the exact base and PR head. That is not, by itself, proof that transitive lifecycle changes cannot affect them. Debugger timing can also differ, so this attempt is not an uninstrumented acceptance pass.

TRX SHA256: 521C8E3D5CBEC6F88BE42155F9E468CA52971CEDFBD171007E16DE081915745A. Private native-event journal SHA256: 87467156A85F7129D0B442ACAE63CA78AE5C6E31D3EAFA09BC2BD89969E9781A. The journal records every owned debug process through completion; no production profile was mapped.

This completes a full current-head inventory that the earlier abort could not complete. It does not retract the earlier local finalizer access violation or hosted silent reasoning-body abort, establish their native cause, waive CI, or change the draft hold. No timeout, assertion, pooling behavior, source, PR head, or rating label was altered.

@bkudiess

bkudiess commented Nov 6, 2026

Copy link
Copy Markdown
Collaborator Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

🦞👀
Exact review queued.

Re-review progress:

@bkudiess

bkudiess commented Nov 7, 2026

Copy link
Copy Markdown
Collaborator Author

Complete uninstrumented native UI result on the unchanged picker fix

The original full native UI filter now completed without a debugger or native observer in the owned disposable Windows Sandbox with App Runtime 2.6.4.0:

dotnet vstest '<staged-ui>\OpenClaw.Tray.UITests.dll' '--TestCaseFilter:Category!=Accessibility&Category!=NativeOnboardingProof&Category!=GatewayFixture' '--Logger:trx;LogFileName=uninstrumented.trx' '--ResultsDirectory:<owned-output>\UninstrumentedResults' '--Blame:CollectHangDump;HangDumpType=none;TestTimeout=300s'

Passed: 638. Failed: 0. Existing permitted skips: 7. Total: 645. Runner exit 0. Started 2026-11-07T05:54:17.3797858Z, completed 2026-11-07T06:05:29.3278993Z, approximately 11 minutes. Every named result matches the exact-base inventory plus the one added queued-disposal regression. That regression and all seven current-value reasoning cases passed. No application-fault event was recorded for this invocation.

Source remains PR head da045817f15cff77ba99a49f7a5e6a0c5c1627b4. There is no product/test source delta: picker blob be5424c8aeb3ce8749bb3f13cf95223987ee08cc, native-test blob 1876e5583ca115cf2c7527b6666fe48d58dc78a2. The rebuilt test binary and staged dependencies were recorded in the invocation manifest; this is a manually recorded local source/binary association, not an execution of the hosted merge commit. Six uncommitted local files are diagnostic scripts/docs only, and the collector was not invoked in this run.

TRX SHA256: 351D8B5FEDCEF897A6F6517B0D0D4AC805FBF45F56ED7263577933FE61C4469A.

The earlier failures remain: the hosted run 42270201206 attempt 1 is still failed, and the earlier local finalizer AV is preserved. This complete local pass is acceptance evidence for the current native test inventory, not a causal explanation or proof that the hosted crash is unrelated. No assertion, timeout, filter, runtime version, PR head or rating label was relaxed or changed.

A separate full observer attempt produced no TRX/completion and its recorded processes disappeared. It is invalid diagnostic evidence and is not counted as a pass or native fault. The direct uninstrumented invocation above used the existing guest execution path independently. The unpublished observer prototype still requires investigation before use on a hosted full lane.

The guest was stopped after preserving the reports. No production profile was mapped, and no CI rerun, code commit/push, ready switch or merge occurred.

@bkudiess

bkudiess commented Nov 7, 2026

Copy link
Copy Markdown
Collaborator Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Nov 7, 2026 •

Copy link
Copy Markdown

🦞👀
Exact review queued.

Re-review progress:

@clawsweeper clawsweeper Bot added 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 rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. labels Nov 7, 2026

This branch has not been deployed

No deployments
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.

1 participant