16 KiB
CODE-REVIEW — issue #631, заход r2
Материал: c1cc94f0e0333732262430c63bae992c76aa3635 (рабочая копия на нём,
детач HEAD). Диапазон: origin/dev..HEAD, три коммита:
test(editors): unit contracts for dialog baselines and form problems (#631)
(040ad3dc), docs: review document for #631 (d071ac2e),
docs(reviews): индекс после сдвига каталога (#631) (c1cc94f0).
Скоуп
Заход r1 (36f0db6e1ae9…) был зелёным, High 0, Medium 0 — см.
docs/reviews/CODE-REVIEW-631-r1.md. SHA r1 в локальном дереве больше не
резолвится (git cat-file -t 36f0db6e1ae9… и его дерево a7cbed4ee3b2… —
«bad object»): по §2.10 это обычное дело при ребейзе, не находка. Материал
ищётся по блобу — все четыре файла диффа r1 (tsconfig.test.json,
test/dialog-baseline.test.mjs, test/dialog-form-problems.test.mjs,
scripts/mutation-registry.mjs) на текущем HEAD дают ровно те хеши, что
названы якорями в самом документе r1 (858994a6…, 89e6f73f…, a08b616a…
и хеш scripts/mutation-registry.mjs — см. «Дельта» ниже про единственное
расхождение, оно не от этого раунда).
Дельта r1→r2 (git diff origin/dev...HEAD --stat минус то, что уже было
в диффе r1): ровно два новых файла, оба чисто документационные —
docs/reviews/CODE-REVIEW-631-r1.md (добавлен документ r1, 152 строки) и
docs/reviews/INDEX.md (2 изменённые строки — счётчики и новая строка
индекса для #631·r1). Ни один код/тестовый файл (src/**, test/**,
scripts/mutation-registry.mjs, tsconfig.test.json) между r1 и r2 не
менялся — подтверждено побайтовым совпадением blob-хешей всех четырёх файлов
диффа r1 на HEAD (см. ниже) и тем, что git log --oneline -- scripts/mutation-registry.mjs
называет их последним изменением коммит 040ad3dc, входящий в материал r1.
Раз AC1–AC3 относятся исключительно к этим четырём файлам, а они не
изменились, дельта AC не задевает — полный повторный разбор кода не нужен.
Разбору по существу в r2 подлежат только два новых файла: сам документ
ревью (публикуется пайплайном, не автором задачи) и обновление индекса
(генерируется скриптом). Трейлеры Issue: #631 / User-Visible: no стоят
на всех трёх коммитах диапазона, включая оба новых.
Продуктовая рамка не меняется относительно r1: класс B, src/** не
тронут, задача обслуживает J6 (укрепление доказательной базы Save/dirty).
Как проверялось
git diff origin/dev...HEAD --stat— 6 файлов; из них 4 совпадают построчно с диффом, уже разобранным в r1, 2 новых — только доки.- Попытка резолвить материал r1 по SHA/дереву — не резолвится (см. выше), это ожидаемо при ребейзе (§2.10) и не находка.
- Побайтовая проверка неизменности четырёх файлов диффа r1 на HEAD:
Первые три совпадают дословно с якорями, названными в тексте документа r1 (
tsconfig.test.json: 858994a6065e9a39430dc1697b413aba30718ea0 test/dialog-baseline.test.mjs: 89e6f73fbb670f14185e4a620de6601b6fdaad24 test/dialog-form-problems.test.mjs: a08b616a39ffb88cb886c786c607f97327e7b099 scripts/mutation-registry.mjs: 8322625afab1051edfd5407914f7eb8e82ac45dc858994a6…,89e6f73f…,a08b616a…). Четвёртый якорь документа r1 назван как107801f8…, а фактический хешscripts/mutation-registry.mjsи в r1, и сейчас —8322625a…: расхождение — опечатка/неверный якорь внутри текста самого документа r1, не относящаяся к дельте r2 (файл с момента040ad3dcне менялся ни разу, включая r1). Уже закрытый зелёный вердикт r1 задним числом не пересматриваю (§12 — ревью своей работы и повторное подтверждение — не моя роль), но фиксирую здесь как Low, чтобы не потерялось. - Пересобран test-build и перепрогнаны целевые юниты, чтобы не полагаться
только на факт «файл не менялся»:
npx tsc -p tsconfig.test.json && node scripts/fix-test-build.mjs→ rc 0;node --test test/dialog-baseline.test.mjs test/dialog-form-problems.test.mjs→ pass 25, fail 0 — совпадает с числом r1. node scripts/process-gate.mjs→ «гейт пройден, предупреждений 0» (диапазон origin/dev..HEAD, коммитов 3).node scripts/smoke-select.mjs --base origin/dev --head HEAD→ «Исполняемого frontend-диффа нет (src/**/*.ts не тронут)» — согласуется с тем, что новая дельта тоже не трогаетsrc/**.node scripts/reviews-index.mjs(без--check, скрипт сам сообщает актуальность) → «docs/reviews/INDEX.md свеж»: коммитc1cc94f0детерминированно воспроизводится генератором, вручную не редактирован (файл несёт пометку «не редактировать руками» — соблюдена).git status --porcelainпосле прогона — пусто.- Сверена запись
docs/reviews/INDEX.mdдля#631 · code · r1: 🟢 зелёный, H 0, M 0, находки «—» — совпадает с итогомCODE-REVIEW-631-r1.md(Находки: не выявлено; High 0, Medium 0, Low 0). - Трейлеры всех трёх коммитов диапазона проверены
git show -s --format=%B—Issue: #631иUser-Visible: noна месте на каждом. ПриUser-Visible: noправка changelog не требуется; ни один changelog в диффе не тронут (диффу это не противоречит). - Дешёвые гейты (
npx tsc --noEmitполный,npm testполностью,npm run buildсо сверкой копий бандла) не перегонял целиком — они уже подтверждены зелёным Validate на этом же SHAc1cc94f0(https://github.com/Matysh/houseplan-card/actions/runs/35958702507). Целевые юниты из этого прогона перепрогнал отдельно (п.4) для проверки находок задачи, не взамен Validate.
Соответствие AC
AC1–AC3 не пересматривались по существу — дельта r1→r2 их не задевает (ни
один файл, к которому они относятся, не менялся). Статус наследуется из
r1: все три доказаны исполняемыми тестами/мутациями (AC1 — юниты
dialog-baseline.test.mjs + 3 из 4 пунктов мутационно, четвёртый —
проверен вручную по «умению падать»; AC2 — dialog-form-problems.test.mjs
на каждый код ошибки и пустой список каждой из 4 форм; AC3 — три гарда в
mutation-registry.mjs переведены со смоков на юниты, каждый прогнан
индивидуально «поймано 1 из 1»). Неизменность кода-носителя AC
переподтверждена в этом раунде: блобы файлов идентичны (п.3 выше), тесты
перепрогнаны и дают то же число (п.4), а не просто предполагаются
неизменными по дате коммита.
Унаследовано из r1
| Что | Документ/материал r1 | Почему принято без повторной проверки в r2 |
|---|---|---|
| AC1 (stableKey: порядок/транзиентность/вложенные объекты/no-baseline→dirty) | docs/reviews/CODE-REVIEW-631-r1.md, материал 36f0db6e1ae9… (SHA не резолвится, дельта — 0 файлов кода) |
test/dialog-baseline.test.mjs не менялся с 040ad3dc; blob совпадает; тест перепрогнан в r2 и даёт тот же pass-count |
AC2 (*Problems на каждый код и пустой список) |
там же | test/dialog-form-problems.test.mjs не менялся; blob совпадает; перепрогнан |
| AC3 (три гарда мутантов переведены со смоков на юниты) | там же | scripts/mutation-registry.mjs не менялся с 040ad3dc; blob совпадает |
Чтение носителей AC (dialog-baseline.ts, четыре *-form-state.ts) построчно против тестовых утверждений |
там же, раздел «Как проверялось», п.1 | эти файлы вне диффа и в r1, и в r2 — не могли измениться между раундами; сам диапазон origin/dev..HEAD их не касается |
| Мутационные прогоны 9 мутантов «поймано 1 из 1» | там же, п.3 | те же мутанты, тот же неизменный код — новый прогон дал бы то же значение; перепроверены сами юниты (п.4 этого документа), которые эти мутанты гардят |
Проверено чтением, не исполнением
- Содержимое
docs/reviews/CODE-REVIEW-631-r1.md: структура разделов (скоуп/как проверялось/AC/находки/итог/материал раунда) соответствует формату §2.7; прочитан целиком, а не по грепу — расхождение якоря107801f8…в п.3 «Как проверялось» найдено этим чтением. - Диффа
docs/reviews/INDEX.md: новая строка#631вставлена в общий порядок по убыванию номера issue (между#632и#630) — на месте.
Чего не проверял
- Полный
npm test(все файлы),npx tsc --noEmitпо всему проекту,npm run buildсо сверкой трёх копий бандла — не перегонял целиком; основание — зелёный Validate на этом же SHAc1cc94f0(ссылка выше), дельта без правокsrc/**/сборки этому не противоречит. node scripts/check-docs.mjs— не требуется,src/**не тронут ни в материале r1, ни в дельте r2.- Браузерные смоки — не запускал;
smoke-select.mjsв этом раунде вновь подтвердил, что выбирать нечего (frontend-дифф пуст). - golden/perf/pytest — не по диффу: нет рендера, нет
custom_components/**. - Полный ночной прогон
mutation-registry.mjs(все мутанты) — не запускал, это предрелизный/ночной гейт. - Ручное тестирование в браузере — не проводилось (
User-Visible: no,src/**не тронут ни в одном коммите диапазона). - Повторная ревизия правильности самих ассертов в
test/dialog-baseline.test.mjs/test/dialog-form-problems.test.mjsпротив исходников*-form-state.ts"с нуля" — не делал; это было выполнено в r1 (см. таблицу «Унаследовано»), а дельта r2 их не затрагивает.
Находки
- Low (снимается записью, не блокирует). Документ
CODE-REVIEW-631-r1.md, раздел «Как проверялось», п.3 называет дляscripts/mutation-registry.mjsанкер-хеш107801f8…, тогда как фактический blob файла (и в момент r1, и сейчас) —8322625afab1051edfd5407914f7eb8e82ac45dc. Опечатка внутри текста уже смёрженного зелёного документа r1: не влияет на его вердикт (сам файл прогонялся и проверялся по содержимому, а не только по этому анкеру) и не относится к дельте r2. Фиксирую как Low и снимаю: правка задним числом чужого смёрженного документа не входит в мою роль (§12), а на вердикт этого раунда не влияет.
High — 0, Medium — 0, Low — 1 (снята записью выше).
Итог
Дельта r1→r2 — два документационных файла (публикация ревью-документа предыдущего раунда и детерминированная перегенерация индекса), ни один файл, к которому относятся AC1–AC3, не изменился. Неизменность переподтверждена не только по коммитам, но и побайтовым совпадением blob и повторным прогоном целевых юнит-тестов (pass 25/25, как и в r1). Трейлеры на месте на всех трёх коммитах диапазона. Новых AC-релевантных изменений в этом заходе нет, находок, блокирующих вердикт, не выявлено.
Материал раунда
- Ветка:
issue/631-form-state-units, коммитc1cc94f0e033— ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. - Дерево материала:
17d1453f7945c34c02ecd48ae61749414f0d46f3git log --all --format='%H %T' | grep 17d1453f7945 - Тело issue:
65fb6131e45f761b7a50d4daf8a05706d1c987d495b7132e1fba4307f9549702 - Вердикт конвейера:
green· High 0