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

  1. Read the label in the message to find which renderer action wedged.
  2. Investigate the GPU stall root cause — this timeout is the wedge detector, not the bug.
  3. 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

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

Related errors


AI-assisted analysis of stablyai/orca@1136503c6a (2026-08-12). Data as JSON: /api/errors/1485e132da8a3fbe. Report an issue: GitHub.