diff --git a/src/resources/extensions/sf/tests/escalation-feature.test.ts b/src/resources/extensions/sf/tests/escalation-feature.test.ts index fec3a10d7..ecba864a5 100644 --- a/src/resources/extensions/sf/tests/escalation-feature.test.ts +++ b/src/resources/extensions/sf/tests/escalation-feature.test.ts @@ -298,4 +298,54 @@ describe("claimOverrideForInjection (carry-forward)", () => { assert.equal(after?.escalation_awaiting_review, 0); assert.equal(after?.escalation_artifact_path, before); }); + + test("resolveEscalation persists choice + rationale as a memory", async () => { + writeEscalationArtifact(dir, buildEscalationArtifact(baseArtifact)); + const result = resolveEscalation( + dir, + "M001", + "S01", + "T01", + "fail", + "explicit user rationale here", + ); + assert.equal(result.status, "resolved"); + const { getActiveMemories } = await import("../memory-store.ts"); + const memories = getActiveMemories(); + assert.ok( + memories.length >= 1, + `expected at least 1 memory, got ${memories.length}`, + ); + const escalationMemory = memories.find((m) => + m.content.startsWith("[escalation:T01]"), + ); + assert.ok(escalationMemory, "no [escalation:T01] memory was written"); + assert.equal(escalationMemory!.category, "architecture"); + assert.match(escalationMemory!.content, /Overwrite or fail\?/); + assert.match(escalationMemory!.content, /Chose:/); + assert.match(escalationMemory!.content, /explicit user rationale here/); + }); + + test("auto-mode resolveEscalation falls back to recommendationRationale when no user rationale", async () => { + writeEscalationArtifact(dir, buildEscalationArtifact(baseArtifact)); + resolveEscalation( + dir, + "M001", + "S01", + "T01", + "accept", + "", // empty rationale — should fall back to art.recommendationRationale + ); + const { getActiveMemories } = await import("../memory-store.ts"); + const memories = getActiveMemories(); + const escalationMemory = memories.find((m) => + m.content.startsWith("[escalation:T01]"), + ); + assert.ok(escalationMemory); + assert.match( + escalationMemory!.content, + /data loss is irreversible/, + "empty user rationale should fall back to recommendationRationale", + ); + }); });