{"record":{"id":"0369e473e569803d","repo":"abhigyanpatwari/GitNexus","slug":"name-must-be-a-non-negative-integer-max","errorCode":null,"errorMessage":"${name} must be a non-negative integer <= ${max}, got \"${raw}\"","messagePattern":"(.+?) must be a non-negative integer <= (.+?), got \"(.+?)\"","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"gitnexus/src/core/embeddings/http-client.ts","lineNumber":75,"sourceCode":"  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  }\n  return parsed;\n};\n\nconst cancelledError = (): DOMException =>\n  new DOMException('Embedding request cancelled', 'AbortError');\n\nconst throwIfAborted = (signal?: AbortSignal): void => {\n  if (signal?.aborted) throw cancelledError();\n};\n\nconst abortableSleep = (ms: number, signal?: AbortSignal): Promise<void> => {\n  throwIfAborted(signal);\n  if (ms <= 0) return Promise.resolve();\n  return new Promise((resolve, reject) => {\n    const timer = setTimeout(() => {\n      signal?.removeEventListener('abort', onAbort);\n      resolve();","sourceCodeStart":57,"sourceCodeEnd":93,"githubUrl":"https://github.com/abhigyanpatwari/GitNexus/blob/ac9a4e9abd8fd3058c070b72c23402a4f887929a/gitnexus/src/core/embeddings/http-client.ts#L57-L93","documentation":"parseNonNegativeIntegerEnv() range guard: GITNEXUS_EMBEDDING_MIN_INTERVAL_MS parsed as digits but is not a safe integer, or falls outside 0..300000 ms. Only this one variable uses the non-negative parser.","triggerScenarios":"GITNEXUS_EMBEDDING_MIN_INTERVAL_MS above 300000 (e.g. 600000 for one request per 10 minutes) or an unsafe huge digit string.","commonSituations":"Over-aggressive throttling for a slow provider (interval > 5 minutes exceeds the clamp), or pasting a value meant for a different tool.","solutions":["Set the interval to ≤ 300000 ms (5 minutes).","Unset the variable if the default pacing is acceptable."],"exampleFix":"# before\nexport GITNEXUS_EMBEDDING_MIN_INTERVAL_MS=600000\n# after\nexport GITNEXUS_EMBEDDING_MIN_INTERVAL_MS=300000","handlingStrategy":"validation","validationCode":"const v = Number(process.env.GITNEXUS_EMBEDDING_MIN_INTERVAL_MS);\nif (process.env.GITNEXUS_EMBEDDING_MIN_INTERVAL_MS &&\n    (!Number.isSafeInteger(v) || v < 0 || v > 300_000)) {\n  throw new Error('GITNEXUS_EMBEDDING_MIN_INTERVAL_MS must be 0..300000');\n}","typeGuard":"const isEnvRangeError = (e: unknown): boolean =>\n  e instanceof Error && /must be a non-negative integer <=/.test(e.message);","tryCatchPattern":"try {\n  await httpEmbed(texts);\n} catch (e) {\n  if (isEnvRangeError(e)) { /* clamp to 300000 or unset; non-retryable */ }\n  else throw e;\n}","preventionTips":["Max pacing interval is 300000 ms; slower endpoints need a different strategy (timeouts, retries), not a longer interval."],"tags":["embeddings","environment-variable","range-validation","rate-limiting"],"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"}