{"record":{"id":"a86dcc60c95e64e7","repo":"chenglou/pretext","slug":"unsupported-browser-browser-a86dcc","errorCode":null,"errorMessage":"Unsupported browser ${browser}","messagePattern":"Unsupported browser (.+?)","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"scripts/symbol-check.ts","lineNumber":70,"sourceCode":"  const raw = parseStringFlag(name)\n  if (raw === null) return fallback\n  const parsed = Number.parseInt(raw, 10)\n  if (!Number.isFinite(parsed)) throw new Error(`Invalid value for --${name}: ${raw}`)\n  return parsed\n}\n\nfunction parseBrowsers(value: string | null): AutomationBrowserKind[] {\n  const raw = (value ?? 'chrome,safari').trim()\n  if (raw.length === 0) return ['chrome', 'safari']\n\n  const browsers = raw\n    .split(',')\n    .map(part => part.trim().toLowerCase())\n    .filter(Boolean)\n\n  for (const browser of browsers) {\n    if (browser !== 'chrome' && browser !== 'safari' && browser !== 'firefox') {\n      throw new Error(`Unsupported browser ${browser}`)\n    }\n  }\n\n  return browsers as AutomationBrowserKind[]\n}\n\nconst requestedPort = parseNumberFlag('port', 0)\nconst browsers = parseBrowsers(parseStringFlag('browser'))\nconst timeoutMs = parseNumberFlag('timeout', 60_000)\n\nfunction printCaseResult(browser: AutomationBrowserKind, testCase: ProbeOracleCase, report: ProbeReport): void {\n  if (report.status === 'error') {\n    console.log(`${browser} | ${testCase.label}: error: ${report.message ?? 'unknown error'}`)\n    return\n  }\n\n  const sensitivity =\n    report.extractorSensitivity === null || report.extractorSensitivity === undefined","sourceCodeStart":52,"sourceCodeEnd":88,"githubUrl":"https://github.com/chenglou/pretext/blob/ac49b09b7d83ede19581fa94a8b892b07d309baf/scripts/symbol-check.ts#L52-L88","documentation":"parseBrowsers accepts a comma-separated --browser= list (default chrome,safari) and validates each entry against {chrome, safari, firefox}. Throws on anything else. Note: 'firefox' passes parsing here but is then rejected at runtime by runBrowser (error 86) because the symbol oracle page automation is not wired for Firefox. So --browser=firefox will pass this check and fail later. 'chromium' and 'webkit' are not accepted tokens.","triggerScenarios":"--browser=edge; --browser=chrome,ie; --browser=chromium (use chrome instead); a typo like --browser=chrom.","commonSituations":"Assuming chromium is accepted; mixing unsupported engines into the matrix; copy-pasting a browser matrix from another tool.","solutions":["Use only chrome, safari, firefox tokens (comma-separated, case-insensitive).","Drop firefox if you need results: symbol runs fail for Firefox (error 86). The default chrome,safari is the supported set.","The message echoes the offending token."],"exampleFix":"# before\nbun run scripts/symbol-check.ts --browser=chromium,webkit\n\n# after\nbun run scripts/symbol-check.ts --browser=chrome,safari","handlingStrategy":"validation","validationCode":"const ACCEPTED = new Set(['chrome', 'safari', 'firefox'])\nconst tokens = (parseStringFlag('browser') ?? 'chrome,safari')\n  .split(',').map(s => s.trim().toLowerCase()).filter(Boolean)\nconst bad = tokens.filter(t => !ACCEPTED.has(t))\nif (bad.length > 0) {\n  console.error(`--browser accepts chrome|safari|firefox only, got ${JSON.stringify(bad)}`)\n  process.exit(2)\n}","typeGuard":"const ACCEPTED = new Set(['chrome', 'safari', 'firefox'])\nconst isAcceptedToken = (s: string): s is 'chrome' | 'safari' | 'firefox' =>\n  ACCEPTED.has(s)","tryCatchPattern":null,"preventionTips":["Accepted tokens are chrome, safari, firefox only. 'chromium'/'webkit'/'edge' are rejected.","firefox parses but fails at run time for symbol checks (error 86); filter it out before launching symbol-check.","Tokens are case-insensitive and comma-separated; whitespace is trimmed."],"tags":["cli","browser-automation","config"],"backgroundTag":null,"analyzedSha":"ac49b09b7d83ede19581fa94a8b892b07d309baf","analyzedAt":"2026-08-12T17:03:16.263Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}