Why this exists
Every graph engine that supports human-in-the-loop resumes a paused node by re-executing it from the top — so everything above the pause runs again. ilmek makes that the engine's problem, not yours.
Durable human-in-the-loop
A node that pauses for a human resumes without re-running the work above it. An interrupt is just a step whose value comes from a person — same replay rules, no special-casing.
The journal
Wrap every side effect in ctx.step(...). Its recorded result replays on resume instead of running again. Charge a card once, retry the flaky call after it — no double charge.
Safe retries
Because completed steps are journaled, retry is free of double-effects. A node that charges then hits a flaky API retries the API alone — the charge replays from the journal.
Graphs are data
Every graph round-trips to a serializable spec (fromSpec / toSpec). A stored spec never carries executable text — the foundation for a drag-and-drop builder the engine knows nothing about.
One stream, many views
A run is one canonical event stream with a monotonic seq and namespace path. Project it into values, updates, custom, messages, and debug modes — no second pass.
Two implementations, one spec
TypeScript (reference) and .NET, both green against the same conformance list, printing identical demo output. MODEL.md is the normative spec; the code reproduces it exactly.