fix(chat): stabilize bottom anchoring - #1089
Conversation
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
|
Codex review: needs real behavior proof before merge. Reviewed August 4, 2026, 8:08 PM ET / August 5, 2026, 00:08 UTC. ClawSweeper reviewWhat this changesThe PR replaces dynamic chat follow-tail anchoring with stable native bottom anchoring and validates queued navigation against the current tail row and item count. Regression provenancePossible regression — probable (reviewed change; failure trace). No predecessor PR is attributed. Merge readiness⛔ Blocked until stronger real behavior proof is added - 4 items remain Keep open pending inspectable current-head runtime proof. The queue-boundary repair is focused, but the linked proof artifact could not be retrieved and an earlier exact-head review recorded an intermittent layout exception. Priority: P1 Review scores
Verification
How this fits togetherThe Windows tray chat renders keyed conversation rows in a virtualized native list. Timeline updates either preserve reading position during in-place streaming or request native navigation for an initial load or genuinely new final row. flowchart LR
A[Chat timeline updates] --> B[Keyed message rows]
B --> C[Virtualized native list]
C --> D{Initial load or new tail?}
D -->|yes| E[Validate queued request]
D -->|no| F[Observe reading position]
E --> G[Native tail navigation]
F --> H[Native bottom anchoring]
Before merge
Agent review detailsSecurityNone. Review metrics
Merge-risk optionsMaintainer options:
Technical reviewBest possible solution: Retain the bounded tail-request design and add redacted, inspectable current-head proof covering scroll-away, in-place streaming, new-tail follow, and long-history remounting before merge. Do we have a high-confidence way to reproduce the issue? Unclear. A collaborator observed an exact-head layout exception, while the contributor's subsequent long run did not reproduce it and its artifact was unavailable for inspection. Is this the best way to solve the issue? Unclear. The source repair correctly narrows stale queued navigation, but the stable-anchor runtime behavior still needs direct current-head evidence. AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against 6e225e4758e1. LabelsLabel justifications:
EvidenceWhat 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 (5 earlier review cycles)
|
|
I completed a dual-model adversarial review plus exact-head paired-profile testing of The anchoring direction is promising, but I do not think this is merge-ready at our >90% confidence bar. What passed
Blocking before mergeExact-head layout exceptionDuring prolonged long-conversation remount/virtualization scrolling, the exact PR head logged an unhandled: The app remained responsive, and clean follow-up runs did not reproduce it during idle Chat, ordinary scrolling, or a shorter UI Automation pass. The precise trigger therefore remains unresolved, but a current-head unhandled layout exception prevents approval. Queued tail index can become invalid
Please capture the queued index, revalidate it against the current item count when the callback executes, and keep Requested follow-up
Current merge confidence: 45%. Requesting changes. |
Capture immutable tail requests, revalidate their index and row identity against the reconciled item count, and coalesce dispatcher work without allowing stale generations to execute. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
|
Addressed the stale queued-tail race in The positioner now receives the reconciled Added behavioral coverage for valid-to-empty, empty-to-valid, stale identity, out-of-range bounds, callback replacement, and stale generations. Validation: full build passed; Shared 3,399 passed / 32 skipped; Tray 2,042 passed; focused tail policy tests 5 passed. Current-head runtime attempt used a clean debugger-free ARM64 DevBuild and isolated profile. It completed 25 full-range scroll/remount passes plus 15 remount passes with 2,846 tool-card expand/collapse operations. The app remained responsive. The signed DebugView capture and app log contained no |
|
Additional streaming proof on the same current-head instance:
Capture: |
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
bkudiess
left a comment
There was a problem hiding this comment.
Reviewed and live-tested with >90% confidence after the queued-tail repair and synchronization with current main. The stale index/generation path is now bounded by immutable request capture and immediate execution-time validation. Exact synchronized-head build, 3,399 Shared tests (32 skipped), 2,045 Tray tests, 15 focused chat/tail tests, 100 non-accessibility UI tests, and 19 accessibility tests passed. Fresh GitHub CI is green for x64, ARM64, tests, all E2E shards, hygiene, dispatch, and the CodeQL gate. Maintainer accepts the extensive current-head manual remount, scrolling, streaming, and tool-card stress proof. Final GPT and Gemini reviews found no actionable issues.
Summary
This PR stabilizes the Reactor chat follow-tail path and hardens queued native navigation against stale reconciled state.
ScrollViewattaches.ViewChangedobservation-only.StartBringItemIntoView.main, including refactor(chat): use Reactor theme resources #1084 theme-resource changes, without conflicts.Tail navigation contract
TailNavigationPolicy.TryCapturerejects empty or out-of-range tail state before work is queued.TailNavigationQueuecoalesces to the newest generation while retaining one dispatcher callback.TailNavigationPolicy.CanExecutethen rejects stale identity, count, generation, or bounds immediately before native navigation.The design intentionally has no synthetic sentinel row, custom layout, extent calculation,
TryGetItemIndex,ChangeView,UpdateLayout, streamed text-length trigger, settle loop, or timer.ItemsViewowns virtualization,ScrollViewowns scrolling and anchoring, andViewChangedremains observation-only.Validation
Current synchronized head:
12bc6d2cgit diff --check.\build.ps1: passedmainremains limited to the intended five files.Real behavior proof
The maintainer accepts the contributor's manual proof for
be07589d, the functional commit immediately below the synchronization merge:LayoutCycleException,Element is already the child of another element, COM failure, or unhandled exception.The synchronization commit only incorporates current
mainand merged cleanly. Exact synchronized-head build, Tray, Shared, focused timeline, WinUI, accessibility, x64, ARM64, and E2E validation all pass.The earlier reviewer-observed exception on
96f0e9ecremains classified as an intermittent negative-reproduction concern rather than a current known code defect. It did not reproduce in clean isolation passes or the contributor's current-head stress runs.Review
be07589d.MERGEat 88% confidence.MERGEat 100% confidence.Scope
This PR changes only Reactor chat tail positioning and its focused policy/tests. Theme and navigation resources are supplied by current
mainthrough #1084.