feat(FN-5103): complete Step 3 — skip reconcile for restricted landed-files capture

Fusion-Task-Id: FN-5103
Fusion-Task-Lineage: e4e4d9ba-4884-4feb-b18b-a30e799c3fb1
This commit is contained in:
Fusion (runfusion.ai)
2026-05-18 23:24:39 -07:00
committed by gsxdsm
parent d6be8fc771
commit 20ab2f0172
2 changed files with 100 additions and 0 deletions

View File

@@ -6218,6 +6218,102 @@ describe("stale triage processing eviction before recovery", () => {
// ── Maintenance cycle concurrency ──────────────────────────────────
describe("recoverDoneTaskMergeMetadata", () => {
it("FN-5103: skips attribution-restricted done task merge metadata reconcile", async () => {
const store = createMockStore();
const manager = new SelfHealingManager(store, { rootDir: "/tmp/test-project" });
(store.listTasks as ReturnType<typeof vi.fn>).mockResolvedValue([
{
id: "FN-5103-A",
column: "done",
paused: false,
mergeDetails: {
commitSha: "merge1",
mergeConfirmed: true,
landedFilesAttributionRestricted: true,
landedFiles: ["a.ts"],
filesChanged: 1,
insertions: 1,
deletions: 0,
},
},
]);
const repaired = await manager.recoverDoneTaskMergeMetadata();
expect(repaired).toBe(0);
expect(store.updateTask).not.toHaveBeenCalled();
manager.stop();
});
it("FN-5103: skips no-op verified-short-circuit merge metadata reconcile", async () => {
const store = createMockStore();
const manager = new SelfHealingManager(store, { rootDir: "/tmp/test-project" });
(store.listTasks as ReturnType<typeof vi.fn>).mockResolvedValue([
{
id: "FN-5103-B",
column: "done",
paused: false,
mergeDetails: {
commitSha: "merge1",
mergeConfirmed: true,
noOpVerifiedShortCircuit: true,
landedFiles: [],
filesChanged: 0,
insertions: 0,
deletions: 0,
},
},
]);
const repaired = await manager.recoverDoneTaskMergeMetadata();
expect(repaired).toBe(0);
expect(store.updateTask).not.toHaveBeenCalled();
manager.stop();
});
it("FN-5103: fallback captures remain reconcilable", async () => {
const store = createMockStore();
const manager = new SelfHealingManager(store, { rootDir: "/tmp/test-project" });
(store.listTasks as ReturnType<typeof vi.fn>).mockResolvedValue([
{
id: "FN-5103-C",
column: "done",
paused: false,
mergeDetails: {
commitSha: "merge1",
mergeConfirmed: false,
landedFilesCaptureFallback: "attribution-failed",
},
},
]);
vi.spyOn(manager as any, "findLandedTaskCommit").mockResolvedValue({
sha: "merge1",
subject: "fix(FN-5103): landed",
filesChanged: 2,
insertions: 4,
deletions: 1,
});
const repaired = await manager.recoverDoneTaskMergeMetadata();
expect(repaired).toBe(1);
expect(store.updateTask).toHaveBeenCalledWith("FN-5103-C", expect.objectContaining({
mergeDetails: expect.objectContaining({
commitSha: "merge1",
mergeConfirmed: true,
}),
}));
manager.stop();
});
it("FN-3862: confirmed task with reachable owned stored SHA preserves canonical commitSha", async () => {
const store = createMockStore();
const manager = new SelfHealingManager(store, { rootDir: "/tmp/test-project" });

View File

@@ -4283,6 +4283,10 @@ export class SelfHealingManager {
let repaired = 0;
for (const task of candidates) {
if (task.mergeDetails?.landedFilesAttributionRestricted || task.mergeDetails?.noOpVerifiedShortCircuit) {
log.log(`recoverDoneTaskMergeMetadata: skipped ${task.id} — attribution-restricted`);
continue;
}
try {
const storedSha = task.mergeDetails?.commitSha;
if (!storedSha) continue;