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

12 KiB
Raw Blame History

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