stablyai/orca · error · Error

Invalid --synthetic-spinner-animation: ${options.syntheticSp

Error message

Invalid --synthetic-spinner-animation: ${options.syntheticSpinnerAnimation}

What it means

Thrown by parseArgs when --synthetic-spinner-animation is not one of the two allowed values ('smooth' or 'steps'). The synthetic spinner fixture only supports those two animation styles; anything else is rejected before measurement.

Source

Thrown at config/scripts/run-idle-cpu-benchmark.mjs:130

    'syntheticSpinnerSteps'
  ]) {
    if (!Number.isFinite(options[key]) || options[key] < 0) {
      throw new Error(`Invalid --${key}: ${options[key]}`)
    }
  }
  options.worktrees = Math.max(1, Math.floor(options.worktrees))
  options.intervalMs = Math.max(250, Math.floor(options.intervalMs))
  options.lineageDepth = Math.floor(options.lineageDepth)
  options.agentsPerWorktree = Math.floor(options.agentsPerWorktree)
  options.zustandPublications = Math.floor(options.zustandPublications)
  options.zustandPublicationIntervalMs = Math.max(
    1,
    Math.floor(options.zustandPublicationIntervalMs)
  )
  options.syntheticVisibleSpinners = Math.max(0, Math.floor(options.syntheticVisibleSpinners))
  options.syntheticSpinnerSteps = Math.max(1, Math.floor(options.syntheticSpinnerSteps))
  if (!['smooth', 'steps'].includes(options.syntheticSpinnerAnimation)) {
    throw new Error(`Invalid --synthetic-spinner-animation: ${options.syntheticSpinnerAnimation}`)
  }
  if (options.lineageDepth > 0 && options.worktrees < 2) {
    throw new Error('--lineage-depth requires at least two --worktrees')
  }
  const publicationSpanMs =
    Math.max(0, options.zustandPublications - 1) * options.zustandPublicationIntervalMs
  if (publicationSpanMs > options.sampleMs) {
    throw new Error(
      `Zustand publication span ${publicationSpanMs}ms exceeds --sample-ms ${options.sampleMs}`
    )
  }
  return options
}
function printUsage() {
  console.log(
    `Usage: node config/scripts/run-idle-cpu-benchmark.mjs [options]\n\nOptions:\n  --warmup-ms <n>    Time to wait after app readiness before sampling (default ${DEFAULT_WARMUP_MS})\n  --sample-ms <n>    Sampling window duration (default ${DEFAULT_SAMPLE_MS})\n  --interval-ms <n>  Sampling cadence (default ${DEFAULT_INTERVAL_MS})\n  --worktrees <n>    Seed repo worktree count, including primary (default ${DEFAULT_WORKTREE_COUNT})\n  --lineage-depth <n>  Nest all worktrees under one expanded lineage, up to this depth\n  --agents-per-worktree <n>  Seed this many visible inline agent rows per worktree\n  --zustand-publications <n>  Publish exactly this many store updates during sampling\n  --zustand-publication-interval-ms <n>  Publication cadence (default ${DEFAULT_ZUSTAND_PUBLICATION_INTERVAL_MS})\n  --headful          Show the Electron window while measuring\n  --skip-build       Reuse out/main/index.js instead of building first\n  --output <path>    Write JSON report to this path\n  --disable-renderer-animations  Inject measurement-only CSS that disables animations/transitions\n  --synthetic-visible-spinners <n>  Measurement-only: add visible working spinners\n  --synthetic-spinner-animation <smooth|steps>  Spinner animation style (default smooth)\n  --synthetic-spinner-steps <n>  Step count for --synthetic-spinner-animation steps (default 12)\n`
  )
}

View on GitHub (pinned to 1136503c6a)

Solutions

  1. Use exactly 'smooth' or 'steps'.
  2. If using steps, also set --synthetic-spinner-steps to the desired step count.

Example fix

# before
node config/scripts/run-idle-cpu-benchmark.mjs --synthetic-spinner-animation linear
# after
node config/scripts/run-idle-cpu-benchmark.mjs --synthetic-spinner-animation steps --synthetic-spinner-steps 12
Defensive patterns

Strategy: validation

Validate before calling

const SPINNER_ANIMATIONS = new Set(['smooth', 'steps'])
if (!SPINNER_ANIMATIONS.has(options.syntheticSpinnerAnimation)) {
  throw new Error(`Invalid --synthetic-spinner-animation: ${options.syntheticSpinnerAnimation}. Use smooth|steps.`)
}

Type guard

function isSpinnerAnimation(value) { return value === 'smooth' || value === 'steps' }

Try / catch

try {
  options = parseArgs(argv)
} catch (err) {
  if (/Invalid --synthetic-spinner-animation/.test(err.message)) { printUsage(); process.exit(2) }
  throw err
}

Prevention

When it happens

Trigger: Passing --synthetic-spinner-animation linear / bounce / ease / '' / a typo like 'step' (singular).

Common situations: Guessing an animation name, typos, stale value from an older version that accepted more styles.

Related errors


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