{"record":{"id":"fef319c19a79b3f3","repo":"JuliusBrussee/caveman","slug":"cave-harness-unknown-transform","errorCode":"cave_harness_unknown_transform","errorMessage":"cave_harness_unknown_transform","messagePattern":"cave_harness_unknown_transform","errorType":"error_code","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/agent/src/adapters.ts","lineNumber":680,"sourceCode":"  evidence: Pick<HarnessRequest, \"evaluatedTransformIDs\" | \"appliedTransformIDs\" | \"recoveryResolved\">,\n  plan: CavePlan,\n): void {\n  if (!Array.isArray(evidence.evaluatedTransformIDs) ||\n      !Array.isArray(evidence.appliedTransformIDs) ||\n      evidence.evaluatedTransformIDs.some((value) => typeof value !== \"string\" || value.length === 0) ||\n      evidence.appliedTransformIDs.some((value) => typeof value !== \"string\" || value.length === 0) ||\n      evidence.recoveryResolved !== true) {\n    throw new Error(\"cave_harness_incomplete_evidence\");\n  }\n  const selected = [...new Set(plan.segment_routes.map((route) => route.transform_id))].sort();\n  const evaluated = [...new Set(evidence.evaluatedTransformIDs)].sort();\n  const applied = [...new Set(evidence.appliedTransformIDs)].sort();\n  if (selected.some((transformID) => !evaluated.includes(transformID))) {\n    throw new Error(\"cave_harness_transform_not_evaluated\");\n  }\n  if (evaluated.some((transformID) => !selected.includes(transformID)) ||\n      applied.some((transformID) => !selected.includes(transformID))) {\n    throw new Error(\"cave_harness_unknown_transform\");\n  }\n}\n\nfunction validateExecution(execution: HarnessExecution, plan: CavePlan): void {\n  const [provider, ...modelParts] = plan.model.split(\"/\");\n  const model = modelParts.join(\"/\");\n  try {\n    validateProviderUsage(execution, {\n      expected: { provider: provider ?? \"\", model },\n      reportedCostUsd: execution.costUsd,\n      requirePriced: true,\n    });\n  } catch {\n    throw new Error(\"cave_harness_incomplete_evidence\");\n  }\n  if (execution.terminal !== true || typeof execution.text !== \"string\" ||\n      execution.text.length === 0 ||\n      execution.usageBasis !== \"provider_reported\" ||","sourceCodeStart":662,"sourceCodeEnd":698,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/766dce6b1394ebb56a3090748d5a0240a5aefb36/packages/agent/src/adapters.ts#L662-L698","documentation":"evaluatedTransformIDs and appliedTransformIDs may only contain transform IDs that the locked plan selected (plan.segment_routes[].transform_id). An ID absent from the selected set is an unauthorized claim of work the plan never approved, so the adapter throws cave_harness_unknown_transform.","triggerScenarios":"adapter.run() where either list contains a stale transform ID from a different/older plan, or IDs concatenated from another run's evidence, while validateTransformEvidence's selected-set comparison finds extras.","commonSituations":"Caching or persisting transform-ID lists across plan rebuilds; merging evidence lists from parallel runs; renaming a transform so old IDs linger in config.","solutions":["Recompute both lists from the current plan's segment_routes instead of caching them","Never merge transform evidence across runs or plans","Validate both directions of the set comparison before run() (see defense below)"],"exampleFix":"// before\nawait adapter.run({ ...req, evaluatedTransformIDs: [\"t1\", \"t9-old\"] });\n\n// after\nconst selected = [...new Set(plan.segment_routes.map((r) => r.transform_id))];\nawait adapter.run({ ...req, evaluatedTransformIDs: selected, appliedTransformIDs: selected });","handlingStrategy":"validation","validationCode":"const selected = [...new Set(plan.segment_routes.map((r) => r.transform_id))];\nconst evaluated = [...new Set(request.evaluatedTransformIDs)];\nconst applied = [...new Set(request.appliedTransformIDs)];\nconst unknown = [...evaluated, ...applied].filter((id) => !selected.includes(id));\nif (unknown.length > 0) {\n  throw new Error(`transform IDs not in plan: ${unknown.join(\", \")}`);\n}","typeGuard":null,"tryCatchPattern":"try {\n  const result = await adapter.run(request);\n} catch (error) {\n  if (error instanceof Error && error.message === \"cave_harness_unknown_transform\") {\n    // Evidence contains transform IDs the plan never selected — the lists\n    // are stale (likely from another plan); recompute from the current plan.\n  }\n  throw error;\n}","preventionTips":["Never cache or persist transform-ID lists across plan rebuilds","Never merge evidence lists from different runs or plans","After renaming a transform, purge old IDs from every config that carries them"],"tags":["evidence","transform-ids","plan","adapter"],"backgroundTag":"transform-evidence-mismatch","analyzedSha":"766dce6b1394ebb56a3090748d5a0240a5aefb36","analyzedAt":"2026-08-18T03:14:35.516Z","contentChangedAt":"2026-08-18T03:14:35.516Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}