vercel-labs/agent-browser · error

renders recording not active - run `react renders start` fir

Error message

renders recording not active - run `react renders start` first

What it means

RENDERS_STOP reads window.__AB_RENDERS_ACTIVE__, which only 'react renders start' sets on that document (and which stop itself deletes). The error means no recording is live: either start was never called, or the page navigated/reloaded since start and the window globals were wiped.

Source

Thrown at cli/src/native/react/scripts.rs:390

            const ch = getChanges(fiber);
            for (const c of ch) {
              if (data[name].changes.length < 50) data[name].changes.push(c);
            }
          }
        }
      }
    }
    walkFiber(fiber.child);
    walkFiber(fiber.sibling);
  }
})()
"#;

/// Stop script for fiber profiler. Returns the collected profile as JSON.
pub const RENDERS_STOP: &str = r#"
(() => {
  const active = window.__AB_RENDERS_ACTIVE__;
  if (!active) throw new Error("renders recording not active - run `react renders start` first");

  const data = window.__AB_RENDERS__;
  const startTime = window.__AB_RENDERS_START__;
  const elapsed = performance.now() - startTime;

  const fpsData = window.__AB_RENDERS_FPS__;
  let fpsStats = { avg: 0, min: 0, max: 0, drops: 0 };
  if (fpsData) {
    cancelAnimationFrame(fpsData.rafId);
    if (fpsData.frames.length > 0) {
      const fpsSamples = fpsData.frames.map((dt) => (dt > 0 ? 1000 / dt : 0));
      const sum = fpsSamples.reduce((a, b) => a + b, 0);
      fpsStats = {
        avg: Math.round(sum / fpsSamples.length),
        min: Math.round(Math.min(...fpsSamples)),
        max: Math.round(Math.max(...fpsSamples)),
        drops: fpsSamples.filter((f) => f < 30).length,
      };

View on GitHub (pinned to 548b159b30)

Solutions

  1. Run 'agent-browser react renders start' first, exercise the page, then 'react renders stop'
  2. If the page reloaded mid-recording, re-run start on the new document and reproduce the interaction again
  3. Guard double-stop flows by checking the flag (see validation) or tracking state in your own code

Example fix

# before
agent-browser react renders stop   # not active

# after
agent-browser react renders start
# ... interact with the page ...
agent-browser react renders stop
Defensive patterns

Strategy: validation

Validate before calling

agent-browser eval "window.__AB_RENDERS_ACTIVE__ === true"
# run before 'react renders stop'

Type guard

function rendersActive(win: Window): boolean {
  return (win as any).__AB_RENDERS_ACTIVE__ === true;
}

Prevention

When it happens

Trigger: Running 'react renders stop' before any 'react renders start'; navigating (or the app triggering a full reload) between start and stop; calling stop twice — the second call fails because the first already deleted the flag.

Common situations: Agent workflows that assume recording persists across navigation; SPA full-page redirects; retrying a stop after a timeout when the first stop actually succeeded.

Related errors


AI-assisted analysis of vercel-labs/agent-browser@548b159b30 (2026-08-16). Data as JSON: /api/errors/e606e62b8d073716. Report an issue: GitHub.