{"record":{"id":"05c95d0efdb95bf8","repo":"JuliusBrussee/caveman","slug":"cave-eve-runtime-identity-missing","errorCode":"cave_eve_runtime_identity_missing","errorMessage":"cave_eve_runtime_identity_missing","messagePattern":"cave_eve_runtime_identity_missing","errorType":"error_code","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/agent/src/adapters.ts","lineNumber":480,"sourceCode":"    totalTokens: strictInteger(value.totalTokens, error),\n  };\n  if (usage.totalTokens !== usage.inputTokens + usage.outputTokens +\n      usage.cacheReadTokens + usage.cacheWriteTokens ||\n      usage.reasoningTokens > usage.outputTokens) {\n    throw new Error(error);\n  }\n  return usage;\n}\n\nfunction eveRuntimeIdentity(events: unknown[]): {\n  provider: string;\n  model: string;\n  upstreamVersion: string;\n} {\n  const starts = events.filter((event) =>\n    isRecord(event) && event.type === \"session.started\" && isRecord(event.data) &&\n    isRecord(event.data.runtime));\n  if (starts.length !== 1) throw new Error(\"cave_eve_runtime_identity_missing\");\n  const runtime = (starts[0] as { data: { runtime: Record<string, unknown> } }).data.runtime;\n  if (typeof runtime.modelId !== \"string\" || runtime.modelId.length === 0 ||\n      runtime.modelId.startsWith(\"dynamic:\")) {\n    throw new Error(\"cave_eve_runtime_identity_missing\");\n  }\n  const separator = runtime.modelId.indexOf(\"/\");\n  if (separator < 1 || separator === runtime.modelId.length - 1 ||\n      typeof runtime.eveVersion !== \"string\" || runtime.eveVersion.length === 0) {\n    throw new Error(\"cave_eve_runtime_identity_missing\");\n  }\n  return {\n    provider: runtime.modelId.slice(0, separator),\n    model: runtime.modelId.slice(separator + 1),\n    upstreamVersion: runtime.eveVersion,\n  };\n}\n\nfunction expectedProviderModel(plan: CavePlan): { provider: string; model: string } {","sourceCodeStart":462,"sourceCodeEnd":498,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/766dce6b1394ebb56a3090748d5a0240a5aefb36/packages/agent/src/adapters.ts#L462-L498","documentation":"`eveRuntimeIdentity` scans the session's events for `session.started` events that carry a `data.runtime` record and requires exactly one. Zero matches (no `session.started`, or one without a `runtime` object) or more than one (concatenated or replayed logs, merged sessions) throws `cave_eve_runtime_identity_missing` at line 480. That single event is what makes provider/model/upstreamVersion identity provable, so ambiguity or absence is fatal to the evidence chain.","triggerScenarios":"An event log filtered so `session.started` is dropped; replaying or concatenating two sessions' event arrays into one; middleware merging duplicate start events; a runtime record renamed by an Eve version change.","commonSituations":"Event-logging pipelines with allowlists that miss `session.started`; tests replaying recorded event fixtures with duplicates; aggregators appending events from multiple sessions.","solutions":["Inspect `result.events` and assert exactly one `{ type: 'session.started', data: { runtime: { … } } }` exists","Remove any dedup/merge logic that duplicates or drops `session.started`","Confirm the runtime populates `data.runtime` on session start for the pinned Eve version (0.29.2)"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// probe: the session must yield exactly one session.started with a runtime\nconst events = (await (await session.send({ message: 'ping' })).result()).events;\nconst starts = events.filter((ev) =>\n  ev?.type === 'session.started' && ev?.data?.runtime && typeof ev.data.runtime === 'object');\nif (starts.length !== 1) {\n  throw new Error(`expected 1 session.started with runtime, got ${starts.length}`);\n}","typeGuard":"function hasSingleSessionStart(events: unknown[]): boolean {\n  return events.filter((ev) => {\n    const e = ev as { type?: string; data?: { runtime?: unknown } };\n    return e?.type === 'session.started' &&\n      typeof e.data?.runtime === 'object' && e.data.runtime !== null;\n  }).length === 1;\n}","tryCatchPattern":null,"preventionTips":["Never filter, merge, or replay Eve event logs in front of the adapter","Add session.started to any event-pipeline allowlist","Assert the single-start invariant in recorded-fixture tests before replay"],"tags":["typescript","eve","session-events","model-identity"],"backgroundTag":"missing-model-identity","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"}