Anatomy
Messages are immutable. A node never edits a message it received; it builds a new one from it with a changed payload or label. Two branches that receive the same message can therefore never disturb one another. The immutability is shallow: values inside a payload are shared, so treat received payloads as read-only.
Identity across nodes
Deriving a message from an input keeps its message id, trace id and timestamp. Creating a brand-new message, as a trigger or a splitter does, assigns new ones.
Because a message may be delivered more than once after a retry or resume, plugins that have side effects should de-duplicate on the message id. See Delivery and back-pressure.
Labels the engine adds
Reading a message in configuration
Node options can reference the incoming message with${payload.field} and ${metadata.key}. See Variables and expressions.
Fields that are carried only
Messages also have optional header fields borrowed from classic messaging patterns: priority, expiration, reply-to, a format indicator, a retry counter and a control flag. They are carried along but the engine does not act on them: an expired message is delivered like any other, and reply-to does not route anything. Do not rely on them for behaviour. Execution priority is a different mechanism, set withyukta.priority in the start payload; see Admission and limits.