# SPEC-REVIEW-178-r2 - **Issue:** https://github.com/Matysh/houseplan-card/issues/178 - **ТЗ:** [`docs/specs/178-toggle-entity.md`](../specs/178-toggle-entity.md) (commit `76f75f85aafabcf9f698c85de0185e2ee64a98b5`, ветка `issue/178-toggle-entity`) - **Ревьюер:** Claude (ревью ТЗ ≠ автор), этап `S4-spec-review`, сессия без контекста написания ТЗ и без контекста r1 - **Цикл:** r2/4 (обычный трек — issue не `small`/`trivial`; метки `P1`, `feature`, `S4-spec-review`) ## Скоуп ревью Повторное ревью ТЗ #178 после красного вердикта r1 (High-1: отсутствовали обязательные разделы «Риски», «Откат», `Touch editor: …`, «Производительность»; Low-1: AC без инлайн-привязки к способу доказательства). Автор внёс правки коммитом `76f75f8` (`docs: address review of toggle entity spec`) — только документация, продуктовый код не менялся: `git diff origin/dev...HEAD --stat` показывает изменения только в `docs/reviews/SPEC-REVIEW-178-r1.md`, `docs/specs/178-toggle-entity.md`, `docs/specs/README.md`. Задача — проверить (а) что оба High/Low из r1 действительно закрыты по существу, а не только по названию раздела, (б) что переразметка секций (§14→§18, вставка новых §14–17) не сломала внутренние ссылки и нумерацию AC↔тестов, (в) что новый текст не содержит догадок, выданных за факты, (г) что документ в целом снова проходит §7.1/§2.5 целиком, а не только по пункту, который был назван в r1. Не в скоупе: реализация — её по-прежнему нет (тот же `git diff` подтверждает пустой `src/**`/`custom_components/**/*.py`), поэтому код-ревью не проводилось и не должно. ## Как проверялось 1. `docs/SCOPE.md`, `AGENTS.md`, `PROCESS.md` целиком (§1, §2.4, §2.5, §5, §7.1, §7.2, §8) — независимо от r1, в свежей сессии. 2. Issue #178: тело, комментарий аналитики владельца, «взял в работу», «ТЗ готово», вердикт r1, комментарий автора о внесённых правках. 3. `docs/reviews/SPEC-REVIEW-178-r1.md` целиком — что именно требовалось исправить и какими словами. 4. `git diff e46ef6f..76f75f8 -- docs/specs/178-toggle-entity.md` — построчный дифф, чтобы увидеть ровно то, что изменилось (только вставка §14–17, переразметка §14→§18/§15→§19/§16→§20, добавление «Доказательство:» к каждому пункту §19). 5. Текущий полный текст `docs/specs/178-toggle-entity.md` (76f75f8) целиком, не только новые разделы — иначе есть риск подтвердить фикс формально и не заметить, что старые разделы стали противоречить новым. 6. Перекрёстные ссылки `§N.M` по всему файлу (`grep -n "§[0-9]"`) — проверено, что после переразметки не осталось ссылок на устаревшие номера разделов (например, старое «§14» тестового контракта не должно указывать на новый «§14 Touch»). Не осталось ни одной. 7. `docs/TOUCH-SUPPORT.md` целиком — точная формулировка обязательной строки (`Touch editor: supported/best effort/intentionally degraded/not exposed`, строки 147–151) и смысл «best-effort editors» / «safety floor». 8. `docs/CONFIG-COMPATIBILITY.md` (раздел `marker.light_entity`, строки 176–191) — сверка формулировок §16 «Откат» ТЗ (lossless doctrine, «старый frontend стирает только при реконструкции marker») с уже принятым каноном для прецедентного поля. 9. Прецедентные ТЗ этого формата — `docs/specs/174-linked-virtual-light-controller.md`, `docs/specs/164-washer-active-cycle.md`, `docs/specs/084-passive-forced-light-sources.md`, `docs/specs/068-help-affordance.md` — как канон формулирует touch-строку и секцию рисков/отката/performance на практике, и есть ли прецедент отдельной декларации `Touch editor: supported` для одного конкретного контрола внутри в целом best-effort редактора (есть, #068: «поддерживается для самого affordance»). 10. Выборочная сверка новых технических утверждений §15.1 с реальным кодом: `src/devices.ts:317-325` (`ownControllableEntities`) — подтверждено, что функция работает по `d.entities` одного устройства (`Array.filter`, `Set`), без глобального обхода registry; заявление «линейно по числу сущностей одного устройства, без global registry scan» — не догадка, а факт, подтверждённый чтением кода. 11. `docs/specs/README.md:98` — трассируемость issue↔ТЗ не нарушена правкой. Гейты (`typecheck`/`test`/`build`) не прогонялись — на этапе ревью ТЗ продуктового кода нет, что подтверждено пустым диффом по классам A/B (PROCESS.md §2.7/§8 относят гейты к код-ревью, не к ревью ТЗ). ## Находки ### Low-2 — раздел touch не называет явно runtime-эффект на View/kiosk **Файл:** `docs/specs/178-toggle-entity.md:336-348` (§14 «Touch и accessibility»). `docs/PROCESS.md` §2.5 требует «влияние на touch по `docs/TOUCH-SUPPORT.md` (**View и киоск — блокирующие**)». §14 разбирает только диалог устройства (редактор): native `