diff --git a/packages/engine/src/__tests__/workflow-column-boundary-capacity.test.ts b/packages/engine/src/__tests__/workflow-column-boundary-capacity.test.ts index 01cde795ef..8b51eb332e 100644 --- a/packages/engine/src/__tests__/workflow-column-boundary-capacity.test.ts +++ b/packages/engine/src/__tests__/workflow-column-boundary-capacity.test.ts @@ -57,7 +57,7 @@ function invariantError() { describe("workflow column boundary — global pause suspends at every node entry", () => { /* - FNXC:EnginePause 2026-07-31-22:30: + FNXC:EnginePause 2026-08-01-00:30: Operator regression: Stop AI Engine (globalPause) did not stop the graph — a live run started a fresh Plan Review model session two minutes after pause, because no node boundary ever re-read settings. These fail if the `isPaused` probe is removed from onNodeEntry. diff --git a/packages/engine/src/runtimes/in-process-runtime.ts b/packages/engine/src/runtimes/in-process-runtime.ts index af96162c1a..059d057a51 100644 --- a/packages/engine/src/runtimes/in-process-runtime.ts +++ b/packages/engine/src/runtimes/in-process-runtime.ts @@ -2309,7 +2309,7 @@ export class InProcessRuntime private async drainWorkflowContinuations(): Promise { if (this.workflowContinuationDrainActive || this.status !== "active") return; /* - FNXC:EnginePause 2026-07-31-22:20: + FNXC:EnginePause 2026-08-01-00:20: A pause-suspended run persists a runnable continuation (same mechanism as capacity). Without this gate the drain would re-dispatch it on the next tick and the graph would bounce suspend→dispatch→suspend forever while paused — and worse, dispatch genuinely new work under diff --git a/packages/engine/src/scheduler.ts b/packages/engine/src/scheduler.ts index d7de5c9c49..19eede07aa 100644 --- a/packages/engine/src/scheduler.ts +++ b/packages/engine/src/scheduler.ts @@ -1277,7 +1277,7 @@ export class Scheduler { hottest write path (26 emit sites against 7, measured), not a signature change here. */ if (task.column === "in-progress") this.failedTaskIds.add(task.id); /* - FNXC:MissionReconciliation 2026-07-31-22:00: + FNXC:MissionReconciliation 2026-08-01-00:00: In-place failure parks do not emit task:moved, but they release the task's durable symbol lock. Reconcile any mission-linked failure update so the roadmap records withheld provenance without fabricating completion. diff --git a/packages/engine/src/workflow-column-boundary-hooks.ts b/packages/engine/src/workflow-column-boundary-hooks.ts index bc8e7fdf59..8d8d11824c 100644 --- a/packages/engine/src/workflow-column-boundary-hooks.ts +++ b/packages/engine/src/workflow-column-boundary-hooks.ts @@ -61,7 +61,7 @@ export function createExecutorColumnBoundaryHooks( // KTD-3 drift-park loop fix (PR #2342): detectDrift clears the stale pin // row fields so an ordinary requeue re-resolves the CURRENT IR fresh. clearPin: pinPersistence.clearPin, - /* FNXC:EnginePause 2026-07-31-22:20: settings re-read per node entry — event-independent. */ + /* FNXC:EnginePause 2026-08-01-00:20: settings re-read per node entry — event-independent. */ isPaused: async () => { try { const settings = await store.getSettings(); diff --git a/packages/engine/src/workflow-column-boundary.ts b/packages/engine/src/workflow-column-boundary.ts index c02484e7a1..ac368aea7e 100644 --- a/packages/engine/src/workflow-column-boundary.ts +++ b/packages/engine/src/workflow-column-boundary.ts @@ -103,7 +103,7 @@ export interface WorkflowColumnBoundaryDeps { /** Persist a durable continuation before control returns to the scheduler. */ onSuspend?: (suspension: Extract) => void | Promise; /* - FNXC:EnginePause 2026-07-31-22:20 (Stop AI Engine did not stop the graph): + FNXC:EnginePause 2026-08-01-00:20 (Stop AI Engine did not stop the graph): Operator-observed regression: with `globalPause: true` the graph runner kept crossing node boundaries — a live run started a NEW Plan Review step (fresh model session) two minutes after Stop AI Engine, and the plan-review→replan loop kept cycling "attempt N/unbounded". The legacy @@ -290,7 +290,7 @@ export function createWorkflowColumnBoundary( const toColumn = node.column; /* - FNXC:EnginePause 2026-07-31-22:20: + FNXC:EnginePause 2026-08-01-00:20: Pause gates EVERY node entry — columnless and same-column nodes included, because each node can start a real AI session regardless of whether the card moves. Suspend with the same durable-continuation mechanism capacity uses, so unpause resumes at exactly this node; the diff --git a/packages/engine/src/workflow-graph-task-runner.ts b/packages/engine/src/workflow-graph-task-runner.ts index 662b778ff0..6ab704bd31 100644 --- a/packages/engine/src/workflow-graph-task-runner.ts +++ b/packages/engine/src/workflow-graph-task-runner.ts @@ -177,7 +177,7 @@ export interface WorkflowColumnBoundaryHooks { clearPin?: () => void | Promise; onWarn?: (message: string, detail: Record) => void; onSuspend?: WorkflowColumnBoundaryDeps["onSuspend"]; - /** FNXC:EnginePause 2026-07-31-22:20: polled at every node entry (see boundary deps). */ + /** FNXC:EnginePause 2026-08-01-00:20: polled at every node entry (see boundary deps). */ isPaused?: WorkflowColumnBoundaryDeps["isPaused"]; }