diff --git a/src/lab/observe/from-conformance.ts b/src/lab/observe/from-conformance.ts index 9c6e686de..9efbf492b 100644 --- a/src/lab/observe/from-conformance.ts +++ b/src/lab/observe/from-conformance.ts @@ -130,6 +130,8 @@ function upstreamAdapter(protocol: string): string { return "anthropic"; case "openai-chat": return "openai-chat"; + case "cursor-protobuf": + return "cursor-protobuf"; default: throw new Error(`unsupported protocol identity: ${protocol}`); } diff --git a/tests/lab-evidence-ledger.test.ts b/tests/lab-evidence-ledger.test.ts index 9678c9dd4..caf0f2218 100644 --- a/tests/lab-evidence-ledger.test.ts +++ b/tests/lab-evidence-ledger.test.ts @@ -659,6 +659,25 @@ describe("CL-02 projection rebuild determinism", () => { }); describe("CL-02 CL-01 integration", () => { + test("mcp-core cursor-protobuf result produces protocol evidence", () => { + withHome((home) => { + const authority = loadCaseAuthority(); + const caseRecord = discoverScenarios(authority, ["mcp-core"]).find( + (c) => c.id === "mcp-core.protocol.namespace-mapping", + )!; + + const { event } = observationFromConformanceResult( + syntheticPassResult(caseRecord), + caseRecord, + authority, + { configDir: home }, + ); + + expect(event.subject.effectiveAdapter).toBe("cursor-protobuf"); + expect(event.subject.upstreamProtocol).toBe("cursor-protobuf"); + }); + }); + test("run → observation → JSONL → replay → SQLite protocol projection", async () => { await withHome(async (home) => { const authority = loadCaseAuthority(); @@ -1158,4 +1177,4 @@ describe("CL-02 phase-2 review regressions", () => { closeTrustedArtifactDir(dir); }); }); -}); \ No newline at end of file +});