mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-30 11:49:16 +00:00
@@ -0,0 +1,138 @@
|
||||
# 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 без повторной проверки, как и было заявлено ранее. Открытых
|
||||
продуктовых вопросов нет. ТЗ готово к разработке.
|
||||
Reference in New Issue
Block a user