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

153 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-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
```
```diff
- Ревизия: 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 закрыты правкой текста, а не заявлением. Дельта локальна,
дополнительных находок не выявлено. **Вердикт: зелёный.**