Files
houseplan-card/docs/reviews/SPEC-REVIEW-44-r3.md
2026-08-30 10:51:30 +00:00

12 KiB

SPEC-REVIEW-44-r3

  • Issue: https://github.com/Matysh/houseplan-card/issues/44
  • Этап: spec (ревью ТЗ, PROCESS.md §2.4)
  • Заход: r3 · блокирующих циклов израсходовано 2/4 (1 — на r1, красный; 1 — на r2, жёлтый)
  • ТЗ: docs/specs/044-filter-grouping-policy.md, ревизия 4, зафиксирована коммитом 44aa6968 («docs: #44 spec revision 4 per SPEC-REVIEW-44-r2», единственный файл, 9 добавлено / 7 удалено — git show --stat 44aa6968)
  • Предыдущий раунд: docs/reviews/SPEC-REVIEW-44-r2.md, вердикт жёлтый, получен на ревизии 3, коммит ba568763
  • Вердикт: зелёный

Скоуп ревью

Разбор по дельте (PROCESS.md §2.10): дельта локальна — один файл ТЗ, правка ограничена ровно теми абзацами, которые называл M1 из r2, плюс унификация термина L1. Продуктовый код с r1 не менялся вовсе (git log --oneline 3d4c5090..HEAD -- src test demo пуст на всех трёх ревизиях подряд). Ни рёбейза, ни смены контракта, ни новой подсистемы — полный повторный разбор не требуется.

Дельта: git diff ba568763..44aa6968 -- docs/specs/044-filter-grouping-policy.md — 16 строк (9/7), четыре места: строка ревизии + «Сценарий» (термин вкладки), «Скоуп → 1» (тот же термин), «Риски» (M1), «Принятые предположения» (M1 + L1). Ни AC, ни «Контракт поведения» дельта не задевает — эти разделы вне рамок проверки этого раунда (§2.10 п.4).

Закрытие раунда r2

Находка r2 Чем закрыта в ревизии 4 Где это видно
M1 — «Риски» и «Принятые предположения» не убрали опровергнутое H1-утверждение «причина показывается на «Скрытых»», внутреннее противоречие с телом ТЗ Оба абзаца переписаны под факт, закреплённый ревизией 3: причина остаётся на «Доступны», новый класс записей на «Скрытые» не появляется, категория не переносится docs/specs/044-filter-grouping-policy.md:170-172 («Текст причины обогащается плейсхолдером на уже существующей вкладке «Доступны» — новых классов записей не появляется…»), :202-203 («Причина остаётся на «Доступны», где уже живёт (#29); ни переноса категории, ни новой вкладки.»)
L1 — термин вкладки использовался непоследовательно («Доступные» в трёх местах, «Доступны» в других) Оставшиеся вхождения «Доступные» заменены на канонический «Доступны» docs/specs/044-filter-grouping-policy.md:13, 49; полнотекстовый grep -n "Доступные|Скрытые" docs/specs/044-filter-grouping-policy.md по всему файлу — 0 совпадений

Оба пункта r2 закрыты по существу, не косметически: правка не просто убрала слово, а привела формулировку в соответствие с фактом, зафиксированным ещё в ревизии 3 (H1 r1), и распространила его на все оставшиеся вхождения в документе.

Находки

Находок этого раунда нет. Дельта — точечная правка двух текстовых абзацев плюс терминология; она не вводит новых утверждений о поведении кода, не трогает AC, «Контракт поведения» или раздел «Модель данных и миграция». Прочитан весь изменённый и прилегающий текст (полные секции «Риски» и «Принятые предположения») — противоречий, недосказанностей или новых догадок, выданных за факт, не найдено.

Унаследовано из r2

Без повторной проверки приняты (проверялись в SPEC-REVIEW-44-r1.md на коммите 3d4c5090 и в SPEC-REVIEW-44-r2.md на коммите ba568763; продуктовый код с тех пор не менялся — git log --oneline ba568763..HEAD -- src test demo пуст):

  • SCOPE.md: задача закрывает тезис issue («третий вариант» запрещён), конфликта со SCOPE нет.
  • Трек — полный (не small), файл ТЗ обязателен и существует; все обязательные разделы §7.1 присутствуют.
  • Резолверы group_lights (devices.ts:1033/1098) и exclude_integrations (houseplan-card.ts:3924-3925, space-render.ts:245-246), включая replace-семантику и [] как валидное «ничего не исключать».
  • EXCLUDED_DOMAINS (rules.ts:12, 13 доменов) совпадает с описанием.
  • scripts/config-field-registry.mjs:42-70 — статусы decision-required, паспорта allow-extra обоих ключей, план перевода в current технически корректен, есть прецедент (6 других полей).
  • expected_rev/транзакционный паттерн Сохранить, прецедент удаления ключа при возврате к дефолту (settings.weather_entity) — реальны.
  • buildDevices(ctx) — чистая функция, AC6 (общий вход превью/боевого пути без копии логики) реализуем технически.
  • H1 (r1): причина excluded_integration уже существует и рендерится на «Доступны» (#29); категория hidden для такого кандидата структурно недостижима без отдельного изменения buildDeviceInbox, которого этот скоуп не открывает. AC4 переписан под факт и непротиворечив.
  • H2 (r1): roomClimateMap (devices.ts:1491) — единственный прямой вызов EXCLUDED_DOMAINS.has( в src/**, контракт 1a + AC4b технически реализуемы и совместимы с существующими тестами #317 (test/devices.test.mjs:1304-1426).
  • AC1–AC8, план автотестов и мутанты (м1, м2) — однозначны и проверяемы как написаны; дельта этого раунда их не касалась.

Как проверялось

  1. Восстановлен SHA r2 (ba568763) и вердикт из docs/reviews/SPEC-REVIEW-44-r2.md (документ называет SHA явно).
  2. git diff ba568763..44aa6968 -- docs/specs/044-filter-grouping-policy.md — единственный источник дельты этого раунда; git show --stat 44aa6968 подтверждает единственный изменённый файл.
  3. git log --oneline 3d4c5090..HEAD -- src test demo — пусто на всём диапазоне трёх ревизий; продуктовый код не тронут ни разу с первого захода.
  4. Полнотекстовый grep -n "Доступные\|Скрытые" по итоговому файлу — 0 совпадений, L1 закрыт полностью, а не частично.
  5. Построчная сверка обоих переписанных абзацев («Риски», «Принятые предположения») с телом ТЗ (разделы «Что человек увидит», «Скоуп → 2», AC4) на непротиворечивость — совпадают дословно по смыслу.
  6. Прочитан документ целиком (ревизия 4) на предмет новых догадок, выданных за факт, вне дельты — не найдено; AC, Контракт и модель данных дельтой не задеты, повторно не проверялись (§2.10 п.4).
  7. Тело issue #44 и все комментарии (включая хендофф автора к ревизии 4, 2026-08-30T10:48:12Z) — соответствие заявленного закрытия M1/L1 фактическому диффу подтверждено.

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

  • M1 закрыт по существу: оба абзаца больше не противоречат телу ТЗ, вкладка «Доступны» упомянута последовательно во всём документе.
  • L1 закрыт полностью: 0 вхождений «Доступные», термин унифицирован под docs/USER-GUIDE.ru.md:785 / device_inbox.tab_available.
  • Дельта не затронула AC, «Контракт поведения» и «Модель данных и миграция» — риска регрессии на унаследованных пунктах r1/r2 нет.
  • Обязательные разделы §7.1 по-прежнему все на месте (ревизия 4 их не трогала кроме перечисленных четырёх мест).

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

  • Полный повторный разбор документа вне дельты и унаследованных пунктов — по правилу «дельта локальна» (§2.10), см. «Унаследовано из r2».
  • Гейты typecheck/test/build/check-docs.mjs — неприменимо: диапазон 3d4c5090..HEAD не касается src/**, test/**, demo/** ни разу (докс- коммиты df1dbccf, ba568763, 6e6747dc, 44aa6968), и на этом этапе (S4, ревизия ТЗ) продуктового кода нет. Прогон Validate на текущем SHA 44aa6968 не искали и не запускали намеренно — это спец-документ, не код, гейты сборки/тестов к нему не относятся; проверка ограничена чтением текста и git diff/git log, что и является корректным способом ревью на этапе spec для docs-only коммита.
  • Смоки/golden/backend/perf/инварианты модели — неприменимо, продуктовый код не менялся.

Итог

Вердикт: зелёный. Оба пункта r2 (M1 — внутреннее противоречие «Риски»/ «Принятые предположения» с уже исправленным H1; L1 — непоследовательная терминология вкладки) закрыты по существу и без остатка: правка точная, дельта не вышла за рамки названного и не создала новых противоречий. AC, контракт поведения и модель данных ревизией не тронуты — унаследованы из r1/r2 без повторной проверки, как и было заявлено ранее. Открытых продуктовых вопросов нет. ТЗ готово к разработке.