Files
houseplan-card/docs/reviews/SPEC-REVIEW-220-r3.md
T
2026-08-20 20:37:09 +00:00

151 lines
13 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-220-r3
- **Issue:** https://github.com/Matysh/houseplan-card/issues/220
- **ТЗ:** `docs/specs/220-space-tab-reorder.md` (текущий коммит `5ba46df`,
«docs: take the atomic write out of the "free to change" block (#220 M3)»)
- **Ревьюер:** Claude (роль «ревьюер ТЗ», PROCESS.md §2.4)
- **Заход:** r3 · блокирующих циклов израсходовано 2 из 4
- **Вердикт:** зелёный · High: 0 · Medium: 0
## Скоуп ревью
Разбор по дельте (PROCESS.md §2.9, #214). Найден вердикт r2
(`https://github.com/Matysh/houseplan-card/issues/220#issuecomment-5361277814`,
`2026-08-20T20:26:51Z`) и документ `docs/reviews/SPEC-REVIEW-220-r2.md`,
зафиксировавший ТЗ на коммите `e57e1d9`. Владелец в комментарии о закрытии r2
(`https://github.com/Matysh/houseplan-card/issues/220#issuecomment-5361297569`)
сам называет SHA после пуша — `5ba46df` — и это совпадает с текущим `HEAD`;
в r2 автор один раз назвал несуществующий SHA (`d0a5bfa`, переписан
`git pull --rebase`), в этом раунде расхождения нет, проверено
`git rev-parse HEAD` = `5ba46df`.
`git diff e57e1d9..5ba46df -- docs/specs/220-space-tab-reorder.md` — единственный
хунк, 12 вставок / 4 удаления, весь внутри пункта 3 §17 («Принятые
предположения»). Ни §8.3 (норматив материализации), ни §9, ни AC12, ни таблица
мутантов §14, ни любой другой раздел не тронуты ни байтом — это чисто
текстовая правка одного абзаца, не смена контракта поведения (сам норматив
и его формулировка в §8.3 не изменились, изменилось только то, как §17
классифицирует уже существующее требование). Дельта локальна, полный
повторный разбор не требуется.
Разобрана дельта полностью: сам абзац §17.3 и его согласованность с §8.3, AC3
и мутантом `reorder-skips-materialization`, на которые он теперь явно
ссылается. Остальное (§1–§16 кроме одного абзаца §17, AC1/2/4–8, весь
мутационный гейт, план автотестов, release-артефакты, откат) дельта не
касается — унаследовано из r2 (раздел ниже).
## Как проверялось
1. Прочитан текущий пункт 3 §17 (`docs/specs/220-space-tab-reorder.md:268-279`)
целиком и сверен построчно с находкой M3 ревью r2: требовалось либо убрать
пункт из «менять свободно», либо явно пометить его исключением со ссылкой
на §8.3/AC3. Автор выбрал второй вариант: первая фраза пункта —
«Атомарность записи предположением не является», далее прямая ссылка на
норматив §8.3, AC3 и мутант `reorder-skips-materialization`, и явное
«свободно меняется всё остальное в этом разделе, но не это». Формулировка
закрывает причину противоречия, а не переименовывает её: заголовок §17
(«менять свободно») больше не может быть прочитан как разрешение развязать
запись на две — конкретный пункт прямо и по имени объявляет себя
исключением.
2. Проверено, что новая формулировка не создаёт обратного противоречия: §8.3
(`:107-139`, не тронут дельтой) называет атомарность «Норматив», AC3
(`:194-224`, не тронут дельтой) и мутант `reorder-skips-materialization`
(§14, не тронут дельтой) её проверяют — пункт §17.3 теперь на них ссылается,
а не спорит с ними. Три источника (§8.3, AC3, мутант, §17.3) говорят одно и
то же.
3. Сохранённый второй абзац («историческая справка про якорь в `settings`,
отвергнутый по M2 r1») — не норматив, а комментарий к истории решения;
он не противоречит новой формулировке первого абзаца и не меняет статус
пункта.
4. `grep -n "17\.3\|§17"` по всему файлу — единственная ссылка на этот раздел
находится в самом пункте 3 (самоссылка на находку M3), других мест
документа, которые ожидали бы прежнюю формулировку, нет.
5. AC, задетые дельтой — ни одного: AC3, единственный кандидат, ссылается на
§8.3 как источник нормы, а не на §17, и текст AC3 не менялся. Проверено
построчным сравнением AC3 в текущем файле с версией, зафиксированной в
`SPEC-REVIEW-220-r2.md` — идентична.
## Закрытие раунда r2
| Находка r2 | Чем закрыта | Где это видно |
|---|---|---|
| **M3** — §17 маркирует нормативное требование атомарности записи как «свободно меняемое», хотя §8.3 называет его нормативом, а AC3 и мутант `reorder-skips-materialization` его проверяют | Пункт 3 §17 переписан: первая фраза — «Атомарность записи предположением не является», с прямой ссылкой на норматив §8.3, AC3 и мутант, и явной оговоркой «свободно меняется всё остальное в этом разделе, но не это» | `docs/specs/220-space-tab-reorder.md:268-275`; сверено с §8.3 (`:113`, слово «Норматив» как было), AC3 и таблицей мутантов §14 — все три не менялись и согласуются с новой формулировкой |
Находка закрыта не переименованием, а содержательно: раньше заголовок §17
разрешал буквальное прочтение «эту запись можно разнести на две», теперь
пункт сам называет себя исключением и объясняет, какому нормативу подчинён.
## Унаследовано из r2
Принято без повторной проверки в этом раунде — проверено и подтверждено в
`docs/reviews/SPEC-REVIEW-220-r2.md` на коммите `e57e1d9`, дельта эти разделы
не касается:
- Персона, сценарий и job `docs/SCOPE.md` J6 (§1–§2 ТЗ) — унаследовано из r2,
которое само унаследовало это из r1 (`0fd2331`).
- Продуктовые решения владельца §4 (тач/права/клавиатура).
- §8.1, §8.2, §8.4, §8.5 контракта.
- §8.3 целиком (материализация вместо якоря) и его согласованность с §9 —
закрытие M1/M2 из r1, подтверждённое в r2 сверкой с кодом `devices.ts`
(все три пути резолюции `firstSpaceId`, включая ветку ручной комнаты без
HA area).
- AC1–AC8 — однозначность и способ доказательства (AC3 переподтверждён в r2
под новую механику материализации; в этом раунде не менялся).
- Все пять записей мутационного гейта §14, включая
`reorder-skips-materialization` и `materialization-touches-bound-markers`.
- §9 (данные/i18n/touch: `Touch editor: not exposed`), §10 (performance),
§11 (риски), §15 (release-артефакты), §16 (откат).
- Low-находка r1 про `.tabedit`/`pointerdown` — оставлена без правки
экспертным решением r1, дельта её не касается.
- Наблюдение r2 про несуществующий SHA `d0a5bfa` в комментарии о закрытии r1 —
закрыто содержательно в этом раунде: владелец подтвердил промах и в
комментарии о закрытии r2 назвал SHA `5ba46df` уже после пуша, он совпадает
с текущим `HEAD`.
## Находки
Нет. High: 0, Medium: 0, Low: 0.
## AC — что перепроверено дельтой
| AC | Задет дельтой | Комментарий |
|---|---|---|
| AC1, AC2, AC4, AC5, AC6, AC7, AC8 | нет | унаследованы из r1/r2 без повторной проверки |
| AC3 | нет (текст AC3 не менялся; менялась только классификация соседнего раздела §17) | сверен построчно с версией из r2 — идентичен |
## Что проверено и корректно
- M3 закрыта предметно: пункт §17.3 больше не может быть прочитан как
разрешение разнести атомарную запись на два `config/set` — именно тот
риск («маркеры уезжают»), ради предотвращения которого писан весь §8.3.
- Три источника нормы (§8.3 «Норматив», AC3, мутант
`reorder-skips-materialization`) и указатель на них в §17.3 теперь говорят
одно и то же, без противоречий.
- Историческая справка про отвергнутый якорь `settings` сохранена как
контекст решения, не как действующая норма — не создаёт путаницы с текущей
механикой материализации.
- Дельта не расширилась дальше объявленной находки: диффом подтверждено, что
ни один другой раздел документа (контракт, AC, мутанты, release-артефакты,
откат) не менялся между `e57e1d9` и `5ba46df`.
- Владелец сам указал на собственную ошибку с несуществующим SHA прошлого
раунда и впредь называет SHA только после пуша — это снимает наблюдение r2,
а не оставляет его висеть.
## Чего не проверял
- Не проверял реализацию — кода ещё нет, это ревью ТЗ.
- Не запускал `tsc`/`npm test`/`npm run build` — класс изменения C
(документация), гейты неприменимы, как и в r1/r2.
- Не пересматривал разделы, не тронутые дельтой (§1–§16 кроме одного абзаца
§17, AC1/2/4–8, весь мутационный гейт) — они унаследованы из r2 на коммите
`e57e1d9`, дельта их не меняла ни байтом (подтверждено `git diff`).
- Не проверял `docs/specs/README.md` сверх того, что было проверено в r1 —
дельта этого раунда файла не касается.
## Итог
Находка M3 закрыта предметно и без побочных противоречий. Правка — 16 строк
внутри одного пункта §17, не меняет AC, скоуп, контракт поведения или
мутационный гейт. Новых находок не появилось. Вердикт — зелёный: ТЗ готово к
`S5-ready`.