mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-30 19:58:50 +00:00
@@ -0,0 +1,139 @@
|
||||
# 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**
|
||||
Reference in New Issue
Block a user