feat(FN-4067): add squash audit gate to merger with integration tests

Adds a squash-merge audit gate that verifies duplicate-cherry-pick commits and file-overlap losses after any squash merge into main, restoring the post-squash audit step to the merge workflow with test coverage for both the audit logic and the broader merger lifecycle.

Fusion-Task-Id: FN-4067

Fusion-Task-Lineage: 593aa917-5640-495b-b1ae-80c3eaa09d01
This commit is contained in:
Fusion
2026-05-12 05:22:14 -07:00
committed by gsxdsm
parent 50c8ab35d7
commit fc863f6e96
10 changed files with 665 additions and 73 deletions

View File

@@ -663,6 +663,67 @@ describe("TaskStore", () => {
expect(respec.recoveryRetryCount).toBeUndefined();
expect(respec.nextRecoveryAt).toBeUndefined();
});
// FN-3964 regression: reopen transitions must clear paused state
it("clears paused and pausedByAgentId when reopening in-progress+paused task to todo", async () => {
const task = await store.createTask({ description: "test reopen clears paused" });
await store.moveTask(task.id, "todo");
await store.moveTask(task.id, "in-progress");
// Simulate a paused task (e.g., from a stuck/retry flow)
await store.updateTask(task.id, {
paused: true,
pausedByAgentId: "agent-test-001",
status: "failed",
error: "Something went wrong",
});
const moved = await store.moveTask(task.id, "todo");
expect(moved.column).toBe("todo");
expect(moved.paused).toBeUndefined();
expect(moved.pausedByAgentId).toBeUndefined();
expect(moved.status).toBeUndefined();
expect(moved.error).toBeUndefined();
});
it("clears paused and pausedByAgentId when reopening done+paused task to triage", async () => {
const task = await store.createTask({ description: "test reopen done to triage clears paused" });
await store.moveTask(task.id, "todo");
await store.moveTask(task.id, "in-progress");
await store.moveTask(task.id, "in-review");
await store.moveTask(task.id, "done");
// Simulate stale paused state on a done task
await store.updateTask(task.id, {
paused: true,
pausedByAgentId: "agent-test-002",
});
const reopened = await store.moveTask(task.id, "triage");
expect(reopened.column).toBe("triage");
expect(reopened.paused).toBeUndefined();
expect(reopened.pausedByAgentId).toBeUndefined();
});
it("clears paused when reopening in-review task to todo", async () => {
const task = await store.createTask({ description: "test reopen in-review to todo clears paused" });
await store.moveTask(task.id, "todo");
await store.moveTask(task.id, "in-progress");
await store.moveTask(task.id, "in-review");
// Simulate paused state during review
await store.updateTask(task.id, {
paused: true,
pausedByAgentId: "agent-test-003",
status: "failed",
error: "Review failed",
});
const retried = await store.moveTask(task.id, "todo");
expect(retried.column).toBe("todo");
expect(retried.paused).toBeUndefined();
expect(retried.pausedByAgentId).toBeUndefined();
});
});