feat(engine): graph interpreter owns the full task lifecycle behind the flag (CU-U3, CU-U4)

Real engine seams: execute delegates to the legacy implementation phase via a
completion interceptor that stops execute() at the implementation-complete
boundary (no double review/merge); review performs the in-review handoff; merge
resolves through ProjectEngine.onMerge over the same serialized merge queue
(wired via a late-bound setMergeRequester, mirroring setMergeEnqueuer). Custom
graph nodes run on the proven WorkflowStep machinery (readonly tool policy,
verdict parsing). Adds a 'planning' seam to the vocabulary (no-op for
pre-specified tasks; custom planning is a prompt node today).

Entry point: execute() routes graph-selected tasks through the runner when
experimentalFeatures.workflowGraphExecutor is on, with process-wide routing
claims (FN-4811 posture), duplicate-dispatch dropping, pre-run errors falling
back to legacy, and mid-run errors parking the task in review (never re-running
the implementation, never stranding the task).

Flag off by default: all 587 executor tests pass unchanged.
This commit is contained in:
gsxdsm
2026-06-03 11:07:30 -07:00
parent 446879fae0
commit 44e77fda5c
8 changed files with 327 additions and 9 deletions

View File

@@ -353,6 +353,9 @@ export class ProjectEngine {
this.runtime.setMergeActiveClearer?.((taskId) => {
this.mergeActive.delete(taskId);
});
// Workflow-graph interpreter merge seam: resolves with the merge outcome
// through the same serialized merge queue the legacy pipeline uses.
this.runtime.setMergeRequester?.((taskId) => this.onMerge(taskId));
}
getActiveMergeTaskId(): string | null {