#12375·oh-my-pi

eval: `wait(handles, { timeout })` above ~35 min aborts the cell instantly and orphans the agents

Author: victorzhukCreated Sep 17, 2026Updated Sep 17, 2026

omp v18.2.4 (bun global install), Linux.

What happens

An eval (js) cell that spawns agents and waits on them with a timeout larger than 2,147,483 ms returns Command aborted within ~50 ms. The spawned agents keep running, so the cell's work is neither cancelled nor collected; the handles stay bound in the VM and a later cell can still wait on them, which is how the failure is survivable but silent.

Node prints the cause when it is visible:

(node:282602) TimeoutOverflowWarning: 2400000000 does not fit into a 32-bit signed integer.
Timeout duration was set to 1.

2400000000 is the passed timeout of 2400000 multiplied by 1000, so the value is scaled to milliseconds a second time before reaching setTimeout. Past 2^31-1 ms the timer fires immediately (1 ms) and the wait is reported to the caller as an abort.

Reproduction

omp -p --no-session --cwd /var/tmp/repro 'Run exactly one eval cell, js, timeout 2500:
const N = ["r1","r2","r3","r4","r5","r6"]
const HS = N.map(n => agent(`Reply with the single word ${n}. No tools.`, { agent: "zresearcher", label: n }))
const R = await wait(HS, { timeout: 2400000, raiseErrors: false })
return R.length'

Result: Command aborted, no cell output, six agents still running.

The same cell with timeout: 1800000 (30 min) completes normally and returns the six results. The boundary is 2,147,483 ms — the largest value that survives the extra ×1000.

Impact

Measured in a real run on 2026-09-17: two dispatch cells (six and four agents) aborted this way. Each left its agents running, and the session spent three turns discovering that hub op:wait does not cover registry peers before recovering the results through the surviving handles. Nothing in the output said the timeout was the problem — the visible failure is an abort with no reason, which reads as a harness or model fault.

Suggested fix

Clamp or reject a wait timeout above the timer maximum instead of scaling it into an instant fire, and distinguish "timed out" from "aborted" in the message. A one-line validation error (timeout must be ≤ 2147483 ms) would have made this self-evident.

Workaround

Keep wait timeouts at or under 30 minutes, and collect long fan-outs in a separate cell from the one that spawns them.