ci: follow spec — 90s convergence windows (awareness re-broadcast covers lost first delivery)

4 flakes in 6 CI runs on 2026-08-01, all with clean traces: no guard beacons,
A demonstrably landed (the 208cb67 sequencing gate passed), B just never got
the one-shot rect applied within 30s while two wasm instances starved the CI
box. Awareness re-broadcasts state periodically, so a 90s condition-poll
converges on re-delivery; local runs stay fast (converge in <2s).

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 11:03:25 +02:00
commit f488744797
No known key found for this signature in database
GPG key ID: 8E75F2CDE64E5322

View file

@ -91,9 +91,14 @@ test('B follows A: viewport mirrors, then local input breaks the follow', async
await expect(b.getByTestId('follow-banner')).toBeVisible({ timeout: 10000 });
// B's viewport converges on A's rect (publish 100 ms + awareness relay).
// 90s, not 30s: on a starved CI box the first delivery can be lost while
// both wasm instances hog the loop; awareness re-broadcasts state
// periodically, so a longer condition-poll converges where a short one
// recorded 4 flakes in 6 runs (2026-08-01) — all with clean traces (no
// guard beacons, A demonstrably on target).
await expect
.poll(async () => near(await viewport(b), T1.cx, T1.cy, T1.hw * 0.02), {
timeout: 30000,
timeout: 90000,
message: 'B never converged on the followed viewport',
})
.toBe(true);
@ -113,7 +118,7 @@ test('B follows A: viewport mirrors, then local input breaks the follow', async
.toBe(true);
await expect
.poll(async () => near(await viewport(b), T2.cx, T2.cy, T2.hw * 0.02), {
timeout: 30000,
timeout: 90000, // see the T1 convergence comment (awareness re-broadcast)
message: 'B never tracked the second viewport move',
})
.toBe(true);