diff --git a/docs/reviews/CODE-REVIEW-698-r2.md b/docs/reviews/CODE-REVIEW-698-r2.md new file mode 100644 index 00000000..7941fb54 --- /dev/null +++ b/docs/reviews/CODE-REVIEW-698-r2.md @@ -0,0 +1,144 @@ +# CODE-REVIEW #698 r2 + +Материал: `origin/dev..HEAD`, два коммита `ea2c000a` (r1, уже разобран) и +`97d819ad` (новый, только он в скоупе этого раунда) поверх `dev@9e4bfb43` +(рабочая копия уже на `97d819ad`). Дельта раунда — `git diff ea2c000a..97d819ad`: +`PROCESS.md` (10 строк), `scripts/rebase-generated.mjs` (комментарий, +5 строк), плюс публикация `docs/reviews/CODE-REVIEW-698-r1.md` (артефакт +конвейера, не правка автора). Файлов класса A по-прежнему нет — +инфраструктурный трек (§1), `track:show`. + +Раунд не первый (PROCESS.md §2.10, #214): разбор — по дельте r1→r2, а не +заново. Дельта локальна и мала (переформулировка одного абзаца канона и +парного комментария в коде, без изменения логики) — полный повторный разбор +механизма (`.gitattributes` union, `UPSTREAM_WINS`, `PATCH_ID_EXCLUDES`) не +требуется, он не менялся байт в байт (см. «Унаследовано из r1»). + +## Скоуп + +r1 закрыл ровно одну блокирующую находку — Medium: абзац `PROCESS.md`, +добавленный коммитом #698, утверждал в настоящем времени существование +«теста полосы на Validate» для всех шести чисел монолита, которого на +момент r1 не было (полоса — только у `bundleBytes`, остальные пять чисел +судятся точно; полоса для всех шести — отдельная нетриаженная задача #699). + +Коммит `97d819ad` переписывает этот абзац и парный комментарий к +`UPSTREAM_WINS`, называя текущий допуск так, как он реализован сегодня, а +не так, как он будет выглядеть после гипотетического #699. Код не менялся +(автор говорит об этом прямо в хендоффе, и `git diff ea2c000a..97d819ad -- +scripts/` подтверждает: правка только в блоке `/** ... */` над +`UPSTREAM_WINS`, объявление и вся исполняемая логика — байт в байт те же). + +## Как проверялось + +| Гейт | Команда | Результат | +|---|---|---| +| Validate на материале (`97d819ad`) | CI run, ссылка в задаче ревью | success — дешёвые гейты (`tsc`, полный `npm test`, `build`+сверка бандла) не перегонял, приняты по этой ссылке (#343) | +| Соответствие формулировки коду: гейт | `grep -n "lint:unused" package.json` | `"lint:unused": "node scripts/unused-locals-gate.mjs"` — имя гейта в новом абзаце названо верно | +| Соответствие формулировки коду: допуск | `scripts/monolith-metrics.mjs:262-274` (`BUNDLE_BYTES_BAND = 2_000`, `compareWithBaseline`: `band = name === 'bundleBytes' ? bundleBand : 0`) | подтверждает буквально: пять чисел — точное совпадение, `bundleBytes` — полоса 2000 Б, ровно как теперь написано в `PROCESS.md` | +| Соответствие формулировки коду: где стоит гейт | `grep -n "lint:unused" .github/workflows/validate.yml` → строка 809 | гейт действительно часть Validate кандидата, а не только локальный скрипт | +| Целевой юнит-набор (дельта r1, не менялась в r2, но перепроверил на новом SHA) | `node --test test/rebase-generated.test.mjs` | 15/15 pass | +| Согласованность конспектов ролей | `node --test test/process-digests.test.mjs` | 5/5 pass — переписанный абзац не входит в дословные «ключевые правила» `AUTHOR.md`/`REVIEWER.md`, там о #698/#699 ничего не сказано (`grep` по обоим файлам не нашёл упоминаний «тест полосы»/`monolith-baseline`/#699) — расхождения конспекта с новым каноном нет | +| Реестр мутантов, дешёвая половина | `node --test --test-name-pattern="every mutant patch anchors exactly once\|every guard command points" test/mutation-gate.test.mjs` | 2/2 — три мутанта из r1 по-прежнему анкерятся, комментарий не входит в их `find`/`replace` | +| Провенанс коммита r2 | `git show -s --format=full 97d819ad` | `Issue: #698`, `User-Visible: no` — корректно, правка только канона и комментария, продуктового поведения нет | +| `process-gate.mjs` на дельте r2 | `node scripts/process-gate.mjs --range 97d819ad~1..97d819ad` | «гейт пройден, предупреждений 0» | + +Не прогонял (и почему): `npx tsc --noEmit`, полный `npm test`, `npm run build` ++ сверка трёх копий бандла, `node scripts/check-docs.mjs`, `mutation-gate +--check` целиком — приняты по зелёному Validate на `97d819ad` (#343); +дельта r2 не трогает `src/**` и не меняет исполняемый код. Golden/скриншоты, +браузерные смоки, `pytest tests_backend`, инварианты модели, +performance-профили — не применимо, как и в r1: диапазон не трогает визуал, +Python или геометрию плана. + +## Что проверено и корректно + +- **Медиан-находка r1 закрыта по существу, а не косметически.** Новая + формулировка называет реальный гейт (`npm run lint:unused` → + `scripts/unused-locals-gate.mjs` → `compareWithBaseline`), реальный + сегодняшний допуск (пять чисел — точно, `bundleBytes` — полоса 2000 Б) и + корректно относит полосу для всех шести чисел к будущему #699, не выдавая + её за факт. Проверено не по тексту хендоффа, а прямым чтением + `scripts/monolith-metrics.mjs` и `.github/workflows/validate.yml` — цитаты + выше воспроизводимы построчно. +- **Прежний вывод об отсутствии тихого прохождения неверного бейзлайна не + меняется.** Новый текст сам это формулирует явно: «сторона `dev` в базе + краснеет, если задача сама меняла эти числа — это прежний возврат + автору, только после Validate, а не до ревью» — совпадает с тем, что уже + было проверено исполнением в r1 (safety net через Validate кандидата). +- **Код механизма не тронут.** `git diff ea2c000a..97d819ad -- + scripts/rebase-generated.mjs` — правка ограничена телом doc-комментария + над `UPSTREAM_WINS`; объявление константы, `planStop`, + `rebaseRegenerating` — те же байты, что проверялись мутациями в r1. +- **Трейлеры и класс изменений корректны**: `Issue: #698`, `User-Visible: no`. + +## Закрытие раунда r1 + +| Находка (r1) | Чем закрыта | Где это видно | +|---|---|---| +| Medium: `PROCESS.md` утверждал как факт «тест полосы на Validate» для всех шести чисел монолита, которого не существует (полоса только у `bundleBytes`) | Абзац переписан в настоящем времени под фактическую автоматизацию: назван гейт (`lint:unused`), сегодняшний нулевой допуск для пяти чисел и полоса 2000 Б для `bundleBytes`; полоса всех шести явно отнесена к будущему #699 | `PROCESS.md` (диапазон строк 392-401, коммит `97d819ad`); тот же текст продублирован в комментарии к `UPSTREAM_WINS` в `scripts/rebase-generated.mjs`; подтверждено чтением `scripts/monolith-metrics.mjs:262-274` и `.github/workflows/validate.yml:809` — формулировка и код совпадают дословно по числам и названию гейта | + +## Унаследовано из r1 (без повторной проверки) + +- Механизм разрешения конфликтов — `.gitattributes` (`merge=union` на обоих + CHANGELOG), `UPSTREAM_WINS` в `scripts/rebase-generated.mjs`, + `PATCH_ID_EXCLUDES` в `scripts/merge-candidate.mjs`, три новых мутационных + гвардианта — реализован корректно и проверен исполнением реального git и + ручными мутациями. Документ: `docs/reviews/CODE-REVIEW-698-r1.md`, SHA + материала `ea2c000af5e4bd47140c2c255fca16ad2a136f6c`. Не перепроверял + заново мутациями в r2: код этих файлов в дельте r1→r2 не менялся (см. + «Скоуп» и «Как проверялось» выше — единственная правка `scripts/` этого + раунда — комментарий). +- Обоснование, почему `docs/images/screenshots.json` и + `scripts/bundle-budget.mjs` вне скоупа #698, — из r1, не пересматривал: + первое отложено на #697 (раскрыто автором), второе — смешанный файл с + содержательными словарями, не тот же тип конфликта, что чистый + производный JSON. +- Два Low из r1 (предиктивный `--dry-run`-лог `rebase-on-dev.mjs` не знает + про новые правила; риск дублирования строки ченджлога при настоящем + конфликте двух правок) остаются снятыми ревьюером без правки — дельта r2 + их не касается. + +## Находки + +Новых находок в дельте r2 нет. High: 0, Medium: 0. + +## Чего не проверял + +- Полный `npm test`, `npx tsc --noEmit`, `npm run build` + сверка бандла — + приняты по зелёному Validate на `97d819ad` (#343); дельта r2 не трогает + `src/**`. +- Существо #699 (проектирование полосы для всех шести чисел) — вне скоупа + #698, не проверял по существу; только убедился, что новая формулировка + канона не выдаёт его результат за уже реализованный. +- Живой прогон конвейера на реальном GitHub Actions с настоящим конфликтом + между двумя параллельными PR — как и в r1, не воспроизводил; логика + проверена в r1 реальным git во временных репозиториях, дельта r2 её не + меняет. + +## Вердикт + +Единственная блокирующая находка r1 (Medium: формулировка канона опережала +не принятую задачу #699) закрыта точечной правкой того же абзаца — новый +текст сверен построчно с фактическим кодом гейта и подтверждён +исполняемыми числами (`compareWithBaseline`, `BUNDLE_BYTES_BAND`, +`validate.yml:809`). Код механизма не менялся, ранее проверенные мутациями +гарантии в силе. Новых находок нет. + +Вердикт: зелёный · заход r2 · блокирующих циклов 1/2 · High: 0 · Medium: 0 + +--- + +--- + + + +## Материал раунда + +- Ветка: `issue/698-rebase-auto-resolve`, коммит `97d819ad6757` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. +- Дерево материала: `0e024d33642f2428aefb2486c6e12395e3e05209` + ``` + git log --all --format='%H %T' | grep 0e024d33642f + ``` +- Тело issue: `e17d18976553c2da4042b649a2073c581aa5108f58a57cf7c2902b6d639859c0` +- Вердикт конвейера: `green` · High 0