Skip to content

0008. Pass automation data by reference, not by wire

Context

An automation node's settings could get values three ways: a typed literal, a {{ path }} reference to the trigger or an earlier node's output, or a data wire from another node into a field's port. References and wires were two front ends for the same thing, an upstream node's output, and both were half-built. Nodes were addressed by generated ids such as n-a1b2, so nobody could write a reference by hand, and a regex bug meant references to hyphenated ids never resolved at all. Wires were easy to draw but passed a node's whole output, so getting one field meant falling back to a reference. Nodes declared output ports but not the shape of what they produced, so the editor couldn't offer a picker.

The closest tools differ. Unreal Blueprints wires typed data pins, which works because it is strongly typed and desktop-only. n8n and Make, closer to Monark, don't wire fields: every field is an expression, filled from a picker listing earlier steps by name with their output fields. All three keep control flow separate from data.

Options

OptionForAgainst
Keep both references and data wires as they wereNo migrationTwo incomplete paths; whole-output wires; references unusable for nodes
Keep data wires as visual sugar that writes a referenceOne runtime path; keeps connect-the-dotsA second port type per field to render, hit-test and validate, for nothing the picker lacks
References only, with a picker; remove data wiresOne runtime path and one authoring surface; least clutterLoses drawing a data wire; old graphs need migrating

Decision

Data moves only by {{ }} reference, over one scope: trigger, steps.<name> (a stable, editable name per node) and vars (run-wide workflow variables written by a Set Variable node). Nodes declare their output fields, and a click-to-insert picker lists everything available at that point in the graph. Wires carry control flow only.

The design note of 2026-08-01 first chose the sugar option. Once the id bug was fixed and the picker shipped, a wire added nothing the picker didn't already do, so data wires were removed instead (2026-08-02).

Consequences

  • One resolution path at run time, usable from every setting, including dropdowns, switches and number boxes through a variable-mode toggle.
  • Node authors declare outputs once, and the picker and type hints follow.
  • Saved graphs with old data wires or id-based references still run; the editor rewrites them to named references on load, and they persist on the next save. The engine keeps a branch for legacy wires.
  • References are paths, not expressions, and aren't type-checked; computed values need a Transform node.
  • Workflow variables are flat and run-wide, with no per-branch scope.