Управление выполнением workflow
Что это
Раздел для оператора: как наблюдать за запусками workflow и управлять ими, не открывая поверхность произвольного выполнения. Каждый запуск (WorkflowRun) и каждый шаг (WorkflowStepRun) хранятся как версионированные записи с хеш-цепочкой событий в изолированном хранилище ops/platform.sqlite (ops/decisions/ADR-029-workflow-dag.md).
Когда использовать
Когда нужно проверить статус зарегистрированных workflow, согласовать гейт, поставить запуск на паузу или отменить его. Помните: движок доступен (workflow_engine_enabled = true), но реальное выполнение рантайма выключено по умолчанию (runtime_execution_enabled = false, config/raytsystem.toml), поэтому в базовой поставке контур преимущественно описателен и ждёт человека.
CLI
Группа workflow содержит три листовые команды. Начинайте с чтения:
uv run raytsystem workflow list --json
Согласование гейта и отмена запуска:
uv run raytsystem workflow approve ...
uv run raytsystem workflow cancel ...
Уведомления читаются и переводятся отдельной группой:
uv run raytsystem notifications list --json
Полный список листовых команд смотрите в Справочнике CLI. Веб-контур запусков доступен в маршруте «Запуски» (Наблюдаемость: запуски).
Pause / resume / cancel
Состояния запуска (WorkflowRun.state): planned, running, paused, cancelled, succeeded, failed. Состояния шага (WorkflowStepRun.state): pending, running, waiting, paused, skipped, succeeded, failed, cancelled (src/raytsystem/contracts/workflows.py).
Тот же ключ идемпотентности не может создать второй запуск. При падении run_ready_steps пересчитывает готовность из durable-записей и возобновляет ровно с последнего зафиксированного шага — это воспроизведение записей, а не эвристика согласования (ADR-029). Узлы wait продвигаются ручным сигналом wake с той же дисциплиной timeout.
Артефакты и уведомления
Артефакты привязываются через WorkflowArtifactBinding (узел, имя выхода, тип, обязательность). Уведомления по гейтам публикуются через notification outbox: продюсеры публикуют смены состояния workflow с политикой-allowlist назначений. При этом external_notifications_enabled остаётся выключенным по умолчанию, поэтому наружу с машины ничего не уходит (ADR-029, config/platform.yaml). Записи outbox всегда помечены redacted = True (src/raytsystem/contracts/workflows.py).
Бюджеты
Бюджеты могут привязываться к сотруднику, задаче, проекту, запуску или workspace и учитывать входные/выходные/кешированные токены, оценочную/фактическую стоимость, число запусков и heartbeats. Жёсткий лимит блокирует новый запуск; лимиты по токенам не зависят от приблизительной конвертации валюты (docs/11-code-graph-and-execution-plane.md).
Аудит-трейл
Каждая запись и шаг хешируются с хеш-цепочкой событий; входы и выходы ограничены каноническим JSON и сканируются на секреты (ADR-029). Координация идёт через комментарии, события прогресса и дочерние задачи — скрытых межагентских сообщений в дизайне нет (ADR-017).
Ограничения и безопасность
- Без approval нет внешних эффектов. Недетерминированные узлы не выполняются сами — они ждут оператора; единственные исполняемые тела — чистые функции движка (
ADR-029). - Перед стартом, шагом и approve движок проверяет
EmergencyService.assert_runtime_allowed(), поэтому глобальный стоп-переключатель останавливает оркестрацию (ADR-029). См. Аварийные средства. - При
workflow_engine_enabled = falseлюбая операция fail-closed поднимает ошибку подсистемы workflow. - Ни push, publish, deploy, send, delete, payment, доступ к внешнему корню, ни продвижение реального корпуса не выполняются без отдельного action-специфичного approval (
docs/10-execution-security.md).
Частые ошибки
- Ожидать, что
workflow listпокажет живое выполнение агентов — при выключенных runtime-флагах агентские узлы ждут. См. Workflow заблокирован. - Пытаться отправить уведомление наружу —
external_notifications_enabled = false, allowlist назначений пуст.
Связанные страницы
Источники истины
ops/decisions/ADR-029-workflow-dag.mdsrc/raytsystem/contracts/workflows.pydocs/10-execution-security.mdconfig/raytsystem.toml,config/platform.yaml