From 73d6e2eeebb5ccbddcff697835ff733a30259c0b Mon Sep 17 00:00:00 2001 From: Codex Date: Wed, 9 Sep 2026 17:44:55 +0300 Subject: [PATCH] =?UTF-8?q?docs:=20spec=20#510=20r4=20=E2=80=94=20proceed?= =?UTF-8?q?=20replaces=20only=20the=20conflict=20conjunct?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Spec review r3: `proceed` is true on the reuse fast-path too, so it must replace the `rebase.conflict != 'true'` conjunct alone; the existing `reuse != 'true'` (#499), stage and decide conjuncts stay on every step that has them. The "single variable" claim is narrowed accordingly. Issue: #510 User-Visible: no --- .../510-mutants-on-candidate-and-review-waits-validate.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/specs/510-mutants-on-candidate-and-review-waits-validate.md b/docs/specs/510-mutants-on-candidate-and-review-waits-validate.md index 66bd4184..df99bed3 100755 --- a/docs/specs/510-mutants-on-candidate-and-review-waits-validate.md +++ b/docs/specs/510-mutants-on-candidate-and-review-waits-validate.md @@ -66,10 +66,10 @@ Push-прогоны на том же SHA не считаются доказат ### 5.2. `process.yml` -Новый шаг «Validate с мутантами на материале» (`id: gate`) стоит **после `reuse` (#499) и шага «Конфликт с dev — вернуть автору без ревью»** и **перед** «Зелёные гейты на этом SHA» (#343): порядок в файле — `material` → `reuse` → возврат при конфликте → `gate` → возврат при красном → `validated` (ревью ТЗ r1, Medium 1: `reuse.outputs` должен быть уже вычислен). Условие шага — `steps.rebase.outputs.conflict != 'true'`; внутри: при `stage != code`, `reuse == true` или отсутствии ветки шаг пишет `proceed=true`, `result=skipped` и выходит; иначе вызывает `validate-gate.mjs` и пишет `result=green|red|missing`, `proceed=true|false` по его коду выхода (сам шаг всегда `exit 0`, чтобы дальнейшая логика меток отработала). Единственная переменная, по которой ветвятся последующие шаги, — `proceed` (`true` = green **или** skipped; `false` = red/missing); `result` — только для текста комментария (ревью ТЗ r2, Medium 1: skip-ветка не должна ни возвращать задачу, ни блокировать ревью). Далее: +Новый шаг «Validate с мутантами на материале» (`id: gate`) стоит **после `reuse` (#499) и шага «Конфликт с dev — вернуть автору без ревью»** и **перед** «Зелёные гейты на этом SHA» (#343): порядок в файле — `material` → `reuse` → возврат при конфликте → `gate` → возврат при красном → `validated` (ревью ТЗ r1, Medium 1: `reuse.outputs` должен быть уже вычислен). Условие шага — `steps.rebase.outputs.conflict != 'true'`; внутри: при `stage != code`, `reuse == true` или отсутствии ветки шаг пишет `proceed=true`, `result=skipped` и выходит; иначе вызывает `validate-gate.mjs` и пишет `result=green|red|missing`, `proceed=true|false` по его коду выхода (сам шаг всегда `exit 0`, чтобы дальнейшая логика меток отработала). Гейт добавляет в условия последующих шагов ровно одну переменную — `proceed` (`true` = green **или** skipped; `false` = red/missing), и она **заменяет только конъюнкт `steps.rebase.outputs.conflict != 'true'`**; все прочие конъюнкты существующих условий (`steps.reuse.outputs.reuse != 'true'` у установки зависимостей, Chromium и `Review` — #499, модель на reuse-ветке не вызывается; `needs.guard.outputs.stage == 'code'` там, где он есть; `steps.decide.outputs.green == 'true'` у слияния) остаются как есть (ревью ТЗ r3, Medium 1). `result` — только для текста комментария (ревью ТЗ r2, Medium 1: skip-ветка не должна ни возвращать задачу, ни блокировать ревью). Далее: - новый шаг «Validate красный — вернуть автору без ревью», условие `steps.rebase.outputs.conflict != 'true' && steps.gate.outputs.proceed != 'true'` (на skip-ветке `proceed == 'true'` — шаг не срабатывает): комментарий по образцу шага «Конфликт с dev» — что именно (red/missing), ссылка на прогон, что делать (починить, запушить, вернуть `S7`), «цикл ревью не израсходован»; метка `S7 → S6`; `exit 0`. -- все последующие шаги ревью (`validated`, зависимости, Chromium, Claude, Review, публикация, решение, слияние, перестановка метки) получают условие `steps.gate.outputs.proceed == 'true'` вместо нынешнего `steps.rebase.outputs.conflict != 'true'` (при конфликте `gate` не выполняется, `proceed` пуст — условие ложно, как и раньше). +- все последующие шаги ревью (`validated`, зависимости, Chromium, Claude, Review, публикация, решение, слияние, перестановка метки) получают `steps.gate.outputs.proceed == 'true'` на месте нынешнего конъюнкта `steps.rebase.outputs.conflict != 'true'`, остальные конъюнкты не трогаются: например, «Установить зависимости» — `steps.gate.outputs.proceed == 'true' && steps.reuse.outputs.reuse != 'true'`, `Review` — то же, «Слить ветку в dev» — по-прежнему `steps.decide.outputs.green == 'true'` (при конфликте `gate` не выполняется, `proceed` пуст — условие ложно, как и раньше; на reuse-ветке `proceed == 'true'`, но `reuse != 'true'` ложно — модель и зависимости по-прежнему не запускаются, тест #499 «вердикт прошлого захода применяется повторно: модель не вызывается» остаётся зелёным). - шаг `validated` (#343) остаётся, но при `proceed == 'true'` на этапе code всегда находит зелёный dispatch-прогон и пишет ссылку на него; ветка «зелёного нет» становится недостижимой на этапе code и остаётся для spec. - Шаг «Переставить метку» и «Позвать владельца» не должны считать gate-возврат падением: `if: always()`-логика проверяется тестом. @@ -96,7 +96,7 @@ Push-прогоны на том же SHA не считаются доказат - `test/classify-changes.test.mjs`: таблица `mutantsRequested` (push без трейлера → false; push с `Release:` → true; dispatch full/mutants/ни одного; PR; schedule). - `test/validate-workflow.test.mjs`: вход `mutants` объявлен; `mutants_requested` выход и условие job; группа concurrency для dispatch отдельная. - `test/validate-gate.test.mjs` (новый, fake `gh`): найден зелёный dispatch → green без запуска; найден красный → red; идущий → ждёт; нет → запускает и ждёт появления; появился на другом SHA → missing; таймаут → red; push-прогон не считается. -- `test/review-doc-guard.test.mjs`: шаг gate стоит после `material` **и после `reuse`** и до установки зависимостей; шаги ревью условны по `proceed`; возврат в `S6` при `proceed != true`; этап spec и reuse гейт не проходят. +- `test/review-doc-guard.test.mjs`: шаг gate стоит после `material` **и после `reuse`** и до установки зависимостей; шаги ревью условны по `proceed`, при этом конъюнкт `reuse != 'true'` у зависимостей/Chromium/`Review` сохранён (тест #499 «модель не вызывается» остаётся); возврат в `S6` при `proceed != true`; этап spec и reuse гейт не проходят. - `test/validate-gate.test.mjs`: `provesMutants` — job исполнены и зелёные / нет job / skipped / одна красная; зелёный чужой dispatch со skipped-мутантами игнорируется, гейт запускает свой. - `test/merge-candidate.test.mjs`: dispatch после пуша кандидата, ожидание dispatch-прогона. - Мутанты реестра (`scripts/mutation-gate.mjs`, гарды — `node --test`): `mutants-run-on-every-push` (classify: push → true), `review-starts-on-red-validate` (gate: red → green), `merge-waits-push-run-without-mutants` (waitValidate игнорирует событие). Каждый — отрицательным прогоном штатным раннером.