ci: de-flake follow spec — sequence on A landing before asserting B tracks

"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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019SE4o46Lnq3hF574FFq8x4
This commit is contained in:
Gergő Törcsvári 2026-08-01 09:19:59 +02:00
commit 208cb67959
No known key found for this signature in database
GPG key ID: 8E75F2CDE64E5322

View file

@ -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,