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

ADR 0215 — Решение проекта доходит до dev и QA

Статус​

Accepted. 2026-10-14 (AT-526; решения владельца от 14.10). ПЕРЕСМАТРИВАЕТ часть ADR 0214: правило "решение без afeta, касающегося задачи, не входит" в контекст dev. Правила в RN-870, RN-871 и RN-872.

Тема: gates. Важный эффект — эффект gate QA: он перестаёт повторять вопрос, на который пользователь уже ответил.

Контекст​

Измерено в TP-01 (15-й раунд, viralabs-app-2026-10-11b):

  • Пользователь ответил на "código inexistente ou apagado responde 404?" в 15:45. Задача "listagem e exclusão de links" принадлежала ДРУГОЙ истории, и её QA утверждал, что вопрос остаётся без ответа, выдал needs_user_decision, и gate запарковался без открытого вопроса в проекте — в ленте не на что было отвечать.
  • afeta.regras, которые записывает Criativo, — это ЗАГОЛОВКИ правил, а фильтр ADR 0214 (afetaAlgum) сравнивает с ID: ни одно решение Criativo никогда не совпадало. Даже с id упомянутые правила не были правилами истории задачи.
  • Вердикт принимал openQuestionId несуществующего или уже отвеченного вопроса и парковался бы навсегда.

Решение​

  1. openQuestionId вердикта проверяется (RN-870): он должен существовать в проекте и быть ОТКРЫТЫМ, до любой записи. Несуществующий (или другого проекта) — 404 pergunta_nao_encontrada; уже отвеченный — 409 pergunta_ja_respondida с текстом решения в теле (decisao), без записи и без pr.gate_changed — QA читает решение вместо ожидания.
  2. afeta.regras принимает точный заголовок (RN-871): в воронке событий точный заголовок artifact.business_rule проекта становится id (самого свежего, если заголовок повторяется); то, что не является ни id, ни точным заголовком, — названный 400. Чтение контекста dev также сопоставляет по ЗАГОЛОВКУ правил истории, для решений, записанных до этого правила.
  3. Остальные решения проекта тоже доходят (RN-872, вариант (a) владельца): GET /internal/sessions/:sessionId/dev-context возвращает, помимо decisoes (касающихся задачи), decisoesDoProjeto — прочие decision_record проекта, ОТДЕЛЬНЫМ списком, в пределах ТОГО ЖЕ предела 10: относящиеся к задаче идут первыми и расходуют предел раньше. Именно это пересматривает ADR 0214, чья фраза "решение без afeta не входит" перестаёт действовать для списка проекта (продолжает действовать для decisoes).

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

  • Новое поле аддитивно: engine его игнорирует, пока lane engine не напечатает раздел "Outras decisões do projeto" в kickoff dev и в срезе QA (context_builder.ex читает контекст через Map.get с именованным ключом).
  • Предел 10 ОБЩИЙ. В проекте с множеством решений старые, не касающиеся задачи, остаются вне — цена того, чтобы не расширять контекст.
  • decisoesDoProjeto включает каждое decision_record проекта, а не только рождённые из вопроса, на который ответил пользователь (решения Criativo о технических ограничениях тоже, RN-711).
  • Заголовок, повторяющийся между версиями правила, разрешается в самую свежую; отказа из-за неоднозначности нет.