stablyai/orca · error · Error
Timed out during ${label} after ${timeoutMs}ms.
Error message
Timed out during ${label} after ${timeoutMs}ms. What it means
runWithTimeout races an action against timeoutMs and throws 'Timed out during {label} after {timeoutMs}ms.' when the action does not settle. It exists because Playwright protocol calls (page.evaluate, page.keyboard.type, window.api IPC) can remain pending when the Wayland GPU path wedges, so each direct renderer action gets an independent deadline rather than relying on Playwright's own timeout.
Source
Thrown at config/scripts/linux-wayland-validation-watchdog.mjs:20
const formatError = (error) =>
error instanceof Error ? error.stack || error.message : String(error)
function delay(ms) {
return new Promise((resolve) => setTimeout(resolve, ms))
}
export async function runWithTimeout(label, action, timeoutMs) {
const actionPromise = Promise.resolve().then(action)
actionPromise.catch(() => undefined)
// Why: Playwright protocol calls can remain pending when the Wayland GPU
// path wedges, so direct renderer actions need an independent deadline.
const result = await Promise.race([
actionPromise.then((value) => ({ timedOut: false, value })),
delay(timeoutMs).then(() => ({ timedOut: true, value: null }))
])
if (result.timedOut) {
throw new Error(`Timed out during ${label} after ${timeoutMs}ms.`)
}
return result.value
}
export function createPhaseLogger({ startedAt, onPhase }) {
return (phase, details = '') => {
onPhase(phase)
const suffix = details ? ` ${details}` : ''
console.log(`[wayland-gpu] phase=${phase} elapsedMs=${Date.now() - startedAt}${suffix}`)
}
}
export function startValidationWatchdog({ timeoutMs, onTimeout }) {
const timer = setTimeout(() => {
void Promise.resolve()
.then(onTimeout)
.then((exitCode) => {
process.exit(exitCode)View on GitHub (pinned to 1136503c6a)
Solutions
- Read the label in the message to find which renderer action wedged.
- Investigate the GPU stall root cause — this timeout is the wedge detector, not the bug.
- Tune timeoutMs only if an action legitimately needs longer (the defaults are 10s for actions, 30s for setup).
Defensive patterns
Strategy: try-catch
Try / catch
try {
return await runWithTimeout(label, action, timeoutMs)
} catch (err) {
if (/Timed out during/.test(err.message)) log.error(`Renderer action '${label}' wedged — suspected Wayland GPU stall`)
throw err
} Prevention
- Wrap every direct renderer action in runWithTimeout so a wedge cannot hang the whole validation indefinitely.
- Use the label to localize the wedged step and investigate the GPU stall, not the timeout.
When it happens
Trigger: A page.evaluate, page.keyboard.type, or window.api call hangs past its timeoutMs because the renderer/GPU process is wedged.
Common situations: Wayland GPU process stall in CI; renderer frozen so Playwright's CDP round-trips never complete; this is the primary detector the validation watchdog uses to flag the GPU wedge.
Understand the failure class
- Timeouts: ETIMEDOUT, deadlines, and hung requests — what actually expires when a request times out.
Related errors
- Timed out polling renderer diagnostics after ${pollTimeoutMs
- Timed out polling ${label} after ${pollTimeoutMs}ms.
- Timed out waiting for ${label}; last value: ${JSON.stringify
- Base run has --disable-gpu; hardware acceleration is disable
- Expected hardware acceleration to remain enabled, but --disa
AI-assisted analysis of stablyai/orca@1136503c6a (2026-08-12).
Data as JSON: /api/errors/1485e132da8a3fbe.
Report an issue: GitHub.