⦿ What it is
A node is a typed, stateless unit of work that receives shared state and a context (including an AbortSignal) and returns a named output. The dispatcher routes on that output to the next node. Four placement kinds cover the full composition space:
| Kind | What it does |
|---|---|
single | One node; output name selects the next vertex |
parallel | Multiple independent nodes run concurrently; combine strategy reduces to one route |
fan-out | One node per item in a state array; fan-in strategy merges results |
deep-dag | A registered DAG invoked as a nested call; state mapped in and out |
⦿ FSM-driven lifecycle
Every execution runs through DAGLifecycleMachine: pending → running → completed | failed | cancelled | timed_out. Terminal states are sticky. Every transition is timestamped with monotonic milliseconds. The lifecycle state travels on NodeStateInterface through every node in the graph.
pending ──start──▶ running ──succeed──▶ completed
│
├──fail(error)──▶ failed
├──cancel(reason)▶ cancelled
└──timeout──────▶ timed_out⦿ No external runtime
Dagonizer runs in-process. No worker pool, no external state store, no IPC. DAG definitions are plain JSON objects — store them in files, databases, or configuration services and load them at runtime via Dagonizer.load. The framework is browser-runnable: no Node.js-only primitives in the core engine.
⦿ See it in action
The Archivist is an end-to-end in-browser demo built entirely on Dagonizer — a bibliographic-assistant pipeline that exercises linear intake, fan-out, deep-DAG composition, cancellation, retry, checkpoint, and visualization in a single runnable flow.