Conversation
|
🦞👀 Pull request received. I will update this pull request when review starts. ClawSweeper review completeClawSweeper finished reviewing this revision. The review result is being finalized. |
|
Codex review: needs real behavior proof before merge. Reviewed September 24, 2026, 1:30 AM ET / 05:30 UTC (Revision 7). ClawSweeper reviewWhat this changesThe branch makes the Windows chat timeline request the latest message after its views load without waiting for another layout event, and updates source-contract tests. Regression provenancePossible regression — probable (reviewed change; failure trace). No predecessor PR is attributed. Merge readiness⛔ Blocked before merge - 4 items remain The scroll-timing change is still unique to this PR, but a source-level retry gap and differential native failures block merge. Current main still uses the layout-event path. The separate anchor-crash work does not resolve this tail-positioning review. Priority: P2 Review scores
Verification
How this fits togetherChat history from the Gateway becomes rows in the Windows tray timeline. The scroll controller uses the selected history and loaded native views to bring the latest row into view. flowchart LR
A[Gateway chat history] --> B[Timeline rows]
B --> C[Selected history and tail]
C --> D[Scroll controller]
E[Loaded native views] --> D
D --> F[Latest row visible]
Before merge
Findings
Agent review detailsSecurityNone. Review metricsNone. Merge-risk optionsMaintainer options:
Technical reviewBest possible solution: Keep load-only navigation if it can retry when ScrollView appears late, then establish reliable natural-tail placement through the existing native fixture on the repaired head. Do we have a high-confidence way to reproduce the issue? Yes for the retry gap: source inspection shows that an ItemsView loaded before its ScrollView is assigned has no later trigger. The recorded native fixture reproduces missed tail visibility, but does not isolate that source path as its cause. Is this the best way to solve the issue? Not yet. Removing the layout wait is a reasonable narrow direction, but it needs a late-ScrollView retry and a repaired-head native result showing that the final row becomes visible. Full review comments:
Overall correctness: patch is incorrect AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning medium; reviewed against 0e45bb673025. LabelsLabel changes: No label changes. Label justifications:
EvidenceAcceptance criteria:
What I checked:
Likely related people:
Rank-up movesOptional improvements that raise the rating; they are not merge blockers.
Rating scale
Overall follows the weaker of proof and patch quality. Workflow
HistoryReview history (6 earlier review cycles)
|
|
Global repo triage reviewed exact head Decision: HOLD_FOR_AUTHOR. Take confidence: 25%. Recommendation confidence: 98%. Risk: High. I found no separate static defect in the load-only refactor, but current-head native proof is negative, and this head still relies on Resolve #1407 first, then rebase or redesign this timing change against the selected navigation mechanism. Add ordinary hosted CI and successful |
|
Clarification: #1407 is unrelated and will be fixed by upgrading to the latest reactor version. This scroll restore issue is separate and caused by relying on I tested locally on both x64 and Arm64 |
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 1785913a-abcf-4220-a9ea-3c8bca03456c
|
Thanks for the clarification, Morten. I kept the scroll timing change separate from the older anchor-crash workaround and tested committed dependencies without the compatibility overlay. Your branch was refreshed with current main by a clean ordinary merge to There is positive evidence: natural initial tail placement and three A/B history switches passed, and the production-shaped Release run passed both narrow and wide viewport checks. No anchor crash was observed in these bounded runs. One result needs investigation before merge:
The base controls used the same native test source and committed dependency manifests, once per configuration. The second assertion is a conjunction of the expected picker selection and final-marker viewport bounds. The Gateway successfully returned the requested long history, but the retained diagnostics do not separate the two UI predicates, so I am not claiming this is specifically a routing defect rather than tail positioning or timing. Reproduction uses the existing Could you look at the Sessions-page transition and the dropped/retried initial-tail request lifecycle with this differential? I am holding the merge for this current-head native result, not treating the historical overlay crash as a blocker or asserting a deterministic root cause from one run per case. The fuller commands, identities, and limitations are preserved in the updated PR body. |
What Problem This Solves
Opening or switching chat histories can leave the initial scroll request waiting for layout event causing the view to not consistently scroll to the most recent message.
User Impact
User impact: initial scrolling toward the latest message no longer requires an additional layout event after the view loads.
Why This Change Was Made
The native bring-into-view request handles target realization and layout. Waiting for an unrelated future
LayoutUpdatednotification adds an unnecessary prerequisite and make the behavior unpredictable.InitialTailPositionerremains the owner. It waits for the ItemsView and ScrollView to load, then retains the existing dispatcher handoff so navigation runs outside Reactor reconciliation. Request-generation and tail-identity checks, unload/disposal cleanup, and streaming follow behavior remain in place. The source-contract tests now guard the load-only flow and prohibit reintroducing the layout-event subscription.Evidence
Historical diagnostic below: the 77-message experiment used the explicitly documented compatibility overlay. It is separate from the September 23 current-head, committed-dependency results under Validation and Real Behavior Proof. The author's latest clarification reports successful local x64 and ARM64 testing and distinguishes the scroll-restore change from the separate Reactor anchor crash.
Actual OpenClaw was exercised with two synthetic 77-message histories. That experiment reproduced the original invalid-anchor crash on the first session switch, rather than proving this change fixes it. The full native dump resolved to:
Pre-publication rubber-duck review of the committed two-file change found no actionable issues. The bundled Codex autoreview command was also attempted but could not run because the Codex CLI is not installed; that tool is not being reported as passed.
Change Type
Scope
winnodeRequired proof pools
windows-winui-interactive: initial chat-history scrolling, session switching, and native ItemsView behavior require an interactive Windows app.windows-11-arm64: native ARM64 build and runtime crash investigation were performed.Validation
Current-head maintainer run, September 23
Tested head:
113416a4fbb6d26bd3db37b065c9c0d905d52aae. This is an ordinary merge of exact mainfb8b9e736f7473705ea14d8e97f6117bcbaddf68into original headf683edcae3b4405316149980b78a28ea5f49291f, pushed to the existing contributor branch. No manual source changes, dependency upgrades, compatibility overlay, rebase, or force push. The contributor's two-file delta remains +72/-54, with the identical stable patch ID5cd326a09541ad704bc754f2a7ccdf3aa1e49c33..\build.ps1dotnet test .\tests\OpenClaw.Shared.Tests\OpenClaw.Shared.Tests.csproj --no-restoredotnet test .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csproj --no-restore --filter FullyQualifiedName~ChatTimelinePresentationTestsdotnet test .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csproj --no-restore.\build.ps1 -Project WinUI -Configuration Release.\scripts\test-gateway-fixture.ps1 -AppPath <Debug app> -Configuration Debug -ArtifactsDirectory <Debug artifacts>.\scripts\test-gateway-fixture.ps1 -AppPath <Release app> -Configuration Release -ArtifactsDirectory <Release artifacts>The app paths were the current worktree's
src\OpenClaw.Tray.WinUI\bin\<Debug or Release>\net10.0-windows10.0.22621.0\win-arm64\OpenClaw.Tray.WinUI.exe. Tests used the private native .NET SDK 10.0.400, isolated unit-test settings and the repository's explicit GatewayFixtureIsolation harness. Each fixture invocation received a fresh owned MXC ledger override. No real chats, provider accounts, normal Gateway, WSL, or uninstall path was used.Exact-base control used a separate clean checkout of
fb8b9e736f7473705ea14d8e97f6117bcbaddf68, unchanged committed dependencies and identicalGatewayFixtureUiTests.cs. Only the failed native cases were selected, once per relevant configuration: Debug 2/2 passed; production-shaped Release 1/1 passed. The command wasdotnet test .\tests\OpenClaw.Tray.UITests\OpenClaw.Tray.UITests.csproj -c <Debug or Release> -r win-arm64 -p:Platform=ARM64 -p:DevBuild=false --filter <selected cases>, with the explicit freshly built baseline app and fixture opt-in environment. No broad baseline unit suite or blind current-head retry was run.At the September 23 initial closeout read, current-head Build and Test and CodeQL required approval (
action_required). That is a historical CI snapshot, not a claim about their subsequent state. Old-head green checks are not current-head CI evidence.Supplemental split-predicate diagnostic, September 24
Exactly one existing Release
PopulatedPagesPreserveSelectionAndPreferencesStayInDisposableProfilecase was run against the retained, hash-identical113416a4product. Only temporary test-harness instrumentation was compiled, withBuildProjectReferences=false; no product binary was rebuilt or modified. The existing navigation sequence, final conjunction and timeout were retained, with independent UI Automation observations added for picker selection and tail visibility. Result: 0 passed, 1 failed, 0 skipped, with the failed condition now identified as natural-tail visibility rather than session selection.Command:
dotnet test .\tests\OpenClaw.Tray.UITests\OpenClaw.Tray.UITests.csproj -c Release -r win-arm64 -p:Platform=ARM64 -p:DevBuild=false --no-build --no-restore --filter FullyQualifiedName=OpenClaw.Tray.UITests.GatewayFixtureUiTests.PopulatedPagesPreserveSelectionAndPreferencesStayInDisposableProfile --logger trx;LogFileName=sessions-composite-diagnostic.trx, with the explicit retained Release app and a dedicated results/artifacts directory. A one-use invocation marker and exact product/test assembly hash checks guarded the command. No baseline, width or stress replay was performed.The diagnostic profile explicitly set
SystemRunSandboxEnabled=false,NodeSystemRunEnabled=falseandEnableNodeMode=false. The test-only launcher used an OS environment allowlist and private HOME/USERPROFILE/APPDATA/LOCALAPPDATA/TEMP/TMP/MXC ledger roots. The app log confirmed Windows auto-start reconciliation and WSL keepalive/startup cleanup were skipped, and the MXC availability probe remained deferred withsandboxEnabled=False. No normal user state or unknown process was changed. Temporary test-source changes were restored exactly after retaining the patch and reports; production source and the contributor's committed delta remain unchanged.Historical validation at original head
.\build.ps1 -Configuration Releasedotnet test .\tests\OpenClaw.Shared.Tests\OpenClaw.Shared.Tests.csprojdotnet test .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csprojThe first test runs restored packages because this was a fresh worktree. Repository-root discovery and tray settings were isolated. The tests include
ReactorTimeline_UsesStableBottomAnchoringAndDiscreteTailRequestsandReactorTimeline_InitialTailWaitsForLoadWithoutLayoutSubscription; these are source-contract checks, not proof that native scrolling always completes.Real Behavior Proof
Current-head native fixture evidence
Recommendation: HOLD pending the differential native failures, not a claim that the separate anchor crash was introduced by this patch. The full Debug and Release fixture commands failed overall. Exact-base controls passed the corresponding selected cases, so the failures are not demonstrated to be inherited. One pass per configuration raises a regression concern but does not prove a deterministic cause or exclude timing sensitivity. The September 24 diagnostic resolves the Sessions-case predicate ambiguity: selection succeeds, but natural-tail visibility fails. It does not establish the causal scheduling or realization branch.
SessionPickerSwitchesRealHistoriesAndShowsMessage240AtBothWidthsPopulatedPagesPreserveSelectionAndPreferencesStayInDisposableProfileSessions-page action routes to long chatEmptySessionRendersConnectedComposerWithoutPreviousHistoryLateHistoryForPreviousSessionCannotReplaceSelectedTranscriptThe Sessions assertion is the conjunction
PickerShows(long title) && IsVisibleInTimeline(final marker). The supplemental Release diagnostic recorded 86 observations over approximately 20 seconds. The expected picker title matched in 85/86, and the final native pickerItemStatusreportedselectedThreadId=agent:main:fixture-longwith that same key inloadedThreadIds. Its name wasSession: Fixture: 240-message conversation, and the synthetic Gateway returned the targetchat.historywithoutcome=ok. The first selection boolean raced initial navigation because the UIA reads are not atomic; all later matching-selection observations still failed the tail check.Natural-tail visibility was false in 86/86 observations: 0/86 visible. The expected marker
FIXTURE LONG END 240was absent from the accessible app tree, withmarkerBounds=null. Vertical scroll percentage remained 0. Final timeline bounds were[1268,702,1105,660](x,y,width,height) and scroll view size was0.9893865803202015. This is direct evidence of correct native session selection with unsuccessful natural-tail positioning, not a routing failure. The app remained responsive and produced no crash-log artifact. No speculative production fix was made; the author retains ownership of the fix.The successful September 23 Release long-history run records
FIXTURE LONG END 240at physical window sizes 1500x720 and 1900x950. Those initial/A-B/width positives and the exact-base controls remain preserved alongside the failed case. All bounded fixture reports show the app responding; no crash-log artifact or native anchor crash was observed in these runs. This is not a general crash-freedom claim. All owned app processes and synthetic profiles were disposed, including diagnostic PID 25916 and its private profile.Application DLL SHA256 identities:
B5B34C5E2F1E981BCCD96CD6595D406F33E1BA91A5521F05B3A47AD2F7D734679A75549272672873C4E60419A091DA30DF7AD331769788982B52E650278CBE7DDD8F16A3E6C08D48948984AB8C63D05DF622A951DE841874A82A9255ACA07C05BE382F6352D3BF0B5DA6081E1456C9ED690A1E9F87274AB86C8FB0CEED0C8B02Both Release runtime configurations have
System.Diagnostics.Debugger.IsSupported=false; neither used DevBuild or an attached debugger. The diagnostic product EXE SHA256 was unchanged atFDFC60C5CE567EFBA364760894BD6035360EB5FED2C5E047A9E1042935043CA0. The current-head scroll-controller SHA256 is3D004E6B23EFF60D1ECB9261FB4037E0D08A90C728DD18FFAAAAD9D488D81EE5and remains byte-identical to the contributor's original controller.Local TRX/report artifacts are retained as
pr1449-integrated,pr1449-baselineandpr1449-diagnosticin the maintainer session, not publicly uploaded. PR Debug result directory:ab4f64cd97c04b07afc829158654cffb; PR Release:cb00170fbe0144179f7f19e7b882ba0e. Failure run IDs: Debug wide-width4459a796fab240a7b9cf96d65015c513, Debug Sessionsf653bcb1da9c4354a70606261b52dfda, Release Sessions67e9f2baf73840e3a7bdaf6a43dd7582. The successful Release layout report is in runa3247f38e3b04d4b91b1f45419fb56ef. Supplemental diagnostic rune014901c2d724a689ad373aca3259774retainssessions-composite-diagnostic.jsonwith the separate UIA observations,run.json, and the synthetic Gateway request trace; its TRX, restored test-only instrumentation patch and sanitized summary are retained inpr1449-diagnostic.Not verified / blocked: the causal scheduling/realization mechanism behind the missed natural tail, screenshots and visual acceptance (
winappwas unavailable; no optional installation or ad-hoc GUI driver), and streaming follow/non-stealing while scrolled up (the committed fixture is browse-only). Selection-versus-tail ambiguity is now resolved by the supplemental diagnostic. Current-head CI status remains a separate gate and cannot replace native behavior proof. No new review was represented as passed: the previously reviewed contributor patch is unchanged, and this closeout made no semantic patch.Historical 77-message diagnostic at original head
f683edcae3b4405316149980b78a28ea5f49291f, with the explicitly noted temporary package/Markdown compatibility overlay. The committed scroll controller was unchanged.completedSwitches: 0,processAlive: false, and two history responses.N/A. The relevant native diagnostic output is copied above; the local screenshot and full dump are not publicly uploaded.Security Impact
NoNoNoNoNoYes, explain the risk and mitigation: N/A.Compatibility and Migration
YesNoNoReview Conversations