Tracks the implementation of ADR-0031 (docs/adr/0031-advanced-flow-node-executors-and-dag.md, merged): adopt structured control-flow constructs as the native + AI-authored flow model, with BPMN gateways/boundary kept in the protocol as the import/export representation.
Decision recap
- loop = structured iteration container (bounded body region + after-path) — not a back-edge, not a subflow.
- parallel = structured block with implicit join at block end (engine-synchronized) — no author-visible split/join gateways.
- errors = structured try/catch/retry, surfacing the existing
fault edge + errorHandling.retry.
- DAG invariant kept — ordinary edges acyclic; iteration/parallel are scoped containers.
- BPMN
parallel_gateway/join_gateway/boundary_event retained for interop only, mapped onto the constructs.
- AI authoring generates constructs from the live registry (
/automation/actions + configSchema); valid-by-construction.
Open question (decide in task 1)
Representation of structured containers in the nodes[]+edges[] model:
- (A) marker-delimited scoped regions (recommended start; flat graph + single-entry/single-exit validation), or
- (B) nested sub-structure (
config.body; cleaner AST, diverges from flat graph).
Roadmap (each = own PR: spec/engine change + tests + showcase example, per multi-agent discipline in AGENTS.md — never push main, branch+PR only, mind shared engine.ts)
Already shipped (this line of work)
Out of scope / non-goals
- Author-visible low-level BPMN gateway/boundary as the native model (interop only).
- Relaxing the DAG invariant to allow arbitrary cycles.
- Runtime BPMN boundary events (timer/signal) — interop representation retained.
Tracks the implementation of ADR-0031 (
docs/adr/0031-advanced-flow-node-executors-and-dag.md, merged): adopt structured control-flow constructs as the native + AI-authored flow model, with BPMN gateways/boundary kept in the protocol as the import/export representation.Decision recap
faultedge +errorHandling.retry.parallel_gateway/join_gateway/boundary_eventretained for interop only, mapped onto the constructs./automation/actions+configSchema); valid-by-construction.Open question (decide in task 1)
Representation of structured containers in the
nodes[]+edges[]model:config.body; cleaner AST, diverges from flat graph).Roadmap (each = own PR: spec/engine change + tests + showcase example, per multi-agent discipline in AGENTS.md — never push main, branch+PR only, mind shared
engine.ts)loopcontainer,parallelblock,try/catch/retry: schema +configSchema+ well-formedness validation (single-entry/single-exit regions; bounded loop). Pick representation (A) vs (B).loopstub.)fault+retryas a structured construct in spec + designer.bpmn-interopimport/export ↔ structured constructs.Already shipped (this line of work)
waitexecutor (feat(automation): implement the wait node executor (durable timer/signal pause) #1469) — durable timer/signal pause.subflowexecutor — synchronous reusable invoke (depth-guarded; nested pause → clear error). Reuse primitive, not the loop mechanism.Out of scope / non-goals