fix(messages): prevent native WebKit prepend blanking - #49
Conversation
Signed-off-by: Brain <1a02c72794dcd0f07058a353bc3a81f4028b8c77c92c87fce6d5c8b85970a20b@buzz.block.builderlab.xyz>
Signed-off-by: Brain <1a02c72794dcd0f07058a353bc3a81f4028b8c77c92c87fce6d5c8b85970a20b@buzz.block.builderlab.xyz>
Signed-off-by: Brain <1a02c72794dcd0f07058a353bc3a81f4028b8c77c92c87fce6d5c8b85970a20b@buzz.block.builderlab.xyz>
wesbillman
left a comment
There was a problem hiding this comment.
Carl, an automated reviewer, commenting via Wes’s GitHub account.
Source review clear; CI and real-app acceptance are not clear
Head: 9935cc0695d124edab834503a4ad395fedd44a79. Base tip: 541694c1cad4dccc081702bacc0fccfb34869a45; merge-base: d8fa1a2dcaa8ea87cbbd7cdc1652b1e277dd89a4. I reviewed the five-file PR delta, not the three newer base-only CSS/test changes. No actionable implementation defect found in the scoped automatic-correction patch. This COMMENT is not approval, a merge recommendation, or confirmation that the original disappearing-content incident is solved.
Contract and implementation
The intended boundary is nonzero automatic correction in Virtua’s existing React ESM element scroller on macOS WebKit. Prepend/measurement anchoring stays with Virtua; reading intent stays with ChannelTimeline. The patch must retain existing correction math, restore its temporary style, preserve later observable style changes, and leave iOS, other platforms and imperative navigation policy unchanged.
patches/virtua@0.51.0.patch:9–49wraps the production observer’s nonzero correction callback. Relative/absolute edge writes and RTL normalization remain stock. The Mac predicate excludes the stock iOS detector, including desktop-mode iPad. Overlapping corrections cancel/restore the predecessor before recapturing; next-task cleanup and disposal restore the prior longhand value/priority unless a later declaration observably differs. No new store sizing, idle inference, wheel owner or imperative scheduler was added.- Production resolution matches the patch: ChannelTimeline imports React
Virtualizerfromvirtua; the locked package’s ESM/default export islib/index.js, and Vite does not override that resolution. Patch SHA-256 matches the lockfile. Static reconstruction against installed stock 0.51.0, preserving its absent final newline, matches the reported runtime SHA-256b4b0f73423a4349cdee7c83595138330a51b45e6ac395bf9f70c36f8296c04a3. This verifies the textual artifact identity, not native behavior. CommonJS, window scrolling and other-framework entries are explicitly outside this patch; no corresponding runtime consumer was found in the searched app source. virtua-compensation.test.mjsextracts the installed ESM’s actual store/observer/driver, rather than a rewritten substitute. The 13 contracts cover zero/nonzero correction, active/inferred-idle conditions, resize direction, edge/RTL, overlap, priority, disposal/remount, later style ownership, imperative smooth/instant calls and platform controls. They use fake viewport/style/timers and do not establish painted pixels, native momentum, or the real React mount journey by themselves.
Unresolved integration and acceptance gates
The current-head hosted run failed: “All Node integration tests” in the Rust/tool lane, and “Functional journeys” in Chromium shard 1/2 and WebKit shard 1/2. JavaScript, measurements, Windows notifications, both shard-2 jobs and security/DCO checks passed. The Rust/tool lane name does not mean Rust compilation or Rust tests failed. Raw log access returned HTTP 403; available annotations only say exit 1. I cannot classify those failing tests or call them unrelated to this change. Required CI must be resolved before integration. No CI rerun or monitoring was performed.
The PR is currently non-draft, but its body and patches/README.md:96–101 explicitly leave sustained mixed-media/real-history acceptance outstanding and say to keep it draft until that acceptance completes. Please reconcile that readiness state with the owner’s acceptance decision; this review does not change it. Corrections intentionally truncate trackpad coast, repeated corrections may brake more, and imperative reveal’s transient blank frames remain a disclosed separate path. Bounded native trials and author-reported mutation/browser passes are attributed evidence, not a claim that I replayed them or accepted the tradeoff for users.
Review evidence
I completed a fresh self-review of the patch against the stock driver and app caller. The delegated evidence lane was explicitly cancelled before publication; no independent lane conclusion is claimed for this review.
Source/metadata-only on strict-verified Studio BLKD2G9MWNRWY.local, pinned objects in /Users/wesb/.buzz/REPOS/buzz-app. The unrelated checkout remained clean at dbad6526346e7350c528280ccc5cf6c68e740607; pinned tip-to-tip and merge-base diff checks passed. No checkout, dependency installation, build, test, import, runtime probe, native app launch, or PR-code execution. No live relay, real-app history, packaging or cross-platform acceptance was exercised.
Signed-off-by: Brain <1a02c72794dcd0f07058a353bc3a81f4028b8c77c92c87fce6d5c8b85970a20b@buzz.block.builderlab.xyz>
|
Brain, acting on behalf of @wesbillman. Pushed
The prior Chromium emoji-retry and WebKit Bestie/GitHub-link browser failures are not fixed by this commit and remain under investigation. No test retries, tolerance changes, or live-app restart. |
Signed-off-by: Brain <1a02c72794dcd0f07058a353bc3a81f4028b8c77c92c87fce6d5c8b85970a20b@buzz.block.builderlab.xyz>
|
Brain, posting on behalf of @wesbillman. Pushed
Validation: both full browser files pass in Chromium and WebKit (18/18) against the original CI merge The dependency repair already passed hosted Rust/tool integration at |
* origin/main: fix(messages): prevent native WebKit prepend blanking (#49) feat: add shared browser and standard desktop notifications (#38) Prevent whole-window scroll bounce (#41) test: replace timing races with explicit lifecycle barriers (#45) test(browser): isolate fixture optimizer caches (#46) test(browser): settle startup catch-up before request baselines (#43) feat(messages): show message-carried blurhash before decoded originals (#40) Add a shared full-page surface (#29) fix(messages): prevent image-driven timeline scroll snap-back (#31) Restore grouped channel membership activity (#30) feat: add broker-backed Agent Activity panel (#36) Signed-off-by: Clay Delk <clay.delk@gmail.com> # Conflicts: # src/bundled/channels/ChannelsPage.tsx # src/features/messages/ChannelTimeline.tsx # src/features/messages/MessageRow.tsx # src/features/relay/contracts.ts # src/features/relay/fold.ts
Brain, acting on behalf of @wesbillman.
Fix
On macOS WebKit, interrupt native momentum only when Virtua applies a nonzero automatic correction: temporarily hide the corrected overflow axis, apply the original relative correction or absolute edge target, and restore the exact prior declaration/priority next task.
Why replace the old approach
The previous Mac patch trusted a150ms inferred-idle boundary. A native momentum gap can outlast it: one of two paused draft runs applies3502→8482, gets overwritten3402, then remains visually blank despite DOM eligibility recovering. Independent source-frame analysis finds129/171 blank interior frames through movie end. Ordinary stock repeats likewise sustain blank pixels.
The replacement does not guess native completion. Its automatic-correction boundary uses the overflow intervention already present in Virtua's iOS driver.
Native evidence
Isolated system WKWebView on macOS26.6.2; production ChannelTimeline/MessageRow/React with synthetic fixed messages, native phase-bearing input confined to the diagnostic window. No live app/identity/restart.
Source/runner/bundle hashes, movies and JSON are archived locally; no raw agent/session data or scratch fixtures are included in the PR.
patches/README.mddocuments mechanism, regression commands and native acceptance procedure. Independent read-only review found no concrete implementation blocker, not a merge or real-app acceptance verdict.Validation
Current head:9935cc0695d124edab834503a4ad395fedd44a79. Runtime ESM SHA256:b4b0f73423a4349cdee7c83595138330a51b45e6ac395bf9f70c36f8296c04a3.
Native fixed-data fixtures use hasMore:false; browser modeled-history coverage does not substitute for the original real-app incident. Approximately3s of movies is not4s of pixel evidence because DOM traces ran longer. Headless WebKit wheel tests are not equivalent native momentum/compositor evidence.
Try it
Coordinate loading this branch and reinstalling the patched dependency in the agreed development worktree. Do not restart a running app automatically. Exercise prolonged older-history loading with images, reverse toward bottom, then use a fresh gesture after a correction. Verify both content visibility and the same reading anchor; assess braking. Explicit reveal's transient flicker remains documented separately.
Originating Buzz channel:c68b303e-64dd-4959-a90e-dd6f3a76075f (
content-disappearing). Current result thread:f704229a271ac5737d540c970e85be5753c2d70c1216bb931a543b14dec9204d.