{"record":{"id":"6b23fea7f0b8e755","repo":"heygen-com/hyperframes","slug":"engine-config-field-must-be-a-finite-number-0","errorCode":null,"errorMessage":"Engine config ${field} must be a finite number > 0","messagePattern":"Engine config (.+?) must be a finite number > 0","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/engine/src/config.ts","lineNumber":399,"sourceCode":"  integer = false,\n): void {\n  const value = config[field];\n  if (\n    typeof value !== \"number\" ||\n    !Number.isFinite(value) ||\n    value < min ||\n    (integer && !Number.isInteger(value))\n  ) {\n    throw new Error(\n      `Engine config ${field} must be a ${integer ? \"finite integer\" : \"finite number\"} >= ${min}`,\n    );\n  }\n}\n\nfunction assertPositiveEngineConfigNumber(config: Record<string, unknown>, field: string): void {\n  const value = config[field];\n  if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n    throw new Error(`Engine config ${field} must be a finite number > 0`);\n  }\n}\n\nfunction assertEngineConfigEnum(\n  config: Record<string, unknown>,\n  field: string,\n  values: readonly unknown[],\n): void {\n  if (!values.includes(config[field])) throw new Error(`Engine config ${field} is invalid`);\n}\n\nfunction validateRequiredEngineConfigFields(config: Record<string, unknown>): void {\n  const requiredFields = Object.keys(DEFAULT_CONFIG);\n  for (const field of requiredFields) {\n    if (!Object.hasOwn(config, field)) {\n      throw new Error(`Engine config snapshot is missing required field ${field}`);\n    }\n  }","sourceCodeStart":381,"sourceCodeEnd":417,"githubUrl":"https://github.com/heygen-com/hyperframes/blob/c2996c8626135db5253519359d8a063d3bafad8d/packages/engine/src/config.ts#L381-L417","documentation":"assertPositiveEngineConfigNumber() requires a strictly positive finite number. It is applied to `coresPerWorker` only — the CPU cores allocated per render worker, whose DEFAULT_CONFIG value is 2.5 (a float is allowed, but the value must be > 0).","triggerScenarios":"validateEngineConfigSnapshot() receives a snapshot with coresPerWorker set to 0, a negative number, NaN/Infinity, or a non-number (string/undefined/null). Because coresPerWorker controls worker sizing, zero or negative would under-allocate or break worker count math.","commonSituations":"Overriding coresPerWorker to 0 to \"disable\" workers (use concurrency instead); env var misparsed; a config editor defaulting an unset field to 0; stale snapshot from an older schema that omitted the field then set it to a placeholder.","solutions":["Set coresPerWorker to a positive finite number (default 2.5; integers not required).","If the goal is fewer workers, tune `concurrency` instead — leave coresPerWorker > 0.","Run the snapshot through resolveConfig() so the default is filled when the field is omitted."],"exampleFix":"// before\nconst snap = { ...DEFAULT_CONFIG, coresPerWorker: 0 };\n\n// after\nconst snap = { ...DEFAULT_CONFIG, coresPerWorker: 2.5 };","handlingStrategy":"validation","validationCode":"if (typeof cfg.coresPerWorker !== \"number\" || !Number.isFinite(cfg.coresPerWorker) || cfg.coresPerWorker <= 0) {\n  throw new Error(\"coresPerWorker must be a finite number > 0\");\n}","typeGuard":"function isValidCoresPerWorker(value: unknown): boolean {\n  return typeof value === \"number\" && Number.isFinite(value) && value > 0;\n}","tryCatchPattern":"try { validateEngineConfigSnapshot(snapshot); }\ncatch (e) {\n  if (/coresPerWorker/.test(String(e))) {\n    snapshot.coresPerWorker = DEFAULT_CONFIG.coresPerWorker; // fall back to default\n    validateEngineConfigSnapshot(snapshot);\n  } else throw e;\n}","preventionTips":["Never set coresPerWorker to 0; tune concurrency to control worker count.","Source coresPerWorker from DEFAULT_CONFIG unless you have a measured reason to override."],"tags":["engine-config","validation","cores-per-worker","positive-number"],"backgroundTag":null,"analyzedSha":"c2996c8626135db5253519359d8a063d3bafad8d","analyzedAt":"2026-08-12T22:18:56.877Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}