Files
2026-09-28 21:01:38 +00:00

13 KiB

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