{"record":{"id":"1db22d67bcb4a026","repo":"nexu-io/open-design","slug":"key-must-be-a-positive-integer-got-raw","errorCode":null,"errorMessage":"${key} must be a positive integer, got \"${raw}\"","messagePattern":"(.+?) must be a positive integer, got \"(.+?)\"","errorType":"validation","errorClass":"RangeError","httpStatus":null,"severity":"error","filePath":"apps/daemon/src/critique/config.ts","lineNumber":58,"sourceCode":"    fallbackPolicy,\n  };\n}\n\n// ---------------------------------------------------------------------------\n// Parsing helpers\n// ---------------------------------------------------------------------------\n\nfunction parseEnabled(raw: string | undefined, fallback: boolean): boolean {\n  if (raw === undefined) return fallback;\n  const v = raw.trim().toLowerCase();\n  return v === 'true' || v === '1' || v === 'yes';\n}\n\nfunction parsePositiveInt(key: string, raw: string | undefined, fallback: number): number {\n  if (raw === undefined) return fallback;\n  const n = Number(raw);\n  if (!Number.isFinite(n) || !Number.isInteger(n) || n < 1) {\n    throw new RangeError(\n      `${key} must be a positive integer, got \"${raw}\"`,\n    );\n  }\n  return n;\n}\n\nfunction parseNonNegativeFloat(key: string, raw: string | undefined, fallback: number): number {\n  if (raw === undefined) return fallback;\n  const n = Number(raw);\n  if (!Number.isFinite(n) || n < 0) {\n    throw new RangeError(\n      `${key} must be a non-negative finite number, got \"${raw}\"`,\n    );\n  }\n  return n;\n}\n\nfunction parseFallbackPolicy(","sourceCodeStart":40,"sourceCodeEnd":76,"githubUrl":"https://github.com/nexu-io/open-design/blob/5be4028344c2eb4c667c5a97bda8f750c5597ef7/apps/daemon/src/critique/config.ts#L40-L76","documentation":"Thrown by parsePositiveInt() (used by loadCritiqueConfigFromEnv) as a RangeError when one of the OD_CRITIQUE_* integer env vars (OD_CRITIQUE_MAX_ROUNDS, OD_CRITIQUE_SCORE_SCALE, OD_CRITIQUE_PER_ROUND_TIMEOUT_MS, OD_CRITIQUE_TOTAL_TIMEOUT_MS, OD_CRITIQUE_PARSER_MAX_BLOCK_BYTES) is set but is not a finite integer >= 1. ${key} names exactly which env var failed and ${raw} shows the offending value.","triggerScenarios":"Setting any of the listed OD_CRITIQUE_* integer vars to zero, a negative, a float, NaN/Infinity, or a non-numeric string. e.g. OD_CRITIQUE_MAX_ROUNDS=0, OD_CRITIQUE_PER_ROUND_TIMEOUT_MS=2.5, OD_CRITIQUE_TOTAL_TIMEOUT_MS=abc.","commonSituations":"Operator set a timeout to 0 thinking it disables it; trailing whitespace/unit ('1000ms'); a float slipped in via a templated env file; copy-paste from a doc that used a different unit.","solutions":["Set the named var to a positive integer (>= 1) with no units — e.g. OD_CRITIQUE_MAX_ROUNDS=3, OD_CRITIQUE_PER_ROUND_TIMEOUT_MS=60000.","Unset the var to fall back to defaultCritiqueConfig().","Strip units/whitespace from templated env values before they reach the process."],"exampleFix":"# before: zero / float / non-numeric\nOD_CRITIQUE_MAX_ROUNDS=0\nOD_CRITIQUE_PER_ROUND_TIMEOUT_MS=2.5s\n\n# after: positive integers, no units\nOD_CRITIQUE_MAX_ROUNDS=3\nOD_CRITIQUE_PER_ROUND_TIMEOUT_MS=60000","handlingStrategy":"validation","validationCode":"function assertPositiveInt(key: string, raw: string | undefined, fallback: number) {\n  if (raw === undefined) return fallback;\n  const n = Number(raw);\n  if (!Number.isFinite(n) || !Number.isInteger(n) || n < 1) {\n    throw new RangeError(`${key} must be a positive integer, got \"${raw}\"`);\n  }\n  return n;\n}","typeGuard":"function isPositiveInt(raw: unknown): raw is number {\n  return typeof raw === 'number' && Number.isFinite(raw) && Number.isInteger(raw) && raw >= 1;\n}","tryCatchPattern":"try { loadCritiqueConfigFromEnv(); }\ncatch (e) {\n  if (e instanceof RangeError) { console.error('critique config invalid', e.message); process.exit(1); }\n  throw e;\n}","preventionTips":["Lint env files for numeric values before deployment.","Strip units/whitespace from templated values before they reach the process.","Treat critique boot errors as fatal: fix the env, do not catch-and-continue."],"tags":["critique","config","env-vars","range-error","boot"],"backgroundTag":null,"analyzedSha":"5be4028344c2eb4c667c5a97bda8f750c5597ef7","analyzedAt":"2026-08-12T12:03:58.812Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}