{"record":{"id":"d897cc39365912d6","repo":"JuliusBrussee/caveman","slug":"cave-harness-transform-not-evaluated","errorCode":"cave_harness_transform_not_evaluated","errorMessage":"cave_harness_transform_not_evaluated","messagePattern":"cave_harness_transform_not_evaluated","errorType":"error_code","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/agent/src/adapters.ts","lineNumber":676,"sourceCode":"  });\n}\n\nfunction validateTransformEvidence(\n  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\");","sourceCodeStart":658,"sourceCodeEnd":694,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/766dce6b1394ebb56a3090748d5a0240a5aefb36/packages/agent/src/adapters.ts#L658-L694","documentation":"Every transform_id selected in plan.segment_routes must appear in the request's evaluatedTransformIDs. One selected transform the request does not claim to have evaluated means execution would skip part of the locked plan, so the adapter rejects the request.","triggerScenarios":"adapter.run() where evaluatedTransformIDs omits an ID present in plan.segment_routes[].transform_id — e.g. hand-assembling the list, or reusing an old request alongside a regenerated plan that selected a new transform.","commonSituations":"Plan rebuilt after a source change adds a transform route while the caller's evaluated/applied lists come from a cached prior request; partially copying transform IDs; filtering IDs by mistake.","solutions":["Derive evaluatedTransformIDs from the same plan you pass in: [...new Set(plan.segment_routes.map(r => r.transform_id))]","Regenerate both transform-ID lists whenever the plan is rebuilt","Diff selected vs evaluated sets before run() (see defense below)"],"exampleFix":"// before\nawait adapter.run({ ...req, plan, evaluatedTransformIDs: [\"t1\"] });\n// plan.segment_routes selects t1 and t2\n\n// after\nconst ids = [...new Set(plan.segment_routes.map((r) => r.transform_id))];\nawait adapter.run({ ...req, plan, evaluatedTransformIDs: ids, appliedTransformIDs: ids });","handlingStrategy":"validation","validationCode":"const selected = [...new Set(plan.segment_routes.map((r) => r.transform_id))];\nconst evaluated = [...new Set(request.evaluatedTransformIDs)];\nconst missing = selected.filter((id) => !evaluated.includes(id));\nif (missing.length > 0) {\n  throw new Error(`transform IDs not evaluated: ${missing.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_transform_not_evaluated\") {\n    // A plan-selected transform is absent from evaluatedTransformIDs —\n    // recompute both ID lists from the current plan and retry.\n  }\n  throw error;\n}","preventionTips":["Derive evaluatedTransformIDs from the same plan object passed to run()","Regenerate transform-ID lists whenever the plan is rebuilt","Never hand-edit or trim the evaluated list"],"tags":["evidence","transform-ids","plan","adapter"],"backgroundTag":"transform-evidence-missing","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"}