feat(FN-4559): complete Step 2 — recover finalize callsites and commitSha propagation

Fusion-Task-Id: FN-4559
Fusion-Task-Lineage: 9276f683-657c-4604-aaef-143da488b287
This commit is contained in:
Fusion
2026-05-15 00:12:42 -07:00
committed by gsxdsm
parent b46cf42a67
commit e2dc95b418

View File

@@ -5842,6 +5842,7 @@ export async function aiMergeTask(
// every consumer of mergeDetails). Set by the squashIsEmpty / staged===0
// sites in mergeAttempt + attemptWithSideStrategy.
let mergeWasEmpty = false;
let recoveredMergeSha: string | undefined;
const projectDefaultBranch = typeof settings.baseBranch === "string" ? settings.baseBranch : undefined;
const mergeTarget = resolveTaskMergeTarget(task, {
@@ -6737,7 +6738,26 @@ export async function aiMergeTask(
store,
audit,
);
if (finalized.ok && finalized.reason === "branch-already-merged-on-main") {
mergeWasEmpty = true;
recoveredMergeSha = finalized.mergeSha;
mergerLog.log(`${taskId}: verification-fix finalize recovered as already landed on main via=${finalized.strategy} sha=${finalized.mergeSha?.slice(0, 8)}`);
await store.appendAgentLog(
taskId,
"Verification fix finalize: task already landed on main — recovered",
"tool_result",
`via=${finalized.strategy} sha=${finalized.mergeSha?.slice(0, 8)}`,
"merger",
);
await store.logEntry(taskId, `Auto-recovered: verification fix produced no content but task already landed on main at ${finalized.mergeSha?.slice(0, 8)} via ${finalized.strategy}`);
return true;
}
if (!finalized.ok) {
if (finalized.reason === "fix-produced-no-content" && recoveredMergeSha) {
mergerLog.warn(`${taskId}: finalize returned fix-produced-no-content after recovered merge SHA ${recoveredMergeSha.slice(0, 8)}; treating as recovered`);
mergeWasEmpty = true;
return true;
}
// Phantom-merge guard: refused to fabricate a commit. Reset
// any leftover squash state and propagate failure.
const { stdout: currentHeadOut } = await execAsync("git rev-parse HEAD", { cwd: rootDir, encoding: "utf-8" });
@@ -6860,7 +6880,26 @@ export async function aiMergeTask(
store,
audit,
);
if (finalized.ok && finalized.reason === "branch-already-merged-on-main") {
mergeWasEmpty = true;
recoveredMergeSha = finalized.mergeSha;
mergerLog.log(`${taskId}: build-fix finalize recovered as already landed on main via=${finalized.strategy} sha=${finalized.mergeSha?.slice(0, 8)}`);
await store.appendAgentLog(
taskId,
"Verification fix finalize: task already landed on main — recovered",
"tool_result",
`via=${finalized.strategy} sha=${finalized.mergeSha?.slice(0, 8)}`,
"merger",
);
await store.logEntry(taskId, `Auto-recovered: verification fix produced no content but task already landed on main at ${finalized.mergeSha?.slice(0, 8)} via ${finalized.strategy}`);
return true;
}
if (!finalized.ok) {
if (finalized.reason === "fix-produced-no-content" && recoveredMergeSha) {
mergerLog.warn(`${taskId}: build finalize returned fix-produced-no-content after recovered merge SHA ${recoveredMergeSha.slice(0, 8)}; treating as recovered`);
mergeWasEmpty = true;
return true;
}
// Phantom-merge guard: the verification fix passed but no
// commit could be produced (no staged content + HEAD never
// moved). Reset and propagate failure rather than silently
@@ -7060,7 +7099,10 @@ export async function aiMergeTask(
// Guard 2: the empty-squash success paths in mergeAttempt /
// attemptWithSideStrategy return true without committing when nothing
// was staged. The recorded HEAD then has nothing to do with this task.
const recordedSha = (isEmptyCommit || mergeWasEmpty) ? undefined : commitSha;
let recordedSha = (isEmptyCommit || mergeWasEmpty) ? undefined : commitSha;
if (recoveredMergeSha) {
recordedSha = recoveredMergeSha;
}
const auditSha = recordedSha;
const postMergeAuditMode = normalizePostMergeAuditMode(settings.postMergeAuditMode);
@@ -7132,7 +7174,7 @@ export async function aiMergeTask(
mergerLog.warn(
`${taskId}: local squash produced an empty commit (${commitSha?.slice(0, 8)}) — branch likely contained dupes of main. Skipping commitSha; recovery will backfill when real commit lands.`,
);
} else if (mergeWasEmpty) {
} else if (mergeWasEmpty && !recoveredMergeSha) {
mergerLog.warn(
`${taskId}: merge succeeded without committing (branch already on main). Skipping commitSha; nothing new landed locally.`,
);