FN-6691: speed shared-branch lifecycle slow tests

Optimizes shared branch group lifecycle coverage by bypassing repeated mock merger sessions where full merge behavior is not under test.

- Add a deterministic fast integration helper that merges staged member branches into the shared group branch and records merge metadata.
- Keep routing and self-healing cases on the full aiMergeTask path while using the faster seam for promotion and gating assertions.
- Preserve FN-5820 shared branch completion and auto-merge-off expectations with less slow-test overhead.

Files changed:
 .../shared-branch-group-lifecycle.slow.test.ts     | 54 ++++++++++++++++++----
 1 file changed, 46 insertions(+), 8 deletions(-)

Fusion-Task-Id: FN-6691

Fusion-Task-Lineage: 5f01318c-20b0-4f11-ad3c-c2e1b8cd0f3e
This commit is contained in:
gsxdsm
2026-06-19 03:11:31 -07:00
parent c8daf21cd0
commit df390ed5fd

View File

@@ -74,6 +74,46 @@ git checkout main
return { taskId: input.taskId, branch, worktreePath, fileName: input.fileName };
}
async function fastIntegrateSharedMember(
store: TaskStore,
rootDir: string,
member: StagedMember,
group: { id: string; branchName: string },
): Promise<string> {
/*
FNXC:EngineTests 2026-06-19-02:55:
FN-6691 keeps full aiMergeTask coverage in the routing-focused and self-healing cases, but promotion/gating cases only need member branches already accumulated on the shared branch with merge metadata.
Use one deterministic git shell seam here so FN-5820 completion, promotion, and auto-merge-off assertions stay intact without paying the mock merger session cost in every case.
*/
const message = `test: integrate ${member.taskId} into ${group.branchName}`;
const script = `set -e
member_branch=$1
group_branch=$2
message=$3
if ! git show-ref --verify --quiet "refs/heads/$group_branch"; then
git branch "$group_branch" main
fi
git checkout "$group_branch"
git merge --no-ff "$member_branch" -m "$message"
git rev-parse HEAD
git checkout main
`;
const output = git(rootDir, `sh -c ${shellQuote(script)} sh ${[member.branch, group.branchName, message].map(shellQuote).join(" ")}`);
const commitSha = output.split("\n").map((line) => line.trim()).filter(Boolean).at(-1) ?? "";
await store.updateTask(member.taskId, {
column: "done",
status: null,
error: null,
mergeDetails: {
commitSha,
mergeConfirmed: true,
mergeTargetSource: "branch-group-integration",
mergeTargetBranch: group.branchName,
},
} as any);
return commitSha;
}
describe("FN-5820 reliability interactions: shared branch group lifecycle", () => {
it.skipIf(!hasGit)("CASE 1: shared members resolve distinct working branches/worktrees without branch conflict", async () => {
const fixture = await makeReliabilityFixture({ taskId: "FN-5820-RI-A", settings: sharedBranchLifecycleSettings() });
@@ -213,8 +253,7 @@ describe("FN-5820 reliability interactions: shared branch group lifecycle", () =
await store.setTaskBranchGroup(task.id, group.id);
await store.setTaskBranchGroup(second.id, group.id);
const firstMerge = await aiMergeTask(store, rootDir, task.id);
expect(firstMerge.merged).toBe(true);
await fastIntegrateSharedMember(store, rootDir, { taskId: task.id, branch: `fusion/${task.id.toLowerCase()}`, worktreePath: "", fileName: "fn5820Case3A" }, group);
const firstMergedTask = await store.getTask(task.id);
expect(firstMergedTask?.mergeDetails?.mergeTargetSource).toBe("branch-group-integration");
expect(firstMergedTask?.mergeDetails?.mergeTargetBranch).toBe(group.branchName);
@@ -229,8 +268,7 @@ describe("FN-5820 reliability interactions: shared branch group lifecycle", () =
expect(incomplete.reason).toBe("incomplete");
expect(() => git(rootDir, "git show main:packages/engine/src/fn5820Case3A.ts")).toThrow();
const secondMerge = await aiMergeTask(store, rootDir, second.id);
expect(secondMerge.merged).toBe(true);
await fastIntegrateSharedMember(store, rootDir, { taskId: second.id, branch: `fusion/${second.id.toLowerCase()}`, worktreePath: "", fileName: "fn5820Case3B" }, group);
const secondMergedTask = await store.getTask(second.id);
expect(secondMergedTask?.mergeDetails?.mergeTargetSource).toBe("branch-group-integration");
expect(secondMergedTask?.mergeDetails?.mergeTargetBranch).toBe(group.branchName);
@@ -307,13 +345,13 @@ describe("FN-5820 reliability interactions: shared branch group lifecycle", () =
autoMerge: true,
});
await stageSharedMember(store, rootDir, { taskId: task.id, groupId: group.id, source: "planning", fileName: "fn5820Case4A" });
await stageSharedMember(store, rootDir, { taskId: second.id, groupId: group.id, source: "planning", fileName: "fn5820Case4B" });
const firstMember = await stageSharedMember(store, rootDir, { taskId: task.id, groupId: group.id, source: "planning", fileName: "fn5820Case4A" });
const secondMember = await stageSharedMember(store, rootDir, { taskId: second.id, groupId: group.id, source: "planning", fileName: "fn5820Case4B" });
await store.setTaskBranchGroup(task.id, group.id);
await store.setTaskBranchGroup(second.id, group.id);
expect((await aiMergeTask(store, rootDir, task.id)).merged).toBe(true);
expect((await aiMergeTask(store, rootDir, second.id)).merged).toBe(true);
await fastIntegrateSharedMember(store, rootDir, firstMember, group);
await fastIntegrateSharedMember(store, rootDir, secondMember, group);
const firstMergedTask = await store.getTask(task.id);
const secondMergedTask = await store.getTask(second.id);
expect(firstMergedTask?.mergeDetails?.mergeTargetSource).toBe("branch-group-integration");