docs: review document for #698

Issue: #698
User-Visible: no
This commit is contained in:
claude[bot]
2026-09-28 21:01:38 +00:00
parent 6ab791e348
commit 59bf216b60
+144
View File
@@ -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
---
---
<!-- material-anchors: сгенерировано конвейером (#414) -->
## Материал раунда
- Ветка: `issue/698-rebase-auto-resolve`, коммит `97d819ad6757` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
- Дерево материала: `0e024d33642f2428aefb2486c6e12395e3e05209`
```
git log --all --format='%H %T' | grep 0e024d33642f
```
- Тело issue: `e17d18976553c2da4042b649a2073c581aa5108f58a57cf7c2902b6d639859c0`
- Вердикт конвейера: `green` · High 0