Files
houseplan-card/docs/reviews/SPEC-REVIEW-396-r3.md
T
2026-08-31 01:36:53 +03:00

140 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-396-r3
- **Issue:** https://github.com/Matysh/houseplan-card/issues/396
- **ТЗ под ревью:** `docs/specs/396-camera-transition-fixes.md`, коммит `02eff9c34b425ae053bc3dccbd24174ea8aa4017` (HEAD ветки `issue/396-camera-transition-fixes`, `docs: #396 spec revision 3 per SPEC-REVIEW-396-r2`)
- **Этап:** spec (PROCESS.md §2.4)
- **Трек:** обычный (без метки `small`/`trivial`) — лимит циклов ревью ТЗ 4
- **Заход:** r3 · блокирующих циклов израсходовано 2 из 4 (до этого вердикта; r1 красный = 1, r2 жёлтый = 1, итого 2)
## Скоуп ревью
Раунд r2 вернул жёлтый вердикт с одной Medium-находкой и одной снятой Low:
- **Medium-1**: строка таблицы отмен `:4188`, `:4216` называла несуществующую
функцию `_load` (`grep -n "\b_load\b" src/houseplan-card.ts` — пусто); обе
строки фактически лежат внутри `_adoptStructuralResponses`.
- **Low-1** (waived, не блокировал): строка `:1159 _onMotionChange, :2363` —
имя функции названо только для первого числа, `:2363` осталось без имени.
Ревизия 3 правит ровно эти два места и ничего больше — это подтверждает
`git diff d5fd5926faab12ec0883458b1d4a932ea9344bb3..HEAD -- docs/specs/396-camera-transition-fixes.md`
(SHA `d5fd5926` — HEAD ветки на момент вердикта r2): три изменённые строки —
строка «Ревизия» (счётчик и ссылка на раунд) и два исправления имён в таблице
раздела «(1) B1». Ни один другой раздел ТЗ не тронут: `git diff --stat` даёт
`1 file changed, 6 insertions(+), 6 deletions(-)`.
Это ревью — по дельте (PROCESS.md §2.10): единственный предмет разбора —
две поправленные ячейки таблицы. B1/B2/M2 по существу, AC1–AC7, «Скоуп/не-скоуп»,
UX, модель данных, i18n, риски, откат, release-артефакты дельту не задевают и
наследуются из r2 без повторной проверки (раздел ниже).
Продуктового кода в ветке по-прежнему нет: диапазон `4e0a30a7..HEAD` содержит
только doc-коммиты (спека и документы ревью r1/r2) плюс текущую ревизию 3;
`src/**` не тронут ни одним коммитом ветки.
## Как проверялось
1. Прочитаны `docs/SCOPE.md` (раздел Core user jobs, J1 — «live spatial
overview» покрывает камеру/зум как часть основного сценария View), `AGENTS.md`,
`PROCESS.md` §1, §2.4, §2.10, §4, §7.1, §7.2 (действующая редакция).
2. Прочитано тело issue #396 целиком и все пять комментариев (аналитика,
вердикт r1, ревизия 2, вердикт r2, ревизия 3).
3. Восстановлена дельта: `git diff d5fd5926..02eff9c3 -- docs/specs/396-camera-transition-fixes.md`
— ровно 3 изменённые строки (см. выше).
4. Обе правки сверены с кодом на HEAD той же командой, что и в r1/r2:
- `grep -n "\b_load\b" src/houseplan-card.ts` — пусто, подтверждает, что
`_load` действительно не существует;
- `grep -n "private _adoptStructuralResponses" src/houseplan-card.ts` →
`4167`; тело функции (`4167`–`4224`) прочитано целиком, обе строки
`4188` и `4216` — вызовы `this._cancelCameraTransition(false);` внутри
неё (в ветках `configChanged` и `layoutChanged` соответственно);
- `grep -n "_cancelCameraTransition(true)" src/houseplan-card.ts` →
строки `1159` и `2363`; строка `2363` прочитана в контексте — она лежит
внутри `private _pageVisibility = (signal: PageVisibilitySignal): void => {…}`,
что в точности совпадает с новым именем в таблице.
5. Проверено, что весь остальной текст ревизии 3 идентичен ревизии 2
(diff выше — исчерпывающий список изменений, других расхождений нет).
6. Проверена внутренняя согласованность: слово `_load` больше нигде в файле
не встречается (`grep -n "_load\b" docs/specs/396-camera-transition-fixes.md`
— пусто), включая AC3 — вопреки формулировке в комментарии ревизии 3
(«заодно поправил AC3, где было то же имя»), AC3 в обеих ревизиях (r2 и r3)
не содержит и не содержало `_load`; это неточность комментария к коммиту,
а не дефект самого ТЗ — текст документа везде корректен, лишний коммент не
вводит фактическую ошибку. Не заводится находкой: не влияет ни на один AC.
## Закрытие раунда r2
| Находка r2 | Чем закрыта | Где это видно |
|---|---|---|
| **Medium-1**: `:4188`, `:4216` приписаны несуществующей `_load` | Имя заменено на `_adoptStructuralResponses` | `docs/specs/396-camera-transition-fixes.md:48` (было `` `:4188`, `:4216` `_load` ``, стало `` `:4188`, `:4216` `_adoptStructuralResponses` ``); подтверждено чтением `src/houseplan-card.ts:4167-4224` — обе строки действительно внутри этой функции |
| **Low-1** (waived): `:2363` без имени функции | Имя добавлено — `_pageVisibility` | `docs/specs/396-camera-transition-fixes.md:45` (было `` `:1159` `_onMotionChange`, `:2363` ``, стало `` `:1159` `_onMotionChange`, `:2363` `_pageVisibility` ``); подтверждено чтением `src/houseplan-card.ts:2363` — строка лежит внутри `private _pageVisibility = …` |
## Унаследовано из r2
Ничего из перечисленного не задето дельтой r2→r3 (диф выше исчерпывающий),
принято без повторной проверки на этом раунде, по документам:
`docs/reviews/SPEC-REVIEW-396-r1.md` (SHA `4e0a30a78161a4ff59679454d1f8b5c471e10008`)
и `docs/reviews/SPEC-REVIEW-396-r2.md` (SHA `d5fd5926faab12ec0883458b1d4a932ea9344bb3`):
- контракт B1 (разделение пользовательской/структурной отмены, правка §13
спеки #82) — проверен по существу в r1, таблица мест — построчно в r2;
- контракт B2 (якорь от цели перехода вместо представленного кадра, правка
§10 спеки #82) и его AC3/AC4 — проверены в r1, дельтой не тронуты;
- контракт M2 (заморозка glow-feather на признаке движения камеры) и AC5 —
проверены в r1;
- раздел «Скоуп/не-скоуп» (включая добавление `_stagePointerDown` в r2) —
проверен в r2;
- AC1, AC2 (переформулированы в r2 под таблицу одиннадцати мест) — проверены
построчно в r2, включая проверку обоих вызывающих контекстов `_zoomAt`
(`:6517`, `:6897` — оба вызывают `_saveZoom()` сразу после);
дельта r2→r3 эти AC не меняет;
- AC6 (правка §10/§13 `082-smooth-zoom.md`), AC7 (regression guard:
reduced-motion, dispose, конфиг) — проверены в r1;
- план автотестов, мутанты, риски, откат, release-артефакты, UX, модель
данных и миграция, i18n — проверены в r1, дельтой не тронуты;
- обязательные разделы §7.1 PROCESS.md присутствуют все — проверено в r1;
- продуктовых вопросов владельцу нет — установлено в r1 и подтверждено в r2.
## Находки
Нет. Обе находки r2 (Medium-1, Low-1) закрыты точно, построчной сверкой с
кодом, без побочных повреждений соседних разделов. Новых расхождений дельта
не вносит.
## Что проверено и корректно
- Обе исправленные ячейки таблицы теперь называют реально существующие
функции на указанных строках (проверено чтением кода, не исполнением —
на этом этапе продуктового кода к issue ещё нет).
- Классификация обеих строк («структурная» для `:4188`/`:4216`, «уже
сохраняется через `settled`» для `:2363`) осталась прежней и по-прежнему
верна: `_adoptStructuralResponses` меняет geometry/config baseline целиком
(структурная отмена по определению контракта B1), `_pageVisibility` зовёт
`cancel(true)` (коммит цели, не «зависание» кадра) — согласуется с общей
строкой `:1159`/`:2363` в таблице.
- Никакая другая часть документа (контракты, AC, скоуп, риски, автотесты)
не изменилась и не пострадала от точечной правки.
## Чего не проверял
- Существо контрактов B1/B2/M2, AC3–AC7, план автотестов, риски, откат —
не проверялись заново в этом раунде: дельта их не касается, разбор
наследуется из r1/r2 (раздел выше).
- Продуктовый код фичи не существует в этой ветке (только doc-коммиты) —
проверять `npx tsc --noEmit`, `npm test`, `npm run build` на этом этапе
бессмысленно: класс A ничем не тронут. Гейты — предмет код-ревью после
реализации.
- Внешний файл аудита `AUDIT-2026-08-31-v1700beta1.md`, на который ссылается
тело issue, не лежит в репозитории и не проверялся — как и в r1/r2, это вне
дерева, доверие к нему устанавливалось построчной сверкой утверждений с
кодом, а не чтением самого аудита.
## Вердикт
Обе находки предыдущего раунда закрыты точно и без побочных эффектов;
дельта чисто текстовая (три строки, две правки имён плюс счётчик ревизии) и
не задевает ничего, требующего повторной проверки. Продуктовых вопросов
владельцу нет.
**Вердикт: зелёный · заход r3 · блокирующих циклов 2/4 · High: 0 · Medium: 0**