{"record":{"id":"2b949c5143b3d093","repo":"stablyai/orca","slug":"invalid-argument-2b949c","errorCode":"invalid_argument","errorMessage":"--scale must be a positive number","messagePattern":"--scale must be a positive number","errorType":"exception","errorClass":"RuntimeClientError","httpStatus":null,"severity":"error","filePath":"src/cli/handlers/browser-env.ts","lineNumber":22,"sourceCode":"import {\n  getOptionalStringFlag,\n  getRequiredFiniteNumber,\n  getRequiredPositiveNumber,\n  getRequiredStringFlag\n} from '../flags'\nimport { RuntimeClientError } from '../runtime-client'\nimport { getBrowserCommandTarget } from '../selectors'\n\nexport const BROWSER_ENV_HANDLERS: Record<string, CommandHandler> = {\n  viewport: async ({ flags, client, cwd, json }) => {\n    const width = getRequiredPositiveNumber(flags, 'width')\n    const height = getRequiredPositiveNumber(flags, 'height')\n    const params: Record<string, unknown> = { width, height }\n    const scale = getOptionalStringFlag(flags, 'scale')\n    if (scale) {\n      const n = Number(scale)\n      if (!Number.isFinite(n) || n <= 0) {\n        throw new RuntimeClientError('invalid_argument', '--scale must be a positive number')\n      }\n      params.deviceScaleFactor = n\n    }\n    if (flags.has('mobile')) {\n      params.mobile = true\n    }\n    Object.assign(params, await getBrowserCommandTarget(flags, cwd, client))\n    const result = await client.call<BrowserViewportResult>('browser.viewport', params)\n    printResult(\n      result,\n      json,\n      (v) => `Viewport set to ${v.width}×${v.height}${v.mobile ? ' (mobile)' : ''}`\n    )\n  },\n  geolocation: async ({ flags, client, cwd, json }) => {\n    const latitude = getRequiredFiniteNumber(flags, 'latitude')\n    const longitude = getRequiredFiniteNumber(flags, 'longitude')\n    const params: Record<string, unknown> = { latitude, longitude }","sourceCodeStart":4,"sourceCodeEnd":40,"githubUrl":"https://github.com/stablyai/orca/blob/1136503c6a231a16dce8f921f6fadb63d181e8db/src/cli/handlers/browser-env.ts#L4-L40","documentation":"Thrown by the `browser-env viewport` handler when --scale is provided but Number(scale) is not finite or is <= 0. deviceScaleFactor must be a positive number, so zero, negatives, NaN, and Infinity are all rejected before the browser.viewport RPC.","triggerScenarios":"Running `browser-env viewport --width 1280 --height 720 --scale 0` (or negative, non-numeric, or Infinity). The `if (scale)` truthy gate then the finite/<=0 check fires.","commonSituations":"Passing a percentage ('100'), a non-numeric token, or 0 thinking it means 'default'. Shell expansion of an unset variable yielding an empty/non-numeric string.","solutions":["Pass a positive finite scale factor such as `--scale 2` for retina.","Omit --scale entirely to leave deviceScaleFactor unset (the flag is optional).","Verify the value is not coming from an empty/unset environment variable."],"exampleFix":"// before\norca browser-env viewport --width 1280 --height 720 --scale 0\n// after\norca browser-env viewport --width 1280 --height 720 --scale 2","handlingStrategy":"validation","validationCode":"function parseScale(raw: string | undefined): number | undefined {\n  if (!raw) return undefined\n  const n = Number(raw)\n  if (!Number.isFinite(n) || n <= 0) throw new Error('--scale must be a positive finite number')\n  return n\n}","typeGuard":"function isPositiveFinite(v: unknown): v is number {\n  return typeof v === 'number' && Number.isFinite(v) && v > 0\n}","tryCatchPattern":null,"preventionTips":["Use --scale only when you need a real device pixel ratio (e.g. 2 for retina).","Omit --scale to inherit the default rather than passing 0/1 speculatively.","Validate scale at the script layer for non-numeric/empty inputs."],"tags":["cli","browser","viewport","flag-validation","invalid-argument"],"backgroundTag":null,"analyzedSha":"1136503c6a231a16dce8f921f6fadb63d181e8db","analyzedAt":"2026-08-12T23:15:58.167Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}