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

13 KiB
Raw Blame History

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.