ci: widen drift-trio convergence windows for starved CI boxes

drift-trio-scenarios S4/S5 flaked 4× across this week's CI runs (three wasm
instances + full-suite load on the runner) while passing 77/78 locally under
stress — and the one local miss carried zero guard beacons, i.e. the same
under-load convergence shortfall, not a code path. Same treatment as the
follow spec: condition-based polls keep their shape, windows grow to what a
starved box actually needs (inline S4/S5 polls 20s→60s, waitAllContain
30s→90s, settleConverged 30s→90s). Local convergence stays ~1s.

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 20:50:14 +02:00
commit 653819d383
No known key found for this signature in database
GPG key ID: 8E75F2CDE64E5322
2 changed files with 4 additions and 4 deletions

View file

@ -53,7 +53,7 @@ function skipFirefox(): void {
} }
/** Poll until every tab's silent save contains `marker`. */ /** Poll until every tab's silent save contains `marker`. */
async function waitAllContain(set: TabSet, cfg: ToolCfg, marker: string, timeout = 30000): Promise<void> { async function waitAllContain(set: TabSet, cfg: ToolCfg, marker: string, timeout = 90000): Promise<void> {
for (const [label, page] of set.tabs) { for (const [label, page] of set.tabs) {
await expect await expect
.poll(async () => (await modelText(page, cfg)).includes(marker), { .poll(async () => (await modelText(page, cfg)).includes(marker), {
@ -219,7 +219,7 @@ for (const ops of [SCH_OPS, PCB_OPS]) {
for (const [tabLabel, p] of trio.tabs) { for (const [tabLabel, p] of trio.tabs) {
await expect await expect
.poll(async () => /s4-from-[AB]/.test(await modelText(p, cfg)), { .poll(async () => /s4-from-[AB]/.test(await modelText(p, cfg)), {
timeout: 20000, timeout: 60000,
intervals: [400], intervals: [400],
message: `${tabLabel} must receive one of the racing values`, message: `${tabLabel} must receive one of the racing values`,
}) })
@ -273,7 +273,7 @@ for (const ops of [SCH_OPS, PCB_OPS]) {
for (const [tabLabel, p] of trio.tabs) { for (const [tabLabel, p] of trio.tabs) {
await expect await expect
.poll(async () => (await modelText(p, cfg)).includes("s5-tmp"), { .poll(async () => (await modelText(p, cfg)).includes("s5-tmp"), {
timeout: 20000, timeout: 60000,
intervals: [400], intervals: [400],
message: `${tabLabel} must lose the undone value`, message: `${tabLabel} must lose the undone value`,
}) })

View file

@ -419,7 +419,7 @@ function firstDiff(a: string, b: string): string {
* Poll until every tab's silent save is byte-identical. The convergence gate * Poll until every tab's silent save is byte-identical. The convergence gate
* between scenario steps bounded poll, no blind sleeps (tests/TESTING.md). * between scenario steps bounded poll, no blind sleeps (tests/TESTING.md).
*/ */
export async function settleConverged(trio: TabSet, cfg: ToolCfg, timeout = 30000): Promise<void> { export async function settleConverged(trio: TabSet, cfg: ToolCfg, timeout = 90000): Promise<void> {
await expect await expect
.poll( .poll(
async () => { async () => {