From a84afc178f34a83f443d7596d4781950facd517a Mon Sep 17 00:00:00 2001 From: gsxdsm Date: Mon, 29 Jun 2026 12:47:21 -0700 Subject: [PATCH] fix(FN-7233): preserve workflow optional step phase --- .changeset/fn-7233-post-merge-optional-step-phase.md | 7 +++++++ .../src/__tests__/workflow-optional-steps.test.ts | 11 +++++++++-- packages/core/src/workflow-optional-steps.ts | 8 ++++++-- 3 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 .changeset/fn-7233-post-merge-optional-step-phase.md diff --git a/.changeset/fn-7233-post-merge-optional-step-phase.md b/.changeset/fn-7233-post-merge-optional-step-phase.md new file mode 100644 index 0000000000..a2e834b717 --- /dev/null +++ b/.changeset/fn-7233-post-merge-optional-step-phase.md @@ -0,0 +1,7 @@ +--- +"@runfusion/fusion": patch +--- + +summary: Show post-merge verification as a post-merge optional workflow step. +category: fix +dev: Preserves optional-group `config.phase` when resolving workflow optional steps. diff --git a/packages/core/src/__tests__/workflow-optional-steps.test.ts b/packages/core/src/__tests__/workflow-optional-steps.test.ts index f6d50e0a3f..9c6ebe4713 100644 --- a/packages/core/src/__tests__/workflow-optional-steps.test.ts +++ b/packages/core/src/__tests__/workflow-optional-steps.test.ts @@ -110,9 +110,9 @@ describe("resolveWorkflowOptionalSteps (optional-group nodes)", () => { }); it("resolves the built-in coding/stepwise optional-groups in execution order", () => { - // Legacy/default/stepwise engineering workflows expose the same three toggles + // Legacy/default/stepwise engineering workflows expose the same toggles // in execution order: plan review before execution, then browser verification - // and code review after implementation. + // and code review after implementation, then post-merge verification after merge proof. const engineeringExpected = [ { templateId: "plan-review", @@ -135,6 +135,13 @@ describe("resolveWorkflowOptionalSteps (optional-group nodes)", () => { phase: "pre-merge" as const, defaultOn: true, }, + { + templateId: "post-merge-verification", + name: "Post-merge verification", + description: "", + phase: "post-merge" as const, + defaultOn: false, + }, ]; expect(resolveWorkflowOptionalSteps(BUILTIN_CODING_WORKFLOW_IR)).toEqual(engineeringExpected); expect(resolveWorkflowOptionalSteps(BUILTIN_STEPWISE_CODING_WORKFLOW_IR)).toEqual(engineeringExpected); diff --git a/packages/core/src/workflow-optional-steps.ts b/packages/core/src/workflow-optional-steps.ts index 87c47092b7..2503dca6a2 100644 --- a/packages/core/src/workflow-optional-steps.ts +++ b/packages/core/src/workflow-optional-steps.ts @@ -18,7 +18,7 @@ export interface ResolvedWorkflowOptionalStep { FNXC:WorkflowOptionalGroup 2026-06-21-14:05: Re-pointed the per-task optional-step toggle SOURCE from the execution-inert `ir.optionalSteps` declaration to v2 `optional-group` NODES (one resolved entry per group). The legacy `WorkflowOptionalStep` type + `optionalSteps` IR field are now REMOVED (FNXC:WorkflowOptionalGroup 2026-06-21-18:00); a legacy persisted `optionalSteps` key on an old v2 row is tolerated/ignored at parse. KEYING: the resolved entry is keyed by the group node `id`. The output field is still named `templateId` (not renamed) so the four consuming UI surfaces — inline quick-create card, New Task modal/TaskForm, task-detail Workflow tab, and the optional-steps dropdown — keep reading the same shape unchanged; they now toggle group ids into `enabledWorkflowSteps` instead of template ids. Renaming/recreating a group resets per-task state, identical to the prior `templateId` keying. -Display metadata: `name` comes from `config.name` (falling back to the node id), `defaultOn` from `config.defaultOn ?? false`. The group node carries no description/icon/phase, so `description` is "" and `phase` defaults to "pre-merge" — keeping every field the consumers read populated and non-blank. +Display metadata: `name` comes from `config.name` (falling back to the node id), `defaultOn` from `config.defaultOn ?? false`, and `phase` from `config.phase ?? "pre-merge"`. `description` remains "" because optional-group nodes do not carry display copy for it. */ function isOptionalGroupNode( @@ -93,7 +93,11 @@ export function resolveWorkflowOptionalSteps( templateId: node.id, name: typeof config.name === "string" && config.name.trim() ? config.name : node.id, description: "", - phase: "pre-merge", + /* + FNXC:WorkflowOptionalSteps 2026-06-29-12:47: + Post-merge verification is now a graph-native optional group. Task creation and detail surfaces need the resolver to preserve `config.phase` so post-merge toggles do not look like pre-merge gates. + */ + phase: config.phase === "post-merge" ? "post-merge" : "pre-merge", defaultOn: config.defaultOn === true, /* FNXC:WorkflowDefinitionSteps 2026-06-29-00:41: