docs: bound review convergence across delivery flows - #137
Conversation
Процессы требовали проверки реализации и зелёного CI, но не определяли порядок между «реализация закончена» и «готово». Отсюда неоднозначности: достаточно ли одной проверки после исправлений, к одной ли редакции относятся verdict и CI, сколько раз допустимо повторять цикл и как отличить локальный дефект от ошибки в плане, design, брифе или маршрутизации. `flows/testing-policy.md` уже владеет таксономией проходов проверки, поэтому контракт сходимости добавлен туда как cross-flow правило: - ровно два исхода — сошлась или не сошлась; третьего не существует; - clean verdict и зелёный обязательный CI обязаны относиться к одной редакции; исправление после verdict аннулирует его; - бюджет по умолчанию — десять полных циклов на review pass; flow может задать более строгий предел, как пять итераций Plan Ready в Feature Flow; - исчерпание бюджета не разрешает принять работу и не создаёт Human Gate само по себе: причина классифицируется и работа возвращается владельцу фактов — коду, плану, design pack, брифу или routing record; - решение продолжить, остановиться или вернуться фиксируется в canonical carrier flow вместе с номером цикла, редакцией, verdict и классом причины. Feature, Small Change, Bug Fix и Refactoring теперь ссылаются на общий контракт вместо собственной формулировки «последний review cycle без открытых замечаний», которая не требовала ни одной редакции, ни разбора причины. Контракт механизм-нейтрален: он требует независимой проверки со структурированным verdict, но не выбирает инструмент — это предмет #120. Closes #121 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RtxeRwhVf1y8zvxUtk6xrS
Ревью показало, что первая редакция была спроектирована по частично прочитанному issue: я пропустил таблицу из семи классов причин, требования к границе цикла, исключение нестабильного CI и прямой запрет смешивать контракт с Plan Ready. - Контракт явно ограничен проверкой после реализации; связь с Plan Ready снята, вместе с дублем константы «пять итераций». Artifact review остаётся отдельным объектом по Verification Context Separation. - Граница цикла определена: `review → исправления → повторный review`, началом служит verdict с блокирующими замечаниями. Редакция — commit SHA. Без этого ни бюджет, ни правило одной редакции нельзя было проверить по следу. - Бюджет считается на delivery-единицу, а не на каждый проход проверки: пять проходов из Verification Context Separation давали бы 50 циклов вместо десяти. - Повтор нестабильного или недоступного CI без изменения кода циклом не считается и фиксируется как внешняя причина. - Таблица причин приведена к issue, включая недостающий седьмой класс — внешнюю блокировку. Без него десять падений на недоступной инфраструктуре пришлось бы классифицировать как дефект реализации и вернуть в тот же цикл. - Возврат при дефекте реализации — пересоставить ограниченный план исправления, а не войти в тот же цикл заново; новый лимит нельзя начать, пока причина не разобрана и владелец фактов не обновлён. - Правые ячейки называют владельца фактов, а не gate Feature Flow: у Small Change, Bug Fix и Refactoring нет Problem/Solution/Plan Ready. - Глубина самой проверки отдана validation profile: контракт не добавляет неавторского reviewer там, где профиль требует лишь обычный review. - Done gate Feature Flow дополнен в самом feature.md — в первой редакции условие стояло только в testing-policy.md, который на feature.md и ссылается. - Required Evidence в Refactoring Flow больше не требует зелёного CI от research refactoring, у которого нет production change. - Incident Flow подключён для repository changes: тот же hotfix через Bug Fix и через Incident должен закрываться одинаково. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RtxeRwhVf1y8zvxUtk6xrS
Ревью нашло 15 проблем, 8 высоких — переписал раздел (
|
| # | Находка | Как закрыто |
|---|---|---|
| 1, 2 | Done gate Feature Flow не был обновлён, условие висело в файле, который делегирует владение | дополнен feature.md |
| 3, 14 | Plan Ready подчинён контракту, который сам себя объявляет проверкой реализации; дубль константы «пять» | связь снята, контракт явно ограничен проверкой после реализации |
| 4 | «Локальный дефект → тот же шаг» открывал закрытый цикл заново | возврат — пересоставить ограниченный план исправления; новый лимит нельзя начать без разбора |
| 5 | не было седьмого класса причин — внешней блокировки | добавлен по таблице issue |
| 6 | повтор нестабильного CI жёг бюджет | без изменения кода циклом не считается |
| 7 | возвраты указывали на gates, которых нет в трёх flow из четырёх | правые ячейки называют владельца фактов, gates Feature Flow — в скобках |
| 8 | «независимая проверка» молча поднимала планку для documentation и low-risk |
глубина отдана validation profile |
| 9 | research refactoring становился незакрываемым | CI требуется только для production change |
| 10 | не определены граница цикла и редакция | цикл — review → исправления → повторный review, редакция — commit SHA |
| 11 | бюджет на проход давал 50 циклов вместо десяти | считается на delivery-единицу |
| 12 | след не имел владельца | canonical carrier flow — тот же, что владеет routing record и validation profile decision |
| 13 | форма записи решения дублировала SDP | ссылка вместо повтора полей |
| 15 | слабая формулировка выживала в Incident | подключён для repository changes |
По Epic Flow (тоже упомянут в находке 15) намеренно ничего не менял: его review относится к epic package, а не к проверке реализации — доставку он делегирует feature-пакетам, и там контракт уже действует.
Проверки зелёные: оба lint, doctor --profile template, валидатор priming-манифестов, git diff --check. Манифесты подготовки контекста трогать не потребовалось — flows/testing-policy.md уже входит в стадии feature, small-change, bug-fix, refactoring и incident, поэтому контракт доезжает до агента вместе с ними.
Самое важное — определение цикла было дырявым. Он начинался «verdict-ом с блокирующими замечаниями», поэтому петля «чистый verdict → красный CI по коду → правка → снова чистый verdict → снова красный CI» не расходовала бюджет вовсе: ни один verdict в ней замечаний не содержит. Это ровно та бесконечная петля, ради закрытия которой issue и существует. Теперь цикл считается по любой несошедшейся проверке — verdict с замечаниями либо красный обязательный CI. - След имеет одного владельца: canonical owner validation profile decision. У Feature Flow routing record и profile decision лежат в разных документах, и прежняя формулировка «тот же carrier» давала записи два законных места. Добавлена минимальная форма записи. - Incident Flow отключён от контракта: `validation-profiles.md` не назначает ему profile, поэтому два пункта контракта — глубина проверки и носитель следа — не имели бы референта. Permanent remediation получает и profile, и контракт после отдельного Task Routing. - Контракт добавлен в сами чек-листы gate, а не только в Required Evidence: терминальное состояние flow определяется через «все gates выполнены», и агент работает по чек-листу. - Research refactoring полностью выведен из-под контракта: у него нет production change, а контракт объявляет себя проверкой после реализации. - Возврат при дефекте реализации — ограничить объём исправления, а не «пересоставить план»: в Small Change план сам по себе является триггером rerouting. - Для flow без нужного этапа возврат ведёт к повторному Task Routing. - `derived_from` дополнен autonomy-boundaries.md и routing.md, откуда контракт берёт нормативное содержание. - Терминальное состояние названо как `Done`, `Resolved` или эквивалент: Bug Fix и Incident не заканчиваются в `Done`. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RtxeRwhVf1y8zvxUtk6xrS
Второй раунд закрыт в
|
| Находка | Как закрыто |
|---|---|
| След ссылался на «тот же carrier, что routing record и profile decision» — у Feature Flow это разные документы | один владелец: canonical owner profile decision из таблицы validation-profiles.md; добавлена минимальная форма записи |
Incident подключён к контракту, хотя validation-profiles.md не назначает ему profile — два пункта контракта остались бы без референта |
Incident отключён; permanent remediation получает и profile, и контракт после отдельного Task Routing |
Medium и low
- Контракт добавлен в сами чек-листы gate, а не только в Required Evidence: терминальное состояние определяется через «все gates выполнены», и агент работает по чек-листу — раньше он мог дойти до Done мимо контракта.
- Research refactoring полностью выведен из-под контракта: у него нет production change, а контракт объявляет себя проверкой после реализации.
- Возврат при дефекте реализации — «ограничить объём исправления», а не «пересоставить план»: в Small Change план сам является триггером rerouting, то есть прежняя формулировка заставляла нарушить flow.
- Для flow без нужного этапа возврат ведёт к повторному Task Routing.
derived_fromдополненautonomy-boundaries.mdиrouting.md, откуда контракт берёт нормативное содержание.- Терминальное состояние названо как
Done,Resolvedили эквивалент — Bug Fix и Incident не заканчиваются вDone.
Проверки зелёные: оба lint, doctor --profile template, валидатор манифестов, git diff --check.
Ревью на соразмерность: 114 добавленных строк, из них на счастливом пути работают 18. Контракт занимал 48% файла, а файл входит в priming всех четырёх flow — 800 слов протокола несходимости читались на каждой задаче, включая те, где проверка сходится с первого раза. Раздел сокращён со 114 строк до 53 без потери критериев приёмки #121. Упрощение вскрыло два дефекта, которые два предыдущих раунда не увидели: - След предписывалось писать в canonical owner profile decision. Для Feature Flow это `brief.md` в репозитории: запись следа создавала новый commit, а значит новую revision, на которой verdict уже недействителен — неразрешимая петля, порождённая правилом об одной редакции. Теперь след пишется вне проверяемой revision: issue, PR или routing record. Заодно execution-факты перестали ложиться в problem-space документ. - Строка «дефект реализации → повторить в текущем flow» не сочеталась с запретом открывать новый лимит без обновления владельца фактов: состояние было не определено, то есть цикл мог идти вечно за пределами бюджета. Разрешено одно продолжение с суженным объёмом, дальше — SDP. Выброшено: след на счастливом пути вместе с полями, которые там не заполняются (`Cycle` при нуле циклов, `Decision` без значения «сошлось»); два абзаца обоснования для ревьюера; пересказ факта о глубине проверки, которым владеет validation-profiles.md; дубли формулировки в восьми местах — осталась одна ссылка на flow, как требует принцип единственного владельца факта. Восстановлено требование закрытого review для research refactoring: сужение до production change случайно сняло его совсем. Манифесты priming для Small Change и Refactoring дополнены autonomy-boundaries и routing — контракт требует их при несходимости, а агент читает только exact manifest стадии. dependency-tree обновлён под новый derived_from. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RtxeRwhVf1y8zvxUtk6xrS
Ответ на «не слишком ли усложняем»: да — сократил вдвое (
|
Независимая проверка запускалась через произвольный транспорт — отдельную cmux-сессию, вручную собранный codex exec или иной ad hoc механизм. Результат приходилось вручную извлекать из логов, а review contract зависел от локального UI и orchestration setup. Разделено по слоям, потому что `code-converge` — конкретный внешний инструмент, а `template/memory-bank/` уходит в произвольные downstream-проекты, где его нет: - в generic-слой (`flows/testing-policy.md`) добавлены требования к любому механизму: structured verdict, fail closed, review-only и разделение автора и проверяющего. Terminal и UI-оркестраторы объявлены средством размещения вкладок, а не механизмом проверки; - в project-adaptation слой (`engineering/testing-conventions.md`) добавлен слот, где проект называет свой механизм и точные вызовы двух режимов; - собственный выбор этого репозитория — `code-converge` — зафиксирован в `AGENTS.md` вместе с командами: обычный review-режим для реализации и `--document-review --max-cycles 0` для документов и артефактов. Нулевой fix budget разделяет роли: проверяющий возвращает findings, но не правит проверяемую revision; исправляет автор, после чего запускается новая проверка новой revision — это уже требует контракт сходимости из #137. Closes #120 Claude-Session: https://claude.ai/code/session_01RtxeRwhVf1y8zvxUtk6xrS Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…bsystem * origin/main: docs: make the review mechanism an explicit, verifiable choice (#139) docs: add WAIT status for external events without a human gate (#138) docs: bound review convergence across delivery flows (#137) chore: pin memory-bank-cli v2.3.0 in CI (#136) refactor: make project-local memory bank a projection of the payload (#134)
Closes #121.
Проблема
Процессы требовали независимой проверки реализации и зелёного CI, но не определяли порядок между «реализация закончена» и «готово». Отсюда ровно те последствия, что перечислены в issue: исправленная после проверки редакция могла дойти до закрытия без повторной чистой проверки, verdict и CI могли подтверждать разные редакции, одинаковые замечания повторялись без разбора причины, а четыре flow трактовали успешное завершение по-своему.
Где живёт контракт
flows/testing-policy.mdуже canonical дляverification_context_separation— то есть для того, как устроены проходы проверки. Туда и добавлен cross-flow разделReview Convergence; добавлен ключreview_convergence_contractвcanonical_for.Что он задаёт
escalate.Что изменилось в flow
Feature, Small Change, Bug Fix и Refactoring ссылаются на общий контракт вместо собственной формулировки «последний review cycle завершён без открытых замечаний», которая не требовала ни одной редакции, ни разбора причины. Done gate в Feature Flow дополнен тем же условием.
Границы
Контракт механизм-нейтрален: требует независимой проверки со структурированным verdict, но не выбирает инструмент, команду или оркестратор — это предмет #120, и он подставит
code-convergeв готовый контракт, не создавая второй способ запуска проверки.Выбранный validation profile, обязательные approvals и CI контракт не ослабляет: они действуют на каждом цикле.
Проверки
lintшаблона,lint --repo-root .,doctor --profile template, валидатор priming-манифестов,git diff --check— всё зелёное.🤖 Generated with Claude Code
https://claude.ai/code/session_01RtxeRwhVf1y8zvxUtk6xrS