{"record":{"id":"b05b7d3d4e5baafa","repo":"abhigyanpatwari/GitNexus","slug":"name-must-be-a-positive-integer-got-raw","errorCode":null,"errorMessage":"${name} must be a positive integer, got \"${raw}\"","messagePattern":"(.+?) must be a positive integer, got \"(.+?)\"","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"gitnexus/src/core/embeddings/http-client.ts","lineNumber":58,"sourceCode":"  retryCapMs: number;\n  minIntervalMs: number;\n  timeoutMs: number;\n  retryTimeouts: boolean;\n  requestDimensions?: number;\n}\n\nexport interface EmbeddingRequestOptions {\n  signal?: AbortSignal;\n}\n\nlet lastHttpRequestStartedAt: number | undefined;\nlet httpPaceQueue: Promise<void> = Promise.resolve();\n\nconst parsePositiveIntegerEnv = (name: string, fallback: number, max: number): number => {\n  const raw = process.env[name];\n  if (raw === undefined || raw === '') return fallback;\n  if (!/^\\d+$/u.test(raw)) {\n    throw new Error(`${name} must be a positive integer, got \"${raw}\"`);\n  }\n  const parsed = Number(raw);\n  if (!Number.isSafeInteger(parsed) || parsed <= 0 || parsed > max) {\n    throw new Error(`${name} must be a positive integer <= ${max}, got \"${raw}\"`);\n  }\n  return parsed;\n};\n\nconst parseNonNegativeIntegerEnv = (name: string, fallback: number, max: number): number => {\n  const raw = process.env[name];\n  if (raw === undefined || raw === '') return fallback;\n  if (!/^\\d+$/u.test(raw)) {\n    throw new Error(`${name} must be a non-negative integer, got \"${raw}\"`);\n  }\n  const parsed = Number(raw);\n  if (!Number.isSafeInteger(parsed) || parsed < 0 || parsed > max) {\n    throw new Error(`${name} must be a non-negative integer <= ${max}, got \"${raw}\"`);\n  }","sourceCodeStart":40,"sourceCodeEnd":76,"githubUrl":"https://github.com/abhigyanpatwari/GitNexus/blob/ac9a4e9abd8fd3058c070b72c23402a4f887929a/gitnexus/src/core/embeddings/http-client.ts#L40-L76","documentation":"parsePositiveIntegerEnv() rejects values that are not pure digit strings. It reads one of the HTTP embedding tuning vars — GITNEXUS_EMBEDDING_MAX_ATTEMPTS (max 20), GITNEXUS_EMBEDDING_RETRY_CAP_MS (max 300000), GITNEXUS_EMBEDDING_HTTP_TIMEOUT_MS (max 300000) — when HTTP embedding mode is configured. Malformed values throw at readConfig() time inside httpEmbed/httpEmbedQuery; isHttpMode() never reads them and never throws.","triggerScenarios":"Setting e.g. GITNEXUS_EMBEDDING_MAX_ATTEMPTS='3x', GITNEXUS_EMBEDDING_HTTP_TIMEOUT_MS='1.5' (float), '-1' (sign), '1e3' (exponent), or ' 5' (whitespace) alongside GITNEXUS_EMBEDDING_URL and GITNEXUS_EMBEDDING_MODEL, then running any embedding operation.","commonSituations":"Copy-pasting values with units ('30s'), floats, scientific notation, or trailing whitespace/newlines from CI secrets or .env files; quoting mistakes in docker-compose YAML.","solutions":["Set the variable to a bare positive integer without units, signs, decimals, or whitespace (e.g. GITNEXUS_EMBEDDING_MAX_ATTEMPTS=5).","Unset the variable to fall back to the built-in default.","Check the exact name spelled in the error (${name}) — that is the offending variable.","Audit .env / CI secret for invisible characters (trailing \\n, BOM)."],"exampleFix":"# before\nexport GITNEXUS_EMBEDDING_HTTP_TIMEOUT_MS='30s'\n# after\nexport GITNEXUS_EMBEDDING_HTTP_TIMEOUT_MS=30000","handlingStrategy":"validation","validationCode":"const assertDigits = (name: string): void => {\n  const raw = process.env[name];\n  if (raw !== undefined && raw !== '' && !/^\\d+$/.test(raw)) {\n    throw new Error(`${name} must be digits, got \"${raw}\"`);\n  }\n};\n['GITNEXUS_EMBEDDING_MAX_ATTEMPTS','GITNEXUS_EMBEDDING_RETRY_CAP_MS','GITNEXUS_EMBEDDING_HTTP_TIMEOUT_MS'].forEach(assertDigits);","typeGuard":"const isEnvFormatError = (e: unknown): boolean =>\n  e instanceof Error && /must be a (positive|non-negative) integer, got/.test(e.message);","tryCatchPattern":"try {\n  await httpEmbed(texts);\n} catch (e) {\n  if (isEnvFormatError(e)) {\n    // config bug: fix the env var named in the message and exit — retrying cannot help\n    process.exitCode = 2;\n  } else throw e;\n}","preventionTips":["Validate all GITNEXUS_EMBEDDING_* numeric vars at deploy time with a strict /^\\d+$/ check.","Never include units, signs, decimals, or quotes in these env values.","Prefer unset-over-zero for 'use the default'."],"tags":["embeddings","environment-variable","configuration","validation","http"],"backgroundTag":"invalid-env-var","analyzedSha":"ac9a4e9abd8fd3058c070b72c23402a4f887929a","analyzedAt":"2026-08-20T23:29:22.980Z","contentChangedAt":"2026-08-20T23:29:22.980Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}