Files
houseplan-card/docs/reviews/SPEC-REVIEW-292-r2.md
T
2026-08-24 18:11:08 +03:00

138 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SPEC-REVIEW-292-r2
- **Issue:** https://github.com/Matysh/houseplan-card/issues/292
- **Этап:** ревью ТЗ (PROCESS.md §2.4)
- **Артефакт ТЗ:** `docs/specs/292-resize-availability-audit.md`, HEAD `70bbb982`
(правка r1 внесена коммитом `70bbb982 docs: clarify resize reasons and rollback`,
поверх `52ad67e7`, на котором получен вердикт r1)
- **Заход:** r2 · блокирующих циклов израсходовано 1 из 4 (зелёный вердикт бюджет
не тратит, §4/§227)
- **Предыдущий вердикт:** жёлтый, r1, `docs/reviews/SPEC-REVIEW-292-r1.md`,
получен на SHA `52ad67e7`. SHA не был назван в теле вердикта r1 (только в
тексте документа) — восстановлен по коммиту `docs: specify resize
availability audit`, на который ссылается комментарий автора «ТЗ подготовлено
и отправлено на внешнее ревью».
- **Ревьюер:** Claude (роль ревьюер ТЗ, PROCESS.md §6)
## Скоуп ревью
Разбор по дельте (PROCESS.md §2.9): единственный изменённый файл между
`52ad67e7` и `HEAD` (кроме публикации самого документа r1) —
`docs/specs/292-resize-availability-audit.md`, 43 строки добавлено / 12 удалено
в разделах 1, 2, 5 и двух новых разделах (9 «Риски и меры», 10 «Откат»).
Продуктовый код не менялся — `git diff 52ad67e7..HEAD --stat` показывает только
этот файл и `docs/reviews/SPEC-REVIEW-292-r1.md`. Дельта локальна: правка того
же документа, без ребейза, без смены контракта поведения за пределами того,
что обсуждалось в r1, без новой подсистемы. Условия §2.9 для полного разбора не
выполнены — сокращаю объём разбора до дельты плюс всё, до чего дельта
дотягивается (разделы 1–2, 5–6 читались целиком повторно, поскольку правка §5
логически связана с §2 и §6; разделы 3, 4, 7, 8, раздел «Принятые
предположения» дельтой не задеты и наследуются из r1 без повторной проверки).
## Как проверялось
1. Восстановлен SHA вердикта r1 (`52ad67e7`) и посчитана дельта:
`git diff 52ad67e7..HEAD -- docs/specs/292-resize-availability-audit.md`.
2. Прочитан целиком `docs/reviews/SPEC-REVIEW-292-r1.md` — обе находки (Medium
и три Low) сверены построчно с новым текстом документа.
3. Перечитаны разделы 1, 2, 5, 6 текущей редакции и новые разделы 9, 10 —
проверено, что убранное обещание «Optimize исправит эту стену» согласовано
между §2, §5 и §9 (риск №3), а не противоречит друг другу.
4. Проверено, что раздел 7 (AC1–AC9) не менялся дельтой и не апеллирует к
дифференцированному тексту reason (нет AC, которое требовало бы двух
вариантов сообщения для одного `SafeResizeReason`) — иначе снятие
обязательства в §5 создало бы новое несоответствие AC.
5. Проверено переномерование разделов 9→11, 10→12, 11→13: содержимое внутри
этих трёх блоков не изменилось, только заголовки; внутренних числовых
ссылок вида «раздел N» в документе нет (`grep -n "раздел [0-9]"` — пусто),
риск «битой» перекрёстной ссылки не подтвердился.
6. Сверен комментарий автора («Правки r1 внесены… добавлены персона/сценарий,
риски и rollback») с фактическим диффом — заявление соответствует
изменённым строкам, а не голословно.
7. Код не читался повторно за пределами того, что уже зафиксировано в r1
(`src/resize.ts`, `src/houseplan-card.ts`), так как дельта не касается
технического контракта — она снимает требовавшую контракта формулировку.
## Закрытие раунда r1
| Находка r1 | Чем закрыта | Где это видно |
|---|---|---|
| **Medium** — обещание «предложить Optimize, только если кандидат #290 существует» не имеет технической опоры (нет поля-признака в `SafeResizeReason`, нет AC, различающего два текста) | Обещание убрано целиком, а не реализован недостающий контракт: текст для `side-angle`/`diagonal` стал безусловным и никогда не рекомендует Optimize; новый вариант reason/поле контекста явно объявлен не входящим в задачу | `docs/specs/292-resize-availability-audit.md:100` («Resize поддерживает только точные оси, без обещания автоматического Optimize»); §5 хвост, строки 107–109 («Динамический признак… и новые варианты `SafeResizeReason` не вводятся этой задачей»); согласованно в §2, строки 45–48 |
| **Low** — отсутствуют разделы «Сценарий и персона», «Риски и меры», «Откат» (PROCESS.md §7.1) | Все три раздела добавлены явно | §1 переименован в «Сценарий, персона и подтверждение» с блоками «Кто и где» / «Момент проблемы» / «До/после» (строки 11–22); новый §9 «Риски и меры» (строки 202–212); новый §10 «Откат» (строки 214–217) |
| **Low** — AC1–AC8 не помечают явно способ доказательства | Не закрыта: раздел 7 не изменён дельтой (`git diff` не касается AC1–AC9) | `docs/specs/292-resize-availability-audit.md:132-189` — тот же текст, что на r1, без явных тегов unit/smoke/code review |
Третья находка (Low, теги доказательства) осталась незакрытой, хотя r1 просил
закрыть все Low в той же правке. Решаю её здесь так же, как обозначил в r1:
смысл способа доказательства везде однозначен (AC1/AC3/AC4/AC6/AC7/AC8 —
`unit` по fixture; AC2 — `unit`; AC5 — `production smoke`; AC9 — сводный список
команд), явные теги ничего не меняют по существу. **Снимаю с записью**, не
возвращая документ на третий заход из-за чисто оформительской правки — бюджет
циклов дороже, чем эта строка (см. верхний блок задачи про #150).
## Унаследовано из r1
Без повторной проверки принято из `docs/reviews/SPEC-REVIEW-292-r1.md`
(получено на SHA `52ad67e7`), так как дельта r2 не касается этих разделов:
- продуктовая рамка и соответствие job J6 (`docs/SCOPE.md`);
- границы с #293 (раздел 6 «Не входит»);
- корректность терминов («Оптимизировать планы», «mixed-role») —
сверены с `docs/USER-GUIDE.ru.md` и `checkMixedRoleRecords`;
- AC2 как эмпирически подтверждённый факт (пара `room-a`/`room-b` edge 2);
- соразмерность локальных гейтов в §9 (ныне §9 «Локальные гейты» под старым
номером не переименован — это раздел 7/AC9, не путать с новым §9 «Риски»)
этапу spec — код не менялся, гейты не запускались;
- отсутствие открытых продуктовых вопросов владельцу — подтверждено также
прямой цитатой автора в комментарии «Аналитика подтверждена».
## Что проверено и корректно (дополнительно к унаследованному)
- Снятие обещания Optimize согласовано во всех трёх местах, где оно упоминалось
(§2, §5, §9) — не осталось хвостов старой формулировки нигде в файле
(`grep -n "предложить Optimize"` и `grep -n "кандидат #290"` по файлу дают
пустой результат).
- Выбранное решение (никогда не обещать вместо «обещать только при
доказанном кандидате») строже, чем любой из двух путей, предложенных в r1: оно
не требует нового технического контракта и не оставляет риска ложного
обещания ни в одном случае — при этом не противоречит AC6 («один resolver,
один reason type»), которое иначе требовало бы явного исключения.
- Это решение — техническое, не продуктовое: оно про честность конкретной
строки подсказки, а не про объём видимого пользователю изменения; эскалация
владельцу не требовалась и не была бы уместна (PROCESS.md §7.1: владельцу —
только вопросы о том, что человек видит/делает и объёме задачи).
- Переномерование разделов не создало разрывов: сверено отсутствием численных
внутренних ссылок вида «раздел N» в тексте документа.
## Чего не проверял
- Разделы 3, 4, 6, 7 (AC1–AC9), 8, 11 (бывший 9, «Ожидаемые файлы»), 12 (бывший
10, «Release»), 13 (бывший 11, «Принятые предположения») — дельта их не
касалась, унаследованы из r1 без повторного построчного разбора (см. раздел
«Унаследовано»).
- Продуктовый код (`src/resize.ts`, `src/houseplan-card.ts`) — не перечитывался
повторно; в r1 уже зафиксировано, что архитектура даёт один статический текст
на один `SafeResizeReason`, и именно на этом факте построена правка r2, так
что перепроверка не добавила бы нового знания.
- `docs/specs/README.md` (таблица issue ↔ ТЗ) — вне зоны ответственности ревью
ТЗ, как и в r1.
- Гейты (typecheck/test/build/check-docs) не запускались — код не менялся,
этап spec, раздел AC9 не входит в дельту этого раунда.
- Состояние #289/#290 (оба ещё не прошли ревью на момент r1) не перепроверялось
повторно; ничего в дельте r2 не меняет эту зависимость.
## Вердикт
Medium-находка r1 закрыта решением, разрешённым самим вердиктом r1 (снятие
обещания вместо ввода нового технического контракта), без остаточного
несоответствия AC. Обе содержательные Low-находки (недостающие разделы)
закрыты явно. Третья, чисто оформительская Low-находка (явные теги способа
доказательства AC) не закрыта правкой, но снимается здесь с записью как не
влияющая на однозначность документа — открывать третий заход ради неё
нецелесообразно. High: 0, Medium: 0 (в задаче не осталось). Документ готов к
переходу дальше по конвейеру.
```
Вердикт: зелёный · заход r2 · блокирующих циклов 1/4 · High: 0 · Medium: 0
Документ: docs/reviews/SPEC-REVIEW-292-r2.md
```