From 6fa5cac616698e27fb97d0d9f7b2bead54e59c75 Mon Sep 17 00:00:00 2001 From: justsisyphus Date: Tue, 27 Jan 2026 09:25:55 +0900 Subject: [PATCH] fix(compaction): preserve agent verification state (#1144) --- .../compaction-context-injector/index.test.ts | 93 +++++++++++++++++++ .../compaction-context-injector/index.ts | 9 ++ 2 files changed, 102 insertions(+) create mode 100644 src/hooks/compaction-context-injector/index.test.ts diff --git a/src/hooks/compaction-context-injector/index.test.ts b/src/hooks/compaction-context-injector/index.test.ts new file mode 100644 index 00000000..557714d9 --- /dev/null +++ b/src/hooks/compaction-context-injector/index.test.ts @@ -0,0 +1,93 @@ +import { describe, expect, it, mock, beforeEach } from "bun:test" + +// Mock dependencies before importing +const mockInjectHookMessage = mock(() => true) +mock.module("../../features/hook-message-injector", () => ({ + injectHookMessage: mockInjectHookMessage, +})) + +mock.module("../../shared/logger", () => ({ + log: () => {}, +})) + +mock.module("../../shared/system-directive", () => ({ + createSystemDirective: (type: string) => `[DIRECTIVE:${type}]`, + SystemDirectiveTypes: { COMPACTION_CONTEXT: "COMPACTION_CONTEXT" }, +})) + +import { createCompactionContextInjector } from "./index" +import type { SummarizeContext } from "./index" + +describe("createCompactionContextInjector", () => { + beforeEach(() => { + mockInjectHookMessage.mockClear() + }) + + describe("Agent Verification State preservation", () => { + it("includes Agent Verification State section in compaction prompt", async () => { + // given + const injector = createCompactionContextInjector() + const context: SummarizeContext = { + sessionID: "test-session", + providerID: "anthropic", + modelID: "claude-sonnet-4-5", + usageRatio: 0.85, + directory: "/test/dir", + } + + // when + await injector(context) + + // then + expect(mockInjectHookMessage).toHaveBeenCalledTimes(1) + const calls = mockInjectHookMessage.mock.calls as unknown as [string, string, unknown][] + const injectedPrompt = calls[0]?.[1] ?? "" + expect(injectedPrompt).toContain("Agent Verification State") + expect(injectedPrompt).toContain("Current Agent") + expect(injectedPrompt).toContain("Verification Progress") + }) + + it("includes Momus-specific context for reviewer agents", async () => { + // given + const injector = createCompactionContextInjector() + const context: SummarizeContext = { + sessionID: "test-session", + providerID: "anthropic", + modelID: "claude-sonnet-4-5", + usageRatio: 0.9, + directory: "/test/dir", + } + + // when + await injector(context) + + // then + const calls = mockInjectHookMessage.mock.calls as unknown as [string, string, unknown][] + const injectedPrompt = calls[0]?.[1] ?? "" + expect(injectedPrompt).toContain("Previous Rejections") + expect(injectedPrompt).toContain("Acceptance Status") + expect(injectedPrompt).toContain("reviewer agents") + }) + + it("preserves file verification progress in compaction prompt", async () => { + // given + const injector = createCompactionContextInjector() + const context: SummarizeContext = { + sessionID: "test-session", + providerID: "anthropic", + modelID: "claude-sonnet-4-5", + usageRatio: 0.95, + directory: "/test/dir", + } + + // when + await injector(context) + + // then + const calls = mockInjectHookMessage.mock.calls as unknown as [string, string, unknown][] + const injectedPrompt = calls[0]?.[1] ?? "" + expect(injectedPrompt).toContain("Pending Verifications") + expect(injectedPrompt).toContain("Files already verified") + }) + }) +}) diff --git a/src/hooks/compaction-context-injector/index.ts b/src/hooks/compaction-context-injector/index.ts index f25c4726..836e706e 100644 --- a/src/hooks/compaction-context-injector/index.ts +++ b/src/hooks/compaction-context-injector/index.ts @@ -45,6 +45,15 @@ When summarizing this session, you MUST include the following sections in your s - User's explicit restrictions or preferences - Anti-patterns identified during the session +## 7. Agent Verification State (Critical for Reviewers) +- **Current Agent**: What agent is running (momus, oracle, etc.) +- **Verification Progress**: Files already verified/validated +- **Pending Verifications**: Files still needing verification +- **Previous Rejections**: If reviewer agent, what was rejected and why +- **Acceptance Status**: Current state of review process + +This section is CRITICAL for reviewer agents (momus, oracle) to maintain continuity. + This context is critical for maintaining continuity after compaction. `