Модель данных¶
Данные пайплайна — один фрейм vars, текущий вдоль пути исполнения.
Фрейм иммутабелен: каждая запись порождает новый, поэтому ветки parallel
расходятся независимо и один объект безопасно отдать нескольким конкурентным
потребителям. Единственная граница видимости — subpipeline: дочерний
пайплайн стартует со свежим фреймом, получая данные через inputs.
arguments узла делится на бакеты: vars — ссылки на переменные фрейма,
const — литералы. Бакеты смешиваются в одном узле; при совпадении имён
ссылка на переменную перекрывает литерал. Отдельного поля настроек у узла
stage нет: литеральная настройка — это const-аргумент.
{
"id": "auth",
"type": "stage",
"stage": "AuthStage",
"arguments": { "vars": { "creds": "creds" }, "const": { "timeout_s": 30 } },
"outputs": { "token": "token" },
"consume": ["creds"],
"next": "fetch"
}
В outputs ключ — имя поля результата стадии, значение — переменная, куда его
записать. Поле, которого стадия не возвращает, отвергается
Pipeline.validate() по спецификации стадии. Если стадия не объявила выходов,
контракт считается необъявленным и проверка не применяется.
Выходы узла применяются как одновременное присваивание: значения вычисляются против фрейма на входе в узел и только потом записываются, поэтому порядок ключей на результат не влияет.
На карточке это две половины: над разделителем то, что узел читает, под ним — то, что пишет.

Панель справа — тот же узел в виде формы, собранной по спецификации стадии:
