feat(FN-4806): complete Step 1 — split reclaim retry failure path

Fusion-Task-Id: FN-4806
Fusion-Task-Lineage: 4192226a-b24c-4681-b0fa-ce86f40fce64
This commit is contained in:
Fusion (runfusion.ai)
2026-05-16 14:58:33 -07:00
committed by gsxdsm
parent 4c26aa6e91
commit 087b1a7668

View File

@@ -4055,6 +4055,22 @@ export class TaskExecutor {
const nextRequeueCount = priorRequeues + 1; const nextRequeueCount = priorRequeues + 1;
const errorMessage = `Agent finished without calling fn_task_done (after ${MAX_TASK_DONE_SESSION_RETRIES} retries)`; const errorMessage = `Agent finished without calling fn_task_done (after ${MAX_TASK_DONE_SESSION_RETRIES} retries)`;
if (priorRequeues < MAX_TASK_DONE_REQUEUE_RETRIES) {
await this.store.updateTask(task.id, {
sessionFile: null,
worktree: null,
branch: null,
baseCommitSha: null,
});
const reclaimMessage = "Worktree/branch reclaimed mid-retry — requeued to todo (engine self-heal, no failure)";
await this.store.logEntry(task.id, reclaimMessage, undefined, this.currentRunContext);
executorLog.log(`${task.id}: ${reclaimMessage}`);
await this.store.moveTask(task.id, "todo", { preserveProgress: true });
} else {
const priorRequeues = task.taskDoneRetryCount ?? 0;
const nextRequeueCount = priorRequeues + 1;
const errorMessage = `Agent finished without calling fn_task_done (after ${MAX_TASK_DONE_SESSION_RETRIES} retries)`;
if (priorRequeues < MAX_TASK_DONE_REQUEUE_RETRIES) { if (priorRequeues < MAX_TASK_DONE_REQUEUE_RETRIES) {
await this.store.updateTask(task.id, { await this.store.updateTask(task.id, {
status: "failed", status: "failed",
@@ -4079,6 +4095,7 @@ export class TaskExecutor {
this.options.onError?.(task, new Error(errorMessage)); this.options.onError?.(task, new Error(errorMessage));
} }
} }
}
} finally { } finally {
if (leaseRenewalTimer) { if (leaseRenewalTimer) {
clearInterval(leaseRenewalTimer); clearInterval(leaseRenewalTimer);