diff --git a/Dockerfile b/Dockerfile index bac9cec140..253df910a2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,9 +10,9 @@ RUN apt-get update \ RUN corepack enable && corepack prepare pnpm@10.33.0 --activate COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ -# FNXC:DockerBuild 2026-07-22-13:00: The dependency-cache layer must include every -# selected workspace manifest before frozen install; otherwise pnpm omits a package's -# dependencies and the later full-workspace build can fail despite its source being copied. +# FNXC:DockerBuild 2026-08-10-18:03: This list is derived from pnpm-workspace.yaml. +# Every selected workspace manifest must be copied before frozen install, or pnpm +# omits its dependencies and the later full-workspace image build can fail. COPY packages/cli/package.json ./packages/cli/package.json COPY packages/cli-alias/package.json ./packages/cli-alias/package.json COPY packages/core/package.json ./packages/core/package.json @@ -30,6 +30,7 @@ COPY plugins/examples/fusion-plugin-ci-status/package.json ./plugins/examples/fu COPY plugins/examples/fusion-plugin-notification/package.json ./plugins/examples/fusion-plugin-notification/package.json COPY plugins/examples/fusion-plugin-settings-demo/package.json ./plugins/examples/fusion-plugin-settings-demo/package.json COPY plugins/fusion-plugin-acp-runtime/package.json ./plugins/fusion-plugin-acp-runtime/package.json +COPY plugins/fusion-plugin-todos/package.json ./plugins/fusion-plugin-todos/package.json COPY plugins/fusion-plugin-compound-engineering/package.json ./plugins/fusion-plugin-compound-engineering/package.json COPY plugins/fusion-plugin-linear-import/package.json ./plugins/fusion-plugin-linear-import/package.json COPY plugins/fusion-plugin-paperclip-runtime/package.json ./plugins/fusion-plugin-paperclip-runtime/package.json diff --git a/docs/testing.md b/docs/testing.md index 51064e1546..2fa684f7ba 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -520,7 +520,14 @@ quo, never below it) — it does **not** fail the build. Refresh is **manual/sch the default branch only**: each CI shard uploads per-shard JSON timing artifacts (U1), and `node scripts/ci-test-shard.mjs --write-timings` merges them into the snapshot. Download the shard artifacts into `.timings/` first (the default lookup directory), or pass -`--inputs-dir ` to point at wherever they were downloaded. A future +`--inputs-dir ` to point at wherever they were downloaded. + + + +When deleted test files leave phantom snapshot entries, run +`node scripts/ci-test-shard.mjs --prune-timings`. Pruning removes only paths absent from disk, +drops packages with no remaining paths, and **never restamps `capturedAt`**. A real refresh still +requires `--write-timings` with timing artifacts, and the 30-day staleness budget still applies. A future scheduled job can gate on freshness via `node scripts/ci-test-shard.mjs --check-timings-staleness`, which exits non-zero when the snapshot is missing or older than the 30-day budget. Package test wrappers that launch Vitest (including `@fusion/desktop`) must forward caller reporter/output diff --git a/plugins/fusion-plugin-todos/vitest.config.ts b/plugins/fusion-plugin-todos/vitest.config.ts index 0cbafd5405..10df21481b 100644 --- a/plugins/fusion-plugin-todos/vitest.config.ts +++ b/plugins/fusion-plugin-todos/vitest.config.ts @@ -1,9 +1,25 @@ import { defineConfig } from "vitest/config"; import { fileURLToPath } from "node:url"; +import { computeMaxWorkers } from "../../packages/core/src/__test-utils__/vitest-workers"; + +const maxWorkers = computeMaxWorkers(); + +/* + * FNXC:PluginTodosTesting 2026-08-10-18:03: + * Todos renders dashboard components, so it retains jsdom while using the + * workspace setup, teardown, and worker budget required for isolated Vitest runs. + */ export default defineConfig({ - resolve: { alias: { - "@fusion/core": fileURLToPath(new URL("../../packages/core/src/index.ts", import.meta.url)), - "@fusion/plugin-sdk": fileURLToPath(new URL("../../packages/plugin-sdk/src/index.ts", import.meta.url)), - } }, - test: { environment: "jsdom", setupFiles: [fileURLToPath(new URL("../../packages/core/src/__test-utils__/vitest-setup.ts", import.meta.url))] }, + resolve: { + alias: { + "@fusion/core": fileURLToPath(new URL("../../packages/core/src/index.ts", import.meta.url)), + "@fusion/plugin-sdk": fileURLToPath(new URL("../../packages/plugin-sdk/src/index.ts", import.meta.url)), + }, + }, + test: { + environment: "jsdom", + setupFiles: [fileURLToPath(new URL("../../packages/core/src/__test-utils__/vitest-setup.ts", import.meta.url))], + globalSetup: [fileURLToPath(new URL("../../packages/core/src/__test-utils__/vitest-teardown.ts", import.meta.url))], + maxWorkers, + }, }); diff --git a/scripts/__tests__/ci-test-shard-timings.test.mjs b/scripts/__tests__/ci-test-shard-timings.test.mjs index 461c2c7f46..ce65bace6f 100644 --- a/scripts/__tests__/ci-test-shard-timings.test.mjs +++ b/scripts/__tests__/ci-test-shard-timings.test.mjs @@ -18,6 +18,7 @@ import { attributeTestFile, extractFileDurations, buildTimingsSnapshot, + pruneMissingTimingFiles, writeTimings, TIMINGS_SNAPSHOT_RELATIVE, TIMINGS_STALENESS_DAYS, @@ -194,6 +195,76 @@ test("buildTimingsSnapshot omits a zero-test package entirely (no zero entry)", } }); +test("pruneMissingTimingFiles removes absent paths, empty packages, and preserves capturedAt", () => { + const root = tmpRoot(); + try { + const existing = "packages/core/live.test.ts"; + mkdirSync(path.join(root, "packages/core"), { recursive: true }); + writeFileSync(path.join(root, existing), ""); + const input = { + capturedAt: "2026-07-24T13:09:41.412Z", + packages: { + "@fusion/core": { files: { [existing]: 700, "packages/core/missing.test.ts": 400 } }, + "@fusion/engine": { files: { "packages/engine/missing.test.ts": 900 } }, + }, + }; + + const { snapshot, removedPaths } = pruneMissingTimingFiles(input, { projectRoot: root }); + assert.deepEqual(removedPaths, ["packages/core/missing.test.ts", "packages/engine/missing.test.ts"]); + assert.equal(snapshot.capturedAt, input.capturedAt); + assert.equal(snapshot.packages["@fusion/core"].files[existing], 700); + assert.ok(!("@fusion/engine" in snapshot.packages)); + assert.deepEqual(input.packages["@fusion/core"].files, { [existing]: 700, "packages/core/missing.test.ts": 400 }); + } finally { + rmSync(root, { recursive: true, force: true }); + } +}); + +test("pruneMissingTimingFiles leaves complete snapshots unchanged", () => { + const root = tmpRoot(); + try { + const file = "packages/core/live.test.ts"; + mkdirSync(path.join(root, "packages/core"), { recursive: true }); + writeFileSync(path.join(root, file), ""); + const input = { capturedAt: "2026-07-24T13:09:41.412Z", packages: { "@fusion/core": { files: { [file]: 700 } } } }; + + const { snapshot, removedPaths } = pruneMissingTimingFiles(input, { projectRoot: root }); + assert.deepEqual(removedPaths, []); + assert.deepEqual(snapshot, input); + } finally { + rmSync(root, { recursive: true, force: true }); + } +}); + +test("--prune-timings prunes the on-disk snapshot without restamping capturedAt", () => { + const root = tmpRoot(); + try { + const live = "packages/core/live.test.ts"; + mkdirSync(path.join(root, "packages/core"), { recursive: true }); + writeFileSync(path.join(root, live), ""); + const snapshotPath = path.join(root, TIMINGS_SNAPSHOT_RELATIVE); + mkdirSync(path.dirname(snapshotPath), { recursive: true }); + writeFileSync(snapshotPath, `${JSON.stringify({ + capturedAt: "2026-07-24T13:09:41.412Z", + packages: { + "@fusion/core": { files: { [live]: 700, "packages/core/deleted.test.ts": 400 } }, + }, + }, null, 2)}\n`); + + const result = spawnSync(process.execPath, [path.join(REPO_ROOT, "scripts/ci-test-shard.mjs"), "--prune-timings"], { + cwd: root, + encoding: "utf8", + }); + assert.equal(result.status, 0, result.stderr); + assert.match(result.stdout, /pruned 1 missing timing file/); + const pruned = JSON.parse(readFileSync(snapshotPath, "utf8")); + assert.equal(pruned.capturedAt, "2026-07-24T13:09:41.412Z"); + assert.deepEqual(pruned.packages, { "@fusion/core": { files: { [live]: 700 } } }); + } finally { + rmSync(root, { recursive: true, force: true }); + } +}); + test("writeTimings writes snapshot to scripts/test-timings.json under a project root", () => { const root = tmpRoot(); try { diff --git a/scripts/ci-test-shard.mjs b/scripts/ci-test-shard.mjs index bc4589f5f1..24791f2768 100644 --- a/scripts/ci-test-shard.mjs +++ b/scripts/ci-test-shard.mjs @@ -14,7 +14,7 @@ */ import { spawn, spawnSync } from "node:child_process"; -import { globSync, readFileSync, writeFileSync, readdirSync, mkdirSync, renameSync } from "node:fs"; +import { existsSync, globSync, readFileSync, writeFileSync, readdirSync, mkdirSync, renameSync } from "node:fs"; import { cpus } from "node:os"; import path from "node:path"; import { fileURLToPath } from "node:url"; @@ -1014,6 +1014,50 @@ export function readTimingsSnapshot(snapshotPath) { } } +/* + * FNXC:CITestSharding 2026-08-10-18:03: + * Deleted test files leave phantom snapshot entries that degrade shard balancing + * and keep the governance guard red. Pruning removes only entries whose file is + * gone and must never restamp capturedAt, because a fabricated timestamp would + * launder the 30-day staleness budget. + */ +/** + * Return a timing snapshot without entries whose repo-relative files no longer + * exist. The input snapshot is not mutated and its capturedAt value is copied + * byte-for-byte so pruning cannot substitute for a real timing refresh. + * + * @param {{ capturedAt: string, packages?: Record }> }} snapshot + * @param {{ projectRoot?: string, existsSync?: (path: string) => boolean }} [options] + * @returns {{ snapshot: object, removedPaths: string[] }} + */ +export function pruneMissingTimingFiles(snapshot, options = {}) { + const projectRoot = options.projectRoot ?? process.cwd(); + const fileExists = options.existsSync ?? existsSync; + const packages = {}; + const removedPaths = []; + + for (const [packageName, packageTimings] of Object.entries(snapshot.packages ?? {})) { + const files = {}; + for (const [file, duration] of Object.entries(packageTimings?.files ?? {})) { + if (fileExists(path.join(projectRoot, file))) { + files[file] = duration; + } else { + removedPaths.push(file); + } + } + if (Object.keys(files).length > 0) packages[packageName] = { ...packageTimings, files }; + } + + return { snapshot: { ...snapshot, packages }, removedPaths }; +} + +function writeTimingSnapshot(snapshotPath, snapshot) { + mkdirSync(path.dirname(snapshotPath), { recursive: true }); + const tmp = `${snapshotPath}.tmp.${process.pid}`; + writeFileSync(tmp, `${JSON.stringify(snapshot, null, 2)}\n`, "utf8"); + renameSync(tmp, snapshotPath); +} + /** * Discover candidate vitest JSON reporter output files in a directory. * Looks for files matching `*timings*.json` (the convention CI shards write). @@ -1091,10 +1135,7 @@ export function writeTimings(options = {}) { return { written: false, snapshot: existing, reason: "newer-snapshot" }; } - mkdirSync(path.dirname(snapshotPath), { recursive: true }); - const tmp = `${snapshotPath}.tmp.${process.pid}`; - writeFileSync(tmp, `${JSON.stringify(snapshot, null, 2)}\n`, "utf8"); - renameSync(tmp, snapshotPath); + writeTimingSnapshot(snapshotPath, snapshot); const pkgCount = Object.keys(snapshot.packages).length; console.log(`[ci-test-shard] wrote ${TIMINGS_SNAPSHOT_RELATIVE} (${pkgCount} packages, capturedAt ${capturedAt}).`); return { written: true, snapshot }; @@ -1231,6 +1272,20 @@ export function buildShardCommands(shardEntries, options = {}) { } export async function main(argv = process.argv.slice(2), env = process.env) { + if (argv.includes("--prune-timings")) { + const snapshotPath = path.join(process.cwd(), TIMINGS_SNAPSHOT_RELATIVE); + const existing = readTimingsSnapshot(snapshotPath); + if (!existing) { + console.error("[ci-test-shard] no valid timing snapshot present; prune unavailable."); + process.exitCode = 1; + return; + } + const { snapshot, removedPaths } = pruneMissingTimingFiles(existing, { projectRoot: process.cwd() }); + writeTimingSnapshot(snapshotPath, snapshot); + console.log(`[ci-test-shard] pruned ${removedPaths.length} missing timing file${removedPaths.length === 1 ? "" : "s"} from ${TIMINGS_SNAPSHOT_RELATIVE}.`); + return; + } + if (argv.includes("--write-timings")) { const dirIdx = argv.indexOf("--inputs-dir"); const inputDir = dirIdx >= 0 ? argv[dirIdx + 1] : undefined; diff --git a/scripts/lib/workflow-reliability-release-check.json b/scripts/lib/workflow-reliability-release-check.json index ff80026f39..dc9a47c385 100644 --- a/scripts/lib/workflow-reliability-release-check.json +++ b/scripts/lib/workflow-reliability-release-check.json @@ -1,6 +1,6 @@ { "version": 1, - "_comment": "FNXC:CustomWorkflowReliability 2026-06-19-00:00: FN-6694 requires this manifest to encode goal G-MPW67VQR-0001-97S3's release-check checklist as objective, runnable seam evidence instead of prose-only QA signoff.", + "_comment": "FNXC:CustomWorkflowReliability 2026-08-10-18:03: FN-6694 requires this manifest to encode goal G-MPW67VQR-0001-97S3's release-check checklist as objective, runnable seam evidence instead of prose-only QA signoff. FN-8951 repointed deleted pre-cutover seams to live tests that cover definitions and route validation, selection dispatch, REVISE completion, interpreter recovery, and restart durability.", "checklist": [ { "id": "author-import-save-discover-reload", @@ -9,19 +9,19 @@ "seams": [ { "package": "@fusion/core", - "file": "packages/core/src/__tests__/workflow-definition-store.test.ts" + "file": "packages/core/src/__tests__/postgres/workflow-definitions.pg.test.ts" }, { "package": "@fusion/dashboard", - "file": "packages/dashboard/src/routes/__tests__/workflow-import-export.test.ts" + "file": "packages/dashboard/src/routes/__tests__/workflow-validate-route.test.ts" }, { "package": "@fusion/dashboard", - "file": "packages/dashboard/src/routes/__tests__/workflow-design-route.test.ts" + "file": "packages/dashboard/src/routes/__tests__/workflow-setting-attribution.test.ts" }, { "package": "@fusion/core", - "file": "packages/core/src/__tests__/workflow-selection-store.test.ts" + "file": "packages/core/src/__tests__/workflow-ir-selection-cache.test.ts" } ] }, @@ -32,7 +32,7 @@ "seams": [ { "package": "@fusion/core", - "file": "packages/core/src/__tests__/workflow-selection-store.test.ts" + "file": "packages/core/src/__tests__/custom-v1-workflow-dispatch.test.ts" }, { "package": "@fusion/engine", @@ -59,7 +59,7 @@ }, { "package": "@fusion/engine", - "file": "packages/engine/src/__tests__/executor-workflow-revision-scope.test.ts" + "file": "packages/engine/src/__tests__/executor-task-done-revise-verdict-guard.test.ts" } ] }, @@ -74,11 +74,11 @@ }, { "package": "@fusion/engine", - "file": "packages/engine/src/__tests__/reliability-interactions/workflow-interpreter-cutover.test.ts" + "file": "packages/engine/src/__tests__/interpreter-merge-seam.test.ts" }, { "package": "@fusion/engine", - "file": "packages/engine/src/__tests__/self-healing-custom-workflow-recovery.test.ts" + "file": "packages/engine/src/__tests__/workflow-step-results-self-healing-recovery.test.ts" } ] }, @@ -89,11 +89,11 @@ "seams": [ { "package": "@fusion/core", - "file": "packages/core/src/__tests__/workflow-restart-durability.test.ts" + "file": "packages/core/src/__tests__/postgres/workflow-continuation-slot.pg.test.ts" }, { "package": "@fusion/engine", - "file": "packages/engine/src/__tests__/self-healing-custom-workflow-recovery.test.ts" + "file": "packages/engine/src/__tests__/restart-recovery-coordinator.test.ts" } ] } diff --git a/scripts/test-timings.json b/scripts/test-timings.json index 79e5686ffe..1bca09af60 100644 --- a/scripts/test-timings.json +++ b/scripts/test-timings.json @@ -326,7 +326,6 @@ "packages/core/src/__tests__/agent-companies-parser.test.ts": 300, "packages/core/src/__tests__/agent-companies-types.test.ts": 100, "packages/core/src/__tests__/agent-log-file-store.test.ts": 100, - "packages/core/src/__tests__/agent-logs-backend-mode.test.ts": 100, "packages/core/src/__tests__/agent-memory-mode.test.ts": 100, "packages/core/src/__tests__/agent-permission-policy-resolution.test.ts": 100, "packages/core/src/__tests__/agent-permission-policy.test.ts": 100, @@ -638,7 +637,6 @@ "packages/core/src/__tests__/symbol-locks.test.ts": 2200, "packages/core/src/__tests__/system-metrics.test.ts": 100, "packages/core/src/__tests__/task-age-staleness.test.ts": 100, - "packages/core/src/__tests__/task-delete-nonblocking-cleanup.test.ts": 100, "packages/core/src/__tests__/task-detail-prompt-resilience.test.ts": 700, "packages/core/src/__tests__/task-helpers.test.ts": 100, "packages/core/src/__tests__/task-lineage.test.ts": 100, @@ -666,7 +664,6 @@ "packages/core/src/__tests__/workflow-ir-foreach.test.ts": 100, "packages/core/src/__tests__/workflow-ir-loop.test.ts": 100, "packages/core/src/__tests__/workflow-ir-optional-group.test.ts": 100, - "packages/core/src/__tests__/workflow-ir-resolver.test.ts": 100, "packages/core/src/__tests__/workflow-ir-settings.test.ts": 100, "packages/core/src/__tests__/workflow-ir-validation.test.ts": 100, "packages/core/src/__tests__/workflow-ir.test.ts": 100, @@ -1135,8 +1132,6 @@ "packages/dashboard/app/components/__tests__/TestModeBanner.test.tsx": 100, "packages/dashboard/app/components/__tests__/ThemeDropdown.test.tsx": 7400, "packages/dashboard/app/components/__tests__/ThemeSelector.test.tsx": 3000, - "packages/dashboard/app/components/__tests__/TodoView.mobile-css.test.ts": 100, - "packages/dashboard/app/components/__tests__/TodoView.test.tsx": 1400, "packages/dashboard/app/components/__tests__/TopProgressBar.test.tsx": 200, "packages/dashboard/app/components/__tests__/TrackingRepoSelect.test.tsx": 300, "packages/dashboard/app/components/__tests__/UpdateAvailableBanner.test.tsx": 600, @@ -1196,7 +1191,6 @@ "packages/dashboard/app/components/__tests__/standing-instructions-template.test.ts": 100, "packages/dashboard/app/components/__tests__/step-number-alignment.test.tsx": 200, "packages/dashboard/app/components/__tests__/stuck-and-agent-card-border.test.ts": 500, - "packages/dashboard/app/components/__tests__/taskSorting.test.ts": 100, "packages/dashboard/app/components/__tests__/useGitHubStarCount.test.tsx": 100, "packages/dashboard/app/components/__tests__/utility-mobile.test.tsx": 200, "packages/dashboard/app/components/__tests__/workflow-auto-layout.test.ts": 100, @@ -1369,7 +1363,6 @@ "packages/dashboard/app/hooks/__tests__/useTerminalSessions.test.ts": 2800, "packages/dashboard/app/hooks/__tests__/useTheme.test.ts": 1200, "packages/dashboard/app/hooks/__tests__/useToast.test.tsx": 100, - "packages/dashboard/app/hooks/__tests__/useTodoLists.test.ts": 500, "packages/dashboard/app/hooks/__tests__/useTouchActionGesture.test.ts": 100, "packages/dashboard/app/hooks/__tests__/useUpdateCheck.test.ts": 500, "packages/dashboard/app/hooks/__tests__/useUsageData.test.ts": 300, @@ -1645,8 +1638,6 @@ "packages/dashboard/src/__tests__/task-revert-route.test.ts": 8500, "packages/dashboard/src/__tests__/terminal-service.test.ts": 100, "packages/dashboard/src/__tests__/test-isolation-guard.test.ts": 100, - "packages/dashboard/src/__tests__/todo-documentation.test.ts": 100, - "packages/dashboard/src/__tests__/todo-routes.test.ts": 100, "packages/dashboard/src/__tests__/update-check.test.ts": 100, "packages/dashboard/src/__tests__/usage.test.ts": 200, "packages/dashboard/src/__tests__/view-chunk-manifest.test.ts": 100, @@ -1751,7 +1742,6 @@ "packages/engine/src/__tests__/agent-action-gate-project-default.test.ts": 100, "packages/engine/src/__tests__/agent-action-gate.test.ts": 2300, "packages/engine/src/__tests__/agent-artifact-tools.test.ts": 100, - "packages/engine/src/__tests__/agent-assignment.test.ts": 100, "packages/engine/src/__tests__/agent-document-tools.test.ts": 100, "packages/engine/src/__tests__/agent-heartbeat-procedures.test.ts": 100, "packages/engine/src/__tests__/agent-heartbeat-worktree.test.ts": 100, @@ -1834,7 +1824,6 @@ "packages/engine/src/__tests__/engine-no-blocking-shellout.test.ts": 1500, "packages/engine/src/__tests__/engine-public-api.test.ts": 100, "packages/engine/src/__tests__/engine-singleton-lock.test.ts": 100, - "packages/engine/src/__tests__/ephemeral-worker-manager.test.ts": 100, "packages/engine/src/__tests__/error-classifier.test.ts": 100, "packages/engine/src/__tests__/eval-followups.test.ts": 100, "packages/engine/src/__tests__/executor-abort-all-in-flight.test.ts": 100, @@ -1938,7 +1927,6 @@ "packages/engine/src/__tests__/hybrid-executor.test.ts": 100, "packages/engine/src/__tests__/identity-snapshot.test.ts": 100, "packages/engine/src/__tests__/in-process-runtime.pg.test.ts": 800, - "packages/engine/src/__tests__/in-review-merge-stall-deadlock-recovery.test.ts": 100, "packages/engine/src/__tests__/in-review-unmet-dependency-reconcile.test.ts": 100, "packages/engine/src/__tests__/integration-branch.test.ts": 100, "packages/engine/src/__tests__/interactive-ai-session.test.ts": 100, @@ -1966,7 +1954,6 @@ "packages/engine/src/__tests__/merger-ai-merge-body.test.ts": 100, "packages/engine/src/__tests__/merger-ai-prompts.test.ts": 100, "packages/engine/src/__tests__/merger-ai-push-after-merge.test.ts": 4900, - "packages/engine/src/__tests__/merger-ai-push-divergence-conflict.test.ts": 5500, "packages/engine/src/__tests__/merger-ai.test.ts": 16600, "packages/engine/src/__tests__/merger-ancestor-shortcircuit.test.ts": 2000, "packages/engine/src/__tests__/merger-auto-prerebase.real-git.test.ts": 200, @@ -2026,7 +2013,6 @@ "packages/engine/src/__tests__/node-dispatch-validation.test.ts": 100, "packages/engine/src/__tests__/node-health-monitor.test.ts": 100, "packages/engine/src/__tests__/node-routing-policy.test.ts": 100, - "packages/engine/src/__tests__/notification-service.test.ts": 1100, "packages/engine/src/__tests__/notifier.runtime.test.ts": 100, "packages/engine/src/__tests__/notifier.test.ts": 500, "packages/engine/src/__tests__/ntfy-provider.test.ts": 100, @@ -2116,7 +2102,6 @@ "packages/engine/src/__tests__/reliability-interactions/concurrent-execute-race.test.ts": 300, "packages/engine/src/__tests__/reliability-interactions/cross-node-assignment-wake.test.ts": 200, "packages/engine/src/__tests__/reliability-interactions/dashboard-diff-boundary.test.ts": 100, - "packages/engine/src/__tests__/reliability-interactions/dependency-cycle-reconcile.test.ts": 12400, "packages/engine/src/__tests__/reliability-interactions/dirty-integration-worktree.real-git.test.ts": 1000, "packages/engine/src/__tests__/reliability-interactions/done-task-verification-benign.real-git.test.ts": 900, "packages/engine/src/__tests__/reliability-interactions/dual-observe-merge-seam.test.ts": 100, @@ -2197,7 +2182,6 @@ "packages/engine/src/__tests__/reliability-interactions/worktree-stale-lock-recovery.test.ts": 300, "packages/engine/src/__tests__/reliability-interactions/worktree-stale-registration-recovery.real-git.test.ts": 700, "packages/engine/src/__tests__/reliability-interactions/worktrunk-audit.test.ts": 100, - "packages/engine/src/__tests__/reliability-interactions/worktrunk-failure.test.ts": 100, "packages/engine/src/__tests__/reliability-interactions/worktrunk-self-healing.test.ts": 100, "packages/engine/src/__tests__/reliability-interactions/worktrunk-worktree-removal.test.ts": 100, "packages/engine/src/__tests__/replan-target.test.ts": 100, @@ -2205,7 +2189,6 @@ "packages/engine/src/__tests__/research-dispatcher.test.ts": 200, "packages/engine/src/__tests__/research-step-runner.test.ts": 100, "packages/engine/src/__tests__/restart-recovery-coordinator.test.ts": 100, - "packages/engine/src/__tests__/restart.integration.test.ts": 500, "packages/engine/src/__tests__/retry-burned-logger.test.ts": 100, "packages/engine/src/__tests__/retry-with-backoff.test.ts": 100, "packages/engine/src/__tests__/review-checkout.test.ts": 200, @@ -2258,7 +2241,6 @@ "packages/engine/src/__tests__/self-healing-cli-sessions.test.ts": 100, "packages/engine/src/__tests__/self-healing-completion-fanout.test.ts": 100, "packages/engine/src/__tests__/self-healing-db-corruption.test.ts": 300, - "packages/engine/src/__tests__/self-healing-fake-overlap-seam.test.ts": 100, "packages/engine/src/__tests__/self-healing-fn-5488-fast-path-regressions.test.ts": 100, "packages/engine/src/__tests__/self-healing-foreign-only-contamination.test.ts": 100, "packages/engine/src/__tests__/self-healing-ghost-branch-recovery.test.ts": 100, @@ -2326,7 +2308,6 @@ "packages/engine/src/__tests__/triage-soft-delete-abort.test.ts": 100, "packages/engine/src/__tests__/triage-soft-delete-write-abort.test.ts": 100, "packages/engine/src/__tests__/triage-split-into-subtasks-delete.test.ts": 100, - "packages/engine/src/__tests__/triage-stuck-requeue-preserve-draft.test.ts": 100, "packages/engine/src/__tests__/triage-token-usage.test.ts": 500, "packages/engine/src/__tests__/triage.test.ts": 1000, "packages/engine/src/__tests__/tunnel-process-manager.test.ts": 100, @@ -2390,11 +2371,9 @@ "packages/engine/src/__tests__/workspace-merger-deps-resilient.test.ts": 1800, "packages/engine/src/__tests__/workspace-merger-lease.test.ts": 2800, "packages/engine/src/__tests__/workspace-merger.test.ts": 4400, - "packages/engine/src/__tests__/worktree-acquisition-backend.test.ts": 100, "packages/engine/src/__tests__/worktree-acquisition-pinned.test.ts": 300, "packages/engine/src/__tests__/worktree-acquisition-secrets-env.test.ts": 200, "packages/engine/src/__tests__/worktree-acquisition-workspace.test.ts": 3200, - "packages/engine/src/__tests__/worktree-acquisition-worktrunk.test.ts": 1100, "packages/engine/src/__tests__/worktree-acquisition.test.ts": 1200, "packages/engine/src/__tests__/worktree-admin-entry-prune.test.ts": 2600, "packages/engine/src/__tests__/worktree-backend-branch-collision.test.ts": 2400,