17 KiB
CODE-REVIEW #753 · r2
Материал раунда: 1a086aa611b667c72885a952b4240d331c3b932c (ровно он, рабочая
копия на нём). Диапазон origin/dev..HEAD — три коммита:
94192889 (код), cafc57fe (документ ревью r1, публикация прошлого раунда),
1a086aa6 (индекс ревью, публикация прошлого раунда).
Скоуп
Issue #753 не меняется с r1: исключение #562 («инфраструктурный диапазон
статуса не требует, если в диффе нет файлов класса A») не знало, где
находится задача, и позволяло issue в S3-spec/S4-spec-review (маршрут
track:ask) пушить ветку из одних тестов без статусной метки — вопреки §11.8
(«до S5 не пушится ни код, ни сама ветка») и с риском того, что эта ветка
станет материалом ревью ТЗ. Задача сужает исключение: решение по каждому
issue в checkIssueStatuses, а не по диапазону.
Трек show (#696), критерий §5 маршрута вердикта пройден так же, как в r1:
complexity (чистая правка одной функции), surfaces (один модуль
scripts/process-gate.mjs), migration (нет), ux-contract (нет — CI-гейт),
perf-touch (нет), undocumented (поведение уже в каноне §11.8/§2.5, задача
устраняет расхождение гейта с каноном). → route: fix.
Почему r2, а не слияние после зелёного r1
r1 (материал 23447c36) получил зелёный вердикт без находок, документ и
индекс были опубликованы в ветку (cafc57fe, 1a086aa6) — штатный шаг
конвейера после зелёного вердикта. Дальше dev ушёл вперёд несколько раз во
время слияния (гонка #492), ветку трижды ребейзили, автосверка процесса
зафиксировала «Validate on the material is completed but the round was not
resumed» и разбудила S7-code-review заново на новом материале. Это ребейз на
ушедший вперёд dev — один из случаев, когда разбор остаётся полным, а не
сокращается до дельты (§2.10, конспект «Повторный раунд»), поэтому ниже —
полный разбор, а не только показ закрытия находок r1 (их и не было).
Как проверялось
- Сверено, что дерево материала r2 после ребейза не разошлось по содержанию
с тем, что проверял r1:
git diff 94192889~1 94192889 --statдаёт ровно те же 4 файла / 141 вставку / 3 удаления, что и r1 на23447c36; хеш текста диффа (scripts/process-gate.mjs,scripts/mutation-registry.mjs,test/process-gate.test.mjs,PROCESS.md) посчитан и сверен — содержимое патча бит-в-бит то же, что проверял r1. Старое дерево материала r1 (e94227ed9fa2…) само по себе уже не резолвится — объект собран как мусор после ребейза; это не находка (конспект «Повторный раунд»: мёртвый SHA — обычное дело, если дерево при публикации существовало, а находка — только мёртвый SHA уже в момент публикации отчёта; свежий тег подтверждён числом изменённых строк и текстом). - Проверено, не задевает ли содержательно новые коммиты
devмежду материалом r1 и r2 ту же область кода:git log 88985d2e..origin/dev -- scripts/process-gate.mjs test/process-gate.test.mjs scripts/mutation-registry.mjs PROCESS.mdнашёл один коммит (a7b02db6, #755), трогающийprocess-gate.mjs— но правитclassifyRisk(риск по изменённым участкам), не пересекается сcheckIssueStatuses/isInfrastructureRange/SPEC_ROUTE_STATUS. Остальные найденные коммиты (#745, #757, #742, #739, #729, #736, #738, #718, #730, #727, #725, #728, #694, #707, #724, #723, #716) либо не трогают эти файлы, либо (как #738, #729, #736) правят другие функции того же файла. Семантического конфликта нет — ребейз был чист и для git (отсутствие маркеров конфликта), и по смыслу. - Код прочитан заново в контексте текущего файла (не по диффу, а по месту):
isInfrastructureRange(scripts/process-gate.mjs:404-423),SPEC_ROUTE_STATUS(:459-463),checkIssueStatuses(:467-518). - Тесты AC1/AC2 прочитаны целиком в текущем файле:
test/process-gate.test.mjs:775-823(юнитcheckIssueStatuses,statusOptional does not cover an issue in the spec route S3/S4 (#753)),:905-947(сквозной CLI,the CLI refuses a class-B-only range of an issue in S3/S4 but not in S1 (#753)). - Мутант
process-gate-infra-entry-covers-spec-route(scripts/mutation-registry.mjs:3602-3612) прочитан: патч убирает условиеspecRoute.length === 0, возвращаяoptional = statusOptional— именно регресс, который AC1 должен ловить. - Прогнаны гейты (ниже — свои, в дополнение к ссылке на Validate).
- Текст PROCESS.md §10.2 (
:1169-1174) сверен дословно с формулировкой ТЗ — совпадает, то же предложение, что проверял r1. - Трейлеры всех трёх коммитов диапазона проверены (ниже).
- Прочитано тело issue #753 и полная лента комментариев, включая гонку ребейза и сообщение автосверки — расхождений с тем, что знал r1, нет.
Что проверено и корректно
- AC1 (исключение не для маршрута ТЗ) — без изменений от r1, содержимое
патча идентично.
specRoute = names ∩ SPEC_ROUTE_STATUS,optional = statusOptional && specRoute.length === 0; при непустомspecRoute— отказ с текстом, называющим статус, §11.8 и #562 (:505-508в текущей нумерации, что совпадает по смыслу с:496-514из r1 — смещение строк из-за восстановленных комментариев выше по файлу, не из-за правки логики).S1-new/S2-analysisвнеSPEC_ROUTE_STATUS— соответствует ТЗ. Юнит покрывает все случаи таблицы АС, включая два issue в одном диапазоне иblockedповерх специального статуса. Прогнан заново — зелёный. - AC2 (сквозной CLI) — без изменений от r1.
S4-spec-review/S3-spec→ выход 1,FAIL п.8, текст с#753 в <статус>;S1-new→ выход 0 и предупреждение #562 безFAIL. Прогнан заново — зелёный. - AC3 (канон + мутант) — без изменений от r1. PROCESS.md §10.2 содержит
предложение дословно. Мутант
process-gate-infra-entry-covers-spec-routeназначен guard'омnode --test test/process-gate.test.mjs; целевой прогон мутационного гейта на этом SHA подтверждаетok(мутант убит новым тестом). - Доказательство «тест умеет падать»: перепрогнано самостоятельно на
текущем материале, не принято на слово ни от автора, ни от документа r1:
node scripts/mutation-gate.mjs --id=process-gate-infra-entry-covers-spec-route --check→ok. - Сообщение
main()про предупреждение #562 по-прежнему печатается для всего диапазона независимо от отказа по конкретному issue — подтверждено тестом AC2 (оба сообщения одновременно). - Трейлеры:
94192889несётIssue: #753,User-Visible: no— корректно (CI-гейт, пользовательского поведения нет, CHANGELOG не тронут и не должен быть).cafc57feи1a086aa6— документация публикации (документ ревью и индекс), тоже сIssue: #753,User-Visible: no; по правилу (PROCESS.md §3 п.10) докс-коммит класса C может не нести трейлеры вовсе — здесь они проставлены сверх минимума, это не находка. - Числовых величин, видимых пользователю дважды, диапазон не вводит — не применимо, задача не трогает UI.
- Ребейз не оставил конфликтных маркеров,
.orig-файлов или следов неполного мержа ни в одном из четырёх правленных файлов.
Прогон гейтов (сам, в дополнение к Validate на этом SHA)
- Validate на
1a086aa6зелёный (ссылка в задаче ревью) — закрываетtsc --noEmit,npm test,npm run build+ сверку бандла. node --test test/process-gate.test.mjs— 48/48 зелёные, включая оба теста AC1 и AC2 (перепрогнано на материале r2, не принято из документа r1).node scripts/mutation-gate.mjs --id=process-gate-infra-entry-covers-spec-route --check—ok(мутант убит); попутно вывод отметилWARN browser guards: 205 при ориентире 200— это накопленное превышение мягкого ориентира реестра мутантов в целом, не связанное с диффом #753 (диапазон не добавляет и не трогает ни одинbrowser-мутант; добавленный мутант — не браузерный), отдельной находкой не считаю.
Чего не проверял и почему
- Полный
mutation-gate --checkпо всему реестру — дорого и не нужно для track show на диапазоне, трогающем один мутант; целевой--id=на нём достаточен для AC3. - Браузерные смоки /
smoke-select.mjs— diff не трогаетsrc/**/www/**, frontend-диффа нет; r1 это уже подтвердил внутриgate:small, повторный запуск не даёт новой информации на идентичном патче. npm run golden:verify,python -m pytest tests_backend,npm run invariants, performance-профили — не применимо: диффа в golden,custom_components/**, геометрии или производительности нет, в АС не названы.- Ручное тестирование UI — не применимо: задача меняет CI-скрипт
(
process-gate.mjs) и канон-документ, пользовательского поведения нет. - Зависимость #748 п.1 (подсказка
S3со стороныtask-packet.mjs) — вне скоупа этой задачи по самому ТЗ («Порядок любой»), не проверял. - Содержательно не перепроверял историческую часть ТЗ (происхождение
исключения #562 из #207/#118, хронология
ad8e7a50/3934f8d8) — она не менялась между r1 и r2 и не относится к коду; принимаю её из r1 (раздел ниже).
Находки
Нет. High: 0, Medium: 0 (в скоупе и вне скоупа).
Вердикт
Зелёный. Содержимое патча идентично тому, что уже получило зелёный вердикт в
r1 (сверено бит-в-бит, не только по статистике диффа); причина r2 —
исключительно гонка ребейза с продвигающимся dev (#492), а не правка кода.
Ребейз чист и для git, и по смыслу: единственный коммит dev, тронувший тот
же файл (#755), правит не пересекающуюся функцию. Оба AC1/AC2 перепрогнаны
самостоятельно на материале r2 и зелёные, мутант AC3 убит целевым прогоном на
этом SHA, PROCESS.md §10.2 дословно совпадает с ТЗ. Трейлеры корректны на всех
трёх коммитах диапазона.
Закрытие раунда r1
r1 находок не содержал (High 0, Medium 0) — закрывать нечего. Таблица ниже фиксирует это явно, как того требует формат раздела:
| Находка r1 | Чем закрыта | Где видно |
|---|---|---|
| — (находок не было) | не применимо | docs/reviews/CODE-REVIEW-753-r1.md, раздел «Находки»: «Нет. High: 0, Medium: 0» |
Унаследовано из r1
Принято без повторной проверки — материал не менялся по содержанию между раундами:
- Историческая реконструкция происхождения исключения #562 (
ad8e7a50/#118,3934f8d8/#562) и её связь с ТЗ — документCODE-REVIEW-753-r1.md, материал23447c36(деревоe94227ed9fa2…, не резолвится после ребейза — ожидаемо, см. «Как проверялось» п.1). - Разбор того, что
ALLOWED_STATUSне содержитS3-spec/S4-spec-reviewи обычный (неstatusOptional) путь не меняется —CODE-REVIEW-753-r1.md, п.6 раздела «Как проверялось»; перепроверено по месту в текущем файле (см. п.3 выше) и подтверждено прежним. - Разбор того, что задача не вводит видимых пользователю величин —
CODE-REVIEW-753-r1.md, раздел «Что проверено и корректно»; задача не затрагивает UI ни в r1, ни в r2.
Материал раунда
- Ветка:
issue/753-rule8-spec-statuses, коммит1a086aa611b6(ровно он, рабочая копия на нём). - Диапазон:
origin/dev..HEAD=94192889,cafc57fe,1a086aa6. - Вердикт этого раунда:
green· High 0 · Medium 0 · маршрутfix.
Материал раунда
- Ветка:
issue/753-rule8-spec-statuses, коммит1a086aa611b6— ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. - Дерево материала:
7a562b237ac83512a473e752e05098bba55cde46git log --all --format='%H %T' | grep 7a562b237ac8 - Тело issue:
6ed6d6796ac50ee54325c0f740dc43953899f6c0b846c8bdc7ea2d41767a498f - Вердикт конвейера:
green· High 0 · маршрутfix