{"record":{"id":"5e5ce860f5b7f40b","repo":"JuliusBrussee/caveman","slug":"cave-invalid-lock-shape","errorCode":null,"errorMessage":"cave_invalid_lock:shape","messagePattern":"cave_invalid_lock:shape","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/agent/src/build.ts","lineNumber":507,"sourceCode":"  if (lock.context_ir_sha256 !== current.contextIRSha256) stale.push(\"context_ir\");\n  if (lock.eval_suite_sha256 !== current.evalSuiteSha256) stale.push(\"eval_suite\");\n  if (lock.runtime.caveman_version !== current.runtimeVersion) stale.push(\"runtime\");\n  if (lock.harness.adapter_version !== current.adapterVersion) stale.push(\"adapter\");\n  if (lock.harness.upstream_version !== current.upstreamVersion) stale.push(\"upstream\");\n  if (lock.runtime.transform_registry_sha256 !== current.transformRegistrySha256) stale.push(\"transform_registry\");\n  if (lock.runtime.external_provenance_sha256 !== (current.externalProvenanceSha256 ?? \"\")) stale.push(\"external_provenance\");\n  if (lock.catalog_sha256 !== current.catalogSha256) stale.push(\"catalog\");\n  return { valid: stale.length === 0, stale };\n}\n\nexport function parseCaveBuildLock(value: unknown): CaveBuildLock {\n  if (!isRecord(value) || !exactKeys(value, [\n    \"schema_version\", \"agent_id\", \"build_sha256\", \"plan_sha256\", \"source_sha256\",\n    \"agent_definition_sha256\", \"context_ir_sha256\", \"eval_suite_sha256\",\n    \"context_ir_schema\", \"harness\", \"runtime\", \"catalog_sha256\",\n    \"baseline_plan_id\", \"selected_plan_id\", \"selected_plan\", \"evidence\",\n  ])) {\n    throw new Error(\"cave_invalid_lock:shape\");\n  }\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);","sourceCodeStart":489,"sourceCodeEnd":525,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/27d5a3981a347890211bb1bf2439e5c821a63bc9/packages/agent/src/build.ts#L489-L525","documentation":"Error \"cave_invalid_lock:shape\" thrown in JuliusBrussee/caveman.","triggerScenarios":"Thrown at packages/agent/src/build.ts:507 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["The build lock shape is invalid; run npm run build to regenerate a well-formed lock."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"27d5a3981a347890211bb1bf2439e5c821a63bc9","analyzedAt":"2026-08-15T09:26:11.751Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}