From 208cb679598d5cfb6cc4a80d8c94aa22b6a15449 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerg=C5=91=20T=C3=B6rcsv=C3=A1ri?= Date: Sat, 1 Aug 2026 09:19:59 +0200 Subject: [PATCH] =?UTF-8?q?ci:=20de-flake=20follow=20spec=20=E2=80=94=20se?= =?UTF-8?q?quence=20on=20A=20landing=20before=20asserting=20B=20tracks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit "B never tracked the second viewport move" ate three v0.1.21 release attempts (2026-08-01) while the same build passed 10/10 locally, including under 4-worker contention. The T2 block asserted B's convergence without first confirming A's second fit LANDED — the T1 block has that sequencing point, T2 didn't — so on a starved CI box any A-side fit delay was misreported as a B-side tracking failure, and B's 30s window burned while A was still moving. Mirror the T1 pattern: poll A onto its target, then start B's clock. Verified 4/4 green locally (web-chromium, 2 workers). Reminder that cost 20 minutes tonight: web/standalone/.env poisons local web e2e (untitled/title mismatches) — stash it before local runs (standalone-env-e2e-poison). Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_019SE4o46Lnq3hF574FFq8x4 --- tests/web/follow.spec.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/tests/web/follow.spec.ts b/tests/web/follow.spec.ts index 1a45aa6..d20bfdb 100644 --- a/tests/web/follow.spec.ts +++ b/tests/web/follow.spec.ts @@ -98,9 +98,19 @@ test('B follows A: viewport mirrors, then local input breaks the follow', async }) .toBe(true); - // A moves again → B tracks. + // A moves again → B tracks. Sequence on A actually LANDING first (same + // pattern as T1): without it, any A-side fit delay on a starved CI box gets + // misreported as "B never tracked" — the exact flake that ate three release + // runs on 2026-08-01 (green 10/10 locally on the same build). B's window + // starts only once A's rect demonstrably went out. const T2 = { cx: 180e6, cy: 120e6, hw: 25e6, hh: 20e6 }; await fit(a, T2.cx, T2.cy, T2.hw, T2.hh); + await expect + .poll(async () => near(await viewport(a), T2.cx, T2.cy, 1e6), { + timeout: 20000, + message: 'A never landed on its second fit target', + }) + .toBe(true); await expect .poll(async () => near(await viewport(b), T2.cx, T2.cy, T2.hw * 0.02), { timeout: 30000,