2026-07-08#
Больше data-нод на удалённых раннерах#
Удалённые раннеры теперь поддерживают чистые data-shaping ноды для массивов и table envelope: data.array.reduce, data.table.build, data.table.select, data.table.pivot и data.table.concat.
Fan-out на удалённых раннерах#
Удалённые раннеры теперь поддерживают control.foreach в central-step режиме. Раннер возвращает тот же fanOut envelope, а control plane по-прежнему отвечает за создание downstream steps, join, traces и billing.
Рендер отчётов на удалённых раннерах#
Удалённые раннеры теперь поддерживают non-PDF report render ноды: report.table.render, report.chart.render, report.compose и report.export.
SEO-трансформации на удалённых раннерах#
Удалённые раннеры теперь поддерживают pure transform ноды seo.yandex_webmaster.query_report.rows и topvisor.report.metrics для обработки уже полученных provider snapshots.
Legacy trigger leases выключены по умолчанию#
Control plane больше не принимает /runner/triggers/leases/renew без явного
legacy-флага REMOTE_RUNNER_LEGACY_TRIGGER_LEASES_ENABLED=true. Production
cron execution должен идти через singleton control-plane scheduler и
/runner/steps/*.
Legacy local-state heartbeat выключен по умолчанию#
API больше не сохраняет heartbeat-поля localCron, localRuns и
localRunReports от удалённых раннеров без явного флага
REMOTE_RUNNER_LEGACY_LOCAL_STATE_ENABLED=true. Для production runner pools
ожидаемый путь остаётся central-step execution через /runner/steps/*.
Cron fire idempotency lookup#
Control plane теперь переиспользует уже созданный cron run для того же
deployment, trigger node и scheduledAt. База дополнительно защищает этот
ключ partial unique index-ом на runs, а insert race возвращается к уже
созданному run без повторного startRun.
Cutover-check для managed runner migration#
Добавлена операторская команда runner:migration:cutover-check: она проверяет,
что active prod deployments без targetId больше нет, а remote-only env-флаги
выставлены явно перед отключением local API workers.
Cron scheduler fire locks#
Control plane теперь пишет durable lock на каждый cron tick перед созданием и
стартом run. Если несколько scheduler-capable API replicas сработают на один
cron fire, side effects выполнит только первая.
CRON_SCHEDULER_INSTANCE_ID задаёт owner id этой singleton scheduler роли в
логах и durable locks.
Аудит legacy runner config#
Добавлена команда npm run runner:legacy-config:audit: она проверяет API и
runner env на включённые legacy runner-local graph/import флаги перед
remote-only rollout.
У команды появился режим --remote-only, который дополнительно проверяет hard
rollout env: local API step workers выключены, execution target обязателен, а
local execution скрыт из app build.
Legacy imported runs скрыты из дефолтного списка#
/runs теперь по умолчанию показывает control-plane runs. Старые imported
local-run rows доступны через source=remote_runner_imported или временный
флаг REMOTE_RUNNER_LEGACY_IMPORTED_RUNS_VISIBLE=true.
Legacy local-run reporting требует явного флага#
Удалённый раннер больше не начинает импорт локальных graph runs только из-за
legacy cron или interval-настройки. Для старого /runner/local-runs/report
нужен явный OPORA_RUNNER_LEGACY_LOCAL_RUN_REPORTS_ENABLED=true; managed
runner шаблоны держат этот режим выключенным.
Legacy runner-local endpoints помечены deprecated#
В OpenAPI /runner/local-runs/report и /runner/triggers/leases/renew
помечены как deprecated compatibility endpoints. Новый production-путь для
раннеров остаётся /runner/steps/*.
Legacy-импорт локальных запусков выключен по умолчанию#
Control plane больше не принимает /runner/local-runs/report без явного
legacy-флага REMOTE_RUNNER_LEGACY_LOCAL_RUN_REPORTS_ENABLED=true. Обычные
production-пулы раннеров должны работать через canonical runs и
/runner/steps/*.
Первый батч gateway-нод на удалённых раннерах#
Удалённые раннеры теперь могут забирать часть AI/message gateway-нод и
передавать их на исполнение существующему control plane contract без отдельного
edge gateway: ai.generate, ai.classify, ai.extract, ai.translate,
ai.moderate, message.send и telegram.message.send.
Публикация в нужный регион выполнения#
В диалоге публикации теперь лучше видно, в какой пул и регион раннеров уйдет процесс. Если выбранная цель не поддерживает часть узлов графа, интерфейс показывает конкретные ключи узлов.