Как подойти к задаче без лишней магии
Что бы я делал, если бы AI сам готовил коммерческое предложение, назначал скидку и отправлял его клиенту. Я бы разделил подготовку и исполнение: модель предлагает, человек подтверждает конкретный payload.
Ошибка, которую я бы сразу убрал: Если approval живёт в длинном запущенном workflow, таймаут или перезапуск может потерять состояние. Надёжнее разделить сохранение предложения и продолжение после решения.

Что подготовить и какой результат ждать
- На выходе: Сотрудник проверяет только рискованные случаи, а после перерыва workflow продолжает работу с того же места.
- Определите действия, которые требуют approval: отправка, возврат, удаление, публикация, изменение прав и финансовые операции.
- Сохраните исходные данные и права доступа отдельно от результата, чтобы можно было проверить, что сделал human-in-the-loop workflow.
- Остановите сценарий на approval, отклоните действие, одобрите его через несколько минут и проверьте журнал.
Соберите approval, который можно проверить
- Разделите предложение и выполнение
AI создаёт draft_action, workflow показывает его человеку, а отдельный шаг Execute запускается только после approve.
Проверьте: Кнопка approve не просто меняет статус, а является условием выполнения.
Если не сработало: Уберите write-инструмент из AI и оставьте его только в финальной ветке.
- Сохраните состояние
Запишите run_id, action, payload, requester, approver, status и expires_at. Для сложного согласования используйте Wait node или webhook resume.
Проверьте: После перерыва можно продолжить тот же run_id.
Если не сработало: Разделите workflow на start и resume, а не держите долгий процесс в памяти.
- Покажите человеку контекст
В карточке approval должны быть исходный запрос, найденные данные, предложение AI, риск и кнопки approve/reject/ask_more.
Проверьте: Решение можно принять без поиска по пяти системам.
Если не сработало: Сократите экран до данных, которые меняют решение.
- Обработайте отказ и таймаут
Reject отправляет задачу владельцу или возвращает draft на правку. Истёкший expires_at не должен автоматически выполнять действие.
Проверьте: Отклонённый запрос не уходит клиенту и виден в журнале.
Если не сработало: Добавьте ежедневный список зависших согласований.

Состояния, которые я бы завёл
Минимальная state machine: received → drafted → waiting_approval → approved/rejected → executed → failed. В записи храните input_snapshot, proposed_action, reviewer_id, reviewed_at, rejection_reason и execution_id. После approved workflow ещё раз проверяет, что вход не устарел.
Для письма или изменения CRM разделите две операции: первая сохраняет draft и отправляет кнопку подтверждения, вторая по approval_id выполняет действие. Так процесс переживает перезапуск и не отправляет повторно.
- Reject должен объяснять причину, а не просто обнулять статус.
- Для низкой уверенности делайте review_required, а не бесконечный цикл уточнений.
Что должно быть на экране согласования
Покажите исходный текст, предложенный результат, изменяемые поля, ссылку на источник, риск и кнопки approve/reject. Если человек не может понять решение за минуту, экран перегружен или AI принёс слишком мало контекста.
Две цепочки вместо зависшего workflow
Workflow A: `Trigger → Get context → AI draft → Validate → proposal_id → action_hash → Save approval → Slack/Gmail`. Workflow B: `Approval webhook → Verify approver → Get proposal → Compare action_hash → Check expiry → Execute once → Audit log`.
Состояния: `pending → approved/rejected/edited → executed/failed/expired`. В записи храните `proposal_id`, `target_id`, `payload`, `action_hash`, `state_version`, `approver_role`, `expires_at`, `rejection_reason` и `execution_id`.
{
"action": "send_quote",
"target_id": "deal_456",
"payload": {"amount": 150000, "discount": 10},
"requires_approval": true,
"expires_at": "2026-08-05T12:00:00Z"
}Что человек должен увидеть
Получатель, сумму, скидку, изменяемые поля, предпросмотр текста, источник данных и время истечения. Кнопка не должна исполнять действие прямо из URL: она передаёт только `proposal_id`, а сервер заново проверяет роль, hash и статус `executed`.
Что должно измениться после настройки
Сотрудник проверяет только рискованные случаи, а после перерыва workflow продолжает работу с того же места.

Почему «human in the loop» часто существует только на словах
Считать approval текстовой инструкцией в prompt.
Не хранить состояние между стартом и подтверждением.
Показывать сотруднику только итог без исходного запроса.
Автоматически выполнять действие после таймаута.
Когда согласование требует отдельного состояния
Подключайте специалиста, если approval касается денег, юридических действий, нескольких ролей или долгих процессов с большим объёмом состояний.
Что должно быть на экране подтверждения
Кому подходит этот способ работы с human-in-the-loop workflow?
В human in the loop AI-сценарии контроль человека — это не фраза в промпте. Система должна остановиться, сохранить состояние, показать вход и предложение AI, дождаться решения и только потом выполнить действие.
С чего начать, если всё пока делается вручную?
Определите действия, которые требуют approval: отправка, возврат, удаление, публикация, изменение прав и финансовые операции.
Как проверить, что настройка не навредит?
Остановите сценарий на approval, отклоните действие, одобрите его через несколько минут и проверьте журнал.
Что делать при непонятном результате?
Сохраните состояние в таблице или базе и поставьте срок эскалации, чтобы зависший approval не потерялся.







