{"record":{"id":"56f567d0d031c1bc","repo":"heygen-com/hyperframes","slug":"keyword-must-be-an-integer-greater-than-1","errorCode":null,"errorMessage":"${keyword} must be an integer greater than 1","messagePattern":"(.+?) must be an integer greater than 1","errorType":"validation","errorClass":"CubeLutParseError","httpStatus":null,"severity":"error","filePath":"packages/core/src/colorLuts.ts","lineNumber":68,"sourceCode":"  return parsed;\n}\n\nfunction parseVec3(parts: string[], keyword: string, lineNumber: number): CubeLutVec3 {\n  if (parts.length !== 3) {\n    throw new CubeLutParseError(`${keyword} expects three numbers`, lineNumber);\n  }\n  return [\n    parseFiniteNumber(parts[0]!, lineNumber),\n    parseFiniteNumber(parts[1]!, lineNumber),\n    parseFiniteNumber(parts[2]!, lineNumber),\n  ];\n}\n\nfunction parseSize(value: string | undefined, keyword: string, lineNumber: number): number {\n  if (!value) throw new CubeLutParseError(`${keyword} expects a size`, lineNumber);\n  const parsed = Number(value);\n  if (!Number.isInteger(parsed) || parsed < 2) {\n    throw new CubeLutParseError(`${keyword} must be an integer greater than 1`, lineNumber);\n  }\n  return parsed;\n}\n\nfunction validateDomain(domainMin: CubeLutVec3, domainMax: CubeLutVec3): void {\n  if (\n    domainMax[0] <= domainMin[0] ||\n    domainMax[1] <= domainMin[1] ||\n    domainMax[2] <= domainMin[2]\n  ) {\n    throw new CubeLutParseError(\"DOMAIN_MAX values must be greater than DOMAIN_MIN values\");\n  }\n}\n\nfunction parseTitle(line: string): string | null {\n  const quoted = /^TITLE\\s+\"([^\"]*)\"\\s*$/i.exec(line);\n  if (quoted) return quoted[1] ?? null;\n  const bare = /^TITLE\\s+(.+)\\s*$/i.exec(line);","sourceCodeStart":50,"sourceCodeEnd":86,"githubUrl":"https://github.com/heygen-com/hyperframes/blob/c2996c8626135db5253519359d8a063d3bafad8d/packages/core/src/colorLuts.ts#L50-L86","documentation":"After confirming a size token exists, parseSize verifies it is an integer >= 2. A 3D LUT of size 1 is a single texel (degenerate, no interpolation), and a fractional size has no physical meaning, so both are rejected at line 67-68.","triggerScenarios":"'LUT_3D_SIZE 1', 'LUT_3D_SIZE 2.5', 'LUT_3D_SIZE 0', or 'LUT_3D_SIZE -4'.","commonSituations":"Author typed 1 expecting 'minimal'; a float slipped in from a templating system; a default/uninitialized value of 0 or 1 written by buggy export code.","solutions":["Use an integer >= 2 (typical values: 17, 25, 32, 33, 64).","Round any computed size to the nearest integer and clamp to >= 2 before writing.","Validate size at generation time with Number.isInteger(size) && size >= 2."],"exampleFix":"// before\nLUT_3D_SIZE 2.5\n\n// after\nLUT_3D_SIZE 32","handlingStrategy":"try-catch","validationCode":"function parseLutSizeSafe(value: string | undefined): number {\n  const n = value == null ? NaN : Number(value);\n  if (!Number.isInteger(n) || n < 2) throw new Error(`Size must be integer >= 2, got ${value}`);\n  return n;\n}","typeGuard":null,"tryCatchPattern":"try {\n  parseCubeLut(fileText);\n} catch (err) {\n  if (err instanceof CubeLutParseError && /must be an integer greater than 1/.test(err.message)) {\n    // report and ask for a valid size\n  } else throw err;\n}","preventionTips":["Use canonical sizes (17, 25, 32, 33, 64).","Round and clamp computed sizes to an integer >= 2.","Validate at generation time with Number.isInteger and a >= 2 check."],"tags":["lut","cube","parsing","size"],"backgroundTag":null,"analyzedSha":"c2996c8626135db5253519359d8a063d3bafad8d","analyzedAt":"2026-08-12T22:18:56.877Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}