# CODE-REVIEW — issue #323, заход r2 **Примечание о нумерации.** Заголовок задачи, переданный конвейером, указывал «заход r1 · блокирующих циклов 0 из 2». Это не соответствует фактическому состоянию: в дереве уже лежит закоммиченный `docs/reviews/CODE-REVIEW-323-r1.md` (коммит `3b915bd0`, класс C, трейлеры корректны), а в комментариях issue есть жёлтый вердикт `заход r1 · блокирующих циклов 1/2`, полученный на SHA `69facb99`, и последующий комментарий владельца «r1 → r2: M1 закрыта» на HEAD `fb8fdf47`. Текущий разбор — фактически **r2**, бюджет циклов до этого раунда равен **1/2** (лимит короткого трека — 2, §5.1). Документ ниже назван и оформлен как r2; если шаг публикации всё же соберёт имя `CODE-REVIEW-323-r1.md` из переданного заголовка, он затрёт настоящий r1 — заголовок задачи нужно поправить на стороне конвейера. **SHA материала:** `fb8fdf479c503992667c45294b28aede2d5056c3` (`git rev-parse HEAD` непосредственно перед подведением итогов). **Трек:** `trivial` (§5.1), лимит код-ревью — 2 цикла. **Класс изменения:** C (документация). `src/**`, `custom_components/**/*.py` не тронуты ни в этом раунде, ни в r1. ## Скоуп раунда — дельта r1 → r2 Предыдущий вердикт (r1, SHA `69facb99`) — жёлтый, High: 0, Medium: 1 (M1, в скоупе). Дельта объявлена по `git diff 69facb99..fb8fdf47`: ``` docs/USER-GUIDE.md | 6 +++--- docs/USER-GUIDE.ru.md | 4 ++-- docs/reviews/CODE-REVIEW-323-r1.md | 176 ++++++++++++++++++++++ (публикация r1 конвейером) 3 files changed ``` Один продуктивный коммит: `fb8fdf47` — «docs: both user guides install from the HACS default catalog too», трейлеры `Issue: #323` / `User-Visible: no`, сообщение коммита прямо ссылается на `CODE-REVIEW-323-r1 M1`. Второй файл в дельте (`docs/reviews/CODE-REVIEW-323-r1.md`) — собственный doc-коммит публикации `3b915bd0`, ожидаемый и не являющийся предметом ревью. Дельта локальна: правка ограничена ровно теми двумя файлами, что назвала находка M1, ничего за пределами её формулировки не задето. Ребейза на ушедший вперёд `dev` не было (родословная `fb8fdf47` — прямое продолжение `69facb99`), контракт поведения не менялся, новая подсистема не задета, объём дельты (10 строк в двух markdown-файлах) многократно меньше исходной задачи. Полный разбор не требуется — работает сокращение по §2.10. ## Закрытие раунда r1 | Находка r1 | Чем закрыта | Где видно | |---|---|---| | **M1** — `docs/USER-GUIDE.md` (82-83) и `docs/USER-GUIDE.ru.md` (82) учили добавлять custom-репозиторий вручную, противореча исправленному README | Шаг 1 в обоих файлах переписан: поиск «House Plan» в HACS, явная фраза «no custom repository needed» / «пользовательский репозиторий добавлять не нужно» — по образцу формулировки README | `docs/USER-GUIDE.md:82-83` (diff `69facb99..fb8fdf47`, коммит `fb8fdf47`); `docs/USER-GUIDE.ru.md:82` (тот же коммит). Проверено чтением: `sed -n '75,90p' docs/USER-GUIDE.md` и `docs/USER-GUIDE.ru.md` после правки, сверено построчно с формулировкой `README.md:88-91` / `README.ru.md:91-95` — смысл идентичен (входит в default-каталог, custom repository не нужен), терминология «основной каталог HACS» совпадает между RU-README и RU-USER-GUIDE | Дополнительно перепроверено grep'ом по всему трекаемому дереву (не только `.md`, без исключений кроме CHANGELOG/reviews/specs, чтобы не полагаться на грепы r1 без проверки): `git grep -rniE "custom.{0,25}repositor|HACS-Custom|пользовательск\S*\s+репозитор|custom.{0,15}Integration.{0,15}repositor"` находит только четыре ожидаемых строки — по одной новой формулировке в каждом из четырёх файлов (README.md, README.ru.md, USER-GUIDE.md, USER-GUIDE.ru.md). Ни устаревших упоминаний, ни расхождений в `custom_components/**`, `src/**` или где-либо ещё не осталось. M1 закрыта полностью, новых мест с тем же дефектом дельта не оставила. ## Унаследовано из r1 Без повторной проверки в этом раунде, ссылка — `docs/reviews/CODE-REVIEW-323-r1.md` на SHA `69facb99`: - **AC1** (бейдж `HACS-Custom` → `HACS-Default` в README.md/README.ru.md) — дельта r1→r2 не трогает README, доказательство r1 не устарело. - **AC2** (секция установки README — поиск вместо custom repository, my-кнопка/ restart/add integration/YAML-ресурс сохранены) — та же причина, README не в дельте. - Правки `docs/STATUS.md` и `docs/TESTING.md` (коммит `69facb99`) — вне дельты этого раунда, признаны корректными в r1. - Трейлеры `Issue: #323` / `User-Visible: no` на коммитах r1 (`343af61a`, `69facb99`) — проверены в r1, не переоценивались повторно. - Обоснование непрогона `check-docs.mjs`, инвариантов геометрии, смоков, `golden:verify`, backend-тестов и perf-профилей для диффа README/STATUS/TESTING (docs-only, `src/**` и геометрия не задеты) — рассуждение переносится и на делту r2, поскольку она тоже чисто текстовая и тоже не касается `src/**`. - Пункт «чего не проверял» из r1 (живой поиск в HACS UI, докс-скриншоты, отсутствие типа `bug` на трек `trivial`) — сохраняет силу, дельта этого раунда на эти пункты не влияет. ## Гейты этого раунда Дешёвые гейты прогнаны заново на `fb8fdf47`, как требует §2.10 (код/дерево изменились с r1, а стоят гейты минуты): | Гейт | Команда | Результат | |---|---|---| | Typecheck | `npx tsc --noEmit` | зелёный, без вывода, exit 0 | | Build | `npm run build` | зелёный, `dist/houseplan-card.js` собран за 11.9s | | Синхронность копий бандла | `git status --short dist/ custom_components/houseplan/frontend/ demo/srv/assets/` + `cmp dist/houseplan-card.js custom_components/houseplan/frontend/houseplan-card.js` | пусто / идентичны — класс D не менялся | | Unit-тесты | `npm test` | зелёный: 1358 объявлено, 1357 pass, 1 skipped, 0 fail | Не прогонялись, причина не изменилась относительно r1 (дельта тоже docs-only, не касается `src/**`, геометрии, рендера, backend): - `node scripts/check-docs.mjs` — дельта не трогает `src/**`, отпечаток скриншотов не мог устареть от правки в двух markdown-файлах руководства. - `npm run invariants -- --config …` — geometry/`layout`/толщина стен/ `marker.space`/`open_spans` не задеты ни разу за оба раунда. - Браузерные смоки (`demo/smoke_*.mjs`) — изменённые символы это markdown-текст `docs/USER-GUIDE*.md`, не код/тест; `smoke-select.mjs` не запускал по той же причине, что и в r1 (инструмент ищет связи по изменённым символам кода/тестов, а не по тексту руководств вне `demo/`). - `npm run golden:verify` — рендер, геометрия, стили не менялись. - `python -m pytest tests_backend -q` — `custom_components/**/*.py` не тронут. - Perf-профили — не названы в AC, не задеты. «Одно число — один источник»: дельта не вводит и не меняет пользовательских числовых величин; текстовая формулировка «в основном каталоге HACS, custom repository не нужен» теперь идентична между README и USER-GUIDE на обоих языках (см. таблицу закрытия M1 выше) — именно то расхождение, которое r1 поймал как Medium, теперь устранено единообразно. ## Находки этого раунда Нет. High: 0, Medium: 0, Low: 0. Дельта — точечный фикс, ничего нового не внесла и не задела соседнее поведение. ## Проверено и корректно - M1 закрыта: оба полных руководства (EN/RU) больше не учат ручному добавлению custom-репозитория и текстуально согласованы с README. - Расширенный grep (не только `.md`, без предположения, что r1 нашёл всё) подтверждает отсутствие других мест с тем же устаревшим паттерном. - Коммит `fb8fdf47` несёт корректные трейлеры (`Issue: #323`, `User-Visible: no`); `User-Visible: no` обоснован — поведение карточки/ интеграции не меняется, только текст документации, changelog-файлы не тронуты (согласуется). - Класс D (`dist/**`, `custom_components/houseplan/frontend/**`, `demo/golden/baselines/**`) не менялся ни в дельте, ни ранее. - Doc-коммит публикации r1 (`3b915bd0`) корректно трейлерован и не является предметом ревью — ожидаемый служебный коммит конвейера. ## Чего не проверял - Живой поиск «House Plan» в интерфейсе HACS — недоступен в окружении ревьюера; унаследовано из r1 без повторной попытки. - Докс-скриншоты/фингерпринт — не проверялись, `src/**` не тронут, `check-docs.mjs` не применим ни в r1, ни в r2. - Отсутствие меты типа (`bug`/`feature`/`tech-debt`) на issue при наличии `trivial` — уже отмечено и принято в r1 как решение владельца, не предмет этого раунда. ## Вердикт High: 0. Medium: 0. M1 из r1 закрыта полностью и без побочных находок. Все AC (унаследованные из r1, дельта их не задевает) доказаны; дополнительная находка r1, из-за которой стоял жёлтый, устранена — задача теперь решает заявленный сценарий целиком: и README, и полное руководство на обоих языках согласованно говорят «House Plan уже в default-каталоге HACS, custom repository не нужен». Вердикт: зелёный.