16 KiB
CODE-REVIEW-699-r3
Issue: #699 · этап: code · трек: show · заход: r3 · блокирующих циклов до этого раунда: 1/2
Материал раунда: git log --oneline origin/dev..HEAD / git diff origin/dev...HEAD,
вершина ветки issue/699-ratchet-bands = 4fa3c7977ebbd11907364af626f978deec790aa5.
Validate на этом SHA — success (run 36491631358). Рабочая копия уже на этом SHA;
git fetch/checkout не делал.
Предыдущий раунд: r2, документ docs/reviews/CODE-REVIEW-699-r2.md, материал
23aca8a987142633c6f0c7522538d6601aa942d9, вердикт зелёный (High 0, Medium 0).
Почему r3, если r2 был зелёным
Пока шло ревью r2, dev продвинулся на 17 коммитов (влиты #696–#698, #701,
#702). Владелец опубликовал кандидат 4fa3c797 как ребейз того же дерева на
новый dev@e1700757 и сам заявил: «Дифф изменился при ребейзе… материал ревью
23aca8a9 и кандидат 4fa3c797 дают разные patch-id: соседние правки в dev
изменили содержимое патча» (issue-комментарий 22:18:47, ссылка на §2.10, #492).
Зелёный вердикт цикл не тратит, но материал под ним умер (объекты 23aca8a9 и
дерево d7500b073db5 не резолвятся в этом дереве — ожидаемо после ребейза,
git cat-file -t возвращает «not found», это не находка, см. REVIEWER.md
«Повторный раунд»), поэтому конвейер честно открыл новый заход, а не подтянул
старый вердикт под новый SHA (#312).
Проверка гипотезы «дифф на самом деле не изменился». Я не могу сравнить
деревья байт-в-байт (старые объекты собраны сборщиком мусора), поэтому сверил
по содержимому: прочитал целиком git diff origin/dev...HEAD (19 файлов,
856+/146-) и построчно сопоставил с описанием кода в r1/r2 (таблицы находок,
цитаты кода, номера тестов). Результат — по каждому файлу код и тесты
текстуально совпадают с тем, что описывали r1/r2:
initialViewCeilingViolation/lazyGraphCeilingViolation без ветки shrank,
compareWithBaseline с METRIC_BANDS, CLI bundle-budget.mjs с потолком
беты до assertBundleBudget, mutation-registry-check.mjs — warned вместо
stale, новый scripts/ratchets.mjs (report/tighten), шаг tighten в
docs/DEVELOPMENT.md («Prepare the candidate as usual», сразу после
npm run bundle:release) — ровно формулировка, которую цитировал r2. Значит
patch-id разошёлся не из-за смыслового отличия, а из-за смещения контекстных
строк при повторном ребейзе (PROCESS.md/докс, которые правили #701 и другие
соседи, лежат рядом с местом вставки #699). Разбор ниже — по этой дельте: она
не локальна формально (ребейз на ушедший вперёд dev, §2.10), поэтому я
перечитал файлы целиком и перепрогнал тесты сам (см. «Как проверялось»), а не
ограничился таблицей «чем закрыта» — но новых находок это не даёт, потому что
менять было нечего.
Скоуп
Не изменился с r1 (см. docs/reviews/CODE-REVIEW-699-r1.md, «Скоуп»):
инфраструктурная задача, файлов класса A нет, src/** не тронут. Двусторонние
храповики с нулевым запасом заменены на полосу над потолком последней беты
(строки двух ядер, gzip четырёх графов, шесть чисел монолита, лимит браузерных
мутантов из жёсткого — в ориентир); scripts/ratchets.mjs — инструмент
релиз-менеджера (report/tighten); шаг tighten закреплён в единственном
каноническом release-runbook (docs/DEVELOPMENT.md) — это и есть M1 из r1,
закрытый в r2. Оба открытых вопроса ТЗ решены владельцем (полоса ядра = 50,
лимит мутантов — ориентир) и реализованы теми же числами.
User-Visible: no на всех четырёх коммитах (47bdf883, 44d4ff4f, 56ebddf3
и двух документных 61feca1f/bc15c3c9/4fa3c797) — верно, продуктовое
поведение (src/**) не меняется; changelog не тронут, и это корректно при
no (проверено — git diff origin/dev...HEAD --stat -- docs/CHANGELOG.md docs/CHANGELOG.ru.md пуст). Трейлеры Issue: #699 / User-Visible: no
подтверждены на всех трёх кодовых коммитах (git show -s --format=... | grep).
Как проверялось
Дешёвые гейты подтверждены зелёным Validate на этом же SHA (4fa3c797, run
36491631358) — typecheck, npm test, npm run build + bundle-policy не
перегонялись повторно. Поверх этого, по диффу и лично мной на этом SHA:
| Гейт | Прогнан | Результат |
|---|---|---|
node --test test/ratchets.test.mjs test/core-file-budget.test.mjs test/monolith-metrics.test.mjs test/bundle-assets.test.mjs test/mutation-gate.test.mjs test/process-digests.test.mjs test/monolith-text-anchors.test.mjs |
да, лично | 133/133 ok |
node scripts/mutation-gate.mjs --check |
да, лично | зелёный; browser guards: 200/200; 3 предсуществующих WARN (не относятся к #699, те же, что в r1/r2) |
| Защитный AC M1 — «тест умеет падать» перепроверен на этом SHA, не только унаследован | да, лично, исполнением | заменил в docs/DEVELOPMENT.md tighten → report в той же позиции (патч мутанта release-runbook-forgets-tighten), node --test --test-name-pattern="#699 r1 M1" test/ratchets.test.mjs → 1 fail (assert.match не находит tighten после bundle:release), откатил (git checkout -- docs/DEVELOPMENT.md), git status --porcelain — пусто |
Построчное сопоставление git diff origin/dev...HEAD (19 файлов) с описанием кода в r1/r2 |
да, лично, чтением | текст диффа совпадает с цитатами и таблицами r1/r2 файл за файлом — см. «Почему r3» выше |
git diff origin/dev...HEAD --stat -- docs/CHANGELOG.md docs/CHANGELOG.ru.md |
да | пусто — корректно при User-Visible: no |
Трейлеры Issue/User-Visible на 47bdf883, 44d4ff4f, 56ebddf3 |
да, лично | все три — Issue: #699, User-Visible: no |
docs/reviews/INDEX.md (r1/r2 уже проиндексированы) |
да, прочитал | строки #699 r1 (🟡, M1) и r2 (🟢) на месте, согласуются с документами |
Не прогонялось и почему: полный дифф-мутационный прогон (mutation-gate.mjs
с реальными патчами, 186 мутантов) — трек show, зелёный Validate на этом SHA,
структурная --check чистая, и содержимое диффа не изменилось с r1/r2, где
этот прогон уже проводился (186/186); браузерные смоки — тело issue их не
называет, диф не трогает src/**/demo/, smoke-select.mjs не запускался за
отсутствием сопоставимого диффа; golden:verify, pytest tests_backend,
npm run invariants, performance-профили — не применимы (нет рендера, Python,
геометрии; AC их не называют); не проверял исполнением реальный
release:prerelease в GitHub Actions — унаследовано из r1/r2 как непроверенное
(эта часть дельтой r3 не затронута); npx tsc --noEmit/npm test целиком/
npm run build с трёхсторонней сверкой бандла — не перегонял: зелёный Validate
на этом же SHA подтверждает дешёвые гейты без повтора.
Закрытие раунда r1
| Находка | Чем закрыта | Где это видно |
|---|---|---|
M1: node scripts/ratchets.mjs tighten не был в единственном каноническом release-runbook docs/DEVELOPMENT.md; единственное упоминание — предупреждение внутри release:prerelease уже в момент публикации. |
Шаг tighten в чек-листе «Prepare the candidate as usual» сразу после npm run bundle:release, до docs/RELEASE-NOTES.md/публикации; тест #699 r1 M1 пере-проверяет и наличие, и порядок; мутант release-runbook-forgets-tighten. Перепроверено мной на 4fa3c797: мутант применён вручную → тест падает (1 fail) → откат чистый. |
docs/DEVELOPMENT.md:525-534 (Prepare the candidate as usual → bundle:release → ratchets.mjs tighten (#699 …) commit them with the candidate → RELEASE-NOTES.md); test/ratchets.test.mjs:69-75; scripts/mutation-registry.mjs — release-runbook-forgets-tighten. |
Низкая находка L1 (r1, оркестрация tighten без автотеста) была снята
ревьюером в r1 с записью (проверено исполнением в изолированном worktree);
дельта r2 и r3 её не касаются.
Унаследовано из r1/r2 (без повторной проверки по существу)
Симметричность полосы по обеим границам на всех трёх видах храповика (ядра,
gzip-графы, числа монолита), корректность реордера в CLI bundle-budget.mjs
(потолок беты проверяется до assertBundleBudget, один источник байт-каунта),
пять новых мутантов реестра + один перенацеленный (якоря найдены по одному
разу), согласованность PROCESS.md §8/docs/TESTING.md с кодом, «одно число —
один источник» у потолка initial View (INITIAL_VIEW_GZIP_CEILING в
bundle-budget.mjs, ratchets.mjs читает его же регэкспом) — всё это разобрано
полно в docs/reviews/CODE-REVIEW-699-r1.md (материал 709c5b8a38f4) и не
затронуто дельтой r1→r2→r3 текстуально (см. «Почему r3» выше — построчное
сопоставление). Принимаю без повторного вывода, кроме того, что перепроверил
сам и назвал в таблице выше (юниты, mutation-gate --check, M1-мутант).
Находки
Новых находок нет. High: 0, Medium: 0.
Формальный повод для r3 (смена patch-id при повторном ребейзе, #492) не
породил содержательного отличия: диф origin/dev...HEAD на этом SHA
текстуально совпадает с тем, что рецензировали r1 и r2, тесты и мутационный
гейт зелёные лично на этом SHA, а M1 остаётся доказуемо закрытым (мутант
всё ещё ловится).
Проверено и корректно
- Продуктовый код (
src/**) не тронут — задача инфраструктурная,User-Visible: noверно на всех коммитах, changelog не трогается, и это правильно. - Рабочая копия чистая до и после моей проверки мутанта (
git status --porcelain— пусто оба раза), файлов в репозитории я не создавал (документ ревью пишется вне репозитория, в$REVIEW_DOC). - Тесты, гейты и трейлеры на текущем SHA
4fa3c797дают тот же результат, что описывали r1/r2 на своих (уже нерезолвящихся) SHA — расхождения нет.
Чего не проверял
- Полный дифф-мутационный прогон
mutation-gate.mjsс реальными патчами (186 мутантов, 6 шардов) — не перегонял на этом SHA: он уже был выполнен в r1 на байт-идентичном по содержанию диффе, трек show, Validate зелёный. - Браузерные смоки — диф не трогает
src/**/demo/,smoke-select.mjsне запускался за отсутствием сопоставимого диффа. golden:verify,pytest tests_backend,npm run invariants, performance-профили — не применимы (нет рендера, Python, геометрии; AC их не называют).- Исполнение реального
release:prereleaseв GitHub Actions (печатает ли--warnна практике) — унаследовано из r1/r2 как непроверенное. npx tsc --noEmit,npm testцеликом,npm run buildс трёхсторонней сверкой бандла — не перегонял: зелёный Validate на4fa3c797(run 36491631358) подтверждает дешёвые гейты без повтора.
Вердикт
Формальный r3 без содержательной дельты: рёбейз сменил patch-id, но не код. M1 из r1 остаётся закрытым и перепроверен исполнением на текущем SHA. Новых находок нет. High: 0, Medium: 0 → зелёный, цикл не тратится.
Материал раунда
- Ветка:
issue/699-ratchet-bands, коммит4fa3c7977ebb— ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. - Дерево материала:
3dfcbd4230f3cf2b19d814176b2b5887dbd30564git log --all --format='%H %T' | grep 3dfcbd4230f3 - Тело issue:
18b6f2dce7c2f914e9c4d61715360cb529fc34c87cbad12c2a646990fefcb724 - Вердикт конвейера:
green· High 0