diff --git a/docs/reviews/SPEC-REVIEW-293-r2.md b/docs/reviews/SPEC-REVIEW-293-r2.md new file mode 100644 index 00000000..c7402e09 --- /dev/null +++ b/docs/reviews/SPEC-REVIEW-293-r2.md @@ -0,0 +1,142 @@ +# SPEC-REVIEW-293-r2 + +- **Issue:** https://github.com/Matysh/houseplan-card/issues/293 +- **Этап:** spec (PROCESS.md §2.4) +- **Заход:** r2 · блокирующих циклов израсходовано 1 из 4 (r1 — жёлтый, потратил + 1 цикл; зелёный вердикт цикла не образует, §227) +- **Ветка/SHA:** `issue/293-resize-pointer-noop` @ `9e9fd0298587ef0d4a1f7a32c6bcc2c61e603729` +- **Предыдущий раунд:** SPEC-REVIEW-293-r1, вердикт жёлтый, получен на SHA + `c514b534` (SHA был явно назван в тексте вердикта r1 и в комментарии автора — + не находка на этот раз) +- **Дельта r1→r2:** `git diff c514b534..HEAD` — три файла: + - `docs/specs/293-resize-pointer-noop.md` (+25/−3: новые разделы 9 и 10, + сдвиг нумерации 9→11, 10→12, 11→13) + - `docs/specs/README.md` (+1: строка индекса) + - `docs/reviews/SPEC-REVIEW-293-r1.md` (+165: коммит документа r1 в дерево, + не предмет этого раунда) + - Продуктового кода в дельте нет (`git diff --stat c514b534..HEAD -- src/ + custom_components/` — пусто), новая подсистема не затронута, контракт + поведения не менялся. Дельта чисто аддитивная и локальная — полный разбор + по §2.10 не требуется. + +## Скоуп ревью + +Предмет раунда — только дельта: закрытие M1 и L1 из r1. AC1–AC10, контракт +раздела 1–8, `docs/RESIZE.md`/`docs/TOUCH-SUPPORT.md`/`docs/USER-GUIDE.ru.md` +согласованность, соответствие `docs/SCOPE.md` — уже разобраны в r1 полностью, +дельта их не касается (ни один AC, ни один пункт контракта не переписан, +только приписаны разделы «Риски» и «Откат» плюс строка индекса). Эти пункты +наследуются без повторной проверки — см. раздел ниже. + +## Как проверялось + +1. `gh issue view 293 --json ... --comments` — подтверждён вердикт r1 (жёлтый, + заход r1, 0/4 при входе) и его SHA `c514b534`, названный автором явно в + тексте комментария-вердикта. +2. `git diff c514b534..HEAD --stat` и полный текстовый diff — три файла, + перечислены выше; `git log --oneline c514b534..HEAD` — два коммита + (`9e9fd029` добавляет разделы, `b0696880` коммитит документ r1), оба несут + `Issue: #293` / `User-Visible: no` — корректно для чисто документационной + правки. +3. Прочитан файл `docs/specs/293-resize-pointer-noop.md` целиком (231 строка) — + не только добавленный фрагмент, чтобы проверить согласованность новых + разделов с остальным текстом и отсутствие сломанных перекрёстных ссылок + после сдвига номеров разделов. Перекрёстных ссылок по номеру раздела + (`## 9`, «раздел 9» и т.п.) в файле не оказалось — все ссылки на AC даны по + имени (`AC1`, `AC7`…), поэтому renumbering 9→11/10→12/11→13 безопасен. +4. Проверено предметное содержание новых разделов против текста находки M1 + r1 — см. таблицу закрытия ниже. +5. `grep -n "## P1" -A3 docs/specs/README.md` — новая строка `#293` попала в + таблицу `## P1`, что соответствует фактическому приоритету issue (метка + `P1`), не в `P2`/`P3`. +6. Гейты `typecheck`/`test`/`build` не запускались — продуктовый код не + менялся ни в r1, ни в этой дельте (см. п.2); эти гейты относятся к + код-ревью (§2.7), не к ревью ТЗ. Смоки/golden/invariants не применимы по + той же причине. + +## Закрытие раунда r1 + +| Находка r1 | Чем закрыта | Где это видно | +|---|---|---| +| **M1** (Medium, в скоупе) — отсутствуют обязательные разделы §7.1 «риски» и «откат» | Добавлены раздел `## 9. Риски и меры` (3 пункта, каждый привязан к конкретным AC — AC1/AC6/AC8 для риска неопределённой root cause, AC2/AC5/AC9 для риска touch safety floor, AC7 для риска ослабления safe Resize) и раздел `## 10. Откат` (revert implementation-коммита, схема/миграция/данные не трогаются) | `docs/specs/293-resize-pointer-noop.md:188-205`, коммит `9e9fd029` | +| **L1** (Low, на решение автора) — спек не индексирован в `docs/specs/README.md` | Строка `#293` добавлена в таблицу `## P1` | `docs/specs/README.md` diff в `9e9fd029`, видно в `## P1` рядом с #277/#280/#281 | + +Обе находки закрыты правкой текста, а не заявлением — проверено чтением диффа, +не пересказом автора. + +Содержательная проверка новых разделов (не только факт присутствия): + +- Риск 1 корректно называет то, что уже было открытым вопросом в разделе 1 + ТЗ («реализация обязана сначала зафиксировать точную причину… а затем + исправить»), и не вводит новый факт под видом решения — риск сформулирован + как риск, а не как скрытая догадка о причине. +- Риск 2 и риск 3 указывают на реальные AC (AC2/AC5/AC9 и AC7 существуют в + разделе 7 в указанном виде — проверено построчно), формулировки не + противоречат разделу 8 (Touch safety floor) и разделу 3 (Pointer contract). +- Раздел «Откат» согласован с шапкой документа («Модель данных: schema и + model version не меняются») и с разделом 12 «Release» — противоречий нет. +- Оба новых раздела не содержат догадки, выданной за факт: формулировки + риска — гипотезы о рисках, а не утверждения о поведении кода. + +## Унаследовано из r1 + +Без повторной проверки принято из **SPEC-REVIEW-293-r1** (документ в дереве — +`docs/reviews/SPEC-REVIEW-293-r1.md`, вердикт получен на SHA `c514b534`): + +- соответствие `docs/SCOPE.md` (дефект в закрытом J6, регрессия безусловно в + скоупе); +- фактическая точность раздела 1 (топология общей стены в + `test/fixtures/real-plan-second-floor.json`, поведение + `_rszDrag/_rszMove/_rszApplyPreview` в `src/houseplan-card.ts`) — + проверено r1 численно и по коду, дельта эти утверждения не трогает; +- корректность и неразмытость раздела «Не входит» (#292/#289/#290, + partial-shared/diagonal/>2-room, schema/storage вне скоупа); +- то, что контракт разделов 3–4 (Pointer contract, Live overlay contract) + восстанавливает уже документированное в `docs/RESIZE.md`, а не изобретает + новую продуктовую рамку; +- то, что новая часть контракта (toast при непредсказуемом reject) — не + придуманный UX, а прямой запрос владельца через существующий механизм + `toast.*`; +- проверяемость и способность падать AC1–AC10 (mutation-требования в + AC1/AC2/AC5/AC8, отсутствие двойного источника числа); +- согласованность раздела 8 с `docs/TOUCH-SUPPORT.md` (safety floor); +- корректность условной формулировки i18n (раздел «Ожидаемые файлы»: en/ru + ключи «если добавляется runtime reason»); +- корректность release-артефактов (раздел 12: трейлеры, оба changelog, + закрытие только бетой). + +Ни один из этих пунктов не мог измениться дельтой этого раунда: дельта не +касается разделов 1–8, 11–13, только добавляет 9–10 и одну строку индекса. + +## Находки этого раунда + +Нет. Дельта полностью закрывает M1 и L1, новых High/Medium/Low не внесено. + +## Что проверено и признано корректным (в дельте) + +- Оба новых раздела присутствуют, содержательны, не формальны (не «риск: не + установлен» без конкретики) и ссылаются на реальные, существующие AC. +- Renumbering разделов 9→11, 10→12, 11→13 не сломал внутренних ссылок — + ссылок по номеру раздела в документе нет вообще. +- Индекс `docs/specs/README.md` обновлён в правильной таблице (`P1`). +- Коммиты дельты несут корректные трейлеры (`Issue: #293`, + `User-Visible: no` — доки, не продукт). +- Документ теперь формально закрывает все обязательные разделы §7.1: риски и + откат добавлены, остальные были на месте с r1. + +## Чего не проверял + +- Полный повторный разбор разделов 1–8, 11–13 — не требуется по §2.10, они не + входят в дельту; их проверка наследуется из r1 (см. выше). +- `typecheck`/`test`/`build`/смоки/invariants/golden — неприменимо, продуктовый + код не менялся ни в одном из двух раундов. +- Соответствие итоговой реализации разделам 9–10 — предмет код-ревью (§2.7), + не этапа ТЗ. + +## Итог + +High: 0. Medium: 0. Low: 0. Обе находки r1 (M1 Medium в скоупе, L1 Low) +закрыты правкой текста, проверено построчно. Дельта чисто документационная, +локальная, не задевает AC, контракт или подсистему — полный разбор не +требовался и не проводился повторно там, где дельта не дотягивается. Вердикт: +зелёный. Issue переходит в «Готово к разработке» (S5-ready).