diff --git a/docs/testing.md b/docs/testing.md index 7c292ca7ec..5c6707f0ce 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -148,6 +148,8 @@ Flaky tests are quarantined ON SIGHT and deleted on a 2-week clock. This is writ **Rescue** (before the clock runs out) requires both: evidence the test catches real regressions, and a root-cause fix for the flake. Stabilization passes — widened timeouts, retries, loosened assertions — are appeasement, not rescue, and are banned (for agents especially). +**CLI shared-fixture rescue pattern (FN-6430):** the 2026-06-14 `@runfusion/fusion` quarantine batch passed direct runs but timed out or bled state only under package/workspace load. The rescue fixed the shared isolation seam, not the timeout: sweep stale top-level `fn-test-home-*` roots with a bounded one-level prefix scan, reject inherited `HOME` values that do not live under the current `fusion-test-workers-*` root, recreate/remark the worker root before each `mkdtemp`, reset module/singleton fixture state in the affected suites, close real stores created by research helpers, and narrow slow real-store seams by moving package imports out of timed test bodies. When rescuing a similar CLI batch, prove it with repeated rescued-file runs plus `pnpm --filter @runfusion/fusion test`, audit rescued files for `vi.setConfig`/`testTimeout`/`hookTimeout` appeasement, and keep ledger/config removals in the same commit. + **Gate eviction:** a flake inside the merge gate cannot block all merges while red — it is evicted by removing its line from the `engine-core` allow-list (no quarantine entry needed unless it should also leave the non-blocking tier). **Gate admission:** the mirror operation — add the test's path to the `engine-core` `include` array in `packages/engine/vitest.config.ts`, citing the evidence of value (a real regression it caught) in the PR. Keep the project under its ~60s wall-clock budget. diff --git a/packages/cli/src/__tests__/extension-task-tools.test.ts b/packages/cli/src/__tests__/extension-task-tools.test.ts index 7debb9de66..182b646381 100644 --- a/packages/cli/src/__tests__/extension-task-tools.test.ts +++ b/packages/cli/src/__tests__/extension-task-tools.test.ts @@ -1,6 +1,9 @@ import { describe, expect, it, vi, beforeEach, afterEach } from "vitest"; - -vi.setConfig({ testTimeout: 20000, hookTimeout: 20000 }); +/* +FNXC:CliTests 2026-06-14-01:25: +FN-6430 requires rescued CLI suites to run on the default timeout after shared HOME isolation, not via the older file-wide 20s timeout. +Keep this worktree-root regression slice fast by relying on module resets and bounded temp fixtures. +*/ import { mkdtemp, mkdir, rm, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; diff --git a/packages/cli/src/__tests__/extension.test.ts b/packages/cli/src/__tests__/extension.test.ts index 2815f7ee0b..dafc64028d 100644 --- a/packages/cli/src/__tests__/extension.test.ts +++ b/packages/cli/src/__tests__/extension.test.ts @@ -4,16 +4,11 @@ import { join } from "node:path"; import { tmpdir } from "node:os"; import { setTimeout as delay } from "node:timers/promises"; -// Each test spins up a fresh temp workspace, mounts the full extension API, -// registers tools, and exercises them through real TaskStore/MissionStore -// machinery (atomic JSON writes, ID allocator with disk sync, async memory -// flushes). Under heavy parallel FS load on a busy machine, individual -// tests can occasionally cross 5s — and the same load also produces -// ENOTEMPTY teardown races when async work outlives the test body. A -// generous testTimeout absorbs both effects without masking real bugs: -// any test that genuinely hangs will still trip the bump, and the suite -// already runs well under the cap on a quiet machine. -vi.setConfig({ testTimeout: 30000, hookTimeout: 30000 }); +/* +FNXC:CliTests 2026-06-14-01:22: +FN-6430 rescues the extension suite by fixing shared HOME isolation and closing research stores in the active slice, not by preserving the older file-wide timeout bump. +Keep this file on the default 5s Vitest timeout so future slow seams are narrowed or quarantined instead of hidden. +*/ vi.mock("@fusion/core/gh-cli", () => ({ isGhAvailable: vi.fn(() => true), @@ -3412,64 +3407,72 @@ describe("fn pi extension (runnable structured-output regression slice)", () => }); it("fn_research_run preserves fire-and-forget behavior when wait_for_completion is false", async () => { - await enableResearch(tmpDir); - const tool = api.tools.get("fn_research_run")!; + const store = await enableResearch(tmpDir); + try { + const tool = api.tools.get("fn_research_run")!; - const result = await tool.execute( - "research-run-ff", - { query: "test query", wait_for_completion: false }, - undefined, - undefined, - makeCtx(tmpDir), - ); + const result = await tool.execute( + "research-run-ff", + { query: "test query", wait_for_completion: false }, + undefined, + undefined, + makeCtx(tmpDir), + ); - expect(result.content[0].text).toContain("Start the project engine to process pending runs"); - expect(result.details.status).toBe("queued"); + expect(result.content[0].text).toContain("Start the project engine to process pending runs"); + expect(result.details.status).toBe("queued"); + } finally { + store.close(); + } }); it("fn_research_run waits and returns terminal run details when wait_for_completion is true", async () => { const store = await enableResearch(tmpDir); - const tool = api.tools.get("fn_research_run")!; - const researchStore = store.getResearchStore(); + try { + const tool = api.tools.get("fn_research_run")!; + const researchStore = store.getResearchStore(); - const settleRunToCompleted = () => { - const queuedRun = researchStore.listRuns({ limit: 1 })[0]; - if (!queuedRun) { - return false; - } - if (queuedRun.status === "completed") { - return true; - } - if (queuedRun.status === "queued") { - researchStore.updateRun(queuedRun.id, { status: "running" }); - } - researchStore.updateRun(queuedRun.id, { - status: "completed", - results: { summary: "done", findings: [{ heading: "h1", content: "f1", sources: [] }], citations: [] }, - }); - return true; - }; - - if (!settleRunToCompleted()) { - const interval = setInterval(() => { - if (settleRunToCompleted()) { - clearInterval(interval); + const settleRunToCompleted = () => { + const queuedRun = researchStore.listRuns({ limit: 1 })[0]; + if (!queuedRun) { + return false; } - }, 25); - setTimeout(() => clearInterval(interval), 500); + if (queuedRun.status === "completed") { + return true; + } + if (queuedRun.status === "queued") { + researchStore.updateRun(queuedRun.id, { status: "running" }); + } + researchStore.updateRun(queuedRun.id, { + status: "completed", + results: { summary: "done", findings: [{ heading: "h1", content: "f1", sources: [] }], citations: [] }, + }); + return true; + }; + + if (!settleRunToCompleted()) { + const interval = setInterval(() => { + if (settleRunToCompleted()) { + clearInterval(interval); + } + }, 25); + setTimeout(() => clearInterval(interval), 500); + } + + const result = await tool.execute( + "research-run-wait", + { query: "terminal query", wait_for_completion: true, max_wait_ms: 4000 }, + undefined, + undefined, + makeCtx(tmpDir), + ); + + expect(result.details.status).toBe("completed"); + expect(result.details.summary).toBe("done"); + expect(result.content[0].text).toContain("is completed"); + } finally { + store.close(); } - - const result = await tool.execute( - "research-run-wait", - { query: "terminal query", wait_for_completion: true, max_wait_ms: 4000 }, - undefined, - undefined, - makeCtx(tmpDir), - ); - - expect(result.details.status).toBe("completed"); - expect(result.details.summary).toBe("done"); - expect(result.content[0].text).toContain("is completed"); }); }); diff --git a/packages/cli/src/commands/__tests__/mission.test.ts b/packages/cli/src/commands/__tests__/mission.test.ts index 37e88a9058..e976634c60 100644 --- a/packages/cli/src/commands/__tests__/mission.test.ts +++ b/packages/cli/src/commands/__tests__/mission.test.ts @@ -1,3 +1,6 @@ +import { mkdtempSync, rmSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; // Mock node:readline/promises before importing the module under test @@ -31,6 +34,8 @@ vi.mock("../../project-resolver.js", () => ({ import { createInterface } from "node:readline/promises"; import { getStore } from "../../project-resolver.js"; +const { TaskStore: ActualTaskStore } = await vi.importActual("@fusion/core"); + // Import after mocks const { runMissionCreate, @@ -931,14 +936,13 @@ describe("mission commands", () => { }); it("operates end-to-end against a real temp-project store", async () => { - const { TaskStore } = await vi.importActual("@fusion/core"); - const { mkdtempSync, rmSync } = await import("node:fs"); - const { tmpdir } = await import("node:os"); - const { join } = await import("node:path"); - + /* + * FNXC:CliTests 2026-06-14-01:04: + * The quarantine rescue must narrow genuinely slow CLI seams instead of widening test timeouts. Keep the real in-memory TaskStore coverage, but hoist module and stdlib loading out of the timed test body so this high-value mission/goal regression joins the default lane without per-test package-load overhead. + */ const rootDir = mkdtempSync(join(tmpdir(), "kb-mission-cli-goals-")); const globalDir = join(rootDir, ".fusion-global-settings"); - const store = new TaskStore(rootDir, globalDir, { inMemoryDb: true }); + const store = new ActualTaskStore(rootDir, globalDir, { inMemoryDb: true }); await store.init(); const mission = store.getMissionStore().createMission({ title: "CLI Mission" }); diff --git a/packages/cli/src/commands/__tests__/plugin.test.ts b/packages/cli/src/commands/__tests__/plugin.test.ts index d70109d9f1..2a5180e8a8 100644 --- a/packages/cli/src/commands/__tests__/plugin.test.ts +++ b/packages/cli/src/commands/__tests__/plugin.test.ts @@ -123,6 +123,11 @@ describe("plugin commands", () => { const tempDirs: string[] = []; beforeEach(() => { + /* + * FNXC:CliTests 2026-06-14-01:28: + * FN-6430's plugin-suite rescue depends on clearing loader path state before every case so a package-load sibling cannot inherit the previous taskStore root. + * Reset the hoisted PluginLoader/PluginStore mocks rather than widening timeouts or serializing the whole CLI lane. + */ mocks.reset(); vi.mocked(resolveProject).mockResolvedValue({ projectPath: "/tmp/fn-project" } as never); vi.spyOn(console, "log").mockImplementation(() => {}); diff --git a/packages/cli/vitest.config.ts b/packages/cli/vitest.config.ts index 7803aa745c..28a62c4afa 100644 --- a/packages/cli/vitest.config.ts +++ b/packages/cli/vitest.config.ts @@ -4,56 +4,20 @@ import { computeMaxWorkers } from "../core/src/__test-utils__/vitest-workers"; const maxWorkers = computeMaxWorkers(); -const quarantinedCliTests = [ +const quarantinedCliTests: string[] = [ /* FNXC:CliTests 2026-06-14-01:36: - The full @runfusion/fusion package lane times out or leaks mock state across these CLI integration-heavy files under changed-test load, while the same files pass in smaller direct runs. - Quarantine them per the flaky-test deletion ratchet instead of raising the 5s test timeout or relaxing assertions. - - FNXC:CliTests 2026-06-14-01:45: - The next full changed-test run exposed five more CLI files that time out only under package-wide load after the dashboard and desktop lanes, and the same five files passed together in a direct run. - Keep excluding load-sensitive offenders from the default CLI lane until their shared fixture and cleanup races are fixed. - - FNXC:CliTests 2026-06-14-01:48: - Re-running the CLI package lane after that quarantine exposed another batch of package-load-only timeouts in extension, goal-store, registration, and init tests. - These files also passed together in a direct run, so keep applying the deletion-ratchet quarantine instead of increasing global CLI timeouts. - - FNXC:CliTests 2026-06-14-01:58: - mission.test includes a real temp-project end-to-end mission-goal case that exceeds the default 5s CLI timeout even as a standalone targeted run, then passes only when given 30s. - Quarantine the slow file rather than encoding a longer timeout into the default package lane. - - FNXC:CliTests 2026-06-13-20:05: - FN-6421 quarantines the remaining FN-6419 CLI lane offenders after standalone evidence showed the agent-provisioning and serve suites pass directly but are integration-heavy under package-wide load. - Keep them on the 14-day deletion clock rather than widening CLI test timeouts or loosening assertions. + The full @runfusion/fusion package lane timed out or leaked mock state across 24 CLI integration-heavy files under changed-test load, while the same files passed in smaller direct runs. + They were quarantined per the flaky-test deletion ratchet instead of raising the 5s test timeout or relaxing assertions. FNXC:CliTests 2026-06-14-05:50: FN-6427 triaged all 24 quarantined CLI files and kept them in-window: 0 rescued, 0 deleted, 24 kept until the 2026-06-27 and 2026-06-28 deletion deadlines. - Fresh direct runs passed, and the shared package-load signature needs a broader fixture/concurrency rescue before these high-value suites can safely rejoin the default lane. + Fresh direct runs passed, and the shared package-load signature needed a broader fixture/concurrency rescue before these high-value suites could safely rejoin the default lane. + + FNXC:CliTests 2026-06-14-01:42: + FN-6430 rescued all 24 CLI quarantine entries after fixing shared test-isolation cleanup, rejecting inherited HOME roots from other invocations, removing pre-existing file-wide timeout bumps, and narrowing the mission real-store seam. + Keep this array as an explicit empty rescue ledger so future CLI quarantines add entries in lockstep with scripts/lib/test-quarantine.json instead of resurrecting stale excludes. */ - "src/__tests__/bin.test.ts", - "src/__tests__/extension.test.ts", - "src/__tests__/extension-agent-provisioning.test.ts", - "src/__tests__/extension-experiment-finalize.test.ts", - "src/__tests__/extension-github-tracking.test.ts", - "src/__tests__/extension-goal-tools.test.ts", - "src/__tests__/extension-goal-tools-audit.test.ts", - "src/__tests__/extension-insights.test.ts", - "src/__tests__/extension-mission-goal-tools.test.ts", - "src/__tests__/extension-task-tools.test.ts", - "src/__tests__/goal-store-resolution.test.ts", - "src/commands/__tests__/mission.test.ts", - "src/__tests__/plugin-sdk-export.test.ts", - "src/__tests__/project-context.test.ts", - "src/__tests__/research-extension-tools.test.ts", - "src/__tests__/task-delete-allow-resurrection.test.ts", - "src/__tests__/task-retry.test.ts", - "src/__tests__/vitest-workspace-resolution.test.ts", - "src/commands/__tests__/agent-import.test.ts", - "src/commands/__tests__/dashboard.test.ts", - "src/commands/__tests__/ensure-project-registered.test.ts", - "src/commands/__tests__/init.test.ts", - "src/commands/__tests__/plugin.test.ts", - "src/commands/__tests__/serve.test.ts", ]; export default defineConfig({ diff --git a/packages/core/src/__test-utils__/vitest-setup.ts b/packages/core/src/__test-utils__/vitest-setup.ts index 322714e673..ffcb4531a3 100644 --- a/packages/core/src/__test-utils__/vitest-setup.ts +++ b/packages/core/src/__test-utils__/vitest-setup.ts @@ -16,7 +16,7 @@ import { afterEach, expect } from "vitest"; import { createRequire, syncBuiltinESMExports } from "node:module"; import { randomUUID } from "node:crypto"; import { tmpdir } from "node:os"; -import { basename, dirname, join, resolve } from "node:path"; +import { basename, dirname, isAbsolute, join, relative, resolve } from "node:path"; import { promisify } from "node:util"; import { isMainThread } from "node:worker_threads"; import { assertOutsideRealFusionPath } from "../test-safety.js"; @@ -370,13 +370,34 @@ function redirectTmpdirPrefix(prefix: T): T { return join(ensureTmpdirRedirectSink(), basename(prefix)) as T; } +function isCurrentWorkerHome(path: string | undefined): boolean { + if (!path) return false; + const resolved = (() => { + try { + return realpathSync(path); + } catch { + return resolve(path); + } + })(); + const relativeHome = relative(WORKER_ROOT, resolved); + return Boolean(relativeHome) + && !relativeHome.startsWith("..") + && !isAbsolute(relativeHome) + && basename(resolved).startsWith(TEST_HOME_PREFIX); +} + function ensureIsolatedHome(): void { const existingHome = process.env.HOME ?? process.env.USERPROFILE; - if (existingHome && existingHome.includes(tmpdir()) && existingHome.includes(TEST_HOME_PREFIX)) { + if (isCurrentWorkerHome(existingHome)) { return; } ensureWorkerRoot(); + /* + FNXC:TestIsolation 2026-06-14-00:31: + Nested or recursive Vitest lanes may inherit a parent worker's `fn-test-home-*` HOME value, which shares global settings/cache state across files and keeps CLI suites load-sensitive. + Reuse HOME only when it belongs to this invocation's worker root; otherwise mint a fresh per-run HOME under `fusion-test-workers-*` so teardown removes it with the worker root. + */ const tempHome = realpathSync(mkdtempSync(join(WORKER_ROOT, `${TEST_HOME_PREFIX}${process.pid}-`))); process.env.HOME = tempHome; process.env.USERPROFILE = tempHome; diff --git a/packages/core/src/__test-utils__/vitest-teardown.ts b/packages/core/src/__test-utils__/vitest-teardown.ts index e9f4ca38f3..aa9aaee21f 100644 --- a/packages/core/src/__test-utils__/vitest-teardown.ts +++ b/packages/core/src/__test-utils__/vitest-teardown.ts @@ -6,12 +6,13 @@ * the run-local worker/home directories as leaks. */ -import { mkdtempSync, rmSync, writeFileSync } from "node:fs"; +import { mkdtempSync, readdirSync, rmSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import { join, resolve } from "node:path"; export const WORKER_ROOT_OWNER_FILE = ".fusion-test-worker-root-owner"; const FUSION_TEST_RUN_TOKEN_ENV = "FUSION_TEST_RUN_TOKEN"; +const LEGACY_TEST_HOME_PREFIX = "fn-test-home-"; let workerRootRmSync = rmSync; let workerRootSleepMsSync = sleepMsSync; @@ -33,6 +34,29 @@ function isEnoent(error: unknown): boolean { return Boolean(error && typeof error === "object" && "code" in error && error.code === "ENOENT"); } +export function removeLegacyTopLevelHomeRoots(tempRoot = tmpdir()): void { + /* + FNXC:TestIsolation 2026-06-14-00:36: + FN-6430 found stale top-level `fn-test-home-*` roots after CLI package-load runs; current workers create HOME under `fusion-test-workers-*`, so top-level homes are legacy leftovers that can bleed settings/cache state into nested lanes. + Sweep only a single temp-root level by prefix during setup/teardown, never a recursive temp-tree walk. + */ + let entries: string[] = []; + try { + entries = readdirSync(tempRoot); + } catch { + return; + } + + for (const entry of entries) { + if (!entry.startsWith(LEGACY_TEST_HOME_PREFIX)) continue; + try { + workerRootRmSync(join(tempRoot, entry), { recursive: true, force: true }); + } catch { + // Best effort only. A future invocation will retry the bounded prefix sweep. + } + } +} + export function removeWorkerRootWithRetry(workerRoot: string, retries = 3, delayMs = 75): void { let lastError: unknown = null; for (let attempt = 1; attempt <= retries; attempt++) { @@ -53,6 +77,7 @@ export function removeWorkerRootWithRetry(workerRoot: string, retries = 3, delay } export default function setup(): () => Promise { + removeLegacyTopLevelHomeRoots(); // Use a fresh root for each Vitest invocation. A static shared root makes the // setup-time redirect sweep proportional to stale directories left by every // prior interrupted run. @@ -78,5 +103,6 @@ export default function setup(): () => Promise { // redirected temp dirs are still closing. Retry boundedly so a brief busy-fd // race does not leak the per-invocation fusion-test-workers-* root. removeWorkerRootWithRetry(workerRoot); + removeLegacyTopLevelHomeRoots(); }; } diff --git a/packages/core/src/__tests__/vitest-teardown-worker-root-cleanup.test.ts b/packages/core/src/__tests__/vitest-teardown-worker-root-cleanup.test.ts index 1234e4e3aa..b1dcc5e60c 100644 --- a/packages/core/src/__tests__/vitest-teardown-worker-root-cleanup.test.ts +++ b/packages/core/src/__tests__/vitest-teardown-worker-root-cleanup.test.ts @@ -6,6 +6,7 @@ import { __fusionWorkerRootCleanupTestHooks } from "../__test-utils__/vitest-set import setup, { __setWorkerRootRmSyncForTests, __setWorkerRootSleepMsSyncForTests, + removeLegacyTopLevelHomeRoots, } from "../__test-utils__/vitest-teardown"; const createdPaths: string[] = []; @@ -88,6 +89,20 @@ describe("vitest global teardown worker-root cleanup", () => { expect(existsSync(workerRoot)).toBe(false); }); + it("sweeps legacy top-level temp HOME roots without walking unrelated temp entries", () => { + const tempRoot = remember(mkdtempSync(join(tmpdir(), "fusion-test-home-sweep-root-"))); + const legacyHome = join(tempRoot, "fn-test-home-stale"); + const unrelated = join(tempRoot, "fusion-test-workers-current"); + mkdirSync(legacyHome, { recursive: true }); + mkdirSync(unrelated, { recursive: true }); + writeFileSync(join(legacyHome, "payload.txt"), "legacy home state"); + + removeLegacyTopLevelHomeRoots(tempRoot); + + expect(existsSync(legacyHome)).toBe(false); + expect(existsSync(unrelated)).toBe(true); + }); + it("removes a self-minted fallback worker root during exit cleanup", () => { const workerRoot = remember(mkdtempSync(join(tmpdir(), "fusion-test-workers-self-minted-"))); const workerDir = join(workerRoot, `w-${process.pid}-fallback`); diff --git a/scripts/lib/test-quarantine.json b/scripts/lib/test-quarantine.json index ebbc479f3b..7dd9fcfa13 100644 --- a/scripts/lib/test-quarantine.json +++ b/scripts/lib/test-quarantine.json @@ -1,9 +1,9 @@ { - "$comment": "Flaky-test quarantine ledger (deletion ratchet \u2014 see AGENTS.md 'Flaky tests: quarantine on sight' and docs/testing.md 'Quarantine ledger and the deletion ratchet'). A test observed failing without a corresponding real bug is quarantined ON SIGHT: add an entry here AND a matching one-line `exclude` entry in that package's vitest config, in the same commit. Every entry needs a non-empty `reason` (link the failing run) and a `quarantinedAt` date \u2014 the entry expires 14 days later, at which point the test file is DELETED unless someone rescues it with evidence it catches real regressions plus a root-cause fix (never appeasement). There is deliberately no loader module and no automation around this file: it is a dated record, the vitest config exclude is the mechanism, and the sweep is policy executed by whoever touches the suite.", + "$comment": "Flaky-test quarantine ledger (deletion ratchet — see AGENTS.md 'Flaky tests: quarantine on sight' and docs/testing.md 'Quarantine ledger and the deletion ratchet'). A test observed failing without a corresponding real bug is quarantined ON SIGHT: add an entry here AND a matching one-line `exclude` entry in that package's vitest config, in the same commit. Every entry needs a non-empty `reason` (link the failing run) and a `quarantinedAt` date — the entry expires 14 days later, at which point the test file is DELETED unless someone rescues it with evidence it catches real regressions plus a root-cause fix (never appeasement). There is deliberately no loader module and no automation around this file: it is a dated record, the vitest config exclude is the mechanism, and the sweep is policy executed by whoever touches the suite.", "entries": [ { "file": "packages/engine/src/__tests__/merger-ai-cleanup-active-session.test.ts", - "reason": "Flake: pruneExistingAiMergeWorktrees skips active-session paths \u2014 active-session temp AI merge dir was unexpectedly pruned during pnpm --filter @fusion/engine test in FN-6206 verification, while the same file passed standalone. Root cause suspected: realpathSync resolution mismatch or readdirSync mock interaction with activeSessionRegistry singleton under concurrent engine suite load. Discovered during FN-6206.", + "reason": "Flake: pruneExistingAiMergeWorktrees skips active-session paths — active-session temp AI merge dir was unexpectedly pruned during pnpm --filter @fusion/engine test in FN-6206 verification, while the same file passed standalone. Root cause suspected: realpathSync resolution mismatch or readdirSync mock interaction with activeSessionRegistry singleton under concurrent engine suite load. Discovered during FN-6206.", "quarantinedAt": "2026-06-10" }, { @@ -60,126 +60,6 @@ "file": "packages/dashboard/src/__tests__/routes-git.test.ts", "reason": "Flake observed during `pnpm test` dashboard api:curated lane on 2026-06-13: `Git Management endpoints > GET /git/branches/:name/commits > respects limit parameter` returned 400 instead of 200 under concurrent dashboard API tests. The same filtered file passed standalone immediately afterward (`pnpm --filter @fusion/dashboard exec vitest run --project dashboard-api-quality src/__tests__/routes-git.test.ts -t \"respects limit parameter\" --silent=passed-only --reporter=dot`, 3/3), indicating suite-load or fixture-state sensitivity rather than a confirmed product bug. Quarantined instead of loosening assertions.", "quarantinedAt": "2026-06-13" - }, - { - "file": "packages/cli/src/__tests__/bin.test.ts", - "reason": "Slow/flaky CLI lane observed during `pnpm test` on 2026-06-14: full `@runfusion/fusion` package run timed out in `bin command routing and fallbacks > routes backup create/list/cleanup/restore` at the 5s test timeout after dashboard/desktop changed-package load. A smaller direct run with bin/project-context/task-retry passed immediately afterward (`pnpm --filter @runfusion/fusion exec vitest run src/__tests__/bin.test.ts src/__tests__/project-context.test.ts src/__tests__/task-retry.test.ts --silent=passed-only --reporter=dot`, 83/83), indicating suite-load sensitivity rather than a confirmed product bug.", - "quarantinedAt": "2026-06-14" - }, - { - "file": "packages/cli/src/__tests__/extension.test.ts", - "reason": "Flake observed during `pnpm --filter @runfusion/fusion test` on 2026-06-14 after earlier CLI quarantines: `fn pi extension > research tools > fn_research_run waits and returns terminal run details when wait_for_completion is true` returned queued instead of completed under the full package lane. The same named test passed standalone immediately afterward (`pnpm --filter @runfusion/fusion exec vitest run src/__tests__/extension.test.ts -t \"fn_research_run waits and returns terminal run details\" --silent=passed-only --reporter=dot`, 1/1), indicating suite-order or shared research fixture sensitivity rather than a confirmed product bug.", - "quarantinedAt": "2026-06-14" - }, - { - "file": "packages/cli/src/__tests__/extension-experiment-finalize.test.ts", - "reason": "Slow/flaky CLI lane observed during `pnpm --filter @runfusion/fusion test` on 2026-06-14 after earlier CLI quarantines: full package run timed out in `extension fn_experiment_finalize > supports dry-run preview` at the 5s test timeout. A direct run with the newly exposed extension/goal/init offenders passed immediately afterward (`pnpm --filter @runfusion/fusion exec vitest run src/__tests__/extension-experiment-finalize.test.ts src/__tests__/goal-store-resolution.test.ts src/commands/__tests__/ensure-project-registered.test.ts src/commands/__tests__/init.test.ts --silent=passed-only --reporter=dot`, 26/26), indicating suite-load sensitivity rather than a confirmed product bug.", - "quarantinedAt": "2026-06-14" - }, - { - "file": "packages/cli/src/__tests__/extension-github-tracking.test.ts", - "reason": "Slow/flaky CLI lane observed during `pnpm test` on 2026-06-14 after earlier CLI quarantines: full `@runfusion/fusion` package run timed out in `extension github tracking hook wiring > fn_task_create triggers registered task-created hook exactly once` at the 5s test timeout after dashboard/desktop changed-package load. A direct run with the five newly failing CLI files passed immediately afterward (`pnpm --filter @runfusion/fusion exec vitest run src/__tests__/extension-github-tracking.test.ts src/__tests__/extension-goal-tools-audit.test.ts src/__tests__/extension-task-tools.test.ts src/__tests__/task-delete-allow-resurrection.test.ts src/__tests__/vitest-workspace-resolution.test.ts --silent=passed-only --reporter=dot`, 11/11), indicating suite-load sensitivity rather than a confirmed product bug.", - "quarantinedAt": "2026-06-14" - }, - { - "file": "packages/cli/src/__tests__/extension-goal-tools.test.ts", - "reason": "Slow/flaky CLI lane observed during `pnpm --filter @runfusion/fusion test` on 2026-06-14 after the first CLI quarantine batch: `extension goal retrieval tools > truncates goal descriptions in fn_goal_list while fn_goal_show keeps full detail` timed out at the 5s test timeout under the full package lane. A smaller direct run with the extension goal/insight/mission/research files passed immediately afterward (`pnpm --filter @runfusion/fusion exec vitest run src/__tests__/extension-goal-tools.test.ts src/__tests__/extension-insights.test.ts src/__tests__/extension-mission-goal-tools.test.ts src/__tests__/research-extension-tools.test.ts --silent=passed-only --reporter=dot`, 25/25), indicating suite-load sensitivity.", - "quarantinedAt": "2026-06-14" - }, - { - "file": "packages/cli/src/__tests__/extension-goal-tools-audit.test.ts", - "reason": "Slow/flaky CLI lane observed during `pnpm test` on 2026-06-14 after earlier CLI quarantines: full `@runfusion/fusion` package run timed out in `extension goal tools retrieval audit > emits retrieval audit for fn_goal_list and fn_goal_show branches`, then produced ENOTEMPTY cleanup fallout. A direct run with the five newly failing CLI files passed immediately afterward (`pnpm --filter @runfusion/fusion exec vitest run src/__tests__/extension-github-tracking.test.ts src/__tests__/extension-goal-tools-audit.test.ts src/__tests__/extension-task-tools.test.ts src/__tests__/task-delete-allow-resurrection.test.ts src/__tests__/vitest-workspace-resolution.test.ts --silent=passed-only --reporter=dot`, 11/11), indicating suite-load sensitivity rather than a confirmed product bug.", - "quarantinedAt": "2026-06-14" - }, - { - "file": "packages/cli/src/__tests__/extension-insights.test.ts", - "reason": "Slow/flaky CLI lane observed during `pnpm --filter @runfusion/fusion test` on 2026-06-14 after the first CLI quarantine batch: `fn insight extension tools > lists and shows persisted insights` timed out at the 5s test timeout under the full package lane. A smaller direct run with the extension goal/insight/mission/research files passed immediately afterward (`pnpm --filter @runfusion/fusion exec vitest run src/__tests__/extension-goal-tools.test.ts src/__tests__/extension-insights.test.ts src/__tests__/extension-mission-goal-tools.test.ts src/__tests__/research-extension-tools.test.ts --silent=passed-only --reporter=dot`, 25/25), indicating suite-load sensitivity.", - "quarantinedAt": "2026-06-14" - }, - { - "file": "packages/cli/src/__tests__/extension-mission-goal-tools.test.ts", - "reason": "Slow/flaky CLI lane observed during `pnpm --filter @runfusion/fusion test` on 2026-06-14 after the first CLI quarantine batch: `extension mission goal tools > returns stable missing mission and goal errors` timed out at the 5s test timeout under the full package lane. A smaller direct run with the extension goal/insight/mission/research files passed immediately afterward (`pnpm --filter @runfusion/fusion exec vitest run src/__tests__/extension-goal-tools.test.ts src/__tests__/extension-insights.test.ts src/__tests__/extension-mission-goal-tools.test.ts src/__tests__/research-extension-tools.test.ts --silent=passed-only --reporter=dot`, 25/25), indicating suite-load sensitivity.", - "quarantinedAt": "2026-06-14" - }, - { - "file": "packages/cli/src/__tests__/extension-task-tools.test.ts", - "reason": "Slow/flaky CLI lane observed during `pnpm test` on 2026-06-14 after earlier CLI quarantines: full `@runfusion/fusion` package run timed out in `extension task tools resolve repo root from worktrees > uses canonical project root for fn_task_show and fn_task_list from worktree cwd` at the test's 20s timeout. A direct run with the five newly failing CLI files passed immediately afterward (`pnpm --filter @runfusion/fusion exec vitest run src/__tests__/extension-github-tracking.test.ts src/__tests__/extension-goal-tools-audit.test.ts src/__tests__/extension-task-tools.test.ts src/__tests__/task-delete-allow-resurrection.test.ts src/__tests__/vitest-workspace-resolution.test.ts --silent=passed-only --reporter=dot`, 11/11), indicating suite-load sensitivity rather than a confirmed product bug.", - "quarantinedAt": "2026-06-14" - }, - { - "file": "packages/cli/src/__tests__/goal-store-resolution.test.ts", - "reason": "Slow/flaky CLI lane observed during `pnpm --filter @runfusion/fusion test` on 2026-06-14 after earlier CLI quarantines: full package run timed out in `extension goal tools store resolution > returns canonical project goals when invoked from a .fusion/worktrees cwd`, then produced ENOTEMPTY cleanup fallout. A direct run with the newly exposed extension/goal/init offenders passed immediately afterward (`pnpm --filter @runfusion/fusion exec vitest run src/__tests__/extension-experiment-finalize.test.ts src/__tests__/goal-store-resolution.test.ts src/commands/__tests__/ensure-project-registered.test.ts src/commands/__tests__/init.test.ts --silent=passed-only --reporter=dot`, 26/26), indicating suite-load sensitivity rather than a confirmed product bug.", - "quarantinedAt": "2026-06-14" - }, - { - "file": "packages/cli/src/__tests__/plugin-sdk-export.test.ts", - "reason": "Default CLI package lane failure observed on 2026-06-14: `plugin-sdk export surface > has no @fusion specifiers in built plugin-sdk declaration artifact when present` failed standalone because an existing generated `packages/cli/dist/plugin-sdk/index.d.ts` contained stale `@fusion/core` specifiers. The test inspects optional generated dist output when present, so it is not stable as a source package-lane test in worktrees with ignored build artifacts. Quarantined from the default lane instead of making `pnpm test` depend on rebuilding or deleting ignored dist output.", - "quarantinedAt": "2026-06-14" - }, - { - "file": "packages/cli/src/__tests__/project-context.test.ts", - "reason": "Slow/flaky CLI lane observed during `pnpm test` on 2026-06-14: full `@runfusion/fusion` package run timed out in `project-context > resolveProject > should resolve unregistered local project from cwd` at the 5s test timeout after dashboard/desktop changed-package load. A smaller direct run with bin/project-context/task-retry passed immediately afterward (`pnpm --filter @runfusion/fusion exec vitest run src/__tests__/bin.test.ts src/__tests__/project-context.test.ts src/__tests__/task-retry.test.ts --silent=passed-only --reporter=dot`, 83/83), indicating suite-load sensitivity rather than a confirmed product bug.", - "quarantinedAt": "2026-06-14" - }, - { - "file": "packages/cli/src/__tests__/research-extension-tools.test.ts", - "reason": "Slow/flaky CLI lane observed during `pnpm --filter @runfusion/fusion test` on 2026-06-14 after the first CLI quarantine batch: `research extension tools` timed out, hit ENOTEMPTY cleanup fallout, and then observed an empty run list under the full package lane. A smaller direct run with the extension goal/insight/mission/research files passed immediately afterward (`pnpm --filter @runfusion/fusion exec vitest run src/__tests__/extension-goal-tools.test.ts src/__tests__/extension-insights.test.ts src/__tests__/extension-mission-goal-tools.test.ts src/__tests__/research-extension-tools.test.ts --silent=passed-only --reporter=dot`, 25/25), indicating suite-load/order sensitivity rather than a confirmed product bug.", - "quarantinedAt": "2026-06-14" - }, - { - "file": "packages/cli/src/__tests__/task-delete-allow-resurrection.test.ts", - "reason": "Slow/flaky CLI lane observed during `pnpm test` on 2026-06-14 after earlier CLI quarantines: full `@runfusion/fusion` package run timed out in `task delete allowResurrection plumbing > fn_task_delete forwards allowResurrection=true` at the 5s test timeout after dashboard/desktop changed-package load. A direct run with the five newly failing CLI files passed immediately afterward (`pnpm --filter @runfusion/fusion exec vitest run src/__tests__/extension-github-tracking.test.ts src/__tests__/extension-goal-tools-audit.test.ts src/__tests__/extension-task-tools.test.ts src/__tests__/task-delete-allow-resurrection.test.ts src/__tests__/vitest-workspace-resolution.test.ts --silent=passed-only --reporter=dot`, 11/11), indicating suite-load sensitivity rather than a confirmed product bug.", - "quarantinedAt": "2026-06-14" - }, - { - "file": "packages/cli/src/__tests__/task-retry.test.ts", - "reason": "Slow/flaky CLI lane observed during `pnpm test` on 2026-06-14: full `@runfusion/fusion` package run timed out in `runTaskRetry > clears the deadlock auto-pause when retrying a failed task` at the 5s test timeout after dashboard/desktop changed-package load. A smaller direct run with bin/project-context/task-retry passed immediately afterward (`pnpm --filter @runfusion/fusion exec vitest run src/__tests__/bin.test.ts src/__tests__/project-context.test.ts src/__tests__/task-retry.test.ts --silent=passed-only --reporter=dot`, 83/83), indicating suite-load sensitivity rather than a confirmed product bug.", - "quarantinedAt": "2026-06-14" - }, - { - "file": "packages/cli/src/__tests__/vitest-workspace-resolution.test.ts", - "reason": "Slow/flaky CLI lane observed during `pnpm test` on 2026-06-14 after earlier CLI quarantines: full `@runfusion/fusion` package run timed out in `CLI Vitest workspace resolution > resolves non-mocked symbols from internal workspace packages when dist outputs are absent` at the 30s test timeout after dashboard/desktop changed-package load. A direct run with the five newly failing CLI files passed immediately afterward (`pnpm --filter @runfusion/fusion exec vitest run src/__tests__/extension-github-tracking.test.ts src/__tests__/extension-goal-tools-audit.test.ts src/__tests__/extension-task-tools.test.ts src/__tests__/task-delete-allow-resurrection.test.ts src/__tests__/vitest-workspace-resolution.test.ts --silent=passed-only --reporter=dot`, 11/11), indicating suite-load sensitivity rather than a confirmed product bug.", - "quarantinedAt": "2026-06-14" - }, - { - "file": "packages/cli/src/commands/__tests__/agent-import.test.ts", - "reason": "Slow/flaky CLI lane observed during `pnpm test` on 2026-06-14: full `@runfusion/fusion` package run timed out in `agent-import > skill import > imports skills from tar.gz archive` at the 5s test timeout after dashboard/desktop changed-package load. A smaller direct run with agent-import/dashboard/plugin passed immediately afterward (`pnpm --filter @runfusion/fusion exec vitest run src/commands/__tests__/agent-import.test.ts src/commands/__tests__/dashboard.test.ts src/commands/__tests__/plugin.test.ts --silent=passed-only --reporter=dot`, 112/112), indicating suite-load sensitivity rather than a confirmed product bug.", - "quarantinedAt": "2026-06-14" - }, - { - "file": "packages/cli/src/commands/__tests__/dashboard.test.ts", - "reason": "Slow/flaky CLI lane observed during `pnpm test` on 2026-06-14: full `@runfusion/fusion` package run timed out in one CentralCore cleanup diagnostics case and then missed the expected warning in a sibling case under package-wide load. A smaller direct run with agent-import/dashboard/plugin passed immediately afterward (`pnpm --filter @runfusion/fusion exec vitest run src/commands/__tests__/agent-import.test.ts src/commands/__tests__/dashboard.test.ts src/commands/__tests__/plugin.test.ts --silent=passed-only --reporter=dot`, 112/112), indicating suite-load/order sensitivity rather than a confirmed product bug.", - "quarantinedAt": "2026-06-14" - }, - { - "file": "packages/cli/src/commands/__tests__/ensure-project-registered.test.ts", - "reason": "Slow/flaky CLI lane observed during `pnpm test` on 2026-06-14 after earlier CLI quarantines: full `@runfusion/fusion` package run timed out in `ensureCwdProjectRegistered > returns existing registered project without writing files` at the 5s test timeout after dashboard/desktop changed-package load. A smaller direct run with extension-github-tracking and ensure-project-registered passed immediately afterward (`pnpm --filter @runfusion/fusion exec vitest run src/__tests__/extension-github-tracking.test.ts src/commands/__tests__/ensure-project-registered.test.ts --silent=passed-only --reporter=dot`, 5/5), indicating suite-load sensitivity rather than a confirmed product bug.", - "quarantinedAt": "2026-06-14" - }, - { - "file": "packages/cli/src/commands/__tests__/init.test.ts", - "reason": "Slow/flaky CLI lane observed during `pnpm --filter @runfusion/fusion test` on 2026-06-14 after earlier CLI quarantines: full package run timed out in `init command > should append local storage directories to existing .gitignore` at the 5s test timeout. A direct run with the newly exposed extension/goal/init offenders passed immediately afterward (`pnpm --filter @runfusion/fusion exec vitest run src/__tests__/extension-experiment-finalize.test.ts src/__tests__/goal-store-resolution.test.ts src/commands/__tests__/ensure-project-registered.test.ts src/commands/__tests__/init.test.ts --silent=passed-only --reporter=dot`, 26/26), indicating suite-load sensitivity rather than a confirmed product bug.", - "quarantinedAt": "2026-06-14" - }, - { - "file": "packages/cli/src/commands/__tests__/mission.test.ts", - "reason": "Standalone slow CLI test observed during `pnpm test` on 2026-06-14 after earlier CLI quarantines: full `@runfusion/fusion` package run timed out in `mission commands > mission goal commands > operates end-to-end against a real temp-project store` at the 5s test timeout. The same named test also timed out standalone at 5s, then passed only when explicitly run with `--testTimeout=30000` (`pnpm --filter @runfusion/fusion exec vitest run src/commands/__tests__/mission.test.ts -t \"operates end-to-end against a real temp-project store\" --testTimeout=30000 --silent=passed-only --reporter=dot`, 1/1 in 8.48s), so it is quarantined as a slow test instead of appeased with a wider timeout.", - "quarantinedAt": "2026-06-14" - }, - { - "file": "packages/cli/src/commands/__tests__/plugin.test.ts", - "reason": "Slow/flaky CLI lane observed during `pnpm test` on 2026-06-14: full `@runfusion/fusion` package run timed out in `writes runPluginInstall metadata to central tables only` and leaked cross-test plugin path state into `includes getRootDir on the plugin loader taskStore mock`. A smaller direct run with agent-import/dashboard/plugin passed immediately afterward (`pnpm --filter @runfusion/fusion exec vitest run src/commands/__tests__/agent-import.test.ts src/commands/__tests__/dashboard.test.ts src/commands/__tests__/plugin.test.ts --silent=passed-only --reporter=dot`, 112/112), indicating suite-load/order sensitivity rather than a confirmed product bug.", - "quarantinedAt": "2026-06-14" - }, - { - "file": "packages/cli/src/__tests__/extension-agent-provisioning.test.ts", - "reason": "Slow/flaky CLI lane offender observed during FN-6419 broad `pnpm test` / targeted @runfusion/fusion verification: the extension agent provisioning suite exercises real temp projects and privileged `fn_agent_create`/`fn_agent_delete` extension tools, making it sensitive to package-wide CLI load and temp cleanup races. FN-6421 local cross-check after install found the current quarantined CLI lane green, and the two-offender direct run passed immediately (`pnpm --filter @runfusion/fusion exec vitest run src/__tests__/extension-agent-provisioning.test.ts src/commands/__tests__/serve.test.ts --silent=passed-only --reporter=dot`, 55/55), so this is quarantined from the default lane rather than appeased with broader timeouts.", - "quarantinedAt": "2026-06-13" - }, - { - "file": "packages/cli/src/commands/__tests__/serve.test.ts", - "reason": "Slow/flaky CLI lane offender observed during FN-6419 broad `pnpm test` / targeted @runfusion/fusion verification: the serve command suite is a large multi-project integration harness with mocked constructible engine classes, EventEmitter routing, timers, and temp directories, making it sensitive to package-wide CLI load and cleanup races. FN-6421 local cross-check after install found the current quarantined CLI lane green, and the two-offender direct run passed immediately (`pnpm --filter @runfusion/fusion exec vitest run src/__tests__/extension-agent-provisioning.test.ts src/commands/__tests__/serve.test.ts --silent=passed-only --reporter=dot`, 55/55), so this is quarantined from the default lane rather than appeased with wider test timeouts or loosened assertions.", - "quarantinedAt": "2026-06-13" } ] }