{"record":{"id":"8f692da360eb3f83","repo":"deepseek-ai/deepseek-harness","slug":"basiccompactionconfig-duplicate-model-policy-for","errorCode":null,"errorMessage":"BasicCompactionConfig: duplicate model policy for ${source.provider}/${source.model}","messagePattern":"BasicCompactionConfig: duplicate model policy for (.+?)/(.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/compaction/compaction-basic/src/config.ts","lineNumber":205,"sourceCode":"      `${name}: retainRatio (${retention.retainRatio}) must be less than `\n      + `the resolved thresholdRatio (${thresholdRatio})`,\n    )\n  }\n}\n\n/** Validate, detach, and reject duplicate exact-target policies. */\nfunction resolveModelPolicies(configured: unknown): ModelCompactPolicyConfig[] {\n  if (configured === undefined) return []\n  if (!Array.isArray(configured)) {\n    throw new Error('BasicCompactionConfig: modelPolicies must be an array')\n  }\n  const seen = new Set<string>()\n  return configured.map((source: unknown, index) => {\n    const name = `BasicCompactionConfig: modelPolicies[${index}]`\n    assertModelPolicy(source, name)\n    const key = `${source.provider}\\u0000${source.model}`\n    if (seen.has(key)) {\n      throw new Error(\n        `BasicCompactionConfig: duplicate model policy for ${source.provider}/${source.model}`,\n      )\n    }\n    seen.add(key)\n    return { ...source }\n  })\n}\n\n/** Validate one untrusted exact-target override and narrow its public type. */\nfunction assertModelPolicy(\n  source: unknown,\n  name: string,\n): asserts source is ModelCompactPolicyConfig {\n  if (!isUnknownRecord(source)) throw new Error(`${name} must be an object`)\n  validateKeys(source, MODEL_POLICY_KEYS, name)\n  assertNonEmptyString(`${name}.provider`, source.provider)\n  assertNonEmptyString(`${name}.model`, source.model)\n  validatePolicy(source, name)","sourceCodeStart":187,"sourceCodeEnd":223,"githubUrl":"https://github.com/deepseek-ai/deepseek-harness/blob/b150a551b8d465e31e418e1b2eaf5e79bbb7d28e/packages/compaction/compaction-basic/src/config.ts#L187-L223","documentation":"Each modelPolicies entry targets exactly one provider/model route, and resolveTargetPolicy() picks the match with Array.find — a duplicate provider+model pair is ambiguous because only the first entry could ever win. resolveModelPolicies() keys entries by provider/model identity and throws on the second identical pair at plugin load.","triggerScenarios":"Two entries in modelPolicies with the same provider AND model strings (matching is exact). Typical: duplicating an entry to tweak values and forgetting to change model, or concatenating two config files that both tune the same route.","commonSituations":"Copy-paste of an existing per-model override; merging team or environment configs that append entries instead of replacing; generated configs emitting one entry per tuning knob.","solutions":["Delete the duplicate and keep exactly one entry per provider/model pair","If the duplicates carried different fields, merge those fields into one entry — unspecified fields inherit from top-level defaults, so one entry can hold everything","When configs are merged or generated, dedupe modelPolicies by provider+model in the merge step before deploy"],"exampleFix":"# before — two entries for deepseek/deepseek-chat\nmodelPolicies:\n  - provider: deepseek\n    model: deepseek-chat\n    maxTokens: 16384\n  - provider: deepseek\n    model: deepseek-chat\n    maxTokens: 32768\n\n# after — one merged entry\nmodelPolicies:\n  - provider: deepseek\n    model: deepseek-chat\n    maxTokens: 32768","handlingStrategy":"validation","validationCode":"const seen = new Set<string>()\nfor (const [i, p] of (config.modelPolicies ?? []).entries()) {\n  const key = `${p.provider} ${p.model}`\n  if (seen.has(key)) throw new Error(`modelPolicies[${i}] duplicates ${key}`)\n  seen.add(key)\n}\nresolveConfig(config)","typeGuard":null,"tryCatchPattern":"try {\n  resolveConfig(config)\n} catch (err) {\n  const msg = (err as Error).message\n  const route = msg.match(/duplicate model policy for (.+)$/)?.[1]\n  if (route !== undefined) {\n    throw new Error(\n      `config has overlapping overrides for ${route}; merge them into one entry`,\n      { cause: err },\n    )\n  }\n  throw err\n}","preventionTips":["Grep cordis.yml for repeated model values under the same provider before deploy","Dedupe modelPolicies by provider+model in any config merge script","Remember matching is exact: 'deepseek-chat' and 'deepseek/chat' are different targets, but identical pairs always fail"],"tags":["config","validation","duplicate","plugin-config","compaction"],"backgroundTag":"duplicate-config-entry","analyzedSha":"b150a551b8d465e31e418e1b2eaf5e79bbb7d28e","analyzedAt":"2026-08-24T18:12:29.105Z","schemaVersion":2},"datasetVersion":"2026-08-24T22:17:12.610Z"}