test: stabilize Playwright readiness and scroll observation #856
Closed
kayg
wants to merge 0 commits from
fix/playwright-train-flakes into dev
pull from: fix/playwright-train-flakes
merge into: kayg:dev
kayg:main
kayg:feat/style-sheet-fixes
kayg:feat/contrast
kayg:storage/wal-checkpoint-off-save-1051
kayg:t3/paged-search-reconcile-final
kayg:feat/pass8
kayg:review/calendar-2
kayg:fix/shared-row-swipes
kayg:dev
kayg:feat/collections-db
kayg:fix/instant-keys-1056
kayg:feat/money-round
kayg:perf/stalls-1054
kayg:wip/tiering-v3-cold4
kayg:wip/tiering-v3-cold5
kayg:port/rows-actions
kayg:port/rows-drop
kayg:port/hidden-blocks
kayg:port/rows
kayg:port/port-tables
kayg:port/port-tables-2
kayg:t3/mail-1011-liveness
kayg:port/devices
kayg:port/port-attachments
kayg:port/port-attachments-2
kayg:port/port-attachments-3
kayg:docs/design-consistency
kayg:docs/engineering-standards
kayg:fix/rusqlite-0.41-rustsec-2026-0459
kayg:feat/iphone-fixes
kayg:shared/restore-and-stale-918-919
kayg:fix/phone-top-band-contrast
kayg:feat/notes-approve
kayg:perf/soak-max-gate
kayg:feat/files-s1-identity
kayg:fix/lifecycle-event-id
kayg:feat/quickfix
kayg:wip/tiering-v3-cold
kayg:perf/web-mockup-frame-fixes
kayg:port/contacts-merge
kayg:port/contacts-edit
kayg:test/shared-room-no-deleted-text
kayg:perf/first-paint-credits
kayg:fix/shared-history-after-grant
kayg:fix/phone-swipe-regressions
kayg:feat/contrast-r1
kayg:review/sharing-pr3-review
kayg:feat/tiering-v3-s2-tags
kayg:feat/folder-drop
kayg:fix/deskpills-lazy-share
kayg:feat/sharing-s1-pr3
kayg:tmp/money-round-before
kayg:fix/phone-pane-backdrop-roots
kayg:fix/palette-preload-chips
kayg:fix/invite-defaults
kayg:port/tasks-matrix
kayg:fix/restore-green-gates
kayg:fix/sharing-fast-path-hardening
kayg:t3/photos-s1
kayg:feat/tiering-v3-s1-namespace
kayg:notes-archive-hide
kayg:feat/tasks-actions
kayg:t3/photos-plan-slice-one
kayg:feat/whiteboard-s1
kayg:t3/paged-search-reconcile
kayg:t3/smooth-pane-transitions
kayg:t3/index-position-startup-scan
kayg:fix/private-staging-759b-r2
kayg:feat/dav-transport
kayg:feat/imap-notes-fetch
kayg:feat/imap-notes-projection
kayg:feat/imap-notes-readonly
kayg:feat/imap-notes-auth
kayg:feat/imap-notes-server-foundation
kayg:docs/undo-block-ids-plan
kayg:fix/undo-768
kayg:proto/block-identity-v7d
kayg:issue/carddav-read-perf-fix-r2
kayg:issue/carddav-read-r2
kayg:docs/imap-766-plan-v2
kayg:docs/imap-notes-plan
kayg:docs/quota-plan-2
kayg:fix/parallel-test-flakes
kayg:feat/contacts-companion-pure
kayg:docs/calendar-backend-v2-plan
kayg:feat/calendar-ical-converter
kayg:docs/tasks-writes-v2-plan
kayg:docs/carddav-writes-v2-plan
kayg:docs/contacts-import-v2-plan
kayg:issue/610-pm-midnight
kayg:feat/calendar-v2-s1-containment
kayg:docs/dav-recorder-v2-plan
kayg:plan/previews-865
kayg:plan/save-log-durable-entry
kayg:fix/e2e-data-on-ram
kayg:feat/appwindow3
kayg:feat/appwindow2
kayg:feat/appwindow
kayg:feat/money-p1
kayg:feat/keys-sheet
kayg:review/calendar-2-themes
kayg:feat/smooth-cursor
kayg:fix/float-style
kayg:review/calendar-2-float
kayg:release/2026-11-06-hotfix
kayg:archive/port/rows-drop-code
kayg:archive/port/rows-actions
kayg:archive/port/rows
kayg:scratch/tasks-894-ui-gates
kayg:review/calendar-2-night-wip
kayg:release/2026-11-05
kayg:archive/feat/tiering-v3-s1-namespace
kayg:archive/flaky/rows-drop-fixed
kayg:archive/flaky/rows-actions
kayg:archive/feat/tiering-v3-reader
kayg:archive/feat/tiering-v3-roots
kayg:archive/flaky/rows
kayg:sim/bm15-final
kayg:sim/bm15-fix
kayg:sim/bm15-bis-932
kayg:sim/bm15-bis-909
kayg:sim/bm15
kayg:sim/bm15-bis-887
kayg:perf/tiering-option-b
kayg:port/style-3
kayg:port/style-2
kayg:port/style
kayg:fix/sw-lazy-precache
kayg:fix/vim-w-waits-for-save
kayg:fix/signout-test-races
kayg:fp-scratch/all
kayg:sim/bm15-first-paint
kayg:archive/bm15/rows-drop
kayg:archive/bm15/rows-actions
kayg:fix/palette-snippet-contrast
kayg:archive/bm15/rows
kayg:archive/bm15/hidden
kayg:archive/plan/save-log-durable-entry
kayg:mock/money-fix2
kayg:archive/fix/e2e-data-on-ram
kayg:mock/appearance-all
kayg:mock/pill-press
kayg:archive/docs/design-consistency
kayg:mock/auto-swipes
kayg:mock/mail-actions
kayg:archive/feat/mail-p1
kayg:mock/money-static
kayg:archive/review/standards-917
kayg:archive/docs/engineering-standards
kayg:perf/tiering-761-fix
kayg:mock/type-audit
kayg:mock/third-pane
kayg:feat/contacts-import-v2-s1
kayg:perf/executor-hot-path
kayg:archive/port/hidden-blocks
kayg:archive/port/devices
kayg:scratch/executor-on-894
kayg:scratch/executor-spans2
kayg:scratch/executor-spans
kayg:train/2026-11-03-bm14c
kayg:archive/port/rows-drop
kayg:feat/tiering-761-d-scale
kayg:feat/tiering-761-c-index
kayg:feat/tiering-761-b-reader
kayg:archive/review/sharing-pr3-review-9fec3d1f
kayg:train/2026-11-03-bm14b
kayg:perf/ports-lazy-budgets
kayg:feat/tiering-761-a-migration
kayg:train/2026-11-03-bm14
kayg:train/2026-11-03-bm12
kayg:archive/review/sharing-pr3-review
kayg:archive/feat/sharing-s1-pr3
kayg:train/2026-11-03-bm11
kayg:archive/feat/imap-notes-fetch
kayg:train/2026-11-03-bm10
kayg:archive/review/sharing-pr3-review-code
kayg:archive/plan/previews-865
kayg:train/2026-11-02-bm9
kayg:archive/port/port-attachments-3
kayg:archive/port/contacts-merge
kayg:fix/motion-audit-859
kayg:train/2026-11-02-bm8
kayg:archive/scratch/bm8-prep
kayg:archive/port/port-pickers
kayg:archive/port/port-tables-2
kayg:archive/port/port-tables
kayg:archive/feat/sharing-s1-pr3-code
kayg:archive/scratch/bm7-fixed
kayg:train/2026-11-02-bm7
kayg:archive/fix/parallel-test-flakes-code-minipc01
kayg:train/2026-11-02-bm6
kayg:docs/imap-766-readonly-slice
kayg:feat/dav-recorder-v3
kayg:research/788-diagnosis
kayg:archive/fix/parallel-test-flakes
kayg:archive/perf/pr792-cold-index-edit
kayg:docs/sharing-slice-1
kayg:archive/docs/imap-766-plan-v2
kayg:feat/dav-recorder-v2
kayg:archive/docs/dav-recorder-v2-plan
kayg:spike/imap-766-s0-cases
kayg:archive/fix/undo-768
kayg:feat/dav-recorder
kayg:archive/docs/contacts-import-v2-plan
kayg:archive/feat/calendar-ical-converter
kayg:feat/contacts-import
kayg:perf/cold-growth-on-764
kayg:perf/cold-growth-on-tiering
kayg:archive/docs/tasks-writes-v2-plan
kayg:archive/docs/calendar-backend-v2-plan
kayg:archive/feat/contacts-companion-pure
kayg:feat/tasks-set-status
kayg:feat/tasks-move-reorder
kayg:archive/docs/carddav-writes-v2-plan
kayg:archive/feat/calendar-v2-s1-containment
kayg:feat/tasks-delete-promote-duplicate
kayg:archive/feat/dav-transport
kayg:archive/fix/carddav-rebuild-r1
kayg:archive/fix/carddav-retention-r1
kayg:feat/carddav-writes
kayg:perf/quota-on-tiering
kayg:perf/quota-simple
kayg:perf/cold-growth-on-quota-stack
kayg:feat/calendar-identity
kayg:feat/calendar-event-parser
kayg:feat/calendar-props-maps
kayg:port/glass-when-ring
kayg:feat/tiering-761-s1
kayg:wip/10by32-01-impl-759b-scratch-20261030
kayg:wip/6by32-01-bm3-webkit-pause-20261030
kayg:wip/10by32-01-bm3-chromium-pause-20261030
kayg:wip/6by32-01-tier-761-s1-pause-20261030
kayg:spike/imap-766-s0
kayg:wip/6by32-02-calternal-pause-20261030
kayg:wip/8by64-01-review-688-pause-20261030
kayg:wip/6by32-01-verify-744-pause-20261030
kayg:wip/6by32-01-verify-742-pause-20261030
kayg:fix/private-staging-759b
kayg:wip/6by32-01-review-748-pause-20261030
kayg:wip/6by32-01-review-733c-pause-20261030
kayg:wip/6by32-01-review-733b-pause-20261030
kayg:wip/6by32-01-perf-idle-8-pause-20261030
kayg:wip/6by32-01-perf767-base-pause-20261030
kayg:wip/6by32-01-perf767b-767-pause-20261030
kayg:wip/6by32-01-perf767b-764-pause-20261030
kayg:wip/6by32-01-perf767-767-pause-20261030
kayg:wip/6by32-01-perf767-764-pause-20261030
kayg:wip/6by32-01-lists-b-pause-20261030
kayg:wip/6by32-01-ids-verify5-pause-20261030
kayg:wip/6by32-01-ids-verify4-pause-20261030
kayg:review/calendar-month
kayg:wip/10by32-02-undo-768-20261030
kayg:test/ids-verify3
kayg:wip/10by32-02-bm3-chromium-20261030
kayg:wip/10by32-01-review-753-20261030
kayg:wip/10by32-01-perf-idle-2-20261030
kayg:wip/10by32-01-bm2-webkit2-20261030
kayg:plan/759b-staging
kayg:train/2026-10-30-bm2
kayg:review/758b-tests
kayg:review/758-tests
kayg:review/764d-tests
kayg:review/767b-tests
kayg:review/preview-2026-10-29
kayg:review/767-tests
kayg:docs/tiering-731-plan
kayg:wip/c6b02-when2
kayg:wip/c6b02-tasks-create-fix5
kayg:wip/c6b02-settings-frost-mock
kayg:wip/c6b02-settings-frost-base
kayg:wip/c6b02-settings-frost
kayg:wip/c6b02-ring
kayg:wip/c6b02-review-733d
kayg:wip/c6b02-bm1-full-a
kayg:wip/compute02-when-field
kayg:wip/compute02-webkit-lists-repro
kayg:wip/compute02-train-bl2-dev
kayg:wip/compute02-dev-green-pw164
kayg:docs/deploy-plan
kayg:review/764c-tests
kayg:review/764b-tests
kayg:review/748g-tests
kayg:review/764-tests
kayg:review/759b-tests
kayg:fix/storage-owner-liveness-642
kayg:fix/storage-fix-7
kayg:wip/compute02-storage-fix-7
kayg:review/759-tests
kayg:feat/tiering-731
kayg:wip/tiering-731-first-attempt
kayg:wip/compute02-storage-fix-1
kayg:review/754g-tests
kayg:perf/idle-honest-2
kayg:review/754f-tests
kayg:review/754e-tests
kayg:review/755-tests
kayg:review/754d-tests
kayg:review/754c-tests
kayg:review/754b-tests
kayg:review/754-tests
kayg:fix/storage-private-tmp-642-dev
kayg:wip/compute02-verify-750
kayg:test/ids-verify5
kayg:test/ids-verify4
kayg:fix/storage-exact-file-quarantine-642
kayg:wip/compute02-verify-740
kayg:perf/one-flush-save
kayg:review/calendar-static
kayg:wip/compute02-verify-737
kayg:review/indexing-ring
kayg:review/when-field-2
kayg:wip/compute02-review-733
kayg:proto/block-identity-2-review
kayg:proto/block-identity-review
kayg:wip/c6b02-tc-design
kayg:review/when-field
kayg:issue/tasks-create-ids
kayg:issue/tasks-create
kayg:review/combined
kayg:wip/compute02-review-combined
kayg:review/task-polish
kayg:review/top-buttons
kayg:review/q1-q5
kayg:train/2026-10-26-bl2
kayg:archive/wt-398h
kayg:archive/train-bm-proptest-seed
kayg:archive/integ325-293
kayg:archive/integ325-ci
kayg:archive/client-auth-review-baseline
kayg:archive/wt-sim-4853
kayg:archive/wt-sim-4811
kayg:archive/wt-448m
kayg:archive/wt-398a-allocator
kayg:issue/calendar-adr
kayg:archive/old/train/2026-10-23bk2
kayg:archive/old/train/2026-10-23bk
kayg:issue/469-mockup-9a
kayg:issue/smart-tasks-mockup
kayg:issue/469-menus
kayg:issue/652-signout-flake
kayg:issue/652-history-fix7
kayg:issue/652-history-fix6
kayg:archive/old/issue/spring-check-perf
kayg:issue/spring-check-perf
kayg:issue/659-rename-fast
kayg:archive/old/train/2026-10-21ar
kayg:issue/search-hardening-3
kayg:issue/652-history-fix5
kayg:issue/660-port-sheets-glass
kayg:issue/652-history-fix4
kayg:issue/652-history-fix3
kayg:issue/652-history-fix2
kayg:issue/652-history-flake
kayg:train/2026-10-21an
kayg:issue/settings-admin-port
kayg:issue/search-port
kayg:train/2026-10-20am
kayg:issue/storage-split-fix2
kayg:issue/storage-split
kayg:archive/old/issue/folder-ids-fix
kayg:train/2026-10-20al
kayg:archive/old/issue/folder-ids
kayg:train/2026-10-20ak
kayg:issue/tables-mockup
kayg:train/2026-10-19aj
kayg:train/2026-10-19ai
kayg:issue/469-merge-fixes
kayg:issue/sidebar-band
kayg:archive/old/issue/608-settings-spec
kayg:train/2026-10-19ah
kayg:issue/swipe-offscreen
kayg:train/2026-10-19ag
kayg:archive/old/issue/590-nlp-adr
kayg:archive/old/issue/587-event-after-write-2
kayg:train/2026-10-19af
kayg:archive/old/issue/587-event-after-write
kayg:issue/469-pill-room-c
kayg:issue/469-pill-room
kayg:train/2026-10-19ae
kayg:issue/469-narrow-handle
kayg:issue/397-ios-swipe-2
kayg:archive/old/issue/adrs-photos-files-tasks
kayg:issue/469-desk-fixes
kayg:archive/old/issue/auto-update-adr
kayg:issue/469-filter-gap
kayg:issue/469-port-1b
kayg:issue/442-opacity-flake
kayg:archive/397-ios-swipe-2
kayg:issue/327-web-fast-3
kayg:archive/old/issue/469-port-1
kayg:issue/469-port-1
kayg:issue/327-web-fast-2
kayg:archive/old/issue/327-web-fast
kayg:archive/old/issue/425-stt-bench-vq1
kayg:archive/old/issue/445-no-bleed
kayg:archive/old/issue/400-swipe-mockup-2
kayg:issue/426-client-review
kayg:issue/426-client-2
kayg:issue/426-client
kayg:archive/old/issue/476-safe-area-lab
kayg:archive/445-top-light-2
kayg:archive/old/issue/445-top-light
kayg:issue/471-blocks-mockup
kayg:archive/old/issue/448-links-app-2
kayg:archive/old/issue/448-links-app
kayg:archive/old/issue/398-cold-links
kayg:issue/434-442-small-2
kayg:issue/434-442-small
kayg:archive/old/issue/398-unload
kayg:archive/old/issue/445-bottom-band
kayg:issue/445-bottom-band
kayg:issue/351-rem-3
kayg:archive/312-views-mockup
kayg:issue/351-rem-2
kayg:issue/351-rem
kayg:archive/old/issue/327-first-note
kayg:issue/395-width-phone
kayg:archive/old/issue/327-typing
kayg:issue/396-ios-edges
kayg:issue/397-ios-swipe
kayg:archive/398-allocator
kayg:archive/old/issue/327-notes-index
kayg:issue/345-347-contrast-empty-2
kayg:archive/old/issue/44-arenas
kayg:issue/44-arenas
kayg:archive/integ325
kayg:archive/old/issue/327-perf-harness
kayg:archive/old/issue/44-thp
kayg:issue/44-thp
kayg:archive/old/issue/285-sticky-pills
kayg:archive/old/issue/44-trim-3
kayg:issue/44-trim-3
kayg:archive/old/issue/165-cards
kayg:archive/old/issue/165-picker-2
kayg:archive/old/issue/212-multi-select
No reviewers
Labels
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set
Reference
kayg/calternal!856
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/playwright-train-flakes"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Make browser fixtures wait for the state they exercise: search typo readiness, the phone account-section landing, save receipts, link-card geometry and preference replies. The refusal integration loads its module graph before measurement; list-fit records the first qualifying browser scroll under its existing deadline.
Current validation and investigation. The historical renamed-link failure remains unattributed; its test and product code are unchanged. Earlier qualification.
BM9 search-corpus repair plan, before source push.
Every cumulative train merge from #779 through #856 passed the isolated spec (1492 queries / 0 misses each), so the requested cold-run sequence does not identify a first bad product merge. Full results: #869 (comment).
The setup contract in this PR's
apps/web/e2e/search-corpus.spec.ts:74-76is incomplete: first/last exact results do not establish typo-vocabulary readiness.crates/search/src/index.rs:229-275deliberately caches expensive vocabularies, serves the prior vocabulary while stale, and delays another background build until its five-second refresh interval.QueryOutput.indexingonly tracks the document indexer (crates/search/src/lib.rs:208), not this vocabulary. Those production paths are unchanged by BM9.A temporary probe retained outside the repository seeds 6000 background notes / 300000 generated terms, warms a typo on that older vocabulary, then executes the unchanged corpus assertions. It failed with 48/1492 misses (limit 2%). The first
mrmaladeresponse was{"hits":[],"indexing":false,"matched":0,...}despite the exact endpoint readiness checks succeeding. This demonstrates the same missing-typo failure mechanism; it does not prove the historical train's exact cache state or reproduce its exact 1106 count.Repair here: wait for each corpus note's exact hit, then for
mrmaladeto find this run's marmalade note before starting the measured/asserted query loop. Keep all 1492 rank/typo assertions and the 2% limit. Use signal polling, no sleeps or retry setting changes. Enable both desktop gate projects (WebKit currently skips these tests). Retain the existing corpus test as the regression gate and rerun the warmed-vocabulary probe red/green, then 3 independent invocations per requested project on the full BM9 scratch merge. No production search algorithm change, no train branch change. Historical first-bad source attribution remains unproven; #856 owns the setup repair.BM9 source repairs and final targeted gates.
76f11dc4ba06468a2a0ed4d4592cea6038206696crates/notes/src/room/edit.rs:43; authorization behavior/order unchangedb89e39bb313bb06b92da274124c6bbde30e2250aConfirmed setup fault and attribution limit. The readiness checks at
apps/web/e2e/search-corpus.spec.ts:74-76in parent85845e3dchecked only the first/last exact words.crates/search/src/index.rs:229-275serves an older expensive typo vocabulary until its five-second background refresh is eligible/completed. Document indexing and vocabulary refresh are separate;crates/search/src/lib.rsreports only document indexing inQueryOutput.indexing. Therefore exact hits, even withindexing:false, do not establish that newly seeded words can be corrected. The repair is at currentsearch-corpus.spec.ts:71-77: establish each exact corpus hit, then pollmrmaladeuntil it finds this run's marmalade note. No fixed wait, longer timeout, weakened rank limit, removed query, or production search change.All 14 cumulative merges passed cold (1492 queries / 0 misses each). Thus there is no demonstrated first-bad merge from the requested isolated sequence, and this investigation cannot honestly attribute the historical 1106 misses to a particular new product commit. #856 owns the incomplete corpus setup and its repair. The full-train observation remains real; it has not been dismissed as a flake. Complete cumulative sequence and commands.
Red/green reproduction. A throwaway probe outside the repository writes 6000 background notes, each with 50 unique generated alphabetic terms, after the native test server starts. It waits for
warmvocabularyand typowarmvocabulryto find a separate warm-up note, then executes the corpus setup and unchanged 1492-query assertions. Before the repair: 48/1492 misses, one corpus test failed and the ranking test passed. Its first typo response was:After the repair, the same probe: 0/1492 misses, 2 tests passed. The first typo response corrected
mrmaladetomarmaladeand returned the current run's note. This proves the readiness gap and fixes that reproduced failure mechanism; it does not recreate the historical train's exact cache state/count. The existing full corpus/ranking tests and all 1492 assertions remain. The new typo-readiness assertion also fails if the vocabulary never catches up.Full BM9 scratch qualification. On dev-01, scratch
73abdbce9821f30e903668f8fe7781028410a1ecis original train head383eb8f8plus clean --no-ff merges of the two source repairs. Verified source merge parents are the full heads above. No train branch was changed or pushed.Totals for the six executed final spec invocations: 12 passed, 0 failed, 0 skipped; 8952 corpus queries, 0 misses. One additional WebKit invocation (run 1) failed before any test ran because native config selected an already-used port (
http://127.0.0.1:13393/). That startup error is retained; an additional independent invocation supplied the third executed WebKit run. The original six-invocation wrapper retains exit 1 for that startup failure; the additional run exits 0. No attempted failing browser case was retried or hidden.Exact commands, all builds/tests on dev-01 via Nix and
~/bin/slot, with CI=1, CARGO_PROFILE_DEV_DEBUG=0, CARGO_PROFILE_TEST_DEBUG=0, CARGO_INCREMENTAL=0:Each final test invocation uses a fresh TMPDIR and native server/data setup. WebKit's prior unconditional skip in this spec was removed for the requested 1440px gate. No wall-clock performance assertion was added. Full workspace tests/full browser suite were not rerun; BM9's existing results cover those unrelated gates. All own jobs finished. Own target, dist, dependency directory, large probe Homes and traces were removed from the VM; only small logs/scripts remain outside the repository. No settings, merges, or deployment.
Open risk: historical first-bad product attribution is unresolved despite exhaustive cold cumulative runs. Treat this as a verified corpus readiness repair with green targeted qualification, not proof that the original full train is now green without a new train run.
BM11 sign-out waiting repair plan. The matched matrix reproduced the original review4 typing timeout twice under one ordinary release build. A read-only pointer probe now reproduces the same mechanism on origin/dev: pointerdown targets Sign out; the existing account-section landing runs; pointerup and click target DIV instead. The button never activates. Settings.svelte schedules this scroll after the section is rendered; that code is identical on dev and train. The current accountReady helper only waits for heading/passkey content.
Repair in this PR: activate the settings tab and wait until the phone Account heading reaches its actual scroll-margin landing position before clicking Sign out. Retain the passkey readiness check. No fixed sleep, longer timeout, weakened logout/editing assertion, or production change. The existing original sign-out cases are the red/green regression gates. A separate pointer probe checks cancellation too. Qualification: 15 fresh zero-retry executions of each requested case on the original train product with the repaired tests, plus a green pointer probe; preserve every earlier failure and both probe startup errors in the BM11 report. Editor has not reproduced in its matched matrix; its historical cause is not established.
BM11 sign-out repair pushed: commit/head
26548949efef7e6e4109ccc8e158f21a12f2b026(fix/playwright-train-flakes).The shared accountReady helper now foregrounds settings and waits for the phone Account heading to reach its actual section landing before Sign out receives a pointer click. It retains passkey readiness and all existing product assertions, without a fixed sleep or timeout increase.
Baseline pointer probes confirmed both pre-existing flakes: typing 13 passed / 2 lost clicks; cancellation 14 passed / 1 lost click. Both failures show pointer-down on Sign out, section scroll, pointer-up/click on DIV. The original train typing timeout reproduced twice before repair.
Final original-train product qualification with this exact fixture: typing 15/15, cancellation 15/15, editor 15/15; pointer probe 3/3, zero retries. git diff --check and the train no-evidence gate passed. Editor's historical failure remains unattributed after 37 train + 22 dev passes; no editor patch is included.
Full per-case verdicts, matched/replacement counts, exact commands, binary provenance, complete failed-attempt accounting and sanitized attachment: #883 (comment). All owned jobs finished and large VM outputs were cleaned. No current-head CI status or review was published when checked.
Flake-wall investigation started from #856 head
26548949, owned control worktreeflake-wall. The requested similarly named fix/parallel-test-flakes is a separate branch; repairs will target this PR's actual fix/playwright-train-flakes branch.Plan: reserve idle dev-01 using the new train gate, build independent BM12 (
1e776f9e) and origin/dev (55f35fcd) products, then run 15 attempts per product idle and 15 per product with one ordinary slot build as load, identical train test definitions. Record all failures and timing samples; bisect only if a product difference is established. Separately reproduce refusal navigation and renamed-link failures before changing their readiness contract, then 15 clean listed-project attempts per repaired case. No retries, larger limits, other-job termination, train edits, merges, or repo evidence. Slot behavior will be checked with live/stale locks, train bypass, and an already-running job on both VMs; the control common brief gets the short Trains rule.Train gate installed and verified on both build VMs.
Paths:
claude@calternal-dev-01-compute02:~/bin/slotandcua@calternal-dev-02-std:~/bin/slot; original scripts retained at~/bin/slot.pre-flake-wall. Control-hostcodecommon brief/home/kayg/Developer/Worktrees/BRIEF-COMMON.mdnow has the short Trains rule, ready for kayg to copy to minipc.Lock contract: write
<train-name> <owner-pid>\nto~/.train.lock, keep that owner alive, remove its lock in an EXIT trap, and run train jobs withSLOT_TRAIN=1. A gone PID makes the lock stale. New ordinary slot calls check the gate before searching and again after acquiring a slot. Existing jobs are unaffected. No job was killed. For the matched experiment, the reservation owner additionally waited for every existing slot lock to drain before preparation.Fresh behavior verification after the final script update: 6/6 checks passed on each VM, in a temporary HOME with the actual installed script: live lock blocks a new ordinary job;
SLOT_TRAIN=1bypasses it; an ordinary job already running finishes while the lock remains; removing the lock releases the waiting job; a nonexistent PID does not block; a live lock without a trailing newline still blocks. The unterminated-file check failed against the first candidate (ordinary job incorrectly started), then passed after the parser correction.bash -npassed on each installed candidate. Test scratch directories were removed.Installed script (evidence kept here, not in the repo):
Matched list-fit matrix complete, original 1500 ms Chromium assertion retained, zero retries. Independent BM12 product
1e776f9eand origin/dev55f35fcd, built separately on dev-01; same targeted test definition plus read-only scroll-event diagnostics. The measurement is captured before diagnostic output to avoid charging that output to the assertion. The train reservation drained all existing slot jobs before setup.The one controlled load was
SLOT_TRAIN=1 CARGO_TARGET_DIR=$HOME/flake-wall/load/target ~/bin/slot nix develop -c bash -c "cargo build --release --workspace --locked -j4", an ordinary workspace build in a separate target directory. SLOT_TRAIN only admitted that requested load through our own reservation; no other ordinary job entered. It ran from 07:01:39 to 07:07:20 IST and overlapped every loaded sample. Both loaded invocations were serial; no second browser test job ran during this matrix. The load build passed.Exact test command (apps/web, per product and condition):
CALTERNAL_BIN=<worktree>/target/debug/calternal E2E_DIST=<worktree>/apps/web/dist ~/bin/slot nix develop <worktree> -c bash -c 'bunx playwright test list-fit.spec.ts:67 --project=chromium-1440 --no-deps --workers=1 --retries=0 --repeat-each=15 --reporter=line,json --output=<outside-repo-results>', with CI=1, SLOT_TRAIN=1 and independent TMPDIRs. No skipped or retried cases.Verdict so far: no demonstrated train-specific slowdown, and the historical 1654 ms failure did not reproduce under the requested single-build load. This does not establish that load alone caused BM12, and there is no justified first-bad PR to bisect from these results. Browser events consistently precede Playwright observation; a controlled below-budget-response probe is investigating that separate measurement weakness. Linux frame figures are functional diagnostics, not GPU qualification.
Flake-wall report: two source repairs pushed; the historical renamed-link failure remains unresolved. This is not a green replacement train and no merge is authorized.
PR #856, branch
fix/playwright-train-flakes, final source headcf14dc43c1b2cd7ffdd61cb188346e26b2a40f65. The owned control worktree is/home/kayg/Developer/Worktrees/flake-wall. The similarly namedfix/parallel-test-flakesbranch is a separate PR's work and was untouched.63faf32c81e637ea6f8d9e541e69c27cd59eefc6cf14dc43c1b2cd7ffdd61cb188346e26b2a40f651. chromium-1440 list-fit: no demonstrated train-specific slowdown; a measurement fault was reproduced and repaired.
Independent products were built from BM12
1e776f9e810c46c91bc752a117ed4f43ebd3938fand origin/dev55f35fcde3bc91ca3781055577b93e93819f6cd4, with separate binaries and production distributions. The original test definition was identical on both products. A read-only browser scroll listener captured the event timestamp; the original elapsed sample was captured before diagnostic output. All existing slots drained before the quiet matrix, and the train reservation excluded new unrelated jobs.The single controlled load was an ordinary
cargo build --release --workspace --locked -j4in one slot, with its own target directory. It passed and overlapped every loaded sample, from 07:01:39 to 07:07:20 IST. There was no second browser job during the matched matrix. Matrix checkpoint and browser-event statistics.The historical 1654 ms observation did not reproduce in these 60 attempts. These samples do not establish that BM12 is slower or that load alone caused its failure. No first-bad PR is justified, so no speculative bisect or product repair was made.
A separate controlled probe suppresses the wheel's default action and schedules a real scroll at 1300 ms. Against the original polling test, the final diagnostic-safe baseline failed 3/3 even though the actual scroll events occurred at 1305, 1289 and 1295 ms. It captures the original elapsed sample before any diagnostic await, and collects event evidence after a failed assertion without changing its result. This demonstrates that the polling schedule can miss a valid response within the unchanged budget; it does not claim to reconstruct BM12's exact host scheduling.
The repair arms a browser-local promise before sending input, resolves it on the first scroll beyond the existing 100 px threshold, and checks its browser-recorded elapsed time. A timer enforces the same existing deadline when no qualifying event arrives. Controller scheduling and polling delays cannot inflate an already recorded response. App work or a main-thread stall during the armed interval still delays the event and fails the same budget; no CPU time is subtracted. Trains also exclude unrelated new slot jobs through the VM gate below.
Final qualification: 15/15 clean original chromium-1440 attempts, 3/3 controlled below-budget responses, and 1/1 WebKit-390 shared-path check. A 1700 ms response was rejected 3/3, preserving a useful negative control. Chromium's 1500 ms deadline, WebKit's 6000 ms deadline, the >100 px requirement and all existing frame-gap assertions remain unchanged. No settling sleep was added.
2. chromium-1440 refusal-performance: navigation/setup race repaired.
Before repair, 15/15 ordinary cold-cache attempts passed. To reproduce the actual failing mechanism, an outside-repo Vite probe sends one real
full-reloadwhile the first refusal module is being transformed. Before repair: 3/3 failed with the exactpage.evaluate: Execution context was destroyed, most likely because of a navigationerror, before timing assertions. The logs contain the Vite reload message and document navigation. This is a controlled reproduction of the race, not proof of what triggered BM12's particular reload.performance.htmlnow statically imports the measured module and exposes its exports only once that graph is loaded. The test waits for the requested exported function in the current document before starting its long evaluation. Navigation uses the commit signal so this readiness wait can survive a setup reload. There is no network-idle heuristic, sleep, evaluation retry, longer test timeout or change to the 16 ms assertions.With the exact same injected reload: 3/3 passed. Then 15/15 clean fresh-cache listed-project attempts passed. Those independent runs use an outside-repo config that imports the native config, retains the native chromium-1440 project/options and source test, and omits unrelated app servers; the integration's own real Vite server still runs. A subsequent native-config full refusal spec passed 2/2, covering both refusedPaste and offlineBacklog. The four relevant source files were SHA256-compared between the tested BM12 overlay and the final pushed source head, including the unchanged missing-links spec; all matched.
3. webkit-390 renamed-link: still unresolved; no speculative readiness or product patch.
The original target passed 15/15 alongside the ordinary build, 15/15 quiet, 3/3 in three complete missing-links sequences, and 15/15 final clean original-case attempts: 48/48 target passes. The complete-spec sequence was 54/54 total, including those three target passes.
The first 33 target attempts captured mouse-down/up targets and the live editor text. In all observed attempts the press and release used the fresh renamed href, and the page reached the intended note. They do not demonstrate a click before the new target was ready. BM12's original source-note URL failure remains real and unattributed. Neither the test nor product was changed for this case. A failing trace with pointer and readiness evidence is still needed before selecting a cause or culprit PR.
VM train gate and control brief.
Installed paths:
claude@calternal-dev-01-compute02:~/bin/slotcua@calternal-dev-02-std:~/bin/slotEach original script remains at
~/bin/slot.pre-flake-wall. New non-train jobs check~/.train.lockbefore finding a slot and again after acquiring one. The file contains<train-name> <owner-pid>; a gone PID is stale, including when a writer omits the trailing newline.SLOT_TRAIN=1admits train work. Existing jobs finish normally. No other job was killed.Final behavioral verification: 6/6 checks on each VM: live lock blocks a new ordinary job; train bypass works; an already-running ordinary job finishes; removing the lock releases a waiter; a stale PID does not block; an unterminated live lock still blocks. The last case failed against the initial parser and passed after correction. Shell syntax checks passed. Installed script and behavior evidence.
On control host
code,/home/kayg/Developer/Worktrees/BRIEF-COMMON.mdnow has the short Trains rule, including waiting for existing jobs before quiet gates. kayg: re-copy that file to minipc.Commands and gate accounting.
Builds were VM-only through
~/bin/slot, under the pinned Nix shell. Each independent product ranbun install --frozen-lockfile && cargo build --locked -j4 && cd apps/web && bun run build. Only the baseline needed the #779 flake tooling overlay; none of it was committed. Matrix/final tests used CI=1, workers=1, retries=0 and separate disk-backed TMPDIRs. Binaries, heads and complete commands are in the attachment.The common native invocation, executed from the corresponding apps/web directory, was:
For final gates
$work=/home/claude/Developer/Worktrees/flake-wall-trainand$out=/home/claude/flake-wall/<label>-train:Cold-cache refusal invocations and controlled probes have their exact outside-repo configs, scripts and commands attached.
git diff --check,node ci/check-case-paths.mjsandnode ci/check-no-evidence.mjspassed on the repaired train overlay; source worktree diff check passed and the pushed tree is clean. No full train rerun, merge, repository-setting change or new performance qualification is claimed. Linux frame checks are functional diagnostics; no Mac/GPU performance result is claimed. No assertion, limit, retry setting or timeout was loosened.Complete attempt ledger: 228 actual attempts, 216 passes, 12 controlled-probe failures, zero nonzero retries and zero skips. Natural product gates were 207/207; the remaining 21 attempts were controlled probes.
There were also 20 zero-case setup failures, excluded from executed-case counts but preserved: 17 empty selections (two stale line selectors after instrumentation and 15 over-anchored title selectors), one external-config web-server cwd error, and two external-probe dependency-resolution errors. The external dependency link and server cwd were corrected;
--listthen selected one intended test for each probe. No attempted failing browser case was hidden or changed into a pass by retries.Evidence attachment: flake-wall-artifacts.tar.gz, 88,860 bytes, SHA256
a0370d927fd24de34af8502120f17cade41c5345baedd4f09d29b13d8efcbf8c. It contains all result JSON and raw text logs, failure accounting, exact probe/config scripts, build provenance and the final installed slot script. No repository artifacts were added. The diagnostic-contaminated preliminary probe is expressly retained rather than used as evidence for the repair.All owned jobs finished before handback: both owned dev-01 units inactive, reservation removed, owned VM worktrees, targets, dependencies, seeded Homes, traces and temporary reports removed after attachment upload. Free root space afterward: dev-01 295 GiB, dev-02 325 GiB. Installed slot scripts and their small backups remain. No other worktree or job was touched. Forgejo had no commit statuses or reviews published for the final head when checked.
Remaining: the historical renamed-link failure is not fixed or attributed; the exact historical 1654 ms cause and BM12 reload trigger are not established. The two independently demonstrated test faults and train admission tooling are repaired, with the requested clean targeted counts. A new train is required to qualify the aggregate; this report does not relabel BM12 green.
Earlier PR description, preserved before updating the description for the final source scope. These are historical qualification results, not the new head's results. Current report: #856 (comment)
Four Playwright flakes that failed train BM6 (causes at #834 issuecomment-74246). No retries, no longer timeouts: each wait is on a real signal.
search-corpus(chromium-1440)corpus-*note first (and its own at the end), waits until the engine has let them go; assertions unchanged--repeat-each=20dev-01: 40 passed. Shared server: trash-search + list-search + corpus--repeat-each=10in one run: 40 passedmissing-links(chromium-390)getAnimations({subtree}).finished) before measuring; tolerance unchanged--repeat-each=20: 360 passedreview4-signout(webkit-1440)writeTwoNoteswaits until the server holds the typed edit--repeat-each=20, 20 skipped by design)backdrop-page(look-webkit-1440)prefs.setreply (waitForResponse) before reading it back--repeat-each=20)Extra flakes found while repeating the signout spec, fixed the same way: the fixture's 30 s server and proxy start waits now wait for the health reply (fail at once if the process exited), and the logout reply wait accepts the server saying the old session is gone when the reloaded page cannot report it.
Decisions: an attempt to wait on a receipt in the refusal-recovery step was dropped (the receipt tag does not fire on rejoin); that step keeps its existing 20 s wait. Commands:
bunx playwright test e2e/<spec> --project=<p> --no-deps --workers=1 --repeat-each=20via~/bin/slot, binary built at the PR head's parent dev (55f35fcd); head85845e3d. missing-links, search-corpus and backdrop-page were run ate8198af0(those files are unchanged since).🤖 Generated with Claude Code
e2e: wait on real signals in four train flakesto test: stabilize Playwright readiness and scroll observationkayg referenced this pull request2026-11-03 02:09:05 +00:00
Closing: head
cf14dc43is already in dev (reached via82549a24); nothing left to merge. Branch kept.Pull request closed