Skip to content

fix(tests): #606 #613 #614 #445 #457 #466 flakes wait on their real conditions - #617

Merged
nolnoch merged 4 commits into
masterfrom
fix/flake-hunt-1106
Nov 6, 2026
Merged

nolnoch merged 4 commits into
masterfrom
fix/flake-hunt-1106

Conversation

@nolnoch

@nolnoch nolnoch commented Nov 6, 2026 •

Copy link
Copy Markdown
Owner

Problem

Value

  • A red run means a regression again, and a release stops costing re-runs.

Solution


Per issue (cause, fix, evidence)

Issue Cause Fix Evidence
#606 omp hosted logout Read /grayboard status once; a root whose subscription closed first sits in retrying until its next reopen meets the sign-out (backoff 250·2^n ms, controller.ts:493) until() both roots read signed out + paused omp scenario green
#613 reload drain ~750 autocommitted writes to an on-disk fixture, one synced commit each; 6–12 s on a slow CI disk Fixture PRAGMA synchronous = OFF, the 250 inserts in one transaction With fullfsync on (a slow-disk stand-in): 355 ms → 45 ms
#614 pi_family opened twice Holder quit before its receipt; at-least-once replay to the next holder is correct Wait for the holder's receipted record before quitting 15/15 (was 5/8 failing on master)
#445 binding "7: dead holder" The v1 binary answers initialize before it listens on sock.fe when a SIGKILLed holder left a stale socket until(poke("fe")), the bind's own probe, before binding Measured: not listening at handshake end 2/20 with a stale socket, 0/20 without; 10/10 under 14-spinner load
#457 local stall Bun 1.4.4 drops a child's stdout read in the test process when a request overlaps a push Wait out the pushes in "dm_inbox lists what you owe" (both sides) Repro (wait removed, 14 spinners): Bun 1.4.4 3/40 fail, canary 1.4.4-canary.20261106.1 0/160. #457 stays open to bump the Bun pin when a stable release ships
#466 omp killed child until(() => holder() !== undefined && holder() !== first) reads twice: first then undefined (dead hold released, new one not yet taken) passes, then a third read sees the gap One read per poll; until returns the id it saw (also the #580 scenario) No product gap: every alias_holds delete is id-scoped (dropHold, session_end)
#466 bridge sleeps Fixed Bun.sleep then exact call counts Wait until the outbox is drained: store.done runs only after every Slack/bus call for the row bridge suite green
#466 mcp.test.ts legacy registry Bun.sleep(1100) sized to one tick of the 1 s idle sweep; Bun.sleep(0) before exact stream/watch counts untilHosted on the counts and on the sweep's effect 50/50 reruns
New: mcp.test.ts "a refusal attaching an idle legacy GET…" (found by this PR's own pre-push hook) Waits 1 s for a GET the SDK client reopens after its 1000 ms initialReconnectionDelay 5 s window, as line 835 already uses for the same reopen Whole file under 14-spinner load: 4/10 runs failing → 0/10
#619 opencode-v2 host attachments ENOENT (found by this PR's flake hunt) The fixture model handed the queued tool call to whichever session asked first; the DM to fe woke the receiver, whose turn could take attachment_get Each invoke puts a nonce in its prompt; the call is issued only to the request carrying it Attachments case, direct and CodeMode, 3 local runs each: 6/6; flake-hunt on 9b34efd

… conditions

- #606 omp logout: wait until both roots read paused, not one status read
- #613 reload-state fixture: no per-write fsync, inserts in one transaction
- #614 pi_family twice-opened: wait for the holder's receipt before it quits
- #445 binding 7: wait for the v1 session's socket to answer before binding
- #457 local dm_inbox test: wait out pushes before overlapping requests
- #466 omp holder() read once per poll; bridge sleeps became outbox-drained waits
@nolnoch nolnoch added the ci workflows, hooks, release tooling label Nov 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci workflows, hooks, release tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant