mirror of
https://github.com/Matysh/houseplan-card
synced 2026-10-01 12:18:51 +00:00
@@ -0,0 +1,150 @@
|
||||
# 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`.
|
||||
Reference in New Issue
Block a user