Skip to content

docs: bound review convergence across delivery flows - #137

Merged
dapi merged 4 commits into
mainfrom
docs/bounded-review-convergence
Sep 6, 2026
Merged

docs: bound review convergence across delivery flows#137
dapi merged 4 commits into
mainfrom
docs/bounded-review-convergence

Conversation

@dapi

@dapi dapi commented Sep 6, 2026

Copy link
Copy Markdown
Owner

Closes #121.

Проблема

Процессы требовали независимой проверки реализации и зелёного CI, но не определяли порядок между «реализация закончена» и «готово». Отсюда ровно те последствия, что перечислены в issue: исправленная после проверки редакция могла дойти до закрытия без повторной чистой проверки, verdict и CI могли подтверждать разные редакции, одинаковые замечания повторялись без разбора причины, а четыре flow трактовали успешное завершение по-своему.

Где живёт контракт

flows/testing-policy.md уже canonical для verification_context_separation — то есть для того, как устроены проходы проверки. Туда и добавлен cross-flow раздел Review Convergence; добавлен ключ review_convergence_contract в canonical_for.

Что он задаёт

  • Ровно два исхода. Сошлась или не сошлась. Третьего — «вроде замечания закрыли» — не существует.
  • Одна редакция. Clean verdict и зелёный обязательный CI обязаны относиться к одной и той же редакции кода; любое исправление после verdict создаёт новую редакцию и аннулирует его. Verdict по одной редакции и CI по другой вместе не доказывают ничего.
  • Бюджет. По умолчанию десять полных циклов «проверка — исправление» на один review pass. Flow может задать более строгий предел — как пять итераций Plan Ready artifact review в Feature Flow, которые теперь явно связаны с общим контрактом.
  • Исчерпание — повод для разбора, а не для приёмки. И не Human Gate само по себе: применяется Structured Decision Protocol, эскалация только при outcome escalate.
  • Классификация причины с возвратом к владельцу фактов: локальный дефект → тот же execution step; ошибка последовательности → Plan Ready; ошибка решения или контрактов → Solution Ready; ошибка требований → Problem Ready; неверный процесс → Task Routing.
  • След. Номер цикла, проверенная редакция, verdict и класс причины фиксируются в canonical carrier flow. Без него нельзя отличить сошедшуюся проверку от брошенной.

Что изменилось в 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

dapi and others added 2 commits September 6, 2026 11:42
Процессы требовали проверки реализации и зелёного 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
@dapi

dapi commented Sep 6, 2026

Copy link
Copy Markdown
Owner Author

Ревью нашло 15 проблем, 8 высоких — переписал раздел (0ea10af)

Корень один и он мой: первая редакция проектировалась по частично прочитанному issue. Я прочитал постановку и хвост, но пропустил середину — таблицу из семи классов причин, требования к границе цикла, исключение нестабильного CI и прямой запрет смешивать контракт с Plan Ready.

Отдельно признаю фактическую ошибку в описании PR: там было сказано «Done gate в Feature Flow дополнен», хотя условие стояло только в testing-policy.md, который сам ссылается на feature.md как на владельца gates. Теперь дополнен по-настоящему.

# Находка Как закрыто
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
@dapi

dapi commented Sep 6, 2026

Copy link
Copy Markdown
Owner Author

Второй раунд закрыт в 29f041c

Одиннадцать находок, три высокие. Главную привожу отдельно, потому что она била точно в цель issue.

Определение цикла было дырявым

Цикл начинался «verdict-ом с блокирующими замечаниями». Значит петля

чистый verdict → красный CI по коду → правка → снова чистый verdict → снова красный CI

не расходовала бюджет вообще: ни один verdict в ней замечаний не содержит, счётчик не двигается, ни одно из двух состояний не достигается. Это ровно та бесконечная петля после реализации, ради закрытия которой issue и написан — я её воспроизвёл в формулировке, которая должна была её закрыть.

Теперь цикл считается по любой несошедшейся проверке: verdict с замечаниями или красный обязательный CI по причине в коде. В текст добавлено объяснение, почему одних замечаний reviewer недостаточно.

Остальные высокие

Находка Как закрыто
След ссылался на «тот же 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
@dapi

dapi commented Sep 6, 2026

Copy link
Copy Markdown
Owner Author

Ответ на «не слишком ли усложняем»: да — сократил вдвое (e3de010)

Ревью на соразмерность дало цифры, которые всё решают: 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 нет значения «сошлось».
  • Два абзаца обоснования («без этого правила петля не расходовала бы бюджет…») — это ответы прошлым ревьюерам, а не норма. Место им в описании PR, а не в документе, который читают на каждой задаче.
  • Пересказ факта о глубине проверки, которым владеет validation-profiles.md.
  • Дубли формулировки в восьми местах → одна голая ссылка на flow. dna/principles.md: «Дубли = дефект», и расхождение уже началось — чек-листы требовали записи следа, Required Evidence нет.

Что добавлено

  • Восстановлено требование закрытого review для research refactoring: сужение до production change случайно сняло его совсем, и research с открытыми блокирующими замечаниями формально проходил Exit Contract.
  • Манифесты priming для Small Change и Refactoring дополнены autonomy-boundaries.md и routing.md. Контракт требует их при несходимости, а агент читает только exact manifest стадии — иначе на несходимости у него не будет нужного документа. Это же прямо входит в область изменения по Не допускать бесконечных циклов проверки после реализации #121.
  • dependency-tree.md обновлён под новый derived_from.

Проверки зелёные: оба lint, doctor --profile template, валидатор манифестов, git diff --check.

@dapi
dapi merged commit f399d07 into main Sep 6, 2026
1 check passed
dapi added a commit that referenced this pull request Sep 6, 2026
Независимая проверка запускалась через произвольный транспорт — отдельную
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>
dapi added a commit that referenced this pull request Sep 6, 2026
…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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Не допускать бесконечных циклов проверки после реализации

1 participant