chenglou/pretext · error · Error

Firefox is not currently supported for symbol oracle checks

Error message

Firefox is not currently supported for symbol oracle checks

What it means

runBrowser maps 'firefox' to reportBrowser=null and session=null, then immediately throws before opening a page server. This is a deliberate, documented gap: the symbol-oracle /probe?batch=symbol-runs automation path is not implemented for Firefox. Because parseBrowsers (error 85) accepts the token, the failure surfaces here at run start, after the browser automation lock has already been acquired (and is released in the finally).

Source

Thrown at scripts/symbol-check.ts:129

    report.predictedHeight === report.actualHeight &&
    report.firstBreakMismatch === null
  )
}

function caseRunsInBrowser(testCase: ProbeOracleCase, browser: AutomationBrowserKind): boolean {
  return testCase.browsers === undefined || testCase.browsers.includes(browser)
}

async function runBrowser(browser: AutomationBrowserKind, port: number): Promise<boolean> {
  const lock = await acquireBrowserAutomationLock(browser)
  const reportBrowser: BrowserKind | null = browser === 'firefox' ? null : browser
  const session = reportBrowser === null ? null : createBrowserSession(reportBrowser)
  let serverProcess: ChildProcess | null = null
  let ok = true

  try {
    if (session === null || reportBrowser === null) {
      throw new Error('Firefox is not currently supported for symbol oracle checks')
    }

    const pageServer = await ensurePageServer(port, '/probe', process.cwd())
    serverProcess = pageServer.process
    const requestId = `${browser}-${Date.now()}-${Math.random().toString(36).slice(2)}`
    const reportServer = await startPostedReportServer<ProbeBatchReport>(requestId)

    try {
      const url =
        `${pageServer.baseUrl}/probe?batch=symbol-runs` +
        `&requestId=${encodeURIComponent(requestId)}` +
        `&reportEndpoint=${encodeURIComponent(reportServer.endpoint)}`
      const batchReport = await loadPostedReport(
        session,
        url,
        () => reportServer.waitForReport(null),
        requestId,
        reportBrowser,

View on GitHub (pinned to ac49b09b7d)

Solutions

  1. Drop firefox from the --browser= list for symbol-check: use the default chrome,safari.
  2. If Firefox symbol coverage is genuinely required, implement the Firefox path (wire reportBrowser/session for firefox in runBrowser); it is a TODO, not a config toggle.
  3. Keep pre-wrap-check and symbol-check browser lists separate in CI.

Example fix

# before
bun run scripts/symbol-check.ts --browser=chrome,safari,firefox

# after
bun run scripts/symbol-check.ts --browser=chrome,safari
Defensive patterns

Strategy: validation

Validate before calling

// Filter firefox out before launching symbol-check, since the run path is unimplemented.
const requested = (parseStringFlag('browser') ?? 'chrome,safari')
  .split(',').map(s => s.trim().toLowerCase()).filter(Boolean) as AutomationBrowserKind[]
const runnable = requested.filter(b => b !== 'firefox')
if (runnable.length < requested.length) {
  console.error('symbol-check: firefox is not supported; running', runnable)
}
if (runnable.length === 0) process.exit(2)

Type guard

const symbolSupported = (b: AutomationBrowserKind): b is 'chrome' | 'safari' => b !== 'firefox'

Prevention

When it happens

Trigger: --browser=firefox or --browser=chrome,firefox with symbol-check. The firefox lock is acquired (line 121) and released in the finally; no measurement runs.

Common situations: Reusing a --browser=chrome,firefox,safari matrix that works for pre-wrap-check; CI config copied across checkers without per-checker filtering.

Related errors


AI-assisted analysis of chenglou/pretext@ac49b09b7d (2026-08-12). Data as JSON: /api/errors/6e3659c617b2b3e5. Report an issue: GitHub.