# CODE-REVIEW — issue #565, заход r1 **Вердикт: жёлтый · заход r1 · блокирующих циклов 1/4 · High: 0 · Medium: 1 → в задаче** ## Скоуп Материал ревью: `git log --oneline origin/dev..HEAD` / `git diff origin/dev...HEAD` на SHA `127cd07ba78fc75cd776ebd6518248a6bef91e82` (рабочая копия на нём же). Диапазон — один продуктовый коммит `127cd07b` (`fix: улучшить доступность View (#565)`, трейлеры `Issue: #565` / `User-Visible: yes` на месте) плюс предшествующий `65a426d6` (`docs: review document for #565`, публикация SPEC-REVIEW-565-r1 конвейером). ТЗ (тело issue #565, зафиксировано владельцем 2026-09-14, ревью ТЗ зелёное, `docs/reviews/SPEC-REVIEW-565-r1.md`) реализует три независимых дефекта доступности: 1. **AC1/AC2** — полоса вкладок пространств получает именованную навигацию и ровно один `aria-current="page"`, Tab/Enter/Space не меняются. 2. **AC3/AC4** — доступное имя устройства схлопывает точные повторы локализованных сегментов (в основном View и `houseplan-space-card`), не трогая различающиеся факты. 3. **AC5–AC7** — клавиатурный `:focus-visible` на маркере устройства в View открывает ту же tooltip, что и mouse-hover, следует за фокусом, закрывается по перечисленным границам и не активируется touch/pen. Не-скоуп: контраст/цвет/текст подписей комнат (**AC8**, явно защищён — не тронут ни один файл стилей/логики подписей), конфиг/миграции (**AC9**), общий ARIA-tablist, roving tabindex, интерактивность статической карточки — всё подтверждено диффом (см. «Что проверено»). Файлы: `src/houseplan-card.ts`, `src/live-hover.ts`, `src/live-interaction-runtime.ts`, `src/device-presentation.ts`, `src/space-render.ts`, `src/i18n/{en,ru,de,fr}.json`, `test/view-accessibility.test.mjs`, `test/device-presentation.test.mjs`, `demo/smoke_household_journeys.mjs`, `demo/smoke_space_card.mjs`, `scripts/mutation-registry.mjs`, документация (`docs/CHANGELOG{.ru,}.md`, `docs/TOUCH-SUPPORT.md`, `docs/UX-MODES.md`, `docs/USER-GUIDE{.ru,}.md`, `docs/TESTING.md`) — соответствует хендоффу. ## Как проверялось | Гейт | Результат | Как учтён | |---|---|---| | `npx tsc --noEmit` | не перезапускал | Validate зелёный на точном SHA `127cd07b` (https://github.com/Matysh/houseplan-card/actions/runs/34814012888) покрывает | | `npm test` | не перезапускал | покрывается тем же Validate-прогоном | | `npm run build` + сверка 3 копий бандла | не перезапускал | покрывается тем же Validate-прогоном; diff-stat подтверждает, что все три копии (`dist/`, `custom_components/.../frontend/`, корневые `houseplan-card.js`/`houseplan-panel.js`) изменены синхронно | | `node scripts/check-docs.mjs` | не перезапускал | часть Validate; diff трогает `src/**`, автор зафиксировал ожидаемое Linux-предупреждение отдельно | | mutation-gate (4 новых witness) | не перезапускал | часть Validate (`mutation-gate` шардируется в `validate.yml`); прочитаны сами мутанты в `scripts/mutation-registry.mjs` — патчи корректно снимают именно ту защиту, которую называют (см. таблицу AC ниже) | | `node scripts/smoke-select.mjs --base origin/dev --head HEAD` | не запускал сам инструмент | по диффу очевидны затронутые смоки: `demo/smoke_household_journeys.mjs`, `demo/smoke_space_card.mjs` — оба уже расширены в этом коммите; `demo/smoke_touch_tips.mjs` не изменён, но прочитан целиком (ниже) | | `node demo/smoke_household_journeys.mjs`, `node demo/smoke_space_card.mjs`, `node demo/smoke_touch_tips.mjs` | **не прогонял** | браузерные смоки не запускались в этом ревью; вместо исполнения — построчное чтение новых проверок (см. «Находки» и «Что проверено») и прослеживание кода, который они должны ловить. Это ослабление отмечаю явно: находка ниже обнаружена именно потому, что код не исполнялся под сценарием, которого смоки не покрывают | | `npm run golden:verify` | не требуется | AC8 защищён явно: ни один файл стилей/логики подписей комнат не тронут (`git diff --stat -- src/` не включает `styles/`, `space-render` правки — только импорт `deviceAccessibleLabel` и замена `.filter(Boolean).join(', ')`); `
→