diff --git a/packages/core/src/store.ts b/packages/core/src/store.ts index 6215ae902b..8b3067fd01 100644 --- a/packages/core/src/store.ts +++ b/packages/core/src/store.ts @@ -1221,6 +1221,7 @@ interface MoveTaskInternalOptions { movePolicyPreflight?: { fromColumn: string; toColumn: string; + workflowSignature: string; }; } @@ -6387,6 +6388,7 @@ export class TaskStore extends EventEmitter { if (task.column === toColumn) return undefined; const workflowIr = this.resolveTaskWorkflowIrSync(id); + const workflowSignature = serializeWorkflowIr(workflowIr); const bypassGuards = this.resolveWorkflowBypassGuards(moveSource, options); const fromColumn = task.column; if (this.shouldSkipWorkflowMovePolicies({ fromColumn, toColumn, moveSource, bypassGuards, options })) { @@ -6409,7 +6411,7 @@ export class TaskStore extends EventEmitter { source: options?.workflowMoveSource ?? moveSource, metadata: options?.workflowMoveMetadata, }); - return { fromColumn, toColumn }; + return { fromColumn, toColumn, workflowSignature }; } private async evaluateWorkflowMovePolicies(input: WorkflowMovePolicyInput): Promise { @@ -6615,7 +6617,8 @@ export class TaskStore extends EventEmitter { if (!skipWorkflowMovePolicies) { if ( internal.movePolicyPreflight?.fromColumn !== fromColumn || - internal.movePolicyPreflight?.toColumn !== toColumn + internal.movePolicyPreflight?.toColumn !== toColumn || + internal.movePolicyPreflight?.workflowSignature !== serializeWorkflowIr(workflowIr) ) { throw new TransitionRejectionError( makeTransitionRejection( diff --git a/packages/engine/src/__tests__/workflow-node-handler-extensions.test.ts b/packages/engine/src/__tests__/workflow-node-handler-extensions.test.ts index b2c0784460..2e30cc56de 100644 --- a/packages/engine/src/__tests__/workflow-node-handler-extensions.test.ts +++ b/packages/engine/src/__tests__/workflow-node-handler-extensions.test.ts @@ -76,7 +76,7 @@ describe("workflow node-handler extensions", () => { schemaVersion: WORKFLOW_EXTENSION_SCHEMA_VERSION, fallback: "failClosed", handle: vi.fn().mockResolvedValue({ - outcome: "outcome:custom-route", + outcome: "outcome:ignored-route", value: "needs-human", }), }); @@ -93,7 +93,7 @@ describe("workflow node-handler extensions", () => { edges: [ { from: "start", to: "decide" }, { from: "decide", to: "human", condition: "outcome:needs-human" }, - { from: "decide", to: "default", condition: "outcome:custom-route" }, + { from: "decide", to: "default", condition: "outcome:ignored-route" }, ], }; const prompt = vi.fn(async () => ({ outcome: "success" as const }));