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

ADR 0214 — Открытый вопрос становится ожидающим решения пунктом

Статус​

Accepted. 2026-10-11 (AT-521; решения владельца от 11.10). Расширяет ADR 0207 (парковка цикла gate) и ПЕРЕСМАТРИВАЕТ часть ADR 0212 (исправление истории). Правила в RN-858, RN-859, RN-860 и RN-861.

Тема: gates. Механизм, который действительно меняет поведение, — новый вердикт QA, который не расходует цикл и паркуется механизмом ADR 0207; реестр и очередь существуют для того, чтобы этому вердикту было кого спросить.

Контекст​

Измерено в TP-01 (14-й раунд):

  • Criativo оставил пользователю четыре вопроса только в ТЕКСТЕ ответа. Ни один не стал записью; ничто на экране не перечисляло их после того, как лента прокрутилась.
  • QA отклонял GET /:codigo как "não confirmado pelo usuário", пока не ИСЧЕРПАЛ цикл исправления (RN-762), — дважды. Второй раз случился ПОСЛЕ того, как владелец ответил в чате: история уже была ready, ADR 0212 позволяет исправлять только историю draft, а QA читал DoR истории, где по-прежнему было "não confirmado". Dev нечего было исправлять: решение было за пользователем, а changes_requested расходовал цикл на каждом круге.

Не хватало трёх вещей: РЕЕСТРА вопроса с состоянием, ВЕРДИКТА, который говорит "это зависит от пользователя", не наказывая dev, и пути, по которому ОТВЕТ доходит до того, кто работает (контекст dev, срез QA, сама история).

Решение​

1. Реестр​

  • artifact.open_question (append-only, в журнале сессии, где он рождается): { questionId, pergunta (≤ 500), sugestao (≤ 300, opcional), afeta: { regras, historias, tarefas }, autor, sessionId }.
  • Закрывается через open_question.answered { questionId, resposta, aceitouSugestao, decisionEventId, respondidaPor }. СТАТУС берётся из журнала (открыт = без answered), никогда из таблицы.
  • Ответ записывает decision_record (актор: пользователь) с context = вопрос, choice = ответ, consequences = то, что затронуто, и questionId. Это тот же универсальный артефакт RN-505.

2. Источник — только инструмент​

declare_open_question (Criativo, PO, Arquiteto, Dev Lead), с ОДНОЙ ЦЕНТРАЛЬНОЙ фразой инструкции, не повторяемой по серверам: "Toda dúvida que você deixar para o usuário vira declare_open_question, com a sua sugestão e o que ela afeta; não termine o turno com pergunta só no texto."

3. Кто отвечает​

Только АВТОР сессии, где родился вопрос. Для вопроса QA — автор сессии выполнения (тот, кто активировал выполнение). Остальные участники видят вопрос с неактивным элементом управления и причиной текстом (ADR 0064).

4. Маршруты​

  • GET /projects/:projectId/open-questions?status=open|answered|all — viewer, limit 50 с общим числом (RN-180).
  • POST /projects/:projectId/open-questions/:questionId/answer — тело { resposta } или { aceitarSugestao: true }; 403 so_o_autor_da_sessao, 409 pergunta_ja_respondida, 404 для вопроса другого проекта.

5. Готовность предупреждает и продолжает​

"Estou pronto" (Criativo) и "Confirmar arquitetura pronta" показывают "N perguntas seguem abertas — responder", с переходом к очереди. Не блокируют.

6. Вердикт needs_user_decision​

emit_qa_verdict получает needs_user_decision с { pergunta, sugestao } (или существующим openQuestionId). api НЕ увеличивает счётчик исправлений (RN-762), записывает open_question (автор qa-agent, затрагивающий задачу), и цикл ПАРКУЕТСЯ механизмом ADR 0207 (gate.rescue_parked). Задача показывается как "esperando você". Ответ на вопрос снова включает gate через GateRescuer.retomar_estacionado/3 (путь RN-724), и QA судит с решением в контексте. При консолидации QA Lead needs_user_decision одной подспециальности побеждает approved. Мерило среза QA: требование, помеченное "não confirmado pelo usuário" (или противоречащее действующему решению), → needs_user_decision, никогда changes_requested.

Это РАСШИРЯЕТ ADR 0207: там цикл парковался по времени простоя; здесь он паркуется также из-за ожидающего решения пользователя. Жест возобновления — тот же механизм, запускаемый ответом.

7. Решение доходит до того, кто работает​

GET .../dev-context возвращает decisoes — связанные с историей/задачей через afeta, предел 10 и 1 500 символов. Kickoff dev и срез QA показывают "Decisões do usuário — vencem RF/DoR quando conflitam".

8. PO исправляет историю ready по ответу пользователя (пересматривает ADR 0212)​

Что МЕНЯЕТСЯ в ADR 0212: recusaDeCorrecaoDeHistoria начинает принимать историю ready, когда запрос на исправление ссылается на ОТВЕЧЕННЫЙ questionId; PO получает ответ и исправляет RF/DoR. Что НЕ меняется: отказ при задаче in_review (и in_progress) остаётся; архивировать по-прежнему можно только draft; исправление ready без отвеченного questionId по-прежнему отклоняется; редактирование пользователем во вкладке Backlog следует мерилу 0212.

9. Экран​

Очередь "Perguntas em aberto" в блоке ожидающих пунктов чата, с собственными заголовком и счётчиком (никогда не суммируемыми с другими очередями, RN-467): вопрос, кто спросил, что затронуто, предложение с "Aceitar sugestão" и короткое поле с "Responder" — оба только для автора сессии. Предупреждение "N perguntas em aberto" находится рядом с "Estou pronto" и "Confirmar arquitetura pronta".

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

  • Стоимость в токенах: ~60 токенов на разговорный ход (центральная фраза и описание инструмента) и до ~400 в срезе QA / kickoff dev, когда есть связанные решения (предел 10 и 1 500 символов).
  • Цикл исправления перестаёт расходоваться на то, что dev не может решить.
  • У вопроса есть владелец: автор сессии. Участник, не являющийся автором, не разблокирует — объявленная цена (см. Альтернативы).
  • Что НЕ меняется: абсолютные пределы (RN-418), ручной merge в защищённую ветку, предел цикла исправления (лишь перестаёт считать этот вердикт), мерило архивирования ADR 0212 и парковка по времени ADR 0207.

Рассмотренные альтернативы​

  • Блокировать готовность при открытом вопросе. Отвергнуто: вопрос может касаться детали, которая не мешает PO продолжать; блокировка заменила бы забывчивость зависанием. Предупреждение с переходом решает забывчивость.
  • Обнаруживать вопросы в тексте агента. Отвергнуто: эвристика по прозе ошибается в обе стороны и создаёт ожидающий пункт, который никто не объявлял. Источник — инструмент, а центральная инструкция — то, что заставляет агента им пользоваться.
  • QA продолжает с предложением агента. Отвергнуто: одобрение по догадке скрывает решение пользователя и является ровно тем требованием "não confirmado", которое QA существует, чтобы не пропускать.
  • Отвечает любой участник developer. Отвергнуто решением владельца: вопрос касается намерения того, кто вёл сессию; ответ другого участника подменил бы решение владельца без его ведома.