fix(FN-2084): improve auto-merge error recovery observability

- Add runtimeLog.error diagnostics when auto-merge recovery updates fail after conflict, non-conflict, or strategy errors
- Keep recovery behavior best-effort while surfacing concrete failure reasons from thrown exceptions
- Add merge-error-recovery tests for conflict retry exhaustion, non-conflict/strategy failures, and verification-error rollback to in-progress
- Verify recovery paths do not crash merge draining when persistence calls fail
This commit is contained in:
Fusion
2026-04-18 21:30:30 -07:00
committed by gsxdsm
parent 7a33b5c1dd
commit 891c95bf89
2 changed files with 305 additions and 6 deletions

View File

@@ -683,8 +683,10 @@ export class ProjectEngine {
// Max retries exceeded or auto-resolve disabled
try {
await store.updateTask(taskId, { status: null });
} catch {
/* best-effort */
} catch (recoveryErr) {
runtimeLog.error(
`Auto-merge: failed to clear status on ${taskId} after max retries exceeded: ${recoveryErr instanceof Error ? recoveryErr.message : String(recoveryErr)}`,
);
}
}
} else {
@@ -695,8 +697,10 @@ export class ProjectEngine {
mergeRetries: ProjectEngine.MAX_AUTO_MERGE_RETRIES,
error: errorMsg,
});
} catch {
/* best-effort */
} catch (recoveryErr) {
runtimeLog.error(
`Auto-merge: failed to update ${taskId} after non-conflict error: ${recoveryErr instanceof Error ? recoveryErr.message : String(recoveryErr)}`,
);
}
}
} else {
@@ -706,8 +710,10 @@ export class ProjectEngine {
mergeRetries: ProjectEngine.MAX_AUTO_MERGE_RETRIES,
error: errorMsg,
});
} catch {
/* best-effort */
} catch (recoveryErr) {
runtimeLog.error(
`Auto-merge: failed to update ${taskId} after merge strategy error: ${recoveryErr instanceof Error ? recoveryErr.message : String(recoveryErr)}`,
);
}
}
} finally {