diff --git a/docs/reviews/CODE-REVIEW-673-r2.md b/docs/reviews/CODE-REVIEW-673-r2.md new file mode 100644 index 00000000..4b3d855f --- /dev/null +++ b/docs/reviews/CODE-REVIEW-673-r2.md @@ -0,0 +1,146 @@ +# CODE-REVIEW-673-r2 + +Материал: `2475403469650fb4f45181a5049f5fce5ef89d5a` (issue/673-stage6-golden, HEAD == материал), делта — `git diff 855bede537e7b7dd9bdd11aab1d1cbb4b6f6623d..HEAD` +Заход: r2 · блокирующих циклов израсходовано 1 из 4 + +## Скоуп + +Issue #673: пять сцен Stage 6 (утверждённых по эскизу приёмкой #649) переведены +из диагностического экспорта `STAGE6_ACCEPTANCE_SCENARIOS` в канонический +`GOLDEN_SCENARIOS` с baseline-файлами и защитным тестом. Механизм задачи разобран +и принят полностью в r1 (жёлтый вердикт с единственной находкой Medium в +скоупе). Этот раунд — проверка закрытия ровно той находки; продукт не меняется, +`User-Visible: no`. + +## Материал раунда r1 и дельта + +- Документ r1: `docs/reviews/CODE-REVIEW-673-r1.md`, материал `855bede537e7b7dd9bdd11aab1d1cbb4b6f6623d`. +- Дельта: `git diff 855bede537e7b7dd9bdd11aab1d1cbb4b6f6623d..HEAD` (`git log --oneline` между ними): + - `2aeda2df` — «docs: review document for #673»: коммит публикации документа r1 + в ветку (пайплайн, класс вне A/B, трейлеры `Issue: #673` / `User-Visible: no` + на месте). Правок продукта не несёт. + - `24754034` — «docs: обновить fingerprint после ребейза #673» (автор): + единственный правящий коммит, единственный файл — `docs/images/screenshots.json` + (24 строки, только `sourceFingerprint` и одиннадцать `sourceSha256`; все + одиннадцать `imageSha256` не тронуты). Трейлеры `Issue: #673` / + `User-Visible: no` на месте. +- Дельта локальна: один файл, одна правка, адресующая ровно находку r1. Полный + повторный разбор механизма задачи (перенос сцен в `GOLDEN_SCENARIOS`, тест, + мутант, baseline) не требуется — ничего из этого дельта не касается. +- `git log --oneline origin/dev..HEAD` не показывает коммитов dev впереди + материала r1 — рёбейза на ушедший вперёд `dev` не было, несмотря на + формулировку сообщения коммита («после ребейза» относится к внутреннему шагу + пайплайна, не к смещению базы). + +## Закрытие раунда r1 + +| Находка r1 | Чем закрыта | Где это видно | +|---|---|---| +| Medium: `docs/images/screenshots.json` — закоммиченный `sourceFingerprint` (`843b7c30…`) не совпадал с тем, что реально даёт `visualFingerprint()` на дереве материала; `check-docs.mjs --screenshots=strict` был красным на `855bede5` | Коммит `24754034` заменил `sourceFingerprint` и все одиннадцать `sourceSha256` на `4c475f0121499124efd0ae3233a06b05f0ab4a117adf17d942e792bcc7462238` | `git diff 855bede5..HEAD -- docs/images/screenshots.json`; независимо пересчитал `visualFingerprint(process.cwd())` на HEAD — результат **побайтово совпал** с новым значением в файле; `node scripts/check-docs.mjs --external --screenshots=strict` на HEAD — `Documentation checks passed (7 files, 12 external links)`, exit 0 (прогнал сам, не со слов автора) | +| Low: SHA `557d4e38…` в комментарии автора не резолвится в репозитории (снято ревьюером без правки) | Не требовало действия автора — уже снято ревьюером в r1 с явной записью | `docs/reviews/CODE-REVIEW-673-r1.md`, раздел «Low» | + +`imageSha256` во всех одиннадцати сценариях не изменился между `855bede5` и +HEAD — подтверждает заявление автора «PNG не менялись, обновлён только +отпечаток исходников» (сверил построчно по диффу выше). + +## Унаследовано из r1 (без повторной проверки в этом раунде) + +Дельта их не касается, повторно не перепроверялось: + +- Перенос `STAGE6_ACCEPTANCE_SCENARIOS` в `GOLDEN_SCENARIOS`, версия матрицы + 66 — `docs/reviews/CODE-REVIEW-673-r1.md`, материал `855bede537e7b7dd9bdd11aab1d1cbb4b6f6623d`. +- Защитный тест `test/golden-matrix.test.mjs` («#673 Stage 6 designer + acceptance scenes are canonical golden entries») + мутант + `stage6-acceptance-left-diagnostic-only`, мутационно доказан красным в r1 + вручную — там же. +- `golden:verify` 184/184, включая пять `isometric-stage6-*` побайтово — там же. +- Правки `ACCEPTANCE.md` / комментария в `matrix.mjs` (текст, не будущая + работа) — там же. +- Классификация коммитов по AGENTS.md (A/B/C/D), трейлеры `Baseline-Reviewed-Local` + и его sha256-соответствие `baselines-index.json` — там же. +- Условный AC про недетерминизм (два независимых захвата дали одинаковый + SHA-256) — принят в r1 как факт по issue, не переисполнялся; в этом раунде + тоже не переисполнялся, дельта его не касается. + +## Как проверялось в этом раунде + +Validate на материале `24754034` зелёный +(https://github.com/Matysh/houseplan-card/actions/runs/36306459071) — +`typecheck`, `npm test`, `npm run build` + `bundle-policy --verify` доверяю +этому прогону, отдельно ради них не перегонял (единственный изменённый файл — +JSON-манифест метаданных скриншотов, не код и не тест). + +Прогнано мной лично в этом раунде (адресно к находке r1, а не для галочки): + +| Гейт | Команда | Результат | +|---|---|---| +| Typecheck (доп. подтверждение, дёшево) | `npx tsc --noEmit` | чисто | +| Пересчёт отпечатка независимо от закоммиченного значения | `node -e "import('./scripts/source-fingerprint.mjs').then(m=>console.log(m.visualFingerprint(process.cwd())))"` | `4c475f0121499124efd0ae3233a06b05f0ab4a117adf17d942e792bcc7462238` — совпадает с записанным в `docs/images/screenshots.json` | +| Доки-гейт, строгий режим (ровно тот, что был красным в r1) | `node scripts/check-docs.mjs --external --screenshots=strict` | `Documentation checks passed (7 files, 12 external links)`, exit 0 | +| Режим гейта на текущей вершине (для полноты — какой режим реально действует в CI) | `node scripts/classify-changes.mjs --screenshots-mode` | `warn` (на HEAD по-прежнему нет `Release:`) — не имеет значения: strict тоже зелёный, находка закрыта не «отступлением в warn», а фактическим совпадением отпечатка | +| Диапазон делты, дерево чистое | `git status --short` (пусто), `git log --oneline origin/dev..HEAD` | подтверждает: рёбейза на ушедший вперёд `dev` не было, делта — ровно два коммита выше | + +Не прогонял и почему: `npm test`, `npm run build`, `bundle-policy --verify`, +`golden:verify`, мутационную пробу — унаследованы от зелёного Validate на этом +же SHA и от полного разбора r1 (механизм задачи дельта не трогает); +`pytest tests_backend`, инварианты модели, performance, browser-смоки — как и +в r1, диф этого коммита не трогает `custom_components/**/*.py`, геометрию, +`src/**` или AC, называющий их. + +## AC · чем доказан · чем краснеет + +Формальных AC issue дельта не добавляет и не меняет (см. таблицу в r1 — она не +пересматривается). Единственный релевантный этому раунду пункт — процессное +условие «оба гейта строгие на финальном дереве», проверенное исполнением выше; +защитного мутационного свидетеля это условие не предполагает (не код, а +согласованность вычисляемого значения с сохранённым — доказательство +пересчётом и есть исчерпывающая проба, других состояний, которые нужно было бы +уметь ронять, здесь нет). + +## Что проверено и корректно + +- Пересчитанный `visualFingerprint()` совпал с сохранённым значением на всех + двенадцати местах, где оно встречается в файле (шапка + одиннадцать + `sourceSha256`) — «одно число, один источник» восстановлено: до правки + расходились ровно эти же двенадцать вхождений с прежним неверным значением. +- `imageSha256` — не тронуты, соответствует заявлению «PNG не менялись». +- Трейлеры `Issue: #673` / `User-Visible: no` на исправляющем коммите + корректны и соответствуют характеру правки (метаданные, не поведение). +- Дельта не расширяет и не сужает скоуп: единственный файл, единственная + причина изменения. + +## Находки + +Нет. Единственная находка r1 (Medium, docs/images/screenshots.json) закрыта +и подтверждена исполнением, не со слов автора. High: 0, Medium: 0. + +## Чего не проверял + +- Повторный полный разбор механизма задачи (перенос сцен, тест, мутант, + baseline, golden:verify) — не требовался: дельта их не касается, они + разобраны и подтверждены исполнением в r1 (см. «Унаследовано из r1»). +- `pytest tests_backend`, `npm run invariants`, performance-профили — как и в + r1: вне AC этой задачи, дельта не трогает Python/геометрию. +- Реальный повторный WSL-захват кадров — не требовался в этом раунде: правка + не меняла ни один PNG (`imageSha256` идентичны), только метаданные отпечатка + исходников. + +## Вердикт + +Зелёный. Находка r1 (Medium, устаревший `sourceFingerprint`) закрыта и +подтверждена независимым пересчётом и строгим прогоном `check-docs.mjs` +лично, а не заявлением автора. High: 0, Medium: 0. Цикл не образуется. + +--- + + + +## Материал раунда + +- Ветка: `issue/673-stage6-golden`, коммит `247540346965` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. +- Дерево материала: `74d76079b3ba59c93e8838b55a6f3913c37ac81b` + ``` + git log --all --format='%H %T' | grep 74d76079b3ba + ``` +- Тело issue: `2d5e8509154786e88d54451c677aae851abbbb856cf4fef150eeb92d232af154` +- Вердикт конвейера: `green` · High 0