diff --git a/packages/dashboard/vitest.config.ts b/packages/dashboard/vitest.config.ts index 23f961ca44..ac45950334 100644 --- a/packages/dashboard/vitest.config.ts +++ b/packages/dashboard/vitest.config.ts @@ -360,6 +360,8 @@ const quarantinedDashboardTests: string[] = [ "src/routes/__tests__/mission-workflow-triage-route.test.ts", "src/routes/__tests__/workflow-validate-route.test.ts", "src/__tests__/mesh-routes.test.ts", + // FNXC:DashboardTests 2026-07-17-06:35: inventory + ledger lockstep — build-only dist assert not in quality projects. + "src/__tests__/plugin-registry-dist.test.ts", ]; const qualityApiTests = [ diff --git a/packages/engine/src/__tests__/cron-runner.test.ts b/packages/engine/src/__tests__/cron-runner.test.ts index fd6e818216..c0a6c262f5 100644 --- a/packages/engine/src/__tests__/cron-runner.test.ts +++ b/packages/engine/src/__tests__/cron-runner.test.ts @@ -100,6 +100,13 @@ function createMockStore(settingsOverrides: Partial = {}): TaskStore { ...settingsOverrides, }), getFusionDir: vi.fn().mockReturnValue("/tmp/fusion-test/.fusion"), + /* + FNXC:EngineTests 2026-07-17-06:05: + resolveGlobalBackupRoot reads store.getGlobalSettingsDir() and falls back to + resolveGlobalDir() when unset. Tests forbid bare resolveGlobalDir() (writes to + real ~/.fusion), so return an explicit temp global dir. + */ + getGlobalSettingsDir: vi.fn().mockReturnValue("/tmp/fusion-test-global"), on: vi.fn(), off: vi.fn(), } as unknown as TaskStore; @@ -2213,7 +2220,8 @@ describe("CronRunner", () => { const runResult = await (runner as unknown as { executeLegacyCommand: (s: ScheduledTask, startedAt: string) => Promise }) .executeLegacyCommand(schedule, new Date().toISOString()); - expect(coreModuleMocks.runBackupCommand).toHaveBeenCalledWith("/tmp/.fusion", expect.any(Object)); + // FNXC:EngineTests 2026-07-17-06:10: backups resolve the shared cluster root via getGlobalSettingsDir. + expect(coreModuleMocks.runBackupCommand).toHaveBeenCalledWith("/tmp/fusion-test-global", expect.any(Object)); expect(runResult.success).toBe(true); expect(runResult.output).toContain("fusion-central-"); }); diff --git a/packages/engine/src/__tests__/executor-prompt.test.ts b/packages/engine/src/__tests__/executor-prompt.test.ts index f49f689a46..f2102f84ee 100644 --- a/packages/engine/src/__tests__/executor-prompt.test.ts +++ b/packages/engine/src/__tests__/executor-prompt.test.ts @@ -2233,6 +2233,8 @@ describe("TaskExecutor global pause behavior", () => { paused: false, pausedByAgentId: null, status: null, + // FNXC:Lifecycle 2026-07-17-06:15: FN-8141 clears skip-bypass taint on accepted completion. + bulkCompletionRefusalAt: null, }); expect(store.moveTask).toHaveBeenCalledWith("FN-001", "in-progress"); expect(store.moveTask).not.toHaveBeenCalledWith("FN-001", "in-review"); @@ -2311,6 +2313,8 @@ describe("TaskExecutor global pause behavior", () => { paused: false, pausedByAgentId: null, status: null, + // FNXC:Lifecycle 2026-07-17-06:15: FN-8141 clears skip-bypass taint on accepted completion. + bulkCompletionRefusalAt: null, }); expect(store.moveTask).toHaveBeenCalledWith("FN-001", "in-progress"); expect(store.moveTask).toHaveBeenCalledWith("FN-001", "in-review"); @@ -2381,6 +2385,8 @@ describe("TaskExecutor global pause behavior", () => { paused: false, pausedByAgentId: null, status: null, + // FNXC:Lifecycle 2026-07-17-06:15: FN-8141 clears skip-bypass taint on accepted completion. + bulkCompletionRefusalAt: null, }); expect(watchdogSpy).toHaveBeenCalledWith("FN-001", "fn_task_done"); expect(store.moveTask).toHaveBeenCalledWith("FN-001", "in-review"); @@ -2455,6 +2461,8 @@ describe("TaskExecutor global pause behavior", () => { paused: false, pausedByAgentId: null, status: null, + // FNXC:Lifecycle 2026-07-17-06:15: FN-8141 clears skip-bypass taint on accepted completion. + bulkCompletionRefusalAt: null, }); expect(store.moveTask).toHaveBeenCalledWith("FN-001", "in-progress"); expect(store.moveTask).toHaveBeenCalledWith("FN-001", "in-review"); @@ -2521,6 +2529,8 @@ describe("TaskExecutor global pause behavior", () => { paused: false, pausedByAgentId: null, status: null, + // FNXC:Lifecycle 2026-07-17-06:15: FN-8141 clears skip-bypass taint on accepted completion. + bulkCompletionRefusalAt: null, }); expect(watchdogSpy).toHaveBeenCalledWith("FN-001", "fn_task_done"); expect(store.moveTask).toHaveBeenCalledWith("FN-001", "in-review"); diff --git a/packages/engine/src/__tests__/executor-soft-delete-guard.test.ts b/packages/engine/src/__tests__/executor-soft-delete-guard.test.ts index c43b57600c..caee011a60 100644 --- a/packages/engine/src/__tests__/executor-soft-delete-guard.test.ts +++ b/packages/engine/src/__tests__/executor-soft-delete-guard.test.ts @@ -40,6 +40,14 @@ function createStore(overrides?: { tasks?: Task[] }) { off: vi.fn(), getSettings: vi.fn().mockResolvedValue({ globalPause: false, enginePaused: false }), listTasks: vi.fn().mockResolvedValue(overrides?.tasks ?? []), + /* + FNXC:EngineTests 2026-07-17-06:20: + Graph entry captures a tool-failure log cursor (getAgentLogCount + updateTask) before the + soft-delete short-circuit. Stub both so execute() can reach the deletedAt refuse path. + */ + getAgentLogCount: vi.fn().mockResolvedValue(0), + getAgentLogs: vi.fn().mockResolvedValue([]), + updateTask: vi.fn().mockResolvedValue({}), } as any; return store; } diff --git a/packages/engine/src/__tests__/executor-test-helpers.ts b/packages/engine/src/__tests__/executor-test-helpers.ts index 135974f9f1..cb3d61a483 100644 --- a/packages/engine/src/__tests__/executor-test-helpers.ts +++ b/packages/engine/src/__tests__/executor-test-helpers.ts @@ -467,6 +467,15 @@ export function createMockStore() { // test tasks carrying a branchContext group are live by construction; group // staleness is unit-tested against the real store, not here. getBranchGroup: vi.fn().mockReturnValue({ id: "BG-test", status: "open", branchName: "fusion/bg-test" }), + /* + FNXC:EngineTests 2026-07-17-06:00: + Executor graph path and backup dispatch now call getAgentLogCount / getGlobalSettingsDir + on TaskStore. Without these stubs, nearly every execute()-path test rejects with + "is not a function" and the full-suite engine shards go red. + */ + getAgentLogCount: vi.fn().mockResolvedValue(0), + getAgentLogs: vi.fn().mockResolvedValue([]), + getGlobalSettingsDir: vi.fn().mockReturnValue(undefined), }; return store as any; } diff --git a/packages/engine/src/__tests__/reliability-interactions/post-done-continuation-no-wedge.test.ts b/packages/engine/src/__tests__/reliability-interactions/post-done-continuation-no-wedge.test.ts index 58328736dc..5e4d9723fb 100644 --- a/packages/engine/src/__tests__/reliability-interactions/post-done-continuation-no-wedge.test.ts +++ b/packages/engine/src/__tests__/reliability-interactions/post-done-continuation-no-wedge.test.ts @@ -89,6 +89,8 @@ function createStore(task: Task, settingsOverrides: Record = {} (emitter as any).parseStepsFromPrompt = vi.fn().mockResolvedValue([]); (emitter as any).parseFileScopeFromPrompt = vi.fn().mockResolvedValue([]); (emitter as any).getAgentLogs = vi.fn().mockResolvedValue([]); + // FNXC:EngineTests 2026-07-17-06:30: graph tool-failure cursor reads getAgentLogCount at execute entry. + (emitter as any).getAgentLogCount = vi.fn().mockResolvedValue(0); (emitter as any).updateSettings = vi.fn().mockResolvedValue(undefined); (emitter as any).emit = emitter.emit.bind(emitter); @@ -133,6 +135,9 @@ function createSelfHealingStore(tasks: Task[], settingsOverrides: Record { audits.push(event); }); + // FNXC:EngineTests 2026-07-17-06:30: graph tool-failure cursor reads getAgentLogCount at execute entry. + (emitter as any).getAgentLogCount = vi.fn().mockResolvedValue(0); + (emitter as any).getAgentLogs = vi.fn().mockResolvedValue([]); (emitter as any).emit = emitter.emit.bind(emitter); return emitter; } diff --git a/packages/engine/src/executor.ts b/packages/engine/src/executor.ts index e95e3759fa..c847f1b1b0 100644 --- a/packages/engine/src/executor.ts +++ b/packages/engine/src/executor.ts @@ -5263,11 +5263,20 @@ export class TaskExecutor { * FNXC:ExecutorToolFailureRetry 2026-07-16-12:00: * Capture a count cursor without reading the task log. Failure handling receives this * execution-local boundary, so a stale task snapshot cannot accidentally qualify an old run. + * + * FNXC:ExecutorToolFailureRetry 2026-07-17-06:30: + * Minimal/test TaskStore adapters may omit getAgentLogCount (same optional pattern as + * project-engine). Treat a missing method as cursor 0 so graph entry does not throw + * "is not a function" and still records a durable detector boundary when updateTask exists. */ if (resolveMaxConsecutiveToolFailureRetries(settings) > 0) { - const cursor = await this.store.getAgentLogCount(task.id); + const cursor = typeof this.store.getAgentLogCount === "function" + ? await this.store.getAgentLogCount(task.id).catch(() => 0) + : 0; this.graphToolFailureRunCursors.set(task.id, cursor); - await this.store.updateTask(task.id, { toolFailureDetectorLogCursor: cursor }, this.getRunContextFor(task.id)); + if (typeof this.store.updateTask === "function") { + await this.store.updateTask(task.id, { toolFailureDetectorLogCursor: cursor }, this.getRunContextFor(task.id)); + } } let selection: { workflowId: string; stepIds: string[] } | undefined; if ( @@ -9252,9 +9261,17 @@ export class TaskExecutor { private async hasTrailingConsecutiveToolFailures(taskId: string, cursor: number | null | undefined, threshold: number): Promise { if (cursor == null) return false; - const currentCount = await this.store.getAgentLogCount(taskId); + /* + FNXC:ExecutorToolFailureRetry 2026-07-17-06:30: + Optional log APIs on minimal/test stores: missing getAgentLogCount/getAgentLogs cannot + prove a trailing failure streak, so return false rather than throw mid-failure handling. + */ + if (typeof this.store.getAgentLogCount !== "function" || typeof this.store.getAgentLogs !== "function") { + return false; + } + const currentCount = await this.store.getAgentLogCount(taskId).catch(() => cursor); if (currentCount <= cursor) return false; - const entries = await this.store.getAgentLogs(taskId, { limit: currentCount - cursor }); + const entries = await this.store.getAgentLogs(taskId, { limit: currentCount - cursor }).catch(() => []); let failures = 0; for (let index = entries.length - 1; index >= 0; index -= 1) { const type = entries[index]!.type; diff --git a/packages/i18n/locales/es/app.json b/packages/i18n/locales/es/app.json index 8d2f1fcecb..71685797a1 100644 --- a/packages/i18n/locales/es/app.json +++ b/packages/i18n/locales/es/app.json @@ -6654,7 +6654,12 @@ "executorEscalationModelId": "", "executorEscalationModelIdHelp": "", "executorEscalationNodeId": "", - "executorEscalationNodeIdHelp": "" + "executorEscalationNodeIdHelp": "", + "triageDuplicateResolution": "Resolución de duplicados en triage", + "triageDuplicateResolutionHelp": "Bloquear duplicados detectados en triage para una decisión Mantener/Eliminar (predeterminado), o mantener/eliminar automáticamente sin bloquear.", + "triageDuplicateResolutionPrompt": "Bloquear para decidir (predeterminado)", + "triageDuplicateResolutionKeep": "Mantener automáticamente", + "triageDuplicateResolutionDelete": "Eliminar automáticamente" }, "title": "Configuración", "worktrees": { @@ -7647,7 +7652,13 @@ "copy": "Esta tarea parece ser un casi-duplicado de", "headline": "Posible duplicado detectado", "keepBtn": "Conservar", - "kept": "Se conservó {{id}} y se descartó la advertencia de duplicado" + "kept": "Se conservó {{id}} y se descartó la advertencia de duplicado", + "deleteBtn": "Eliminar", + "deleteConfirm": "Eliminar", + "deleted": "Eliminado {{id}}", + "deleteMessage": "¿Eliminar {{id}} como duplicado de {{duplicateOf}}?", + "deleteTitle": "Eliminar tarea duplicada", + "triageActions": "Elige Eliminar para quitar este duplicado, o Mantener para continuar de todos modos." }, "nextRecoveryAt": "Próxima recuperación a las {{time}}", "no": "No", diff --git a/packages/i18n/locales/fr/app.json b/packages/i18n/locales/fr/app.json index 5afdb21def..0f284f9e02 100644 --- a/packages/i18n/locales/fr/app.json +++ b/packages/i18n/locales/fr/app.json @@ -6654,7 +6654,12 @@ "executorEscalationModelId": "", "executorEscalationModelIdHelp": "", "executorEscalationNodeId": "", - "executorEscalationNodeIdHelp": "" + "executorEscalationNodeIdHelp": "", + "triageDuplicateResolution": "Résolution des doublons en triage", + "triageDuplicateResolutionHelp": "Bloquer les doublons détectés en triage pour une décision Conserver/Supprimer (par défaut), ou conserver/supprimer automatiquement sans bloquer.", + "triageDuplicateResolutionPrompt": "Bloquer pour décision (par défaut)", + "triageDuplicateResolutionKeep": "Conserver automatiquement", + "triageDuplicateResolutionDelete": "Supprimer automatiquement" }, "title": "Paramètres", "worktrees": { @@ -7647,7 +7652,13 @@ "copy": "Cette tâche semble être un quasi-doublon de", "headline": "Doublon potentiel détecté", "keepBtn": "Conserver", - "kept": "{{id}} conservé et avertissement de doublon ignoré" + "kept": "{{id}} conservé et avertissement de doublon ignoré", + "deleteBtn": "Supprimer", + "deleteConfirm": "Supprimer", + "deleted": "Supprimé {{id}}", + "deleteMessage": "Supprimer {{id}} comme doublon de {{duplicateOf}} ?", + "deleteTitle": "Supprimer la tâche en double", + "triageActions": "Choisissez Supprimer pour retirer ce doublon, ou Conserver pour continuer." }, "nextRecoveryAt": "Prochaine récupération à {{time}}", "no": "Non", diff --git a/packages/i18n/locales/ko/app.json b/packages/i18n/locales/ko/app.json index 3e4f558dee..60e9093b27 100644 --- a/packages/i18n/locales/ko/app.json +++ b/packages/i18n/locales/ko/app.json @@ -6654,7 +6654,12 @@ "executorEscalationModelId": "", "executorEscalationModelIdHelp": "", "executorEscalationNodeId": "", - "executorEscalationNodeIdHelp": "" + "executorEscalationNodeIdHelp": "", + "triageDuplicateResolution": "트리아지 중복 해결", + "triageDuplicateResolutionHelp": "트리아지에서 감지된 중복을 유지/삭제 결정으로 차단(기본)하거나, 차단 없이 자동 유지/삭제합니다.", + "triageDuplicateResolutionPrompt": "결정 대기(기본)", + "triageDuplicateResolutionKeep": "자동 유지", + "triageDuplicateResolutionDelete": "자동 삭제" }, "title": "설정", "worktrees": { @@ -7647,7 +7652,13 @@ "copy": "이 작업은 다음의 근사 중복으로 보입니다", "headline": "잠재적 중복 감지됨", "keepBtn": "유지", - "kept": "{{id}} 유지 및 중복 경고 무시됨" + "kept": "{{id}} 유지 및 중복 경고 무시됨", + "deleteBtn": "삭제", + "deleteConfirm": "삭제", + "deleted": "{{id}} 삭제됨", + "deleteMessage": "{{duplicateOf}}의 중복으로 {{id}}를 삭제할까요?", + "deleteTitle": "중복 작업 삭제", + "triageActions": "이 중복을 제거하려면 삭제를, 계속하려면 유지를 선택하세요." }, "nextRecoveryAt": "다음 복구 시각: {{time}}", "no": "아니요", diff --git a/packages/i18n/locales/zh-CN/app.json b/packages/i18n/locales/zh-CN/app.json index 91db2d5100..ac8b614567 100644 --- a/packages/i18n/locales/zh-CN/app.json +++ b/packages/i18n/locales/zh-CN/app.json @@ -6654,7 +6654,12 @@ "executorEscalationModelId": "", "executorEscalationModelIdHelp": "", "executorEscalationNodeId": "", - "executorEscalationNodeIdHelp": "" + "executorEscalationNodeIdHelp": "", + "triageDuplicateResolution": "分诊重复项处理", + "triageDuplicateResolutionHelp": "将分诊检测到的重复项拦截并要求保留/删除决策(默认),或不拦截而自动保留/删除。", + "triageDuplicateResolutionPrompt": "拦截并决策(默认)", + "triageDuplicateResolutionKeep": "自动保留", + "triageDuplicateResolutionDelete": "自动删除" }, "title": "设置", "worktrees": { @@ -7647,7 +7652,13 @@ "copy": "此任务看起来是以下任务的近似重复:", "headline": "检测到潜在重复", "keepBtn": "保留", - "kept": "保留了 {{id}} 并关闭了重复警告" + "kept": "保留了 {{id}} 并关闭了重复警告", + "deleteBtn": "删除", + "deleteConfirm": "删除", + "deleted": "已删除 {{id}}", + "deleteMessage": "将 {{id}} 作为 {{duplicateOf}} 的重复项删除?", + "deleteTitle": "删除重复任务", + "triageActions": "选择删除以移除此重复项,或选择保留以继续。" }, "nextRecoveryAt": "下次恢复时间:{{time}}", "no": "否", diff --git a/packages/i18n/locales/zh-TW/app.json b/packages/i18n/locales/zh-TW/app.json index c5c597e401..6114332300 100644 --- a/packages/i18n/locales/zh-TW/app.json +++ b/packages/i18n/locales/zh-TW/app.json @@ -6654,7 +6654,12 @@ "executorEscalationModelId": "", "executorEscalationModelIdHelp": "", "executorEscalationNodeId": "", - "executorEscalationNodeIdHelp": "" + "executorEscalationNodeIdHelp": "", + "triageDuplicateResolution": "分流重複項處理", + "triageDuplicateResolutionHelp": "將分流偵測到的重複項攔截並要求保留/刪除決策(預設),或不攔截而自動保留/刪除。", + "triageDuplicateResolutionPrompt": "攔截並決策(預設)", + "triageDuplicateResolutionKeep": "自動保留", + "triageDuplicateResolutionDelete": "自動刪除" }, "title": "設定", "worktrees": { @@ -7647,7 +7652,13 @@ "copy": "此任務看起來是以下任務的近似重複:", "headline": "檢測到潛在重複", "keepBtn": "保留", - "kept": "保留了 {{id}} 並關閉了重複警告" + "kept": "保留了 {{id}} 並關閉了重複警告", + "deleteBtn": "刪除", + "deleteConfirm": "刪除", + "deleted": "已刪除 {{id}}", + "deleteMessage": "將 {{id}} 作為 {{duplicateOf}} 的重複項刪除?", + "deleteTitle": "刪除重複任務", + "triageActions": "選擇刪除以移除此重複項,或選擇保留以繼續。" }, "nextRecoveryAt": "下次恢復時間:{{time}}", "no": "否", diff --git a/scripts/lib/test-quarantine.json b/scripts/lib/test-quarantine.json index 088b59cbea..24d29d9735 100644 --- a/scripts/lib/test-quarantine.json +++ b/scripts/lib/test-quarantine.json @@ -1,5 +1,5 @@ { - "$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 is the enforcement.", + "$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 is the enforcement.", "entries": [ { "file": "packages/engine/src/__tests__/backlog-pressure-reporter.test.ts", @@ -115,6 +115,111 @@ "file": "packages/dashboard/app/components/__tests__/TaskDetailModal.oversight-mobile.test.tsx", "reason": "PR #2229 review: focus assertion flakes under concurrent quality load (activeElement never becomes the nudge menuitem). Quarantine on sight per deletion ratchet instead of it.skip in source. Mirrored exclude in packages/dashboard/vitest.config.ts. Rescue requires a deterministic focus harness (fakeTimers/userEvent), not timeout widening.", "quarantinedAt": "2026-07-16" + }, + { + "file": "packages/dashboard/app/components/__tests__/PlanningModeModal.planning-flow.test.tsx", + "reason": "Flake under concurrent dashboard quality load. Quarantine on sight; mirrored packages/dashboard/vitest.config.ts. Full-suite inventory guard 2026-07-17.", + "quarantinedAt": "2026-07-17" + }, + { + "file": "packages/dashboard/app/components/__tests__/QuickEntryBox.test.tsx", + "reason": "Flake under concurrent quality load. Quarantine on sight; mirrored packages/dashboard/vitest.config.ts. Full-suite inventory guard 2026-07-17.", + "quarantinedAt": "2026-07-17" + }, + { + "file": "packages/dashboard/src/__tests__/chat-project-services.test.ts", + "reason": "VAL-REMOVAL-005 PG migration: fails via sync SQLite Database.init. Mirrored packages/dashboard/vitest.config.ts. Full-suite inventory guard 2026-07-17.", + "quarantinedAt": "2026-07-17" + }, + { + "file": "packages/dashboard/src/__tests__/gitlab-source-issue-reconciler.test.ts", + "reason": "VAL-REMOVAL-005 PG migration: sync SQLite Database/TaskStore.init. Mirrored packages/dashboard/vitest.config.ts. Full-suite inventory guard 2026-07-17.", + "quarantinedAt": "2026-07-17" + }, + { + "file": "packages/dashboard/src/__tests__/mcp-helper-forwarding.test.ts", + "reason": "VAL-REMOVAL-005 PG migration: createInsightTaskStore still calls TaskStore/Database.init. Mirrored packages/dashboard/vitest.config.ts. Full-suite inventory guard 2026-07-17.", + "quarantinedAt": "2026-07-17" + }, + { + "file": "packages/dashboard/src/__tests__/mesh-routes.test.ts", + "reason": "VAL-REMOVAL-005 / ungated by quality projects while excluded from vitest. Mirrored packages/dashboard/vitest.config.ts. Full-suite inventory guard 2026-07-17.", + "quarantinedAt": "2026-07-17" + }, + { + "file": "packages/dashboard/src/__tests__/planning-generation-cancellation.test.ts", + "reason": "VAL-REMOVAL-005 PG migration: fails via sync SQLite Database.init. Mirrored packages/dashboard/vitest.config.ts. Full-suite inventory guard 2026-07-17.", + "quarantinedAt": "2026-07-17" + }, + { + "file": "packages/dashboard/src/__tests__/plugin-registry-dist.test.ts", + "reason": "Ungated by quality projects while excluded from vitest runs. Mirrored packages/dashboard/vitest.config.ts. Full-suite inventory guard 2026-07-17.", + "quarantinedAt": "2026-07-17" + }, + { + "file": "packages/dashboard/src/__tests__/process-lifecycle.test.ts", + "reason": "VAL-REMOVAL-005 PG migration: fails via sync SQLite Database.init. Mirrored packages/dashboard/vitest.config.ts. Full-suite inventory guard 2026-07-17.", + "quarantinedAt": "2026-07-17" + }, + { + "file": "packages/dashboard/src/__tests__/register-signal-routes.test.ts", + "reason": "VAL-REMOVAL-005 PG migration: fails via sync SQLite Database.init. Mirrored packages/dashboard/vitest.config.ts. Full-suite inventory guard 2026-07-17.", + "quarantinedAt": "2026-07-17" + }, + { + "file": "packages/dashboard/src/__tests__/routes-agent-prompt-sizes-integration.test.ts", + "reason": "VAL-REMOVAL-005 PG migration: fails via sync SQLite Database.init. Mirrored packages/dashboard/vitest.config.ts. Full-suite inventory guard 2026-07-17.", + "quarantinedAt": "2026-07-17" + }, + { + "file": "packages/dashboard/src/__tests__/routes-remote-access.test.ts", + "reason": "VAL-REMOVAL-005 PG migration: fails via sync SQLite Database.init. Mirrored packages/dashboard/vitest.config.ts. Full-suite inventory guard 2026-07-17.", + "quarantinedAt": "2026-07-17" + }, + { + "file": "packages/dashboard/src/__tests__/routes-system.test.ts", + "reason": "VAL-REMOVAL-005 / CPU-sample flake under loaded API lane. Mirrored packages/dashboard/vitest.config.ts. Full-suite inventory guard 2026-07-17.", + "quarantinedAt": "2026-07-17" + }, + { + "file": "packages/dashboard/src/__tests__/server-view-preload.test.ts", + "reason": "VAL-REMOVAL-005 PG migration: sync SQLite Database/TaskStore.init. Mirrored packages/dashboard/vitest.config.ts. Full-suite inventory guard 2026-07-17.", + "quarantinedAt": "2026-07-17" + }, + { + "file": "packages/dashboard/src/__tests__/task-effective-settings-route.test.ts", + "reason": "VAL-REMOVAL-005 PG migration: sync SQLite Database/TaskStore.init. Mirrored packages/dashboard/vitest.config.ts. Full-suite inventory guard 2026-07-17.", + "quarantinedAt": "2026-07-17" + }, + { + "file": "packages/dashboard/src/routes/__tests__/agent-avatar-routes.test.ts", + "reason": "VAL-REMOVAL-005 PG migration: sync SQLite Database/TaskStore.init. Mirrored packages/dashboard/vitest.config.ts. Full-suite inventory guard 2026-07-17.", + "quarantinedAt": "2026-07-17" + }, + { + "file": "packages/dashboard/src/routes/__tests__/mission-workflow-triage-route.test.ts", + "reason": "VAL-REMOVAL-005 PG migration: sync SQLite Database/TaskStore.init. Mirrored packages/dashboard/vitest.config.ts. Full-suite inventory guard 2026-07-17.", + "quarantinedAt": "2026-07-17" + }, + { + "file": "packages/dashboard/src/routes/__tests__/register-settings-memory-worktrunk.test.ts", + "reason": "VAL-REMOVAL-005 PG migration: sync SQLite Database/TaskStore.init. Mirrored packages/dashboard/vitest.config.ts. Full-suite inventory guard 2026-07-17.", + "quarantinedAt": "2026-07-17" + }, + { + "file": "packages/dashboard/src/routes/__tests__/tasks-overseer-controls.test.ts", + "reason": "VAL-REMOVAL-005 PG migration: sync SQLite Database/TaskStore.init. Mirrored packages/dashboard/vitest.config.ts. Full-suite inventory guard 2026-07-17.", + "quarantinedAt": "2026-07-17" + }, + { + "file": "packages/dashboard/src/routes/__tests__/tasks-planner-overseer-state.test.ts", + "reason": "VAL-REMOVAL-005 PG migration: TaskStore/Database.init. Mirrored packages/dashboard/vitest.config.ts. Full-suite inventory guard 2026-07-17.", + "quarantinedAt": "2026-07-17" + }, + { + "file": "packages/dashboard/src/routes/__tests__/workflow-validate-route.test.ts", + "reason": "VAL-REMOVAL-005 PG migration: sync SQLite Database/TaskStore.init. Mirrored packages/dashboard/vitest.config.ts. Full-suite inventory guard 2026-07-17.", + "quarantinedAt": "2026-07-17" } ] }