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

ADR 0184 — Повторное открытие сессии: три решения владельца, и developer открывает снова

Статус​

Accepted. 2026-09-30 (AT-337, раунд 32). Поверх ADR 0183, который НЕ редактируется: он пометил три решения как предварительное, консервативное значение по умолчанию в ожидании владельца, а этот ADR фиксирует ответ владельца по всем трём.

Контекст​

ADR 0183 открыл выход из терминальных состояний сессии — повторное открытие через собственный маршрут (POST projects/:projectId/sessions/:sessionId/reopen) — и оставил три выбора открытыми, объявленными как предварительные:

  1. минимальная роль, закреплённая как maintainer, на ступень выше общего перехода (developer), который завершает сессию;
  2. отсутствие срока — каждая завершённая сессия может быть открыта снова навсегда;
  3. отказ с 409 sessao_com_execucao для сессии, несущей execution.activated, чтобы findActiveExecutionSession (RN-139) не уводился на старую сессию выполнения.

Владелец решил все три 2026-09-30.

Решение​

  1. Минимальная роль developer. Та же роль, что для завершения через общий переход: кто может объявить сессию завершённой, может вернуть её. Аргумент 0183 за подъём на ступень (снова включить расход токенов) не выдерживает того, что тот же developer уже может открыть новую сессию и разговаривать в ней, тратя те же токены. viewer по-прежнему отклоняется (403). Изменение — то, что предвидел 0183: @RequireRole маршрута и roleAtLeast экрана Sessão.
  2. Без срока — ПОДТВЕРЖДЕНО. Никакого сравнения с closed_at.
  3. Сессия с execution.activated по-прежнему отклоняется — ПОДТВЕРЖДЕНО. 409 sessao_com_execucao; путь к повторному выполнению — по-прежнему открыть новую сессию и активировать выполнение в ней.

Больше ничего в 0183 не меняется: собственный переход (canReopen), событие session.reopened, вызов engine до транзакции и SessionLifecycleWorker, игнорирующий уже отменённое закрытие.

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

  • Три решения перестают быть предварительными. RN-650 начинает говорить developer, а RN-649 ссылается на этот ADR в двух подтверждённых решениях.
  • docs/security-surface.md перечисляет маршрут как role:developer; тест route-surface.spec.ts сравнивает таблицу с реальной аннотацией.
  • Экран меняет текстовую причину с "exige maintainer" на "exige developer" (ключ ativacao.reabrirExigeDeveloper, в обоих языках).
  • Остаётся открытым и здесь не решается: второй автоматический анализ Psicólogo после повторного открытия (Consequences 0183).