{"record":{"id":"d974558b52166ffc","repo":"deepseek-ai/deepseek-harness","slug":"basiccompactionconfig-auto-must-be-a-boolean","errorCode":null,"errorMessage":"BasicCompactionConfig: auto must be a boolean","messagePattern":"BasicCompactionConfig: auto must be a boolean","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/compaction/compaction-basic/src/config.ts","lineNumber":71,"sourceCode":"  /**\n   * @param targetKey - exact provider/model route used as the warning key.\n   * @param message - actionable configuration failure detail.\n   */\n  constructor(readonly targetKey: string, message: string) {\n    super(message)\n  }\n}\n\n/**\n * Resolve and validate service defaults plus exact-target partial overrides.\n * @param config - untrusted plugin configuration after Loader normalization.\n * @returns detached immutable defaults and validated exact-target overrides.\n */\nexport function resolveConfig(config: BasicCompactionConfig = {}): ResolvedConfig {\n  validateKeys(config, BASIC_COMPACT_CONFIG_KEYS, 'BasicCompactionConfig')\n  validatePolicy(config, 'BasicCompactionConfig')\n  if (config.auto !== undefined && typeof config.auto !== 'boolean') {\n    throw new Error('BasicCompactionConfig: auto must be a boolean')\n  }\n\n  const thresholdRatio = config.thresholdRatio ?? DEFAULT_THRESHOLD_RATIO\n  const retention = resolveRetention(config, { retainRatio: DEFAULT_RETAIN_RATIO })\n  validateRatioRetention(thresholdRatio, retention, 'BasicCompactionConfig')\n  const modelPolicies = resolveModelPolicies(config.modelPolicies)\n  for (const [index, policy] of modelPolicies.entries()) {\n    validateRatioRetention(\n      policy.thresholdRatio ?? thresholdRatio,\n      resolveRetention(policy, retention),\n      `BasicCompactionConfig: modelPolicies[${index}]`,\n    )\n  }\n\n  return deepFreeze({\n    thresholdRatio,\n    ...retention,\n    summarizationProvider: config.summarizationProvider ?? '',","sourceCodeStart":53,"sourceCodeEnd":89,"githubUrl":"https://github.com/deepseek-ai/deepseek-harness/blob/b150a551b8d465e31e418e1b2eaf5e79bbb7d28e/packages/compaction/compaction-basic/src/config.ts#L53-L89","documentation":"compaction-basic's resolveConfig, run at plugin load, validates the top-level BasicCompactionConfig. When `auto` is present it must be a real boolean — it switches automatic compaction at request pressure; YAML truthiness and numeric flags are not accepted.","triggerScenarios":"cordis.yml contains auto as a quoted string (auto: \"false\"), a number (auto: 0 or 1), or any non-boolean produced by templated config generation.","commonSituations":"YAML quoting mistakes; config generators emitting 0/1 flags; environment-variable interpolation that always yields strings.","solutions":["Write a bare YAML boolean: auto: false (or auto: true).","Omit the key to keep the default (auto defaults to true).","If config is generated, fix the generator to emit real booleans, not strings or numbers."],"exampleFix":"# before — quoted string, rejected at load\nauto: \"false\"\n\n# after — bare boolean\nauto: false","handlingStrategy":"validation","validationCode":"if (config.auto !== undefined && typeof config.auto !== 'boolean') {\n  throw new Error('auto must be a real boolean before cordis.yml is loaded')\n}","typeGuard":"const isBooleanOrAbsent = (v: unknown): boolean =>\n  v === undefined || typeof v === 'boolean'","tryCatchPattern":null,"preventionTips":["Never quote booleans in YAML.","Dry-run generated config through the loader before deploy.","Watch environment-variable interpolation — it always yields strings."],"tags":["config","validation","yaml","boolean","compaction"],"backgroundTag":"config-validation-failed","analyzedSha":"b150a551b8d465e31e418e1b2eaf5e79bbb7d28e","analyzedAt":"2026-08-24T18:12:29.105Z","schemaVersion":2},"datasetVersion":"2026-08-24T22:17:12.610Z"}