Перейти к основному содержимому

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) предела нет: цикл, на который никто не смотрел часами, перезапускается целиком поверх контекста, который мог измениться.

Решение​

  1. Живой — по task. Спасение спрашивает lead ({:em_voo?, task_id}); lead, слишком занятый, чтобы ответить, считается живым.
  2. Ожидающее решение человека удерживает спасение. Действие pending актора gate (qa*, secops*, appsec) в сессии цикла: только журнал.
  3. Предел 2 ч, по последней активности. Возраст считается от updated_at, той же колонки, что порог устаревания, а не от inserted_at: upsert! трогает updated_at при каждом субагенте, поэтому продвигающийся цикл не стар; отсчёт от создания парковал бы долгие и живые циклы. Выше предела строка получает parked_at, журнал сессии получает gate.rescue_parked (task, gate, возраст, причина), и обход перестаёт её видеть — при загрузке и на тике.
  4. Возобновление требует жеста человека через GateRescuer.retomar_estacionado/3. Новый вход в полёт того же цикла снимает отметку.

Последствия​

  • Не было человеческого пути для возобновления цикла gate; поставленный минимум — функция engine, вызываемая оператором. Внутренний маршрут и кнопка в событии остаются предложенными, не сделанными.
  • Ожидающий пункт читается по СЕССИИ, а не по task: у proposed_actions нет task_id. Две tasks в одной сессии с ожидающим действием QA удерживают друг друга — принятая цена, худший случай — не спасти, но никогда не заплатить дважды.
  • Правило: RN-722, которое пересматривает RN-140.