{"record":{"id":"a3397d0036f44f59","repo":"JuliusBrussee/caveman","slug":"cave-invalid-lock","errorCode":"cave_invalid_lock","errorMessage":"cave_invalid_lock:${integrity.join(\",\")}","messagePattern":"cave_invalid_lock:(.+?)","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/agent/src/build.ts","lineNumber":526,"sourceCode":"  }\n  const lock = value as unknown as CaveBuildLock;\n  if (lock.schema_version !== 2 || lock.context_ir_schema !== \"1\" ||\n      !isRecord(lock.harness) || !exactKeys(lock.harness, [\"id\", \"adapter_version\", \"upstream_version\"]) ||\n      ![\"pi\", \"claude\", \"vercel-ai-sdk\", \"eve\", \"mastra\"].includes(lock.harness.id) ||\n      !isRecord(lock.runtime) || !exactKeys(lock.runtime, [\"caveman_version\", \"transform_registry_sha256\", \"external_provenance_sha256\"]) ||\n      !isRecord(lock.evidence) || !exactKeys(lock.evidence, [\n        \"status\", \"basis\", \"quality_retention_lcb95\", \"error_rate\", \"p95_latency_ms\",\n        \"catalog_cost_usd_per_task\", \"completed_runs\",\n      ]) ||\n      lock.evidence.status !== \"locked\" || lock.evidence.basis !== \"inferred\" ||\n      !isRecord(lock.selected_plan) || !exactKeys(lock.selected_plan, [\n        \"schema_version\", \"plan_id\", \"model\", \"reasoning\", \"segment_routes\",\n        \"budgets\", \"recovery\", \"fallbacks\",\n      ]) || !validPlanShape(lock.selected_plan)) {\n    throw new Error(\"cave_invalid_lock:shape\");\n  }\n  const integrity = lockIntegrityErrors(lock);\n  if (integrity.length > 0) throw new Error(`cave_invalid_lock:${integrity.join(\",\")}`);\n  return lock;\n}\n\nfunction validPlanShape(plan: Record<string, unknown>): boolean {\n  if (plan.schema_version !== 1 || typeof plan.plan_id !== \"string\" || typeof plan.model !== \"string\" ||\n      ![\"none\", \"minimal\", \"low\", \"medium\", \"high\"].includes(String(plan.reasoning)) ||\n      !isRecord(plan.budgets) || !exactKeys(plan.budgets, [\n        \"instructions\", \"tools\", \"memory\", \"history\", \"results_artifacts\",\n        \"reasoning\", \"output\", \"retry_cascade_reserve\",\n      ]) ||\n      Object.values(plan.budgets).some((value) => !Number.isSafeInteger(value) || Number(value) < 0) ||\n      !isRecord(plan.recovery) || !exactKeys(plan.recovery, [\"namespace\", \"tools\"]) ||\n      !isRecord(plan.fallbacks) || !exactKeys(plan.fallbacks, [\"unknown\", \"transform_error\", \"not_smaller\"]) ||\n      !Array.isArray(plan.segment_routes)) {\n    return false;\n  }\n  return plan.segment_routes.every((route) =>\n    isRecord(route) &&","sourceCodeStart":508,"sourceCodeEnd":544,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/3ee70a102609e550bd2e68004bf5990a9341c851/packages/agent/src/build.ts#L508-L544","documentation":"Raised by parseCaveBuildLock when the lock file is structurally valid but its integrity fields no longer match the current environment: embedded SHA-256 hashes (context_ir, eval_suite, transform_registry, external_provenance) or version stamps (runtime, adapter, upstream) differ from the computed current values. The joined suffix names which fields went stale.","triggerScenarios":"Thrown at packages/agent/src/build.ts:526 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Rebuild: run caveman build to regenerate the lock against the current context IR, eval suite, and runtime","If dependencies changed intentionally (caveman version, adapter, upstream), refresh the lock rather than reusing the old one","Do not hand-edit hash fields; they exist to force an honest rebuild"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"3ee70a102609e550bd2e68004bf5990a9341c851","analyzedAt":"2026-09-20T15:53:39.229Z","contentChangedAt":"2026-09-20T15:53:39.229Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}