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,limit50 с общим числом (RN-180).POST /projects/:projectId/open-questions/:questionId/answer— тело{ resposta }или{ aceitarSugestao: true }; 403so_o_autor_da_sessao, 409pergunta_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. Отвергнуто решением владельца: вопрос касается намерения того, кто вёл сессию; ответ другого участника подменил бы решение владельца без его ведома.