feat(FN-5255): flip directMergeCommitStrategy default from squash to direct

Changes the default merge strategy from squash to direct by flipping `directMergeCommitStrategy` in the settings schema and types, with the core implementation in `merger-ref-update-advance.ts`. Also aligns a heartbeat executor test assertion with the FN-5060 deduplication shape.

Fusion-Task-Id: FN-5255

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Fusion-Task-Id: FN-5255
This commit is contained in:
gsxdsm
2026-05-23 11:01:05 -07:00
parent ec1269fd84
commit 8f5c1f97ad
10 changed files with 19 additions and 11 deletions

View File

@@ -151,8 +151,8 @@ describe("settings key parity", () => {
expect(DEFAULT_PROJECT_SETTINGS.completionDocumentationMode).toBe("off");
});
it("keeps directMergeCommitStrategy project-scoped with auto default", () => {
expect(DEFAULT_PROJECT_SETTINGS.directMergeCommitStrategy).toBe("auto");
it("defaults directMergeCommitStrategy to always-squash and keeps it project-scoped", () => {
expect(DEFAULT_PROJECT_SETTINGS.directMergeCommitStrategy).toBe("always-squash");
expect(isProjectSettingsKey("directMergeCommitStrategy")).toBe(true);
expect(isGlobalSettingsKey("directMergeCommitStrategy")).toBe(false);
});

View File

@@ -103,9 +103,9 @@ describe("TaskStore", () => {
expect(settings.mergeStrategy).toBe("pull-request");
});
it("defaults directMergeCommitStrategy to auto and persists updates", async () => {
it("defaults directMergeCommitStrategy to always-squash and persists updates", async () => {
const defaults = await harness.store().getSettings();
expect(defaults.directMergeCommitStrategy).toBe("auto");
expect(defaults.directMergeCommitStrategy).toBe("always-squash");
await harness.store().updateSettings({ directMergeCommitStrategy: "always-rebase" });
const settings = await harness.store().getSettings();

View File

@@ -195,7 +195,7 @@ export const DEFAULT_PROJECT_SETTINGS = {
autoMerge: true,
testMode: undefined,
mergeStrategy: "direct",
directMergeCommitStrategy: "auto",
directMergeCommitStrategy: "always-squash",
mergeIntegrationWorktree: "reuse-task-worktree",
integrationBranch: undefined,
requirePrApproval: false,

View File

@@ -2733,7 +2733,7 @@ export interface ProjectSettings {
* - "auto": squash single-substantive branches, preserve history for multi-substantive branches
* - "always-squash": always use the legacy squash path for direct merges
* - "always-rebase": always preserve individual branch commits during direct merges
* Only applies when mergeStrategy is "direct". Default: "auto". */
* Only applies when mergeStrategy is "direct". Default: "always-squash". */
directMergeCommitStrategy?: DirectMergeCommitStrategy;
/** Auto-merge integration-root mode.
* - "reuse-task-worktree" (default): run the auto-merge cascade in the task worktree