diff --git a/packages/dashboard/src/__tests__/routes-github.test.ts b/packages/dashboard/src/__tests__/routes-github.test.ts index 537ac7ccaa..5242eaeb99 100644 --- a/packages/dashboard/src/__tests__/routes-github.test.ts +++ b/packages/dashboard/src/__tests__/routes-github.test.ts @@ -211,6 +211,12 @@ function createMockStore(overrides: Partial = {}): TaskStore { getSettingsByScopeFast: vi.fn().mockResolvedValue({ global: {}, project: {} }), getGlobalSettingsStore: vi.fn().mockReturnValue(createMockGlobalSettingsStore()), logEntry: vi.fn().mockResolvedValue(undefined), + /* + FNXC:TaskCreateDedup 2026-07-18-15:55: + FN-8277 parent-scoped uniqueness pre-check requires findRecentTasksBySourceParentTaskId; + default empty so subtask create-tasks routes return 201 under mock stores. + */ + findRecentTasksBySourceParentTaskId: vi.fn().mockResolvedValue([]), // FNXC:GitHubImportAttachments 2026-07-15-11:20: import downloads issue screenshots into task attachments. addAttachment: vi.fn().mockResolvedValue(undefined), getAgentLogs: vi.fn().mockResolvedValue([]), diff --git a/packages/dashboard/src/__tests__/routes-planning.test.ts b/packages/dashboard/src/__tests__/routes-planning.test.ts index 41259943a4..7b99d00a9a 100644 --- a/packages/dashboard/src/__tests__/routes-planning.test.ts +++ b/packages/dashboard/src/__tests__/routes-planning.test.ts @@ -219,6 +219,12 @@ function createMockStore(overrides: Partial = {}): TaskStore { getSettingsByScopeFast: vi.fn().mockResolvedValue({ global: {}, project: {} }), getGlobalSettingsStore: vi.fn().mockReturnValue(createMockGlobalSettingsStore()), logEntry: vi.fn().mockResolvedValue(undefined), + /* + FNXC:TaskCreateDedup 2026-07-18-15:55: + FN-8277 parent-scoped uniqueness pre-check requires findRecentTasksBySourceParentTaskId; + default empty so planning create-task / subtask routes return 201 under mock stores. + */ + findRecentTasksBySourceParentTaskId: vi.fn().mockResolvedValue([]), getAgentLogs: vi.fn().mockResolvedValue([]), getAgentLogCount: vi.fn().mockResolvedValue(0), getAgentLogsByTimeRange: vi.fn().mockResolvedValue([]), diff --git a/packages/dashboard/src/test/mockCoreEngine.ts b/packages/dashboard/src/test/mockCoreEngine.ts index 3729d6a6ae..f2f4032f35 100644 --- a/packages/dashboard/src/test/mockCoreEngine.ts +++ b/packages/dashboard/src/test/mockCoreEngine.ts @@ -79,6 +79,24 @@ export function createEngineMock(overrides: AnyModule = {}): AnyModule { )), // FNXC:McpConfig 2026-07-02-13:45: Planning/mission route tests share this engine mock; MCP resolution must return the full shaped empty result so readonly session creation can proceed without importing real engine stores. resolveMcpServersForStore: vi.fn(async () => ({ servers: [], errors: [] })), + /* + FNXC:TaskCreateDedup 2026-07-18-15:55: + FN-8277 routes planning/subtask creation through createAgentTask. The wholesale + @fusion/engine mock previously fell back to vi.fn() → undefined, so + `const { task } = await createAgentTask(...)` threw. Default to a thin wrapper + that uses the real store.createTask and reports wasDuplicate:false. + */ + createAgentTask: vi.fn(async ( + store: { createTask?: (input: unknown, options?: unknown) => Promise }, + input: unknown, + _options?: unknown, + ) => { + if (typeof store?.createTask !== "function") { + throw new Error("createAgentTask mock requires store.createTask"); + } + const task = await store.createTask(input, { settings: {} }); + return { task, wasDuplicate: false }; + }), ...overrides, }); } diff --git a/packages/engine/vitest.config.ts b/packages/engine/vitest.config.ts index 9228bda74c..2262284077 100644 --- a/packages/engine/vitest.config.ts +++ b/packages/engine/vitest.config.ts @@ -404,6 +404,13 @@ export default defineConfig({ "src/__tests__/reliability-interactions/branch-group-single-pr-e2e.slow.test.ts", "src/__tests__/reliability-interactions/shared-branch-group-lifecycle.slow.test.ts", // SQLite-path (delete-sqlite-runtime-final PHASE A): uses inMemoryDb via _helpers.ts. + /* + FNXC:EngineTests 2026-07-18-15:55: + Full-suite engine-slow (run 29663725381): FN-5363 queue-head pollution handoff left a + leased merge-queue row after successful merge under load without product-bug evidence. + Quarantine on sight — mirrored in scripts/lib/test-quarantine.json. + */ + "src/__tests__/reliability-interactions/merge-reuse-task-worktree.slow.test.ts", ], minWorkers: 1, maxWorkers: 1, diff --git a/scripts/lib/test-quarantine.json b/scripts/lib/test-quarantine.json index d3eb1772d9..82be59d5ed 100644 --- a/scripts/lib/test-quarantine.json +++ b/scripts/lib/test-quarantine.json @@ -35,6 +35,11 @@ "file": "packages/cli/src/__tests__/extension-dist-barrel.test.ts", "reason": "Full-suite shard 4 (run 29662476909): beforeAll hook timed out at 10s under package-lane load without product-bug evidence (prior FN-8093/FN-8271 rescue). Quarantine on sight per AGENTS.md. Mirrored in packages/cli/vitest.config.ts.", "quarantinedAt": "2026-07-18" + }, + { + "file": "packages/engine/src/__tests__/reliability-interactions/merge-reuse-task-worktree.slow.test.ts", + "reason": "Full-suite engine-slow (run 29663725381): FN-5363 queue-head pollution handoff left leased merge-queue row after merge under load without product-bug evidence. Quarantine on sight per AGENTS.md. Mirrored in packages/engine/vitest.config.ts engine-slow exclude.", + "quarantinedAt": "2026-07-18" } ] }