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

143 lines
12 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-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).