diff --git a/packages/engine/src/mission-execution-loop.ts b/packages/engine/src/mission-execution-loop.ts index 5fc784b2bf..9b498d054a 100644 --- a/packages/engine/src/mission-execution-loop.ts +++ b/packages/engine/src/mission-execution-loop.ts @@ -25,7 +25,9 @@ import type { Mission, ValidationDiagnostics, } from "@fusion/core"; -import { MissionRemediationStoppedError, normalizeMissionAssertionType, normalizeValidationDiagnostics, renderValidationFailureDescription } from "@fusion/core"; +import { MissionRemediationStoppedError, normalizeMissionAssertionType, normalizeValidationDiagnostics, renderValidationFailureDescription, + resolveTaskLifecycleColumns, +} from "@fusion/core"; import { GitCheckoutMaterializer, type CheckoutMaterializer, type VerificationOutcome } from "./mission-verification.js"; import { createFnAgent, promptWithFallback, type AgentResult } from "./pi.js"; import { mergeEffectiveSettings } from "./effective-settings.js"; @@ -318,7 +320,13 @@ export class MissionExecutionLoop extends EventEmitter { // If the feature has a linked task that's already done, re-trigger validation if (feature.taskId) { const linkedTask = await this.taskStore.getTask(feature.taskId).catch(() => null); - if (linkedTask && (linkedTask.column === "done" || linkedTask.column === "archived")) { + const linkedLifecycle = linkedTask + ? await resolveTaskLifecycleColumns(this.taskStore, linkedTask.id) + : undefined; + if (linkedTask && ( + linkedTask.column === (linkedLifecycle?.complete ?? "done") + || linkedTask.column === (linkedLifecycle?.archived ?? "archived") + )) { await this.processTaskOutcome(feature.taskId); } } @@ -335,7 +343,13 @@ export class MissionExecutionLoop extends EventEmitter { if (feature.taskId) { try { const linkedTask = await this.taskStore.getTask(feature.taskId).catch(() => null); - if (linkedTask && (linkedTask.column === "done" || linkedTask.column === "archived")) { + const linkedLifecycle = linkedTask + ? await resolveTaskLifecycleColumns(this.taskStore, linkedTask.id) + : undefined; + if (linkedTask && ( + linkedTask.column === (linkedLifecycle?.complete ?? "done") + || linkedTask.column === (linkedLifecycle?.archived ?? "archived") + )) { await this.processTaskOutcome(feature.taskId); } recoveredCount++; @@ -361,7 +375,13 @@ export class MissionExecutionLoop extends EventEmitter { try { const linkedTask = await this.taskStore.getTask(feature.taskId).catch(() => null); - if (linkedTask && (linkedTask.column === "done" || linkedTask.column === "archived")) { + const linkedLifecycle = linkedTask + ? await resolveTaskLifecycleColumns(this.taskStore, linkedTask.id) + : undefined; + if (linkedTask && ( + linkedTask.column === (linkedLifecycle?.complete ?? "done") + || linkedTask.column === (linkedLifecycle?.archived ?? "archived") + )) { loopLog.log(`Recovery: re-triggering implementing feature ${feature.id} from completed task ${feature.taskId}`); await this.processTaskOutcome(feature.taskId); recoveredCount++; @@ -665,7 +685,12 @@ export class MissionExecutionLoop extends EventEmitter { if (!taskId) return null; const linkedTask = await this.taskStore.getTask(taskId).catch(() => null); const column = linkedTask?.column; - if (!column || column === "done" || column === "archived") return null; + const premergeLifecycle = linkedTask ? await resolveTaskLifecycleColumns(this.taskStore, linkedTask.id) : undefined; + if ( + !column + || column === (premergeLifecycle?.complete ?? "done") + || column === (premergeLifecycle?.archived ?? "archived") + ) return null; return column; } diff --git a/scripts/lib/lifecycle-column-census-baseline.json b/scripts/lib/lifecycle-column-census-baseline.json index 1f623b75a6..f3be903dce 100644 --- a/scripts/lib/lifecycle-column-census-baseline.json +++ b/scripts/lib/lifecycle-column-census-baseline.json @@ -7,7 +7,6 @@ "packages/dashboard/app/components/TaskDetailModal.tsx": 30, "packages/engine/src/scheduler.ts": 26, "packages/core/src/store.ts": 12, - "packages/engine/src/mission-execution-loop.ts": 10, "packages/core/src/task-store/async-comments-attachments.ts": 9, "packages/dashboard/app/components/TaskContextMenu.tsx": 9, "packages/dashboard/src/github-tracking-comments.ts": 9, @@ -92,6 +91,7 @@ "packages/engine/src/auto-merge-finalization.ts": 2, "packages/engine/src/cli-agent/state-machine.ts": 2, "packages/engine/src/merger-scope-auto-widen.ts": 2, + "packages/engine/src/mission-execution-loop.ts": 2, "plugins/fusion-plugin-even-cards/src/cards/board-cards.ts": 2, "plugins/fusion-plugin-reports/src/store/report-store.ts": 2, "packages/cli/src/commands/pr.ts": 1,