Files
houseplan-card/docs/reviews/SPEC-REVIEW-403-r2.md
T
2026-09-01 15:08:22 +00:00

12 KiB
Raw Blame History

SPEC-REVIEW-403-r2

  • Issue: https://github.com/Matysh/houseplan-card/issues/403
  • Артефакт ТЗ: docs/specs/403-area-relocation-safety.md (полный трек, класс A; без метки small/trivial)
  • Материал: спец-файл на HEAD = 83005c3c (ветка issue/403-area-relocation-safety, коммит «docs: revise area relocation safety spec», ревизия ТЗ 2)
  • Заход: r2 · блокирующих циклов израсходовано 1/4 (зелёный вердикт цикл не образует, §4/#227 — этот раунд бюджет не тронет)
  • Ревьюер: Claude (роль «ревьюер ТЗ»), независимая сессия
  • Разбор — по дельте (§2.10 PROCESS.md): дельта локальна (см. ниже), ребейза не было, контракт поведения не менялся, новая подсистема не задета, объём дельты (25 строк diff) многократно меньше исходной задачи

1. Вердикт r1 и SHA, на котором он получен

docs/reviews/SPEC-REVIEW-403-r1.md (коммит bfe05bed): жёлтый, заход r1, блокирующих циклов 1/4, High: 1 (H1), Medium: 0, Low: 1 (L1, снят с записью). Материал ревью r1 — SHA 1f9d9014 (ветка issue/403-area-relocation-safety, тот же текст, что и коммит bb47ec31 в этой ветке; расхождение SHA — только факт истории ветки на момент r1, содержимое спецификации идентично тому, что лежит в bb47ec31). SHA был назван в документе r1 явно — находки «SHA не назван» здесь нет.

2. Объявление дельты

Код продукта (src/**) на этапе ТЗ не менялся и не должен был: спор — только о тексте спецификации. Дельта:

git diff bb47ec31..83005c3c -- docs/specs/403-area-relocation-safety.md
- Ревизия: 1 (2026-08-31)
+ Ревизия: 2 (2026-09-01; H1/L1 из SPEC-REVIEW-403-r1)
...
- `src/houseplan-card.ts:5056-5058`:
+ `src/houseplan-card.ts:5062-5065`:
...
+ ## Touch, View и kiosk
+ (текст: touch-контракт не меняется, drag/tap-жесты и DOM/рендер не
+   затрагиваются, View/kiosk сохраняют идентичный desktop-результат)
+
+ ## Производительность
+ (текст: нет новых циклов/подписок/сетевых вызовов сверх уже выполняемых
+   `_syncAreaRelocations`/`_writeConfig`; очистка истории — не более 50 команд)

git diff --stat bb47ec31..HEAD подтверждает: изменены ровно два файла — сам спек (+23/-2) и новый docs/reviews/SPEC-REVIEW-403-r1.md (публикация документа r1, не предмет разбора). Продуктовый код, тесты, docs/SCOPE.md, docs/TOUCH-SUPPORT.md, docs/USER-GUIDE.ru.md в дельте не участвуют — разбор ограничен текстом спецификации, что и требуется §2.10 для дельты по ТЗ.

Дельта локальна: без ребейза (истории общий предок совпадает), без смены контракта (AC1–AC7, сценарий, скоуп/не-скоуп не тронуты), без новой подсистемы (правки — только два новых раздела DoR-чек-листа и один адрес строки).

3. Закрытие раунда r1

Находка r1 Чем закрыта Где это видно
H1 (High). ТЗ не называет влияние на touch/kiosk (docs/TOUCH-SUPPORT.md) и на производительность — ни утвердительно, ни явным «нет», как требует DoR §2.5 Добавлены разделы «Touch, View и kiosk» (docs/specs/403-area-relocation-safety.md:133-144) и «Производительность» (:146-152) с явными положительными утверждениями «нет влияния» и обоснованием docs/specs/403-area-relocation-safety.md:133-152; проверено построчно против docs/TOUCH-SUPPORT.md:9-38 (View/kiosk — «fully supported», доступный AC1/AC2-результат туда попадает без ослабления) и против docs/USER-GUIDE.ru.md:260,1325 (раздел 6 «Навигация, масштаб и жесты» — строка «История редактора»; лимит 50 команд подтверждён кодом, см. §5)
L1 (Low). Адрес сниппета M1 указывал src/houseplan-card.ts:5056-5058, актуальный код на 1f9d9014 — :5062-5065 Адрес в тексте ТЗ обновлён на :5062-5065 docs/specs/403-area-relocation-safety.md:84; сверено с текущим деревом — src/houseplan-card.ts:5062-5065 содержит ровно процитированный фрагмент (см. §5)

Обе находки закрыты правкой текста, не заявлением автора о правке — ниже приведена самостоятельная проверка, а не пересказ хендоффа.

4. Унаследовано из r1 (без повторной проверки)

Источник: docs/reviews/SPEC-REVIEW-403-r1.md (коммит bfe05bed, материал — SHA 1f9d9014). Дельта r2 этих утверждений не касается, поэтому переносятся без повторной проверки:

  • диагноз C2 и M1 точен и построчно сверен с кодом (_syncAreaRelocations, resolveDeviceAreaRelocations, _devicePositionHistory.clear());
  • AC1–AC7 однозначны, у каждого указан способ доказательства, реалистичны на существующей инфраструктуре смоков (demo/smoke_area_relocation.mjs уже умеет мокать отказ houseplan/config/set);
  • все обязательные разделы §7.1 присутствуют (сценарий · что человек увидит · проблема/контракт по пунктам · скоуп/не-скоуп · UX · модель данных и миграция · i18n · план автотестов · риски · откат · release-артефакты);
  • терминология соответствует docs/USER-GUIDE.ru.md (раздел «Устройства», раздел «История редактора»);
  • инструменты плана тестов существуют (scripts/mutation-gate.mjs, demo/smoke_area_relocation.mjs);
  • задача лежит в скоупе docs/SCOPE.md (J6 «Keep the plan true as the home evolves» + правило «никогда не удалять данные пользователя по догадке»).

5. Проверка дельты (не унаследовано — перепроверено заново)

Строка L1. Прочитан src/houseplan-card.ts:5060-5070 на текущем HEAD:

5062      this._areaRelocationIds = new Set(areaRelocations.relocateIds);
5063      if (this._areaRelocationIds.size) {
5064        this._cancelDeviceDrag();
5065        this._devicePositionHistory.clear();

Совпадает буквально с текстом ТЗ и с новым адресом :5062-5065. Находка L1 закрыта корректно, не только по номеру, но и по содержанию.

Раздел «Производительность». ТЗ утверждает лимит истории «не более чем из 50 команд». Проверено чтением src/command-stack.ts:20-21: public constructor(limit = 50) — комментарий на той же строке ссылается на UX-04 («useful 30–50-step history»). Число подтверждено, не выдумано.

Раздел «Touch, View и kiosk». Утверждение «View/kiosk сохраняют одинаковый позиционный результат на desktop и touch» проверено против docs/TOUCH-SUPPORT.md:9-41 — View обязан быть «fully supported; must be convenient and reliable» на touch, отдельного исключения для содержимого маркера/отметки внимания там нет; AC1/AC2 результата (позиция или отметка) не вводят нового жеста и не меняют DOM/рендер — согласуется с диагнозом, унаследованным из r1 (правка ограничена _syncAreaRelocations и фильтром по deviceId в существующей истории). Раздел не содержит утверждений о поведении, которых нет в каноне: ссылки на TOUCH-SUPPORT.md и на раздел «История редактора» USER-GUIDE.ru.md проверены и точны.

Ни один AC не задет дельтой текстуально (AC1–AC7 не менялись), поэтому повторная проверка самих AC не требовалась по правилу §2.10 п.4 — они наследуются из §4 этого документа.

6. Что проверено и корректно

  • Оба замечания r1 (H1, L1) закрыты по существу, не косметически: новые разделы отвечают на конкретные пункты DoR, а не констатируют «нет» без обоснования; исправленный адрес строки указывает на верный код.
  • Ревизия ТЗ поднята до 2 с корректной пометкой источника правки.
  • Дельта не расширяет скоуп, не меняет AC, не вводит новых терминов и не противоречит канону подсистемы (TOUCH-SUPPORT.md, USER-GUIDE.ru.md).
  • Продуктовый код и тесты в дельте отсутствуют, что и ожидается на этапе ТЗ.

7. Чего не проверял

  • Диагноз C2/M1 и построчную сверку с src/houseplan-card.ts / src/device-area-relocation.ts — не перепроверял заново, дельта их не касается; см. §4 «Унаследовано из r1».
  • Автотесты, мутанты и код реализации — их не существует на этапе ТЗ, вне скоупа спек-ревью.
  • Гейты typecheck/test/build/golden/смоки — не прогонял: дельта этого раунда состоит из двух docs-коммитов (bfe05bed, 83005c3c), продуктовый код не тронут ни разу с прошлого зелёного Validate на 83005c3c (тот же SHA — это и есть HEAD; прогон уже зафиксирован в контексте задачи). Полные наборы гейтов — предмет код-ревью, а не ревью ТЗ.

Итог

Обе находки r1 закрыты правкой текста, а не заявлением. Дельта локальна, дополнительных находок не выявлено. Вердикт: зелёный.