ADR 0207 — Цикл gate, простаивающий более 2 ч, паркуется, и возобновить его может лишь жест человека
Статус
Accepted. 2026-10-02 (AT-391, решение владельца от 02.10). Пересматривает ADR 0067, не редактируя его: автоматическое спасение продолжается, с пределом возраста.
Контекст
ADR 0067 заставил GateRescuer самостоятельно возобновлять каждый цикл in_progress,
простаивающий более 15 мин, при загрузке и на каждом тике. Реальное использование 02.10 показало
три проблемы: (1) он перезапустил цикл, в сессии которого был ожидающий proposed_action
актора qa-*, — цикл ждал человека, область снова оплачивалась, и действие
осталось бы сиротой; (2) проверка "живого процесса" была по ПРОЕКТУ, а
строка — по TASK, так что потерянный цикл провёл 8 ч без спасения, потому что QA
Lead проекта был жив и простаивал; (3) предела нет: цикл, на который никто не смотрел
часами, перезапускается целиком поверх контекста, который мог измениться.
Решение
- Живой — по task. Спасение спрашивает lead (
{:em_voo?, task_id}); lead, слишком занятый, чтобы ответить, считается живым. - Ожидающее решение человека удерживает спасение. Действие
pendingактора gate (qa*,secops*,appsec) в сессии цикла: только журнал. - Предел 2 ч, по последней активности. Возраст считается от
updated_at, той же колонки, что порог устаревания, а не отinserted_at:upsert!трогаетupdated_atпри каждом субагенте, поэтому продвигающийся цикл не стар; отсчёт от создания парковал бы долгие и живые циклы. Выше предела строка получаетparked_at, журнал сессии получаетgate.rescue_parked(task, gate, возраст, причина), и обход перестаёт её видеть — при загрузке и на тике. - Возобновление требует жеста человека через
GateRescuer.retomar_estacionado/3. Новый вход в полёт того же цикла снимает отметку.
Последствия
- Не было человеческого пути для возобновления цикла gate; поставленный минимум — функция engine, вызываемая оператором. Внутренний маршрут и кнопка в событии остаются предложенными, не сделанными.
- Ожидающий пункт читается по СЕССИИ, а не по task: у
proposed_actionsнетtask_id. Две tasks в одной сессии с ожидающим действием QA удерживают друг друга — принятая цена, худший случай — не спасти, но никогда не заплатить дважды. - Правило: RN-722, которое пересматривает RN-140.