11 KiB
QA4 source-only cause checkpoint
Current source 0ffd92a8d2072a19fe61ac6edcf5097a9538fddd; saved runtime source 4de357e4a7489d6a25466cdec9babd8ed1edd513. Interpreter mail20261024T195244 requests source-only continuation, with no browser/server/build/tests and client next heavy slot. Existing three dirty retention paths preserved.
Measured evidence reanalysis
Read-only Python inspection of /tmp/playback-qa-4-vertical-result.json exited0. Seven snapshots per viewport reconfirm42 native-input sample hits on sidebar at360,42 at390,0 at1280; associated-label toggle/restoration4/4 per viewport,12/12 total. Inputs are check-comments/check-no-nip71-mirror. These are sampled hit-test interceptions, not measured failed native-input clicks or a proven stacking cause. Existing strict widths21/21 and Tab120/120 are prior results, not newly executed tests. Historical362/360 and394/390 strict failures remain retained.
Additional source trace
- ModalManager.js:64-83 obtains modalContainer and passes the imported appState setter through initUploadModal. initUploadModal.js:21-46 passes it unchanged to UploadModal. UploadModal.open:1507-1535 reveals root, sets upload state and activates focus; no body/sidebar suppression class write exists in that path.
- appState.js:167-182 updates modal state and notifies named/key subscribers. Repository JS search for subscribeToModalState and subscribeToAppState finds their definitions but no consumers; subscribeToAppStateKey consumers in app.js subscribe to pubkey/current user. No source connection from upload state to sidebar suppression was found. This narrows the lifecycle trace; it does not establish actual runtime classes or effective cascade.
- CSS:100-114 sidebar suppression requires body.modal-open or sidebar.is-modal-hidden. Search of JS/HTML found modal-open writes in other controllers and staticModalAccessibility, no is-modal-hidden writer. staticModalAccessibility synchronizes classes only when its own open/close functions execute; Upload uses createModalAccessibility directly, whose activate handles focus/listeners without that synchronization.
- index.html:162-166 app initially has fade-in; modalContainer is its descendant, sidebarContainer a body sibling. CSS:4412-4415 fade-in uses opacity animation with forwards fill; js/index.js:514-553 removes transient fade classes on animationend/animationcancel. Source therefore contains transient animation context, but saved results omit app class/animation state. No claim that animation persisted or caused interception is supported.
- CSS:5576-5604 app width/margin rules do not themselves declare z-index/transform/isolation. Sidebar and modal declarations alone cannot identify an intervening runtime stacking context. No minimal product/CSS patch is justified from these observations.
Exact missing evidence and smallest next measurement
Cause remains INCONCLUSIVE. Saved snapshots omit body/html/sidebar/app class history, computed sidebar/modalContainer and ancestor styles/rectangles, and complete ordered elementsFromPoint at the intercepted points. A native checkbox-box click was not executed. Rule collector selected html/body/modal/sheet/controls/labels and overflow candidates; it did not deliberately include app/modalContainer/sidebar ancestor chains, so matched-rule presence cannot fill those gaps.
Smallest proposed ONE new bounded run, only after explicit resource grant: reuse pinned genuine offline actual-app preparation and public deny; at360x800 only accept disclaimer/open Upload and wheel once to the same lower state. Before any click capture body/html/sidebar/app classes; sidebar and both ancestor chains with computed position/z-index/opacity/transform/filter/backdrop-filter/isolation/contain/will-change/animation/pointer-events/visibility/display, rectangles and active matched rules; record elementsFromPoint at the three saved relative input points plus label control point. Record class mutations from before Upload open through capture and document.getAnimations timing so transient context is distinguishable. Perform one native click at visible comments input center, recording checked state before/after and event target/composedPath; restore through known safe label UI if changed. Close Upload and capture suppression/stack state again. No style/class mutation experiment, publish, product patch or broad viewport campaign. If this does not reproduce, preserve that result without retries. This run is proposed only, not authorized or started.
No new runtime/test/build/gate/commit/submission; no outgoing acknowledgement required by interpreter. QA3 CI-equivalent execution, historical overflow cause, real-device/AA and live media remain unverified.
Recorded UTC: 2026-10-24T19:54:01.260766+00:00
Post-outage measurement preparation
Interpreter22:03:18 routes sourceprep only; client sole brief Firefox slot. New scratch script /tmp/playback-qa-4-cause-run.cjs SHA256 fd70de6956c2df0dcdc0f08bfe35b38aae90520c2fdb45ba1c7019d3436e7c04; node --check exit0. Syntax/preparation READY, runtime NOT executed. Exact eventual command node /tmp/playback-qa-4-cause-run.cjs from own worktree, only after client RELEASE, fresh health and explicit next-slot approval. Runtime guard requires HEAD 0ffd92a8d2072a19fe61ac6edcf5097a9538fddd; drift stops before bind. Relevant source comparison against saved runtime4de357e4 returned no diff for index/template/CSS/index.js/appState/ModalManager/initUploadModal/UploadModal/modalAccessibility.
Revalidated existing Buffer/CSS hashes2/2 and both genuine relay hashes2/2, matching prior pins. Script preserves actual-app readiness, real disclaimer/Upload UI, local synthetic identity, no relay seeding/submission, private31864/31865 and public HTTP/WS denial. Original runner/results untouched. One360x800 context; one wheel action then same relative input/label sample coordinates. Captures ancestor computed styles/rectangles/active rules, ordered hit stacks, class mutation history from pre-open and active animation timings; one native comments-input center click/event composedPath, conditional safe label restoration, close-state capture. It makes no style/class mutations. Result/screenshot paths unique /tmp/playback-qa-4-cause-result.json and /tmp/playback-qa-4-cause-360.png. Awaited browser/app/relay finally cleanup retained; stop on first blocker, no retry.
No browser/server/build/tests/full gate/commit/submission executed. Historical strict failures and prior evidence retained; source cause remains inconclusive until runtime measurement. All earlier browser grants expired; no outgoing ACK sent as instructed.
Prepared UTC: 2026-10-24T22:04:09.008941+00:00
Approved ONE measurement result — 2026-10-24T22:06Z
Interpreter grant22:05:39 after client RELEASE22:04:51. Verified exact runner SHAfd70de6956c2df0dcdc0f08bfe35b38aae90520c2fdb45ba1c7019d3436e7c04 and Buffer/CSS/relay pins before execution. Fresh fleet health22:05:50 max66C/load1.86/RAM70.5%/battery53%41min; swap91% advisory. Command node /tmp/playback-qa-4-cause-run.cjs received normal host approval; no review rejection. Source 0ffd92a8d2072a19fe61ac6edcf5097a9538fddd, Chromium145.0.7632.6. START22:06:01.125Z, natural exit0, RELEASE22:06:03.621Z, elapsed2.496s. Diagnostic exit0 means completed capture, NOT a passing input interaction.
Counts: one browser/context/360x800 viewport; actual readiness/disclaimer/Upload1/1 each; one wheel; one native checkbox-center click; failed intended checked-state change1/1. Click before=true/after=true at requested46.375,592.4375. Actual click event rounded46,592 targets ASIDE#sidebar; composedPath sidebar/sidebarContainer/body/html excludes checkbox/label. No restoration needed because state did not change. Before-wheel/lower/after-click six input samples each hit sidebar first with checkbox second:18/18 interceptions. Label-text sample points hit spans as expected; no label activation repeated in this run. Prior12/12 label toggles remain separate evidence.
Strict widths360/360 at all four captures, including closed state4/4. Historical362/360 and394/390 failures remain unexplained. Page errors0; blocked public requests14; genuine Buffer route served from hash-pinned mirror, other public HTTP/WS denied. No relay events seeded or notes/media submitted. Own app31864/relay31865/browser closed via awaited finally; resourcesClosed=true. No independent socket inventory performed; preview3000 and peers untouched. Posthealth22:06:10 max63.9C/load1.93/RAM70.2%/battery52%37min, swap91%; no continuous peak-temperature claim.
Newly measured ordering and source-associated explanation
Sidebar left0/right51.1875, fixed, z-index20, pointer-events auto, visible, opacity1/isolation isolate. modalContainer fixed viewport bounds, z-index100/isolation isolate inside app; Upload fixed z-index100/pointer-events auto. These exact declarations coexist with sidebar first in ordered input hit stacks. Both html/body class sidebar-collapsed; sidebar class sidebar-collapsed, no is-modal-hidden. No watched class changes from before Upload open through close. Suppression selectors body.modal-open #sidebar and #sidebar.is-modal-hidden do not match the measured classes. This confirms absent sidebar suppression during this run rather than merely assuming it from Upload source.
App retains fade-in class with computed animation 0.28s ease-out forwards interface-fade-in. getAnimations records its opacity animation finished/currentTime280/fill forwards/progress1 before wheel, after wheel and after click. Matched generated .fade-in rule confirms opacity0 plus forwards animation; keyframes animate opacity0→1. App ancestors have transform/filter none, opacity1, z-index auto/isolation auto/contain none/will-change auto. This retained opacity-animation context is the source-supported explanation for why the modal descendant does not outrank the sibling sidebar despite its numeric100 vs20. Causal intervention (remove animation/class or apply suppression) was NOT performed. Animation-cleanup failure mechanism/timing remains unverified; do not claim why js/index.js animationend/cancel listener missed cleanup, or generalize to every boot/device.
Minimal independent review/ownership scope is now narrower: index.html app fade-in/modal nesting; js/index.js:514-553 transient animation cleanup; css/tailwind.source.css:4412-4415/5758 opacity animation plus100-114 sidebar suppression and4602 modal root; UploadModal/appState modal-open integration as previously traced. No token/color/z-index value change or redesign proposed. Dispatch must independently reproduce and assign implementation before product/CSS edits. This measurement does not establish the original horizontal-overflow cause.
Artifacts: /tmp/playback-qa-4-cause-result.json SHA256 ea7a6aa358c488e4937ff3df7c21e24b7cd25488ad81232e21196aa3c255b742; screenshot /tmp/playback-qa-4-cause-360.png SHA256 beb7fc91d13223021951a7f13363ad73181e92c40fbbbf81ccda22fa6eaaa383. Original artifacts unchanged. No retry/product/CSS/test/helper/config/build/gate/commit/submission. QA3 CI, historical overflow cause, causal intervention, other viewport parity and real-device/AA remain unverified.