moeru-ai/airi · error · Error

Unsupported settle delay "${argv[settleMsFlagIndex + 1] ?? s

Error message

Unsupported settle delay "${argv[settleMsFlagIndex + 1] ?? settleMs}". Expected a number >= 0.

What it means

After confirming --settle-ms has a value, the script converts it with Number() (capture.ts:25) and requires a finite result >= 0 (capture.ts:87). This error fires when the raw string is not numeric (Number() returns NaN), or is negative. The message echoes the original argv string (or the coerced value) so you can see exactly what was parsed.

Source

Thrown at packages/scenarios-stage-tamagotchi-browser/scripts/capture.ts:87

if (settleMsFlagIndex >= 0 && !argv[settleMsFlagIndex + 1]) {
  throw new Error('Missing value for --settle-ms.')
}

if (avifMaxWidthFlagIndex >= 0 && !argv[avifMaxWidthFlagIndex + 1]) {
  throw new Error('Missing value for --avif-max-width.')
}

if (avifQualityFlagIndex >= 0 && !argv[avifQualityFlagIndex + 1]) {
  throw new Error('Missing value for --avif-quality.')
}

if (avifSpeedFlagIndex >= 0 && !argv[avifSpeedFlagIndex + 1]) {
  throw new Error('Missing value for --avif-speed.')
}

if (!Number.isFinite(settleMs) || settleMs < 0) {
  throw new Error(`Unsupported settle delay "${argv[settleMsFlagIndex + 1] ?? settleMs}". Expected a number >= 0.`)
}

if (!Number.isFinite(avifMaxWidth) || avifMaxWidth < 1) {
  throw new Error(`Unsupported AVIF max width "${argv[avifMaxWidthFlagIndex + 1] ?? avifMaxWidth}". Expected a number >= 1.`)
}

if (!Number.isFinite(avifQuality) || avifQuality < 0 || avifQuality > 100) {
  throw new Error(`Unsupported AVIF quality "${argv[avifQualityFlagIndex + 1] ?? avifQuality}". Expected a number between 0 and 100.`)
}

if (!Number.isFinite(avifSpeed) || avifSpeed < 1 || avifSpeed > 10) {
  throw new Error(`Unsupported AVIF speed "${argv[avifSpeedFlagIndex + 1] ?? avifSpeed}". Expected a number between 1 and 10.`)
}

await captureBrowserRoots({
  imageTransformers: requestedFormat === 'avif'
    ? [avifTransformer]
    : undefined,

View on GitHub (pinned to 677329427f)

Solutions

  1. Pass milliseconds as a plain non-negative number: `--settle-ms 1500`
  2. If you meant seconds, convert first: 0.5 s -> `--settle-ms 500`
  3. Check no other flag immediately follows --settle-ms without an intervening value

Example fix

// before
pnpm capture --settle-ms 1s
// after
pnpm capture --settle-ms 1000
Defensive patterns

Strategy: validation

Validate before calling

function parseSettleMs(raw: string | undefined): number {
  const value = raw === undefined ? 500 : Number(raw)
  if (!Number.isFinite(value) || value < 0)
    throw new Error(`Unsupported settle delay "${raw}". Expected a number >= 0.`)
  return value
}

Type guard

const isNonNegativeNumber = (v: unknown): v is number =>
  typeof v === 'number' && Number.isFinite(v) && v >= 0

Prevention

When it happens

Trigger: Passing a non-numeric value (`--settle-ms abc`, `--settle-ms 1s`, `--settle-ms 500ms`), a negative value (`--settle-ms -1`), or a string that Number() cannot coerce. Note that a following flag like `--settle-ms --format` coerces to NaN here because any non-empty string passes the presence check at capture.ts:70.

Common situations: Units confusion (typing seconds where milliseconds are expected, e.g. `--settle-ms 0.5s`), locale decimal separators, or the value slot silently swallowed by another flag.

Related errors


AI-assisted analysis of moeru-ai/airi@677329427f (2026-08-18). Data as JSON: /api/errors/7ed1d3db5e1f4a40. Report an issue: GitHub.