{"record":{"id":"3807aa3064eab214","repo":"JuliusBrussee/caveman","slug":"cave-harness-upstream-version-mismatch","errorCode":"cave_harness_upstream_version_mismatch","errorMessage":"cave_harness_upstream_version_mismatch","messagePattern":"cave_harness_upstream_version_mismatch","errorType":"error_code","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/agent/src/adapters.ts","lineNumber":260,"sourceCode":"  session: EveSessionBinding,\n): HarnessAdapter {\n  assertSupportedUpstream(identity, EVE_VERSION, \"eve\", \"eve\");\n  return createHarnessAdapter(\"eve\", identity, {\n    package: \"eve/client\",\n    class: \"ClientSession\",\n    method: \"send.result\",\n    usage: \"step.completed.data.usage\",\n  }, async (request) => {\n    const startedAt = performance.now();\n    const response = await session.send({\n      message: request.prompt,\n      ...(request.signal === undefined ? {} : { signal: request.signal }),\n    });\n    const result = await response.result();\n    if (result.status !== \"completed\") throw new Error(`cave_eve_terminal_${result.status}`);\n    const identity = eveRuntimeIdentity(result.events);\n    if (identity.upstreamVersion !== request.build.harness.upstream_version) {\n      throw new Error(\"cave_harness_upstream_version_mismatch\");\n    }\n    const usage = usageFromEveEvents(result.events, request.plan.reasoning !== \"none\");\n    return harnessExecution({\n      request,\n      text: result.message ?? \"\",\n      provider: identity.provider,\n      model: identity.model,\n      usage,\n      latencyMs: Math.round(performance.now() - startedAt),\n    });\n  });\n}\n\nexport interface MastraAgentBinding {\n  generate(messages: string, options?: {\n    maxProcessorRetries?: number;\n    maxSteps?: number;\n    runId?: string;","sourceCodeStart":242,"sourceCodeEnd":278,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/766dce6b1394ebb56a3090748d5a0240a5aefb36/packages/agent/src/adapters.ts#L242-L278","documentation":"After a completed Eve run, the adapter extracts runtime identity from the (single) `session.started` event and compares its reported `eveVersion` against `request.build.harness.upstream_version` — the Eve version pinned in the Cave build lock. A mismatch means the session was actually served by a different Eve version than the locked build was compiled against, so all downstream evidence (usage, model identity) would be untrustworthy, and the adapter throws before reading usage.","triggerScenarios":"Build lock generated when the gateway ran Eve 0.29.1 while the live session reports 0.29.2; a rolling Eve deployment serving mixed versions across requests; a checked-in lock file gone stale after an upgrade.","commonSituations":"Stale lock after an Eve upgrade; lock generated in CI against a different Eve deployment than production; long-lived cached locks that nobody regenerates on release.","solutions":["Regenerate the build lock against the currently deployed Eve version so `build.harness.upstream_version` matches the runtime","Align Eve versions across environments, or finish rolling upgrades before running locked executions","If the lock pin is intentional, deploy the Eve runtime at exactly that pinned version"],"exampleFix":"// before — lock built when the gateway ran 0.29.1, runtime now reports 0.29.2\n// build.harness.upstream_version: \"0.29.1\"\n// after — rebuild the lock against the live runtime\n// build.harness.upstream_version: \"0.29.2\"","handlingStrategy":"validation","validationCode":"// probe the live runtime's version and compare to the lock before locked runs\nconst probe = await session.send({ message: 'ping' });\nconst started = (await probe.result()).events\n  .find((ev) => (ev as { type?: string })?.type === 'session.started');\nconst eveVersion = started?.data?.runtime?.eveVersion;\nif (eveVersion !== lock.harness.upstream_version) {\n  throw new Error(`eve lock drift: lock=${lock.harness.upstream_version} runtime=${eveVersion}`);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Regenerate the build lock on every Eve release; treat the lock as tied to the deployed runtime","Run a CI drift check comparing the lock's upstream_version to the live gateway runtime","Pause locked executions during Eve rolling upgrades until versions homogenize"],"tags":["typescript","version-mismatch","build-lock","eve","reproducibility"],"backgroundTag":"dependency-version-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"}