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 000000000..557714d95 --- /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 f25c47261..836e706e9 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. `