test(scrutiny): fix missing MissionExecutionLoop mock in serve.test.ts

Add MissionExecutionLoop mock to @fusion/engine vi.mock block in
serve.test.ts. The mock provides start, stop, processTaskOutcome,
and recoverActiveMissions methods to match the actual class interface.

Also adds the scrutiny synthesis report for milestone execution-loop
which identifies 3 blocking issues in FEAT-004:
- parseValidationResult stub always returns pass
- notifyValidationComplete passes featureId instead of taskId
- recoverActiveMissions doesn't perform state transitions

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
This commit is contained in:
gsxdsm
2026-04-11 18:37:49 -07:00
parent bc3688badf
commit 89abece8cb
3 changed files with 153 additions and 0 deletions

View File

@@ -25,6 +25,7 @@ const mocks = vi.hoisted(() => {
const selfHealingInstances: any[] = [];
const cronRunnerInstances: any[] = [];
const missionAutopilotInstances: any[] = [];
const missionExecutionLoopInstances: any[] = [];
const notifierInstances: any[] = [];
const pluginStoreInstances: any[] = [];
const pluginLoaderInstances: any[] = [];
@@ -194,6 +195,17 @@ const mocks = vi.hoisted(() => {
return autopilot;
});
const missionExecutionLoopCtor = vi.fn().mockImplementation(() => {
const loop = {
start: vi.fn().mockResolvedValue(undefined),
stop: vi.fn().mockResolvedValue(undefined),
processTaskOutcome: vi.fn().mockResolvedValue(undefined),
recoverActiveMissions: vi.fn().mockResolvedValue(undefined),
};
missionExecutionLoopInstances.push(loop);
return loop;
});
const notifierCtor = vi.fn().mockImplementation(() => {
const notifier = {
start: vi.fn(),
@@ -253,6 +265,7 @@ const mocks = vi.hoisted(() => {
selfHealingInstances,
cronRunnerInstances,
missionAutopilotInstances,
missionExecutionLoopInstances,
notifierInstances,
listenCalls,
taskStoreCtor,
@@ -267,6 +280,7 @@ const mocks = vi.hoisted(() => {
selfHealingCtor,
cronRunnerCtor,
missionAutopilotCtor,
missionExecutionLoopCtor,
notifierCtor,
pluginStoreCtor,
pluginLoaderCtor,
@@ -284,6 +298,7 @@ const mocks = vi.hoisted(() => {
selfHealingInstances.length = 0;
cronRunnerInstances.length = 0;
missionAutopilotInstances.length = 0;
missionExecutionLoopInstances.length = 0;
notifierInstances.length = 0;
pluginStoreInstances.length = 0;
pluginLoaderInstances.length = 0;
@@ -344,6 +359,7 @@ vi.mock("@fusion/engine", () => ({
StuckTaskDetector: mocks.stuckDetectorCtor,
SelfHealingManager: mocks.selfHealingCtor,
MissionAutopilot: mocks.missionAutopilotCtor,
MissionExecutionLoop: mocks.missionExecutionLoopCtor,
createAiPromptExecutor: vi.fn().mockResolvedValue(vi.fn().mockResolvedValue("ok")),
HeartbeatMonitor: vi.fn().mockImplementation(() => ({
start: vi.fn(),