test(FN-4746): complete Step 3 — cover wake trigger diagnostics

Fusion-Task-Id: FN-4746
Fusion-Task-Lineage: 04107d0d-4319-4270-8480-7a98341a966d
This commit is contained in:
Fusion (runfusion.ai)
2026-05-16 09:20:32 -07:00
committed by gsxdsm
parent a152076f1b
commit de714b8880

View File

@@ -29,6 +29,7 @@ vi.mock("../pi.js", () => ({
}),
}));
import { createFnAgent } from "../pi.js";
import { heartbeatLog } from "../logger.js";
import { acquireTaskWorktree } from "../worktree-acquisition.js";
const mockedCreateFnAgent = vi.mocked(createFnAgent);
const mockedAcquireTaskWorktree = vi.mocked(acquireTaskWorktree);
@@ -1576,6 +1577,7 @@ describe("executeHeartbeat", () => {
describe("executeHeartbeat - message processing", () => {
it("keeps message_received wake reason when wake-on-message inbox is non-empty", async () => {
vi.mocked(heartbeatLog.log).mockClear();
const store = createStoreWithAgentForExec();
const mockSession = createMockAgentSession();
mockedCreateFnAgent.mockResolvedValue({ session: mockSession as any });
@@ -1613,6 +1615,13 @@ describe("executeHeartbeat", () => {
agentId: "agent-001",
source: "on_demand",
triggerDetail: "wake-on-message",
wakeMessage: {
messageId: "msg-1",
fromType: "user",
fromId: "user-1",
forced: false,
createdAt: "2024-01-15T10:30:00.000Z",
},
});
expect(result.status).toBe("completed");
@@ -1632,14 +1641,19 @@ describe("executeHeartbeat", () => {
// assigned task (paperclip-parity).
expect(executionPrompt).toContain("## Wake Delta");
expect(executionPrompt).toContain("wake reason: message_received");
expect(executionPrompt).toContain("- pending messages: 2");
expect(executionPrompt).toContain("- inbox snapshot: 2 message(s)");
expect(executionPrompt).toContain("wake trigger source: message msg-1 from user:user-1, still unread");
expect(executionPrompt).toContain("- pending messages: 2");
expect(executionPrompt).toContain("autonomous heartbeat run");
expect(executionPrompt).toContain(HEARTBEAT_PROCEDURE);
expect(executionPrompt).toContain("do not re-read PROMPT.md to advance it");
expect(vi.mocked(heartbeatLog.log)).toHaveBeenCalledWith(
expect.stringMatching(/\[wake-trigger-diagnostics\].*messageId=msg-1.*inboxUnreadCount=2.*wakeMessageStillUnread=true/),
);
});
it("annotates wake-on-message with already-consumed reason when inbox snapshot is empty", async () => {
vi.mocked(heartbeatLog.log).mockClear();
const store = createStoreWithAgentForExec();
const mockSession = createMockAgentSession();
mockedCreateFnAgent.mockResolvedValue({ session: mockSession as any });
@@ -1661,18 +1675,30 @@ describe("executeHeartbeat", () => {
agentId: "agent-001",
source: "on_demand",
triggerDetail: "wake-on-message",
wakeMessage: {
messageId: "msg-empty-1",
fromType: "user",
fromId: "user-empty",
forced: false,
createdAt: "2024-01-15T12:00:00.000Z",
},
});
expect(result.status).toBe("completed");
const promptCalls = mockSession.prompt.mock.calls;
const executionPrompt = promptCalls[promptCalls.length - 1][0];
expect(executionPrompt).toContain("wake reason: message_received_already_consumed");
expect(executionPrompt).toContain("- pending messages: 0");
expect(executionPrompt).toContain("- inbox snapshot: empty (already consumed)");
expect(executionPrompt).toContain("wake trigger source: message msg-empty-1 from user:user-empty, already consumed at snapshot");
expect(executionPrompt).toContain("- pending messages: 0");
expect(executionPrompt).not.toContain("wake reason: message_received\n");
expect(vi.mocked(heartbeatLog.log)).toHaveBeenCalledWith(
expect.stringMatching(/\[wake-trigger-diagnostics\].*messageId=msg-empty-1.*inboxUnreadCount=0.*wakeMessageStillUnread=false/),
);
});
it("annotates forced wake-on-message with urgent already-consumed reason when inbox snapshot is empty", async () => {
vi.mocked(heartbeatLog.log).mockClear();
const store = createStoreWithAgentForExec();
const mockSession = createMockAgentSession();
mockedCreateFnAgent.mockResolvedValue({ session: mockSession as any });
@@ -1694,14 +1720,25 @@ describe("executeHeartbeat", () => {
agentId: "agent-001",
source: "on_demand",
triggerDetail: "wake-on-message-forced",
wakeMessage: {
messageId: "msg-forced-1",
fromType: "user",
fromId: "user-forced",
forced: true,
createdAt: "2024-01-15T13:00:00.000Z",
},
});
expect(result.status).toBe("completed");
const promptCalls = mockSession.prompt.mock.calls;
const executionPrompt = promptCalls[promptCalls.length - 1][0];
expect(executionPrompt).toContain("wake reason: message_received_urgent_already_consumed");
expect(executionPrompt).toContain("- pending messages: 0");
expect(executionPrompt).toContain("- inbox snapshot: empty (already consumed)");
expect(executionPrompt).toContain("wake trigger source: message msg-forced-1 from user:user-forced (forced), already consumed at snapshot");
expect(executionPrompt).toContain("- pending messages: 0");
expect(vi.mocked(heartbeatLog.log)).toHaveBeenCalledWith(
expect.stringMatching(/\[wake-trigger-diagnostics\].*messageId=msg-forced-1.*forced=true.*inboxUnreadCount=0.*wakeMessageStillUnread=false/),
);
});
it("substitutes per-agent heartbeatProcedurePath content for the default procedure", async () => {