# Индекс ревью Генерируется `node scripts/reviews-index.mjs` (#635) — не редактировать руками. Документов: 1024, issue: 362. Вердикт: 🟢 зелёный · 🟡 жёлтый · 🔴 красный · ⚪ не распознан (свободная форма старых документов). H/M — число High/Medium по строке вердикта или заголовкам находок. Файлы — пути, названные в находках; ищите по имени файла: `grep form-kit INDEX.md`. | Issue | Документ | Этап · раунд | Вердикт | H | M | Находки | Файлы | |---|---|---|---|---:|---:|---|---| | #642 | [SPEC-REVIEW-642-r1.md](SPEC-REVIEW-642-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #641 | [CODE-REVIEW-641-r1.md](CODE-REVIEW-641-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | нет исполняемого автотеста на ключевой guard в accept.mjs | `accept.mjs` `demo/golden/accept.mjs` `test/golden-wsl-artifact.test.mjs` `wsl-attestation.json` `test/golden-capture-provenance.test.mjs` `scripts/mutation-registry.mjs` `scripts/golden-wsl-artifact.mjs` | | #641 | [CODE-REVIEW-641-r2.md](CODE-REVIEW-641-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #640 | [SPEC-REVIEW-640-r1.md](SPEC-REVIEW-640-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | AC3 называет browser-smoke «unit»-тестом | `demo/smoke_furniture_lazy_art.mjs` | | #640 | [CODE-REVIEW-640-r1.md](CODE-REVIEW-640-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #639 | [CODE-REVIEW-639-r1.md](CODE-REVIEW-639-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | Новая запись smoke-links.mjs для smoke_space_settings_form.mjs описывает проверку, кото… | `smoke-links.mjs` `smoke_space_settings_form.mjs` `scripts/smoke-links.mjs` `demo/smoke_space_settings_form.mjs` `src/editors/space-form.ts` `form-kit.ts` | | #639 | [CODE-REVIEW-639-r2.md](CODE-REVIEW-639-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #637 | [CODE-REVIEW-637-r1.md](CODE-REVIEW-637-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | ложный «—» вместо настоящего «0 ч» в медианах | `scripts/process-metrics.mjs` | | #637 | [CODE-REVIEW-637-r2.md](CODE-REVIEW-637-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #636 | [CODE-REVIEW-636-r1.md](CODE-REVIEW-636-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #635 | [CODE-REVIEW-635-r1.md](CODE-REVIEW-635-r1.md) | code · r1 | 🟡 жёлтый | 1 | 0 | индекс молчаливо теряет находки и врёт числами по текущему | `docs/reviews/CODE-REVIEW-639-r1.md` `CODE-REVIEW-637-r1.md` `docs/reviews/CODE-REVIEW-594-r1.md` `docs/LESSONS.md` | | #635 | [CODE-REVIEW-635-r2.md](CODE-REVIEW-635-r2.md) | code · r2 | 🟡 жёлтый | 1 | 1 | docs/reviews/INDEX.md, зафиксированный в материале ревью, устарел на собственном SHA — …; parseFindings/parseFiles: фолбэк «первая строка тела блока» вырезает начало буллета и п… | `docs/reviews/INDEX.md` `SPEC-REVIEW-625-r1.md` `SPEC-REVIEW-625-r2.md` `CODE-REVIEW-625-r1.md` `CODE-REVIEW-625-r2.md` `process.yml` `test/reviews-index.test.mjs` `INDEX.md` | | #635 | [CODE-REVIEW-635-r3.md](CODE-REVIEW-635-r3.md) | code · r3 | 🟢 зелёный | 0 | 0 | firstParagraph: ветка нет\b в фильтре мёртвая из-за ASCII-only \b в JS-регэкспах, расхо… | `scripts/reviews-index.mjs` | | #634 | [CODE-REVIEW-634-r1.md](CODE-REVIEW-634-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #633 | [CODE-REVIEW-633-r1.md](CODE-REVIEW-633-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #632 | [CODE-REVIEW-632-r1.md](CODE-REVIEW-632-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | trivial-трек не входит в признаки продуктового потока | `scripts/task-packet.mjs` `task-packet.mjs` | | #632 | [CODE-REVIEW-632-r2.md](CODE-REVIEW-632-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #632 | [CODE-REVIEW-632-r3.md](CODE-REVIEW-632-r3.md) | code · r3 | 🟢 зелёный | 0 | 0 | — | — | | #631 | [CODE-REVIEW-631-r1.md](CODE-REVIEW-631-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #631 | [CODE-REVIEW-631-r2.md](CODE-REVIEW-631-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #630 | [CODE-REVIEW-630-r1.md](CODE-REVIEW-630-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #629 | [SPEC-REVIEW-629-r1.md](SPEC-REVIEW-629-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #627 | [SPEC-REVIEW-627-r1.md](SPEC-REVIEW-627-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | избыточное (не противоречивое) условие в AC2; влияние на touch не названо явным пунктом | `docs/TOUCH-SUPPORT.md` | | #625 | [SPEC-REVIEW-625-r1.md](SPEC-REVIEW-625-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | новый инвариант markers[].id не описывает исход для уже испорченной хранимой конфигурации; продуктовые формулировки §7.1 неполны; не проговорены явные «нет» по i18n/touch | `validation.py` `__init__.py` | | #625 | [SPEC-REVIEW-625-r2.md](SPEC-REVIEW-625-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #625 | [CODE-REVIEW-625-r1.md](CODE-REVIEW-625-r1.md) | code · r1 | 🟡 жёлтый | 0 | 0 | Три из четырёх точек вызова validate_active_marker_ids не имеют ни одного теста, exerci…; AC5 текстуально обещает «отдельные тесты сохраняют поведение при отсутствующем length» …; store.py:async_save_config_state — controller.async_flush() и последующий controller.re… | `custom_components/houseplan/websocket_api.py` `test_validation.py` | | #625 | [CODE-REVIEW-625-r2.md](CODE-REVIEW-625-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #624 | [SPEC-REVIEW-624-r1.md](SPEC-REVIEW-624-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | AC1-b: «чем краснеет» не соответствует заявленному свидетелю | `scripts/gate-small.mjs` `scripts/bundle-budget.mjs` `scripts/monolith-baseline.json` | | #624 | [SPEC-REVIEW-624-r2.md](SPEC-REVIEW-624-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #624 | [CODE-REVIEW-624-r1.md](CODE-REVIEW-624-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #622 | [CODE-REVIEW-622-r1.md](CODE-REVIEW-622-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #621 | [CODE-REVIEW-621-r1.md](CODE-REVIEW-621-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #619 | [CODE-REVIEW-619-r1.md](CODE-REVIEW-619-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #618 | [SPEC-REVIEW-618-r1.md](SPEC-REVIEW-618-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | нотация h в B5 не встречается в коде | `docs/FILTERING.md` | | #617 | [SPEC-REVIEW-617-r1.md](SPEC-REVIEW-617-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | «новый необязательный параметр» уже существует | `src/backdrop-pick.ts` `houseplan-editor-runtime.ts` | | #615 | [SPEC-REVIEW-615-r1.md](SPEC-REVIEW-615-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | AC3 называет несуществующую защиту от расползания на плашки цвета | `smoke_room_settings_form.mjs` `smoke_space_settings_form.mjs` `smoke_device_settings_form.mjs` `smoke_dialog_polish_605.mjs` `smoke_general_settings_form.mjs` | | #615 | [SPEC-REVIEW-615-r2.md](SPEC-REVIEW-615-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #614 | [SPEC-REVIEW-614-r1.md](SPEC-REVIEW-614-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #614 | [CODE-REVIEW-614-r1.md](CODE-REVIEW-614-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | AC1/AC2/AC3 требуют unit-тест, а он не написан | `test/dialog-baseline.test.mjs` `test/space-dialog.test.mjs` `general-form-state.ts` `space-form-state.ts` `marker-form-state.ts` `tsconfig.test.json` `dialog-baseline.ts` `scripts/mutation-registry.mjs` | | #614 | [CODE-REVIEW-614-r2.md](CODE-REVIEW-614-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #613 | [SPEC-REVIEW-613-r1.md](SPEC-REVIEW-613-r1.md) | spec · r1 | 🟡 жёлтый | 1 | 1 | High. Принятое предположение о scroll-инвалидации не работает в основном заявленном сце…; Medium (в скоупе), сопутствует H1. AC1/AC2 не требуют, чтобы smoke-контейнер пересекал … | `demo/serve.mjs` | | #613 | [SPEC-REVIEW-613-r2.md](SPEC-REVIEW-613-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #613 | [CODE-REVIEW-613-r1.md](CODE-REVIEW-613-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #612 | [CODE-REVIEW-612-r1.md](CODE-REVIEW-612-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #611 | [SPEC-REVIEW-611-r1.md](SPEC-REVIEW-611-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | контракт не называет второй код-путь с идентичным дефектом (_repair_target_space_refs) | `custom_components/houseplan/import_export.py` `import_export.py` | | #611 | [SPEC-REVIEW-611-r2.md](SPEC-REVIEW-611-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #611 | [CODE-REVIEW-611-r1.md](CODE-REVIEW-611-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | ветки live/ambiguous AC2 не имеют собственного мутанта | `import_export.py` `scripts/mutation-registry.mjs` | | #610 | [SPEC-REVIEW-610-r1.md](SPEC-REVIEW-610-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #610 | [CODE-REVIEW-610-r1.md](CODE-REVIEW-610-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #610 | [CODE-REVIEW-610-r2.md](CODE-REVIEW-610-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #609 | [SPEC-REVIEW-609-r1.md](SPEC-REVIEW-609-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | строки :558/574 для ветки ha-dialog в преамбуле устарели на ~8 строк; план автотестов не называет явно «влияние на производительность: нет» | `PROCESS.md` | | #609 | [CODE-REVIEW-609-r1.md](CODE-REVIEW-609-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | AC5 не доказан ни одним добавленным свидетелем; некорректная ссылка на AC в mutation-registry.mjs | `demo/verify_ha_form_shell_609.mjs` `demo/smoke_ha_form_shell_parity.mjs` `demo/srv/demo.html` `verify_ha_form_shell_609.mjs` `mutation-registry.mjs` `hp-dialog.ts` `scripts/mutation-registry.mjs` | | #609 | [CODE-REVIEW-609-r2.md](CODE-REVIEW-609-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #608 | [SPEC-REVIEW-608-r1.md](SPEC-REVIEW-608-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | «Шесть потребителей» на самом деле семь вызовов rangeLine; Ответ владельца на Q1–Q3 не оставлен отдельным комментарием | `marker-dialog.ts` `form-kit.ts` `docs/SCOPE.md` | | #608 | [CODE-REVIEW-608-r1.md](CODE-REVIEW-608-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | Русский changelog: сломанное предложение (Medium, в скоупе — правится в этой же задаче) | `docs/CHANGELOG.ru.md` `docs/CHANGELOG.md` | | #608 | [CODE-REVIEW-608-r2.md](CODE-REVIEW-608-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #607 | [SPEC-REVIEW-607-r1.md](SPEC-REVIEW-607-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | предварительный блок ## AC в начале тела issue называет несуществующую кнопку | — | | #607 | [CODE-REVIEW-607-r1.md](CODE-REVIEW-607-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | новые guard'ы AC4 проверяются только смоком, но не зарегистрированы в scripts/mutation-… | `scripts/mutation-registry.mjs` `demo/smoke_dialog_modal_recovery.mjs` `scripts/mutation-gate.mjs` | | #607 | [CODE-REVIEW-607-r2.md](CODE-REVIEW-607-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #606 | [SPEC-REVIEW-606-r1.md](SPEC-REVIEW-606-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | 1. Предположение 1 («резолвер покрывает арт и lazy-gate») по буквальному прочтению не н… | `src/decor-image-editor.ts` `demo/smoke_furniture.mjs` `test/furniture-assets.test.mjs` | | #606 | [CODE-REVIEW-606-r1.md](CODE-REVIEW-606-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #605 | [SPEC-REVIEW-605-r1.md](SPEC-REVIEW-605-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #605 | [CODE-REVIEW-605-r1.md](CODE-REVIEW-605-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #604 | [CODE-REVIEW-604-r1.md](CODE-REVIEW-604-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #603 | [SPEC-REVIEW-603-r1.md](SPEC-REVIEW-603-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | «Отменить» в discard-confirm пересекается с уже существующим термином «Отменить» = Undo | `docs/USER-GUIDE.ru.md` | | #603 | [CODE-REVIEW-603-r1.md](CODE-REVIEW-603-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #602 | [SPEC-REVIEW-602-r1.md](SPEC-REVIEW-602-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | неоднозначность «уже настроенного» radar-toggle; неверная пара changelog-файлов | `src/editors/radar-section.ts` `src/radar-editor.ts` `src/radar-model.ts` `CHANGELOG.md` `docs/CHANGELOG.md` `docs/CHANGELOG.ru.md` `AGENTS.md` `scripts/validate-commit-provenance.mjs` | | #602 | [SPEC-REVIEW-602-r2.md](SPEC-REVIEW-602-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #602 | [CODE-REVIEW-602-r1.md](CODE-REVIEW-602-r1.md) | code · r1 | 🟡 жёлтый | 0 | 0 | golden:verify красный на материале ревью, обновление golden-сцен из плана тестирования … | `demo/golden/policy.mjs` `check-docs.mjs` `scripts/validate-commit-provenance.mjs` | | #602 | [CODE-REVIEW-602-r2.md](CODE-REVIEW-602-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #601 | [CODE-REVIEW-601-r1.md](CODE-REVIEW-601-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #600 | [SPEC-REVIEW-600-r1.md](SPEC-REVIEW-600-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | регресс-гарантия для существующих кнопок действий не названа отдельным AC | `SPEC.md` `marker-dialog.ts` `test/space-copy-runtime.test.mjs` `test/space-dialog.test.mjs` `demo/smoke_danger_confirmation.mjs` `test/zigbee-topology.test.mjs` `demo/smoke_zigbee_topology_hover.mjs` `demo/smoke_space_copy.mjs` | | #600 | [CODE-REVIEW-600-r1.md](CODE-REVIEW-600-r1.md) | code · r1 | 🟡 жёлтый | 0 | 4 | Room settings: подпись «Temperature» в 5-сегменте переносится посреди слова; Device dialog: у Glow radius появилась не согласованная владельцем блокировка Save; Дефект №5 (поповер «?» обрезается границей диалога комнаты) не имеет свидетеля закрытия; ACCEPTANCE.md: заявлено 11 эталонных сцен, фактически принято 13; docs/USER-GUIDE.ru.md:529 — испорченная строка таблицы | — | | #600 | [CODE-REVIEW-600-r2.md](CODE-REVIEW-600-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | .hpf-seg label: min-width: fit-content (колонка не сжимается ниже слова) + overflow-wra…; glowRadiusValid/проблема marker-glow-radius удалены целиком; marker-dialog.ts больше не…; Свидетель добавлен: новый смок доказывает исполнением, что подсказка живёт вне скроллер…; Абзац переписан: явно «13 сцен» = 11 из ТЗ + 2 room-temperature-dialog-, с объяснением … | — | | #598 | [SPEC-REVIEW-598-r1.md](SPEC-REVIEW-598-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | судьба marker.run_target_gone не решена, счётчик i18n не сходится | `src/editors/marker-dialog.ts` | | #598 | [SPEC-REVIEW-598-r2.md](SPEC-REVIEW-598-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #598 | [CODE-REVIEW-598-r1.md](CODE-REVIEW-598-r1.md) | code · r1 | 🔴 красный | 1 | 3 | AC8 (эталоны) не выполнен: golden:verify красный на этом SHA; AC2/AC3 нарушены: изменён один из «неприкосновенных» .srcrow-смоков; Сегментированный переключатель обещан в семи местах ТЗ, реализован в одном; AC5 доказан мутантом только наполовину; AC1 не имеет обещанного автотеста для диалога «Пространство» (закрыто чтением) | `src/editors/general-settings-dialog.ts` `src/editors/space-settings-dialog.ts` `src/editors/marker-dialog.ts` `demo/smoke_tap_run.mjs` `smoke_general_settings.mjs` `smoke_tap_run.mjs` `demo/smoke_marker_dialog_cards.mjs` `space-settings-dialog.ts` | | #598 | [CODE-REVIEW-598-r2.md](CODE-REVIEW-598-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #597 | [SPEC-REVIEW-597-r1.md](SPEC-REVIEW-597-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | AC2 заявляет проверку «ни одно из пяти правил не лежит в листе панели литералом», но на…; К3/AC3 заявляют байт-в-байт неизменность выхода formKitCss(CARD_DIALOG_FORM_KIT), но на… | `src/summary-panel-editor-style.ts` `test/form-kit.test.mjs` `test/styles-split.test.mjs` `styles-split.test.mjs` | | #597 | [SPEC-REVIEW-597-r2.md](SPEC-REVIEW-597-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #597 | [CODE-REVIEW-597-r1.md](CODE-REVIEW-597-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | устаревший обязательный гейт check-docs не закрыт | `src/styles/form-kit.styles.ts` `src/summary-panel-editor-style.ts` `USER-GUIDE.ru.md` `docs/images/screenshots.json` | | #597 | [CODE-REVIEW-597-r2.md](CODE-REVIEW-597-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #596 | [CODE-REVIEW-596-r1.md](CODE-REVIEW-596-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #595 | [CODE-REVIEW-595-r1.md](CODE-REVIEW-595-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #594 | [SPEC-REVIEW-594-r2.md](SPEC-REVIEW-594-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 1 | Раздел «i18n» ТЗ не называет ключи для текста заголовков четырёх новых карточек-групп (… | — | | #594 | [SPEC-REVIEW-594-r3.md](SPEC-REVIEW-594-r3.md) | spec · r3 | 🟢 зелёный | 0 | 0 | — | — | | #594 | [CODE-REVIEW-594-r1.md](CODE-REVIEW-594-r1.md) | code · r1 | 🟡 жёлтый | 0 | 3 | AC7 не закрыт до конца — эталоны не приняты; отпечаток скриншотов документации не обновлён; AC1 доказан у́же, чем заявлено | `docs/images/screenshots.json` `test/form-kit.test.mjs` `demo/smoke_room_settings.mjs` `smoke_color_picker_consumers.mjs` `smoke_room_temperature_thresholds.mjs` | | #594 | [CODE-REVIEW-594-r2.md](CODE-REVIEW-594-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #594 | [CODE-REVIEW-594-r3.md](CODE-REVIEW-594-r3.md) | code · r3 | 🟢 зелёный | 0 | 0 | — | — | | #593 | [SPEC-REVIEW-593-r1.md](SPEC-REVIEW-593-r1.md) | spec · r1 | 🔴 красный | 1 | 0 | Оба продуктовых решения (Р1 «кактус → plant», Р2 «при отказе чанка не рисуется ничего»)…; М1. AC9 и §7 заявляют защиту трёх бюджетов через npm run bundle:budget, но код гейта фа… | `PROCESS.md` `docs/FURNITURE.md` `scripts/bundle-manifest.mjs` `furniture-plan-art.generated.ts` `furniture-menu-art.generated.ts` `scripts/bundle-budget.mjs` | | #593 | [SPEC-REVIEW-593-r2.md](SPEC-REVIEW-593-r2.md) | spec · r2 | 🔴 красный | 1 | 0 | Воспроизведение | `test/furniture-assets.test.mjs` `assets/furniture/houseplan-0.3.0/README.md` `pack.json` `LICENSE.md` `README.md` `assets/furniture/houseplan-0.3.0/pack.json` `PROCESS.md` | | #593 | [SPEC-REVIEW-593-r3.md](SPEC-REVIEW-593-r3.md) | spec · r3 | 🟢 зелёный | 0 | 0 | — | — | | #593 | [CODE-REVIEW-593-r1.md](CODE-REVIEW-593-r1.md) | code · r1 | 🟡 жёлтый | 0 | 2 | docs/ARCHITECTURE.md не обновлён, хотя ТЗ явно называет это условием; сцена tray-narrow-palette-en меняется, но не объявлена в списке golden-приёмки | `docs/ARCHITECTURE.md` `docs/FURNITURE.md` `docs/images/screenshots.json` `demo/golden/matrix.mjs` `scripts/golden-acceptance.mjs` `artifacts/golden/golden-report.json` | | #593 | [CODE-REVIEW-593-r2.md](CODE-REVIEW-593-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #592 | [SPEC-REVIEW-592-r1.md](SPEC-REVIEW-592-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 0 | М1. AC2 не называет один из golden-эталонов, который рендерит код именно внутри перенос…; Шапка «Аналитика» называет запас обоих ядер «4», фактический запас (по мере, которую ис… | `demo/golden/matrix.mjs` `demo/golden/harness.mjs` | | #592 | [SPEC-REVIEW-592-r2.md](SPEC-REVIEW-592-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #592 | [CODE-REVIEW-592-r1.md](CODE-REVIEW-592-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | «перенесённая» строка в гейте no-new-any матчится по всему диффу, а не по паре файлов р…; Нет — все второстепенные наблюдения либо покрыты объяснением автора (device-icon-state-… | `scripts/no-new-any.mjs` `brand-new-feature.ts` `room-settings-dialog.ts` `space-settings-dialog.ts` `test/no-new-any.test.mjs` `test/houseplan-source.mjs` | | #592 | [CODE-REVIEW-592-r2.md](CODE-REVIEW-592-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #588 | [SPEC-REVIEW-588-r1.md](SPEC-REVIEW-588-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 0 | М1. Три ветки пылесоса, явно включённые в скоуп, не имеют ни одного AC/теста/мутанта; М2. docs/USER-GUIDE.ru.md и docs/FILTERING.md описывают «подсветку убираемой комнаты» п… | `src/houseplan-card.ts` `houseplan-card.ts` `test/device-presentation-policy.test.mjs` `smoke_static_icon.mjs` `device-value-badge.ts` `device-pulse.ts` `demo/smoke_static_icon.mjs` `docs/USER-GUIDE.ru.md` | | #588 | [SPEC-REVIEW-588-r2.md](SPEC-REVIEW-588-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 0 | Третий факт AC6 (отсутствие .vacwarn) не доказывается способом, который сам же AC6 назы…; Новых Low-находок в дельте не найдено. Low из r1 (нечёткость «чем краснеет» AC7/бывший … | `demo/smoke_static_icon.mjs` `src/vacuum-routes.ts` `demo/smoke_vacuum_multifloor.mjs` `smoke_vacuum_multifloor.mjs` | | #588 | [SPEC-REVIEW-588-r3.md](SPEC-REVIEW-588-r3.md) | spec · r3 | 🟢 зелёный | 0 | 0 | — | — | | #588 | [CODE-REVIEW-588-r1.md](CODE-REVIEW-588-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | docs/TESTING.md называет непроверяемую поверхность «PDF» | `docs/TESTING.md` `src/pdf/pdf-export.ts` `pdf-scene.ts` `src/pdf/pdf-scene.ts` `pdf-export.ts` `src/device-presentation.ts` | | #587 | [CODE-REVIEW-587-r1.md](CODE-REVIEW-587-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #586 | [CODE-REVIEW-586-r1.md](CODE-REVIEW-586-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #585 | [SPEC-REVIEW-585-r1.md](SPEC-REVIEW-585-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #585 | [CODE-REVIEW-585-r1.md](CODE-REVIEW-585-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | устаревшая строка docs/STATUS.md и отсутствующий хендофф evidence | `docs/STATUS.md` | | #585 | [CODE-REVIEW-585-r2.md](CODE-REVIEW-585-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #584 | [SPEC-REVIEW-584-r1.md](SPEC-REVIEW-584-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | влияние на touch не названо; 1. Раздел «UX» и «скоуп/не-скоуп» не оформлены отдельными заголовками. Содержание по фа… | `docs/TOUCH-SUPPORT.md` | | #584 | [SPEC-REVIEW-584-r2.md](SPEC-REVIEW-584-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #584 | [CODE-REVIEW-584-r1.md](CODE-REVIEW-584-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | рост ленивого чанка furniture-plan-art.generated не назван числом, как того требует соб… | `scripts/bundle-budget.mjs` | | #584 | [CODE-REVIEW-584-r2.md](CODE-REVIEW-584-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #583 | [SPEC-REVIEW-583-r1.md](SPEC-REVIEW-583-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | 1, снята решением ревьюера с записью | — | | #583 | [CODE-REVIEW-583-r1.md](CODE-REVIEW-583-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | Золотой (golden) семантический контракт для iso-дверей не обновлён под новое поведение … | `demo/golden/run.mjs` `demo/golden/matrix.mjs` `src/iso-openings.ts` `test/iso-openings.test.mjs` `test/isometric-contract.test.mjs` `demo/smoke_isometric_contract.mjs` `matrix.mjs` | | #583 | [CODE-REVIEW-583-r2.md](CODE-REVIEW-583-r2.md) | code · r2 | 🟡 жёлтый | 0 | 1 | — | — | | #582 | [SPEC-REVIEW-582-r1.md](SPEC-REVIEW-582-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | AC5 не несёт собственного независимого доказательства (снято ревьюером) | `houseplan-card.ts` | | #582 | [CODE-REVIEW-582-r1.md](CODE-REVIEW-582-r1.md) | code · r1 | 🔴 красный | 0 | 0 | — | — | | #582 | [CODE-REVIEW-582-r2.md](CODE-REVIEW-582-r2.md) | code · r2 | 🔴 красный | 0 | 0 | — | — | | #582 | [CODE-REVIEW-582-r3.md](CODE-REVIEW-582-r3.md) | code · r3 | 🟢 зелёный | 0 | 0 | — | — | | #581 | [SPEC-REVIEW-581-r1.md](SPEC-REVIEW-581-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #581 | [CODE-REVIEW-581-r1.md](CODE-REVIEW-581-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #580 | [SPEC-REVIEW-580-r1.md](SPEC-REVIEW-580-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | ТЗ не отвечает на несколько обязательных пунктов §7.1 / чек-листа DoR §2.5, оставляя их…; Контракт п.4 использует немодальную формулировку («может оставаться видимым»), которую … | `docs/SCOPE.md` `PROCESS.md` `docs/TOUCH-SUPPORT.md` `docs/SUN.md` | | #580 | [SPEC-REVIEW-580-r2.md](SPEC-REVIEW-580-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #580 | [CODE-REVIEW-580-r1.md](CODE-REVIEW-580-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #580 | [CODE-REVIEW-580-r2.md](CODE-REVIEW-580-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #579 | [SPEC-REVIEW-579-r1.md](SPEC-REVIEW-579-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #579 | [CODE-REVIEW-579-r1.md](CODE-REVIEW-579-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | AC4 (матрица day cycle/Glow/room fills/hatching/фон) не имеет тестового доказательства; AC2 не имеет именованного мутанта. У AC2 («бюджет сохранён») нет специального MUTANT_DE… | `test/live-viewport.test.mjs` `demo/smoke_live_pan_coverage.mjs` `demo/screencast_visual_continuity.mjs` `demo/srv/demo.html` `src/houseplan-card.ts` | | #579 | [CODE-REVIEW-579-r2.md](CODE-REVIEW-579-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #578 | [SPEC-REVIEW-578-r1.md](SPEC-REVIEW-578-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | i18n закрыт только косвенно; сценарий «новый mouse pointerdown сразу после pinch» не назван явно ни в одном AC | `test/touch-gesture-click-guard.test.mjs` | | #578 | [CODE-REVIEW-578-r1.md](CODE-REVIEW-578-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #577 | [SPEC-REVIEW-577-r1.md](SPEC-REVIEW-577-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | раздел «Release-артефакты» не называет два документа, которые эта же задача обязана обн… | `docs/CHANGELOG.md` `.ru.md` `docs/SUN.md` `docs/USER-GUIDE.ru.md` `docs/TESTING.md` `docs/WALL-THICKNESS.md` `docs/CONFIG-COMPATIBILITY.md` `WALL-THICKNESS.md` | | #577 | [SPEC-REVIEW-577-r2.md](SPEC-REVIEW-577-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #577 | [CODE-REVIEW-577-r1.md](CODE-REVIEW-577-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | AC4 и AC7 объявляют доказательство golden, но ни один golden-сценарий и эталон для режи… | `demo/golden/matrix.mjs` `demo/smoke_sun.mjs` `test/sun.test.mjs` | | #577 | [CODE-REVIEW-577-r2.md](CODE-REVIEW-577-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #576 | [CODE-REVIEW-576-r1.md](CODE-REVIEW-576-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #573 | [CODE-REVIEW-573-r1.md](CODE-REVIEW-573-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | evaluateCiProof меняет поведение merge/review-потребителей без теста и вопреки утвержде… | `scripts/ci-proof.mjs` `scripts/merge-candidate.mjs` `scripts/validate-gate.mjs` `validate.yml` `merge-candidate.mjs` `validate-gate.mjs` `test/ci-proof.test.mjs` `test/merge-candidate.test.mjs` | | #573 | [CODE-REVIEW-573-r2.md](CODE-REVIEW-573-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #571 | [CODE-REVIEW-571-r1.md](CODE-REVIEW-571-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #570 | [SPEC-REVIEW-570-r1.md](SPEC-REVIEW-570-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #570 | [CODE-REVIEW-570-r1.md](CODE-REVIEW-570-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #569 | [CODE-REVIEW-569-r1.md](CODE-REVIEW-569-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #568 | [CODE-REVIEW-568-r1.md](CODE-REVIEW-568-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #567 | [CODE-REVIEW-567-r1.md](CODE-REVIEW-567-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #566 | [CODE-REVIEW-566-r1.md](CODE-REVIEW-566-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | «наблюдение» ложно утверждает «владелец жив» там, где владелец не подтверждён | `scripts/model-invariants.mjs` `src/space-reference-repair.ts` `test/model-invariants.test.mjs` | | #566 | [CODE-REVIEW-566-r2.md](CODE-REVIEW-566-r2.md) | code · r2 | 🟡 жёлтый | 0 | 0 | — | — | | #565 | [SPEC-REVIEW-565-r1.md](SPEC-REVIEW-565-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #565 | [CODE-REVIEW-565-r1.md](CODE-REVIEW-565-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | Клавиатурная focus-tooltip тихо стирается наведением мыши на комнату — нарушает контрак… | `src/houseplan-card.ts` `src/logic.ts` `houseplan-card.ts` `docs/UX-MODES.md` `demo/smoke_household_journeys.mjs` | | #565 | [CODE-REVIEW-565-r2.md](CODE-REVIEW-565-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #564 | [SPEC-REVIEW-564-r1.md](SPEC-REVIEW-564-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | DoR: «затронутые файлы и модули» не названы (Medium, в скоупе); «Сценарий» и «Что человек увидит» объединены без явной персоны на | `PROCESS.md` `src/styles/devices.styles.ts` `src/houseplan-card.ts` `src/houseplan-editor-runtime.ts` `hp-device-preview.ts` `docs/specs/213-device-marker-geometry.md` `docs/SCOPE.md` | | #564 | [SPEC-REVIEW-564-r2.md](SPEC-REVIEW-564-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #564 | [CODE-REVIEW-564-r1.md](CODE-REVIEW-564-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | AC2 не имеет заявленного browser-smoke доказательства для Icon/Text/Double/legacy и чет… | `test/device-hit-owner.test.mjs` `docs/device-hit-owner.test.mjs` `demo/smoke_household_journeys.mjs` `src/device-hit-owner.ts` `src/styles/devices.styles.ts` `smoke_household_journeys.mjs` `test/device-hit-owner-contract.test.mjs` | | #564 | [CODE-REVIEW-564-r2.md](CODE-REVIEW-564-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #563 | [SPEC-REVIEW-563-r1.md](SPEC-REVIEW-563-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | сценарий и «что человек увидит» не выделены отдельными первыми | `PROCESS.md` `docs/SCOPE.md` | | #563 | [CODE-REVIEW-563-r1.md](CODE-REVIEW-563-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #562 | [CODE-REVIEW-562-r1.md](CODE-REVIEW-562-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | task-packet.mjs определяет инфра-трек и право трогать класс A по тематической метке inf… | `task-packet.mjs` `PROCESS.md` `AGENTS.md` `scripts/process-gate.mjs` `process-gate.mjs` `test/task-packet.test.mjs` | | #562 | [CODE-REVIEW-562-r2.md](CODE-REVIEW-562-r2.md) | code · r2 | 🟡 жёлтый | 0 | 1 | после фикса статусless infra-issue без опубликованной ветки получает заведомо неверную … | `scripts/task-packet.mjs` `AGENTS.md` `task-packet.mjs` `process-gate.mjs` `PROCESS.md` | | #562 | [CODE-REVIEW-562-r3.md](CODE-REVIEW-562-r3.md) | code · r3 | 🟢 зелёный | 0 | 0 | — | — | | #561 | [SPEC-REVIEW-561-r1.md](SPEC-REVIEW-561-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | ТЗ не называет явно влияние на touch/View/kiosk — обязательный, блокирующий пункт DoR (…; Разделы «сценарий» и «что человек увидит до/после» не оформлены отдельными подзаголовка… | `docs/TOUCH-SUPPORT.md` | | #561 | [SPEC-REVIEW-561-r2.md](SPEC-REVIEW-561-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 0 | — | — | | #561 | [CODE-REVIEW-561-r1.md](CODE-REVIEW-561-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #560 | [CODE-REVIEW-560-r1.md](CODE-REVIEW-560-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | process-gate даёт 1 предупреждение, а хендофф заявляет «предупреждений 0» | `scripts/process-gate.mjs` | | #558 | [CODE-REVIEW-558-r1.md](CODE-REVIEW-558-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #557 | [CODE-REVIEW-557-r1.md](CODE-REVIEW-557-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #556 | [CODE-REVIEW-556-r1.md](CODE-REVIEW-556-r1.md) | code · r1 | 🔴 красный | 1 | 0 | Границу «модель не пишет в issue» PR не строит — permissions: per-job не влияет на реал… | `.github/workflows/process.yml` `src/github/token.ts` `process.yml` `docs/security.md` | | #556 | [CODE-REVIEW-556-r2.md](CODE-REVIEW-556-r2.md) | code · r2 | 🔴 красный | 0 | 0 | — | — | | #555 | [CODE-REVIEW-555-r1.md](CODE-REVIEW-555-r1.md) | code · r1 | 🔴 красный | 1 | 0 | relabel() может уронить весь прогон и никогда не эскалировать именно тот случай, ради к… | `scripts/process-reconcile.mjs` `process-reconcile.mjs` `process-reconcile.yml` `test/process-reconcile.test.mjs` `summary.json` | | #555 | [CODE-REVIEW-555-r2.md](CODE-REVIEW-555-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #554 | [SPEC-REVIEW-554-r1.md](SPEC-REVIEW-554-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #554 | [CODE-REVIEW-554-r1.md](CODE-REVIEW-554-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #553 | [CODE-REVIEW-553-r2.md](CODE-REVIEW-553-r2.md) | code · r2 | 🟡 жёлтый | 0 | 1 | Регрессионный тест #553 не защищает от отката формулировки, ради которого заведён; Стале-цитата правила в §11.4 после правки формулировки §5 | `test/review-doc-guard.test.mjs` `PROCESS.md` `AGENTS.md` | | #553 | [CODE-REVIEW-553-r3.md](CODE-REVIEW-553-r3.md) | code · r3 | 🟡 жёлтый | 0 | 0 | — | — | | #551 | [CODE-REVIEW-551-r1.md](CODE-REVIEW-551-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #551 | [CODE-REVIEW-551-r4.md](CODE-REVIEW-551-r4.md) | code · r4 | 🟢 зелёный | 0 | 0 | — | — | | #550 | [CODE-REVIEW-550-r1.md](CODE-REVIEW-550-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #549 | [CODE-REVIEW-549-r1.md](CODE-REVIEW-549-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #549 | [CODE-REVIEW-549-r2.md](CODE-REVIEW-549-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #548 | [CODE-REVIEW-548-r1.md](CODE-REVIEW-548-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #547 | [CODE-REVIEW-547-r1.md](CODE-REVIEW-547-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #546 | [CODE-REVIEW-546-r1.md](CODE-REVIEW-546-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #545 | [SPEC-REVIEW-545-r1.md](SPEC-REVIEW-545-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #545 | [CODE-REVIEW-545-r1.md](CODE-REVIEW-545-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #544 | [SPEC-REVIEW-544-r1.md](SPEC-REVIEW-544-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #544 | [CODE-REVIEW-544-r1.md](CODE-REVIEW-544-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #543 | [SPEC-REVIEW-543-r1.md](SPEC-REVIEW-543-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | двусмысленная ссылка на тестовый артефакт в AC7 и списке файлов | `test/config-adoption-ownership.test.mjs` `docs/ARCHITECTURE.md` `test/config-adoption.test.mjs` `docs/CONFIG-COMPATIBILITY.md` `test/config-adoption-attempt.test.mjs` `config-adoption.test.mjs` `config-adoption-ownership.test.mjs` | | #543 | [SPEC-REVIEW-543-r2.md](SPEC-REVIEW-543-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #543 | [CODE-REVIEW-543-r1.md](CODE-REVIEW-543-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #542 | [CODE-REVIEW-542-r1.md](CODE-REVIEW-542-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #541 | [CODE-REVIEW-541-r1.md](CODE-REVIEW-541-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #536 | [SPEC-REVIEW-536-r1.md](SPEC-REVIEW-536-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | 1. «До/После» использует термин реализации. Формулировка «уходит тогда, когда контролле… | — | | #536 | [CODE-REVIEW-536-r1.md](CODE-REVIEW-536-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #535 | [SPEC-REVIEW-535-r1.md](SPEC-REVIEW-535-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | 1. Не-скоуп не продублирован внутри ## ТЗ. Перечень «чего в этой задаче нет» (формулиро… | — | | #535 | [CODE-REVIEW-535-r1.md](CODE-REVIEW-535-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | текст console.error панели изменён вопреки букве К2 ТЗ | `scripts/bundle-manifest.mjs` | | #534 | [SPEC-REVIEW-534-r1.md](SPEC-REVIEW-534-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | ключевое техническое допущение К2/«Принято предположительно» №2 неверно, и это открывае…; «их единицы» (К3) неточно описывает число проёмов | `src/styles/devices.styles.ts` `demo/smoke_space_switch_transitions.mjs` `test/device-marker-polish-contract.test.mjs` `test/space-order.test.mjs` `test/device-face.test.mjs` | | #534 | [SPEC-REVIEW-534-r2.md](SPEC-REVIEW-534-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 1 | К2 распространяет keyed+repeat на список проёмов «для единообразия», но обоснование (К3… | `src/styles/plan.styles.ts` `src/houseplan-card.ts` | | #534 | [SPEC-REVIEW-534-r3.md](SPEC-REVIEW-534-r3.md) | spec · r3 | 🟢 зелёный | 0 | 0 | АС2а/К3 называют триггер проёмов «Plan ↔ View», код переключает шире | `src/houseplan-card.ts` | | #534 | [CODE-REVIEW-534-r1.md](CODE-REVIEW-534-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #533 | [CODE-REVIEW-533-r1.md](CODE-REVIEW-533-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | AC1 закрыт частично: 19 из 22 вызовов pointer() не проверяют доставку события | `demo/smoke_room_resize.mjs` | | #533 | [CODE-REVIEW-533-r2.md](CODE-REVIEW-533-r2.md) | code · r2 | 🟡 жёлтый | 0 | 0 | — | — | | #533 | [CODE-REVIEW-533-r3.md](CODE-REVIEW-533-r3.md) | code · r3 | 🟢 зелёный | 0 | 0 | — | — | | #532 | [SPEC-REVIEW-532-r1.md](SPEC-REVIEW-532-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #532 | [SPEC-REVIEW-532-r2.md](SPEC-REVIEW-532-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #532 | [CODE-REVIEW-532-r1.md](CODE-REVIEW-532-r1.md) | code · r1 | 🟡 жёлтый | 0 | 2 | чейнджлог утверждает то, что опровергает сам контракт задачи; docs/SUN.md приписывает измерение в Chromium браузеру Firefox | `docs/CHANGELOG.md` `docs/CHANGELOG.ru.md` `docs/SUN.md` | | #532 | [CODE-REVIEW-532-r2.md](CODE-REVIEW-532-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #531 | [SPEC-REVIEW-531-r1.md](SPEC-REVIEW-531-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | второй триггер бюджета (К2) не имеет ни одного AC и ни одной названной константы; обязательные разделы §7.1 присутствуют по содержанию, но не как отдельные заголовки; сн… | `demo/benchmark_large_house.mjs` | | #531 | [SPEC-REVIEW-531-r2.md](SPEC-REVIEW-531-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #531 | [CODE-REVIEW-531-r1.md](CODE-REVIEW-531-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | устаревший отпечаток скриншотов документации | `src/live-viewport.ts` `docs/images/screenshots.json` | | #531 | [CODE-REVIEW-531-r2.md](CODE-REVIEW-531-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #530 | [SPEC-REVIEW-530-r1.md](SPEC-REVIEW-530-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | правка меняет два поведения, задокументированных в docs/PDF-EXPORT.md, но документ не н…; существующий мутант pdf-room-edge-dropped защищает ровно ту гарантию, которую контракт … | `docs/PDF-EXPORT.md` `src/pdf/pdf-scene.ts` `PDF-EXPORT.md` `scripts/mutation-gate.mjs` | | #530 | [SPEC-REVIEW-530-r2.md](SPEC-REVIEW-530-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #530 | [CODE-REVIEW-530-r1.md](CODE-REVIEW-530-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #529 | [SPEC-REVIEW-529-r1.md](SPEC-REVIEW-529-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | К4/AC5 описывают механизм самолечения, который не соответствует реальному пути записи c… | — | | #529 | [SPEC-REVIEW-529-r2.md](SPEC-REVIEW-529-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #529 | [CODE-REVIEW-529-r1.md](CODE-REVIEW-529-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #528 | [CODE-REVIEW-528-r1.md](CODE-REVIEW-528-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #526 | [SPEC-REVIEW-526-r1.md](SPEC-REVIEW-526-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | Отсутствуют оба обязательных продуктовых раздела ТЗ: «сценарий» и «что человек увидит д…; Раздел «UX» не выделен явно. §7.1 перечисляет UX отдельным обязательным разделом. По со… | `docs/SCOPE.md` | | #526 | [SPEC-REVIEW-526-r2.md](SPEC-REVIEW-526-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #526 | [CODE-REVIEW-526-r1.md](CODE-REVIEW-526-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #525 | [SPEC-REVIEW-525-r1.md](SPEC-REVIEW-525-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | не проговорены явные «нет» по четырём пунктам DoR; формулировка changelog называет только «открытие» | — | | #525 | [CODE-REVIEW-525-r1.md](CODE-REVIEW-525-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #524 | [SPEC-REVIEW-524-r1.md](SPEC-REVIEW-524-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | ТЗ не выделяет отдельными разделами «сценарий» и «что человек увидит до/после» (снято) | — | | #524 | [CODE-REVIEW-524-r1.md](CODE-REVIEW-524-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #522 | [SPEC-REVIEW-522-r1.md](SPEC-REVIEW-522-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | К3 называет неверное число диалогов с объявленным autofocus; К1 называет .close/ha-dialog «фолбэками без изменений», хотя их достижимость меняется | `hp-confirm.ts` `src/hp-dialog.ts` | | #521 | [SPEC-REVIEW-521-r1.md](SPEC-REVIEW-521-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | заявленный источник поведения не существует в названном документе | `docs/USER-GUIDE.ru.md` `AGENTS.md` `USER-GUIDE.ru.md` | | #521 | [SPEC-REVIEW-521-r2.md](SPEC-REVIEW-521-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 1 | новая ссылка на несуществующий документ в том же абзаце, который правил находку r1 | `docs/USER-GUIDE.ru.md` `AGENTS.md` `CLAUDE.md` `PROCESS.md` `docs/SCOPE.md` | | #521 | [SPEC-REVIEW-521-r3.md](SPEC-REVIEW-521-r3.md) | spec · r3 | 🟢 зелёный | 0 | 0 | — | — | | #521 | [CODE-REVIEW-521-r1.md](CODE-REVIEW-521-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | AC5 заявляет доказательство, которого смок не даёт | `src/live-editor.ts` `demo/smoke_align_guides.mjs` `houseplan-card.ts` | | #521 | [CODE-REVIEW-521-r2.md](CODE-REVIEW-521-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | тело issue правилось после зелёного ревью ТЗ без нового цикла S4-spec-review | — | | #520 | [SPEC-REVIEW-520-r1.md](SPEC-REVIEW-520-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 3 | обязательный раздел «Риски» отсутствует (§7.1); AC3 не имеет дешёвого воспроизводимого способа доказательства; регрессия профиля изометрии показана в «Симптоме», но не отражена в контракте/AC | `PROCESS.md` `docs/specs/506-startup-performance.md` `test/config-adoption-ownership.test.mjs` `demo/benchmark_large_house.mjs` `demo/performance/budgets-large-house-isometric.json` `demo/performance/evaluate.mjs` | | #520 | [SPEC-REVIEW-520-r2.md](SPEC-REVIEW-520-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 1 | амендированный AC4 не покрывает второе число из того же предложения «Симптома»: firstSt… | `demo/performance/evaluate.mjs` `budgets-large-house-isometric.json` | | #520 | [SPEC-REVIEW-520-r3.md](SPEC-REVIEW-520-r3.md) | spec · r3 | 🟢 зелёный | 0 | 0 | — | — | | #520 | [CODE-REVIEW-520-r1.md](CODE-REVIEW-520-r1.md) | code · r1 | 🔴 красный | 1 | 0 | правка не устраняет регрессию, которую должна была устранить | — | | #520 | [CODE-REVIEW-520-r2.md](CODE-REVIEW-520-r2.md) | code · r2 | 🟡 жёлтый | 0 | 1 | node scripts/check-docs.mjs красный на материале ревью: отпечаток скриншотов документац… | `src/houseplan-card.ts` `src/config-adoption.ts` `scripts/source-fingerprint.mjs` `config-adoption.ts` `docs/images/screenshots.json` | | #520 | [CODE-REVIEW-520-r3.md](CODE-REVIEW-520-r3.md) | code · r3 | 🟢 зелёный | 0 | 0 | — | — | | #517 | [SPEC-REVIEW-517-r1.md](SPEC-REVIEW-517-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | Гарантия AC2 не держится при повторном применении зелёного вердикта (#499); Метка small не соответствует собственному описанию задачи как полнотрековой; У1 содержит неточное утверждение о текущем коде (не блокирует, для протокола) | `scripts/review-doc-guard.mjs` `process.yml` `scripts/process-gate.mjs` `task-packet.mjs` | | #517 | [SPEC-REVIEW-517-r2.md](SPEC-REVIEW-517-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | Полнотрековый статус этой задачи формально расходится с ещё не изменённым §2.3 | `PROCESS.md` | | #517 | [CODE-REVIEW-517-r1.md](CODE-REVIEW-517-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #516 | [CODE-REVIEW-516-r1.md](CODE-REVIEW-516-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #516 | [CODE-REVIEW-516-r2.md](CODE-REVIEW-516-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #515 | [CODE-REVIEW-515-r1.md](CODE-REVIEW-515-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #514 | [SPEC-REVIEW-514-r1.md](SPEC-REVIEW-514-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #514 | [CODE-REVIEW-514-r1.md](CODE-REVIEW-514-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #514 | [CODE-REVIEW-514-r2.md](CODE-REVIEW-514-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #514 | [CODE-REVIEW-514-r3.md](CODE-REVIEW-514-r3.md) | code · r3 | 🟡 жёлтый | 0 | 1 | фолбэк-токен E2E_DISPATCH_TOKEN, если он scoped только на houseplan-e2e, молча ломает p… | `release.yml` `scripts/e2e-gate.mjs` `e2e-gate.mjs` `.github/workflows/release.yml` `houseplan-e2e/e2e.yml` `e2e.yml` `validate-gate.mjs` `PROCESS.md` | | #514 | [CODE-REVIEW-514-r4.md](CODE-REVIEW-514-r4.md) | code · r4 | 🟢 зелёный | 0 | 0 | docs/specs/514-e2e-stable-release-gate.md:38 дословно цитирует старый текст TOKEN_HINT,… | `docs/specs/514-e2e-stable-release-gate.md` `scripts/e2e-gate.mjs` | | #513 | [CODE-REVIEW-513-r1.md](CODE-REVIEW-513-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | scripts/pre-push-gate.mjs продолжает называть полный мутационный реестр предрелизным ге… | `scripts/pre-push-gate.mjs` `mutation-gate.yml` `docs/TESTING.md` `pre-push-gate.mjs` `scripts/mutation-gate.mjs` `mutation-gate.mjs` | | #513 | [CODE-REVIEW-513-r2.md](CODE-REVIEW-513-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #512 | [SPEC-REVIEW-512-r1.md](SPEC-REVIEW-512-r1.md) | spec · r1 | 🔴 красный | 1 | 0 | ТЗ не учитывает, что правка demo/docs/capture.mjs ломает captureScriptSha256 и красит d… | `demo/docs/capture.mjs` `docs/specs/512-golden-version-seam-and-docs-identical-accept.md` `scripts/check-docs.mjs` `scripts/source-fingerprint.mjs` `capture.mjs` `scripts/capture-environment.mjs` `accept.mjs` `policy.mjs` | | #512 | [SPEC-REVIEW-512-r2.md](SPEC-REVIEW-512-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #512 | [CODE-REVIEW-512-r1.md](CODE-REVIEW-512-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #511 | [SPEC-REVIEW-511-r1.md](SPEC-REVIEW-511-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | AC3 указывает не туда, реальный источник искажения не назван | `docs/performance/README.md` `docs/TESTING.md` `docs/DEVELOPMENT.md` | | #511 | [SPEC-REVIEW-511-r2.md](SPEC-REVIEW-511-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #511 | [CODE-REVIEW-511-r1.md](CODE-REVIEW-511-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #510 | [SPEC-REVIEW-510-r1.md](SPEC-REVIEW-510-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 0 | 1: место шага gate относительно reuse не зафиксировано и рискует сломать fast-path #499; 2: критерий «подходящий прогон» в validate-gate.mjs/merge-candidate.mjs не проверяет, ч…; 1: нет явной декларации «пользовательское поведение не меняется» и N/A по i18n/UX/модел… | `docs/specs/510-mutants-on-candidate-and-review-waits-validate.md` `process.yml` `review-doc-guard.test.mjs` `validate-gate.mjs` `merge-candidate.mjs` `validate-gate.test.mjs` `merge-candidate.test.mjs` `docs/specs/README.md` | | #510 | [SPEC-REVIEW-510-r2.md](SPEC-REVIEW-510-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 0 | 1: проводка gate → красный-возврат / продолжение ревью использует в трёх соседних предл… | `docs/specs/510-mutants-on-candidate-and-review-waits-validate.md` | | #510 | [SPEC-REVIEW-510-r3.md](SPEC-REVIEW-510-r3.md) | spec · r3 | 🟡 жёлтый | 0 | 0 | 1: унификация «всё через proceed» ломает reuse-fast-path (#499) — деплой-зависимости, C… | `docs/specs/510-mutants-on-candidate-and-review-waits-validate.md` `process.yml` `test/review-doc-guard.test.mjs` | | #510 | [SPEC-REVIEW-510-r4.md](SPEC-REVIEW-510-r4.md) | spec · r4 | 🟢 зелёный | 0 | 0 | — | — | | #510 | [CODE-REVIEW-510-r1.md](CODE-REVIEW-510-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | Отменённый (cancelled) dispatch-прогон читается как красный, а не игнорируется — то же … | `scripts/validate-gate.mjs` `scripts/merge-candidate.mjs` `validate.yml` `validate-gate.mjs` `test/validate-gate.test.mjs` `test/merge-candidate.test.mjs` `scripts/release-gate.mjs` | | #510 | [CODE-REVIEW-510-r2.md](CODE-REVIEW-510-r2.md) | code · r2 | 🟡 жёлтый | 0 | 1 | Файл: scripts/merge-candidate.mjs:145 — waitValidate внутри realOps: js const runs = al… | `scripts/merge-candidate.mjs` `test/merge-candidate.test.mjs` `merge-candidate.mjs` `scripts/validate-gate.mjs` | | #510 | [CODE-REVIEW-510-r3.md](CODE-REVIEW-510-r3.md) | code · r3 | 🟢 зелёный | 0 | 0 | — | — | | #509 | [SPEC-REVIEW-509-r1.md](SPEC-REVIEW-509-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | отсутствует раздел «Принятые технические предположения» (PROCESS.md §7.1); контракт п.4 (прежнее значение при инвалидации мемо, без скелета) не доказан ни одним AC; критерий отказа от лёгкого трека не назван явно | `SPEC-REVIEW-505-r1.md` `docs/specs/493-...md` | | #509 | [SPEC-REVIEW-509-r2.md](SPEC-REVIEW-509-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | способ инъекции счётчика вызовов для AC3 остался неназванным | `wall-thickness.ts` | | #509 | [CODE-REVIEW-509-r1.md](CODE-REVIEW-509-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #508 | [SPEC-REVIEW-508-r1.md](SPEC-REVIEW-508-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | AC3 называет несуществующее доказательство: golden-сценариев summary- в репозитории нет; В ТЗ лёгкого трека нет раздела «откат»; Целевой файл документации для фразы про футер не определён. Пункт 3 «Изменений» называе…; Влияние на производительность не названо явно. DoR (§2.5) требует явного «нет», если вл… | `demo/capture_summary_panel_505.mjs` `docs/UX-MODES.md` `docs/ARCHITECTURE.md` | | #508 | [SPEC-REVIEW-508-r2.md](SPEC-REVIEW-508-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #508 | [CODE-REVIEW-508-r1.md](CODE-REVIEW-508-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #508 | [CODE-REVIEW-508-r2.md](CODE-REVIEW-508-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #508 | [CODE-REVIEW-508-r3.md](CODE-REVIEW-508-r3.md) | code · r3 | 🟢 зелёный | 0 | 0 | — | — | | #506 | [SPEC-REVIEW-506-r1.md](SPEC-REVIEW-506-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #506 | [CODE-REVIEW-506-r1.md](CODE-REVIEW-506-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #505 | [SPEC-REVIEW-505-r1.md](SPEC-REVIEW-505-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | отсутствуют обязательные первые разделы «Сценарий» и «Что человек увидит до и после» (P…; отсутствует обязательный раздел «Принятые технические предположения» (PROCESS.md §7.1/§7); неполный список визуальных пар в разделе доказательств (§8) | `docs/specs/505-summary-panel-design-parity.md` `docs/SCOPE.md` `docs/specs/493-summary-panel-hardening.md` | | #505 | [SPEC-REVIEW-505-r2.md](SPEC-REVIEW-505-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #505 | [CODE-REVIEW-505-r1.md](CODE-REVIEW-505-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | неиспользуемый ключ локализации summary.block_visible | `src/summary-panel-editor.ts` | | #505 | [CODE-REVIEW-505-r2.md](CODE-REVIEW-505-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #502 | [SPEC-REVIEW-502-r1.md](SPEC-REVIEW-502-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | `src/radar-setup.ts` `test/helpers/i18n-consumers.mjs` `test/i18n-dead-keys.test.mjs` | | #502 | [CODE-REVIEW-502-r1.md](CODE-REVIEW-502-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #500 | [SPEC-REVIEW-500-r1.md](SPEC-REVIEW-500-r1.md) | spec · r1 | 🟡 жёлтый | 2 | 0 | Инвентаризация вызывающих adoptStructuralResponses неполна: 4 названных против 7 фактич…; Инвентаризация писателей тела serverCfg = тоже неполна: 6/16 названо, фактически 8 моду… | `houseplan-editor-runtime.ts` `houseplan-onboarding-runtime.ts` `demo/smoke_space_delete_adoption.mjs` `houseplan-card.ts` `plan-optimize-write.ts` `serialized-write-queue.ts` `space-copy-runtime.ts` `summary-panel-runtime-loaded.ts` | | #500 | [SPEC-REVIEW-500-r2.md](SPEC-REVIEW-500-r2.md) | spec · r2 | 🟡 жёлтый | 1 | 0 | новый текст r2 неверно утверждает, что adoptInitialSpace сегодня не вызывается ни на од… | `docs/specs/500-config-adoption-boundary.md` `src/houseplan-editor-runtime.ts` `houseplan-card.ts` | | #500 | [SPEC-REVIEW-500-r3.md](SPEC-REVIEW-500-r3.md) | spec · r3 | 🟢 зелёный | 0 | 0 | — | — | | #500 | [CODE-REVIEW-500-r1.md](CODE-REVIEW-500-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | Post-write гейт: отказ (asset-wait) не останавливает хвост вызывающего ни в одном из че…; Риск-таблица ТЗ §12 содержит неверный факт о static properties, но код всё равно корректен | `src/houseplan-editor-runtime.ts` `src/houseplan-onboarding-runtime.ts` `demo/smoke_post_write_adoption.mjs` `test/config-adoption.test.mjs` | | #500 | [CODE-REVIEW-500-r2.md](CODE-REVIEW-500-r2.md) | code · r2 | 🟡 жёлтый | 0 | 1 | Единственный автоматический свидетель AC4/M1 красный на материале ревью — demo/smoke_po… | `demo/smoke_post_write_adoption.mjs` | | #500 | [CODE-REVIEW-500-r3.md](CODE-REVIEW-500-r3.md) | code · r3 | 🟢 зелёный | 0 | 0 | — | — | | #498 | [SPEC-REVIEW-498-r1.md](SPEC-REVIEW-498-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | обязательный раздел «AC1…ACn» отсутствует, часть пунктов DoR не названа явно; предложенный алгоритм обхода графа ссылок (§6) не гарантирует заявленный предел глубины…; «После» в §1.2 смешивает пользовательский язык с деталями реализации | `decor_assets.py` `src/decor-image-editor.ts` | | #498 | [SPEC-REVIEW-498-r2.md](SPEC-REVIEW-498-r2.md) | spec · r2 | 🟢 зелёный | 0 | 2 | нумерация разделов «## 8» / «## 8.0» после вставки AC-раздела | — | | #498 | [CODE-REVIEW-498-r1.md](CODE-REVIEW-498-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #495 | [SPEC-REVIEW-495-r1.md](SPEC-REVIEW-495-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #495 | [CODE-REVIEW-495-r1.md](CODE-REVIEW-495-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #493 | [SPEC-REVIEW-493-r1.md](SPEC-REVIEW-493-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | лишняя пустая строка в конце файла ТЗ | `docs/specs/493-summary-panel-hardening.md` | | #493 | [CODE-REVIEW-493-r1.md](CODE-REVIEW-493-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #492 | [SPEC-REVIEW-492-r1.md](SPEC-REVIEW-492-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | AC6 не называет способ доказательства | `docs/specs/492-exact-candidate-and-input-manifest.md` `check-inputs.mjs` `src/houseplan-card.ts` `test/gate-reuse.test.mjs` | | #492 | [SPEC-REVIEW-492-r2.md](SPEC-REVIEW-492-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #492 | [CODE-REVIEW-492-r1.md](CODE-REVIEW-492-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #491 | [SPEC-REVIEW-491-r1.md](SPEC-REVIEW-491-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #491 | [CODE-REVIEW-491-r1.md](CODE-REVIEW-491-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | 1; 0 | `custom_components/houseplan/websocket_api.py` `scripts/mutation-gate.mjs` | | #491 | [CODE-REVIEW-491-r2.md](CODE-REVIEW-491-r2.md) | code · r2 | 🟢 зелёный | 1 | 2 | 0; в скоупе — 0; вне скоупа — 1, заведена отдельным issue; 1 | `scripts/process-gate.mjs` `docs/TESTING.md` `TESTING.md` `scripts/mutation-gate.mjs` | | #490 | [SPEC-REVIEW-490-r1.md](SPEC-REVIEW-490-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #490 | [CODE-REVIEW-490-r1.md](CODE-REVIEW-490-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | Recovery-адаптация обходит asset-readiness gate и continuity-overlay (в скоупе, Medium) | `src/summary-panel-runtime-loaded.ts` `houseplan-card.ts` `space-card.ts` `src/signing.ts` `visual-continuity.ts` `signing.ts` `demo/smoke_summary_panel.mjs` | | #490 | [CODE-REVIEW-490-r2.md](CODE-REVIEW-490-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #489 | [SPEC-REVIEW-489-r1.md](SPEC-REVIEW-489-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 3 | Условие существования зум-кнопок противоречит текущему рендеру и не-скоупу (Medium, в с…; Гейт свежести документации (check-docs) не назван обязательным при правке src/ (Medium,…; data-hp-mode="device" расходится с уже опубликованным именем mode-devices (Medium, в ск… | `docs/specs/489-data-hp-contract.md` `src/houseplan-card.ts` `src/styles/chrome.styles.ts` `docs/data-hp-contract.json` `STYLING-HOOKS.md` `demo/smoke_styling_hooks.mjs` `src/houseplan-editor-runtime.ts` `src/hp-dialog.ts` | | #489 | [SPEC-REVIEW-489-r2.md](SPEC-REVIEW-489-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #489 | [CODE-REVIEW-489-r1.md](CODE-REVIEW-489-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #488 | [CODE-REVIEW-488-r1.md](CODE-REVIEW-488-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #487 | [SPEC-REVIEW-487-r1.md](SPEC-REVIEW-487-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | расхождение с уже принятой формулировкой «наследовать» (в скоупе, не блокирует) | `docs/specs/487-room-temperature-thresholds.md` `src/houseplan-editor-runtime.ts` | | #487 | [CODE-REVIEW-487-r1.md](CODE-REVIEW-487-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #486 | [SPEC-REVIEW-486-r1.md](SPEC-REVIEW-486-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | Сверка утверждений о текущем коде с фактическим origin/dev; Проверка полномочий продуктовых решений; Проверка обязательных разделов ТЗ (PROCESS.md §7.1); Проверка непротиворечивости с продуктовым скоупом | — | | #486 | [CODE-REVIEW-486-r1.md](CODE-REVIEW-486-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | 1 Дешёвые гейты — приняты по ссылке, не перегонялись; 2 Тяжёлые гейты — не приняты вслепую, прослежены по истории CI ветки; 3 Что прогнал/перепроверил сам; 4 Вывод smoke-select.mjs (для протокола); 5 Таблица гейтов; 1 High — нет | — | | #485 | [SPEC-REVIEW-485-r1.md](SPEC-REVIEW-485-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | исключение из SCOPE.md для истории/тепловой карты не зафиксировано в самом SCOPE.md; этап 1 не декларирует touch-классификацию нового редактора (обязательное требование TOU… | `docs/SCOPE.md` `485-radar-presence.md` `docs/TOUCH-SUPPORT.md` `485-radar-presence-stage2.md` `485-radar-presence-stage3.md` `485-radar-presence-stage1.md` | | #485 | [SPEC-REVIEW-485-r2.md](SPEC-REVIEW-485-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #485 | [SPEC-REVIEW-485-r3.md](SPEC-REVIEW-485-r3.md) | spec · r3 | 🟡 жёлтый | 0 | 1 | новый гейт видимости, по тексту, исключает ранее принятый адаптер «любой числовой сенсо… | `docs/specs/485-radar-presence-stage1.md` `stage1.md` `485-radar-presence.md` | | #485 | [SPEC-REVIEW-485-r4.md](SPEC-REVIEW-485-r4.md) | spec · r4 | 🟢 зелёный | 0 | 0 | — | — | | #485 | [CODE-REVIEW-485-r1.md](CODE-REVIEW-485-r1.md) | code · r1 | 🔴 красный | 6 | 6 | «partial» не существует как состояние здоровья; смешанные и полностью устаревшие данные…; гонка teardown/await воскрешает HA-подписки после выгрузки интеграции. custom_component…; нет проверки «то же устройство» для верифицированного адаптера LD2450. custom_component…; «Настроить на плане» отказывает для комнаты без контура вместо предупреждения и незанят…; известные занятые зоны (zones_v1) никогда не рисуются на плане. grep -n "zone" src/rada…; смена HA-привязки маркера может молча удалить уже сохранённую, откалиброванную конфигур… | `custom_components/houseplan/radar.py` `__init__.py` `custom_components/houseplan/radar_validation.py` `radar.py` `src/editors/radar-section.ts` `radar-model.ts` `radar-editor.ts` `editors/radar-section.ts` | | #485 | [CODE-REVIEW-485-r2.md](CODE-REVIEW-485-r2.md) | code · r2 | 🟡 жёлтый | 0 | 1 | M-1 (продолжение M6 из r1, закрыто частично). Три из четырёх числовых гардов калибровоч…; Фикс H4 (комната без контура открывает мастер с предупреждением) корректен по чтению (s… | `radar_geometry.py` `src/radar-geometry.ts` `test/radar-geometry.test.mjs` `radar_websocket.py` `test_ha_radar_websocket.py` `custom_components/houseplan/websocket_api.py` `docs/specs/485-radar-presence-stage1.md` `custom_components/houseplan/__init__.py` | | #485 | [CODE-REVIEW-485-r3.md](CODE-REVIEW-485-r3.md) | code · r3 | 🟡 жёлтый | 0 | 1 | M-1 (новая). Четвёртый числовой гвард двухточечного решателя — согласованность радиальн… | `custom_components/houseplan/radar_geometry.py` `src/radar-geometry.ts` | | #485 | [CODE-REVIEW-485-r4.md](CODE-REVIEW-485-r4.md) | code · r4 | 🟢 зелёный | 0 | 0 | Нет golden-сцены для радара (find demo/golden -iname "radar" — по-прежнему пусто). Не э… | `radar.py` | | #484 | [SPEC-REVIEW-484-r1.md](SPEC-REVIEW-484-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #484 | [CODE-REVIEW-484-r1.md](CODE-REVIEW-484-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #483 | [CODE-REVIEW-483-r1.md](CODE-REVIEW-483-r1.md) | code · r1 | ⚪ — | 0 | 0 | — | — | | #482 | [SPEC-REVIEW-482-r1.md](SPEC-REVIEW-482-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | источник и лицензия векторного компаса заявлены как факт без проверяемой цитаты, аналог… | `docs/specs/482-pdf-export-polish.md` `docs/FURNITURE.md` `docs/PDF-EXPORT.md` `SPEC-REVIEW-159-r1.md` | | #482 | [SPEC-REVIEW-482-r2.md](SPEC-REVIEW-482-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #482 | [CODE-REVIEW-482-r1.md](CODE-REVIEW-482-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #481 | [SPEC-REVIEW-481-r1.md](SPEC-REVIEW-481-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | в скоупе задачи, чинится в этом же issue; снимаю с записью, не блокирует | `validate.yml` `test/mutation-gate.test.mjs` `test/validate-workflow.test.mjs` | | #481 | [SPEC-REVIEW-481-r2.md](SPEC-REVIEW-481-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #481 | [CODE-REVIEW-481-r1.md](CODE-REVIEW-481-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #478 | [SPEC-REVIEW-478-r1.md](SPEC-REVIEW-478-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #478 | [CODE-REVIEW-478-r1.md](CODE-REVIEW-478-r1.md) | code · r1 | 🔴 красный | 2 | 4 | TS и Python дают разные ID и разные решения accept/reject на одном и том же legacy JSON…; устаревшая v9-запись поверх уже мигрированного v10-документа не отклоняется (нарушение …; golden-харнесс не переименован вслед за полем, из-за чего сценарий превью толщины цепоч…; путь поглощения комнаты не атомарен при вырожденном spaceModel() (в скоупе, риск для AC9); AC13 (фикс-пойнт Optimize сразу после accept) не доказан через реальный путь редактора; мёртвые поля redundantDraftsRemoved/removedDrafts в моке смока | `src/wall-segment-model.ts` `custom_components/houseplan/wall_segment_model.py` `test-build/wall-segment-model.js` `wall_segment_model.py` `src/logic.ts` `test/wall-segment-model.test.mjs` `tests_backend/test_wall_segment_model.py` `custom_components/houseplan/validation.py` | | #478 | [CODE-REVIEW-478-r2.md](CODE-REVIEW-478-r2.md) | code · r2 | 🟡 жёлтый | 0 | 1 | канонический документ подсистемы утверждает поведение, которого дельта только что лишил… | `docs/CONFIG-COMPATIBILITY.md` `test/fixtures/478-room-draft-migration-vectors.json` `wall-segment-model.ts` `src/wall-segment-model.ts` `custom_components/houseplan/wall_segment_model.py` `validation.py` | | #478 | [CODE-REVIEW-478-r3.md](CODE-REVIEW-478-r3.md) | code · r3 | 🟢 зелёный | 0 | 0 | — | — | | #477 | [SPEC-REVIEW-477-r1.md](SPEC-REVIEW-477-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #477 | [CODE-REVIEW-477-r1.md](CODE-REVIEW-477-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #476 | [SPEC-REVIEW-476-r1.md](SPEC-REVIEW-476-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | §18 противоречит §7.3/AC4; §7.2 нумерованный список читается как безусловный | `docs/specs/476-color-picker-ok.md` `hp-color-opacity.ts` | | #476 | [SPEC-REVIEW-476-r2.md](SPEC-REVIEW-476-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #476 | [CODE-REVIEW-476-r1.md](CODE-REVIEW-476-r1.md) | code · r1 | 🟡 жёлтый | 0 | 0 | AC4: защита от обхода невалидного HEX повторным «ОК» не имеет постоянного свидетеля в s…; AC3/§7.2.4: заявленная защита «клик не проваливается в план/toolbar под поверхностью» н…; src/houseplan-card.ts:5932 — invalidHex: …, confirm: … на одной строке (git diff слепил… | `scripts/mutation-gate.mjs` `SPEC-REVIEW-476-r1.md` `demo/smoke_color_picker.mjs` `scripts/smoke-links.mjs` `src/houseplan-card.ts` | | #476 | [CODE-REVIEW-476-r2.md](CODE-REVIEW-476-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #476 | [CODE-REVIEW-476-r3.md](CODE-REVIEW-476-r3.md) | code · r3 | 🟢 зелёный | 0 | 0 | — | — | | #475 | [SPEC-REVIEW-475-r1.md](SPEC-REVIEW-475-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | job и guardFiles() не покрывают гарды бэкенда, хотя они уже есть в реестре | `.test.mjs` `scripts/mutation-gate.mjs` `custom_components/houseplan/frontend_registration.py` `tests_backend/test_ha_frontend_registration.py` `mutation-gate.mjs` `.github/workflows/validate.yml` `src/wall-merge.ts` | | #475 | [SPEC-REVIEW-475-r2.md](SPEC-REVIEW-475-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #475 | [CODE-REVIEW-475-r1.md](CODE-REVIEW-475-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | триггер job не покрывает третье условие контракта; тест AC7 не покрывает четвёртый бэкенд-мутант, хотя код это делает | `.github/workflows/validate.yml` `scripts/mutation-gate.mjs` `test/validate-workflow.test.mjs` `validate.yml` `test/mutation-gate.test.mjs` `custom_components/houseplan/frontend_registration.py` `tests_backend/test_ha_frontend_registration.py` | | #475 | [CODE-REVIEW-475-r2.md](CODE-REVIEW-475-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #474 | [SPEC-REVIEW-474-r1.md](SPEC-REVIEW-474-r1.md) | spec · r1 | 🔴 красный | 1 | 0 | Контракт §4.2–4.3 не даёт ensure() для палитры мебели без уже существующей мебели в кон… | `docs/specs/474-lazy-furniture-art.md` `decor-image-editor.ts` `src/i18n/language-runtime.ts` `furniture-plan-art.generated.ts` `src/decor-image-editor.ts` `src/houseplan-editor-runtime.ts` `demo/srv/demo.html` `demo/smoke_furniture.mjs` | | #474 | [SPEC-REVIEW-474-r2.md](SPEC-REVIEW-474-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 1 | , в скоупе] Счётчик свидетелей в AC9 и §8 не обновлён после добавления седьмого | `docs/specs/474-lazy-furniture-art.md` `docs/reviews/SPEC-REVIEW-474-r1.md` `scripts/mutation-gate.mjs` `mutation-gate.mjs` | | #474 | [CODE-REVIEW-474-r1.md](CODE-REVIEW-474-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | scripts/bundle-budget.mjs: печать не называет новый ленивый граф | `scripts/bundle-budget.mjs` `test/bundle-assets.test.mjs` | | #473 | [SPEC-REVIEW-473-r1.md](SPEC-REVIEW-473-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 3 | AC7 недоказуем предписанным способом; --variants=60 не поддерживается скриптом, на который распространён контракт; четыре обязательных раздела §7.1 отсутствуют без пометки «не применимо» | `docs/specs/473-iso-perf-witnesses-and-smoke.md` `src/houseplan-render-lifecycle.ts` `src/houseplan-card.ts` `validate.yml` `scripts/mutation-gate.mjs` `.github/workflows/validate.yml` `houseplan-card.ts` `performance.yml` | | #473 | [SPEC-REVIEW-473-r2.md](SPEC-REVIEW-473-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | риск «хрупкость мутантов к рефакторингу подписи кэша» не вошёл в таблицу §7.2 | `docs/specs/473-iso-perf-witnesses-and-smoke.md` | | #473 | [CODE-REVIEW-473-r1.md](CODE-REVIEW-473-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #472 | [SPEC-REVIEW-472-r1.md](SPEC-REVIEW-472-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | 2; 1 (не блокирует, на усмотрение автора) | `scripts/mutation-gate.mjs` `validate.yml` `mutation-gate.yml` | | #472 | [SPEC-REVIEW-472-r2.md](SPEC-REVIEW-472-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 1 | 1; 1 (не блокирует, на усмотрение автора) | `scripts/mutation-gate.mjs` | | #472 | [CODE-REVIEW-472-r1.md](CODE-REVIEW-472-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | Medium, в скоупе. SHA в отчёте — не тот, что был протестирован; Low, не блокирует. Поиск открытого issue по заголовку не проверен вживую | — | | #472 | [CODE-REVIEW-472-r2.md](CODE-REVIEW-472-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #471 | [SPEC-REVIEW-471-r1.md](SPEC-REVIEW-471-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #471 | [CODE-REVIEW-471-r1.md](CODE-REVIEW-471-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #464 | [SPEC-REVIEW-464-r1.md](SPEC-REVIEW-464-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #464 | [CODE-REVIEW-464-r1.md](CODE-REVIEW-464-r1.md) | code · r1 | 🟡 жёлтый | 1 | 0 | реальный hover курсора оставляет hovered-source МАРКЕР под топологией, а не над ней (на… | `src/styles/devices.styles.ts` `src/hp-zigbee-topology-overlay.ts` `smoke_zigbee_topology_hover.mjs` `docs/SCOPE.md` `mutation-gate.mjs` | | #464 | [CODE-REVIEW-464-r2.md](CODE-REVIEW-464-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #463 | [SPEC-REVIEW-463-r1.md](SPEC-REVIEW-463-r1.md) | spec · r1 | ⚪ — | 1 | 0 | Раздел «Release-артефакты» содержит опровергнутое фактом утверждение: golden обязателен…; AC1: формулировка «backdrop непрозрачен» неоднозначна относительно действующей CSS | `demo/golden/harness.mjs` `demo/serve.mjs` `demo/srv/demo.html` `matrix.mjs` `docs/specs/README.md` `src/hp-dialog.ts` | | #463 | [SPEC-REVIEW-463-r2.md](SPEC-REVIEW-463-r2.md) | spec · r2 | 🔴 красный | 0 | 0 | — | — | | #463 | [CODE-REVIEW-463-r1.md](CODE-REVIEW-463-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #462 | [SPEC-REVIEW-462-r1.md](SPEC-REVIEW-462-r1.md) | spec · r1 | ⚪ — | 0 | 1 | пересечение нового баннера с существующим тостом #353; числовой touch-target 44×44 не имеет источника в каноне | `docs/USER-GUIDE.ru.md` `src/editor-runtime-loader.ts` `src/houseplan-card.ts` `PROCESS.md` `docs/TOUCH-SUPPORT.md` `docs/UX-MODES.md` | | #462 | [SPEC-REVIEW-462-r2.md](SPEC-REVIEW-462-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 1 | новый контракт lovelace.resource_mode: yaml не подтверждён и; числовой touch-target 44×44; SHA не назван в вердикт-комментарии r1 | `SPEC-REVIEW-462-r1.md` | | #462 | [SPEC-REVIEW-462-r3.md](SPEC-REVIEW-462-r3.md) | spec · r3 | 🔴 красный | 1 | 0 | — | — | | #462 | [CODE-REVIEW-462-r1.md](CODE-REVIEW-462-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | 1 Backend (AC2, AC3, AC4, AC5, AC11); 2 Frontend (AC6–AC10, AC12); 3 Документация (AC1) и артефакты сборки (AC13) | — | | #461 | [SPEC-REVIEW-461-r1.md](SPEC-REVIEW-461-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | 1. §9.3, formula несогласованность между двумя scaling-проверками не объяснена одной фр… | — | | #461 | [CODE-REVIEW-461-r1.md](CODE-REVIEW-461-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | AC4 заявляет метод доказательства «unit + mutation witness» для «verdict fast/full совп…; §6.4 против фактической обработки !safe в commitDraftSegmentGeometry | `scripts/mutation-gate.mjs` `test/draft-live-preflight.test.mjs` `test/wall-union-isolation.test.mjs` `demo/smoke_wall_draw_click.mjs` `smoke_junction_limits.mjs` `smoke_wall_junctions.mjs` `smoke_multiwall_junction.mjs` `smoke_near_orthogonal_junction.mjs` | | #461 | [CODE-REVIEW-461-r2.md](CODE-REVIEW-461-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #460 | [SPEC-REVIEW-460-r1.md](SPEC-REVIEW-460-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #460 | [CODE-REVIEW-460-r1.md](CODE-REVIEW-460-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #459 | [SPEC-REVIEW-459-r1.md](SPEC-REVIEW-459-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | AC не покрывают главное новое содержимое подсказки; фикстура для AC2 не покрыта в «Затронутых файлах» | `src/i18n/topology.ts` `src/houseplan-editor-runtime.ts` | | #459 | [SPEC-REVIEW-459-r2.md](SPEC-REVIEW-459-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | help_aria не соответствует заявленному образцу; контракт и AC3 говорят «шесть пунктов легенды», перечисляя семь | `src/i18n/ru.json` | | #459 | [CODE-REVIEW-459-r1.md](CODE-REVIEW-459-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #459 | [CODE-REVIEW-459-r2.md](CODE-REVIEW-459-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #457 | [SPEC-REVIEW-457-r1.md](SPEC-REVIEW-457-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | зафиксировано, без правки | — | | #457 | [CODE-REVIEW-457-r1.md](CODE-REVIEW-457-r1.md) | code · r1 | 🟡 жёлтый | 0 | 2 | нормализация relationship отступает от принятого ТЗ §6.3; доказательство AC9 неполно: нет browser-smoke на аспектах/zoom | `src/zigbee-topology.ts` `test/zigbee-topology.test.mjs` `demo/smoke_zigbee_topology_hover.mjs` `src/live-viewport.ts` `zigbee-topology-overlay-bridge.ts` | | #457 | [CODE-REVIEW-457-r2.md](CODE-REVIEW-457-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #456 | [SPEC-REVIEW-456-r1.md](SPEC-REVIEW-456-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #456 | [CODE-REVIEW-456-r1.md](CODE-REVIEW-456-r1.md) | code · r1 | 🟡 жёлтый | 0 | 3 | 1 Дешёвые гейты (гоняю сам — зелёного Validate на этом SHA нет); 2 Живой браузерный прогон новой фичи (нет закоммиченного смока — см. M3); check-docs.mjs красный: отпечаток скриншотов устарел; golden:verify красный: footer диалога пространства изменился, эталон не обновлён; заявленный в ТЗ browser smoke для Copy отсутствует; Фокус поля имени при возврате из отменённого Optimize-warning (§6.2, §11: «при возврате… | `check-docs.mjs` `docs/images/screenshots.json` `space-copy.ts` `space-copy-runtime.ts` `plan-optimize-write.ts` `space-dialog.ts` `houseplan-editor-runtime.ts` `houseplan-card.ts` | | #456 | [CODE-REVIEW-456-r2.md](CODE-REVIEW-456-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | 1 Дешёвые гейты — прогнаны заново (код изменился, стоят минуты); 2 Гейты, закрывающие находки r1 — прогнаны целиком (не только для проверки на слово авт…; 3 Не прогонялось повторно — обосновано в §5 «Унаследовано» | — | | #454 | [SPEC-REVIEW-454-r1.md](SPEC-REVIEW-454-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | AC2 не доказуем тем способом, который сам называет; нет явных разделов «UX» и «i18n»; cohesion review-doc-guard.mjs | `SPEC-REVIEW-449-r1.md` `-r2.md` `-r1.md` `PROCESS.md` `review-doc-guard.mjs` `scripts/review-doc-guard.mjs` `scripts/review-round-counter.mjs` | | #454 | [SPEC-REVIEW-454-r2.md](SPEC-REVIEW-454-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #454 | [CODE-REVIEW-454-r3.md](CODE-REVIEW-454-r3.md) | code · r3 | 🟢 зелёный | 0 | 1 | страховка по комментариям может завысить и attempt, и spent через посторонний маркер в … | `process.yml` `CODE-REVIEW-441-r1.md` `CODE-REVIEW-230-r2.md` `test/review-doc-guard.test.mjs` `CODE-REVIEW-454-r3.md` `docs/specs/454-review-round-counter.md` | | #454 | [CODE-REVIEW-454-r4.md](CODE-REVIEW-454-r4.md) | code · r4 | 🟢 зелёный | 0 | 0 | — | — | | #451 | [SPEC-REVIEW-451-r1.md](SPEC-REVIEW-451-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 3 | docs/PERFORMANCE.md не существует, но назван обязательным артефактом (Medium, в скоупе); docs/SCREENSHOTS.md не существует (Medium, в скоупе); верхняя граница диапазона «наблюдавшихся» замеров в §11.3 не подтверждена ни одним исто… | `docs/PERFORMANCE.md` `docs/specs/451-render-performance.md` `demo/performance/README.md` `docs/DEVELOPMENT.md` `docs/SCREENSHOTS.md` `docs/reviews/CODE-REVIEW-126-r1.md` `PROCESS.md` `scripts/check-docs.mjs` | | #451 | [SPEC-REVIEW-451-r2.md](SPEC-REVIEW-451-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #451 | [CODE-REVIEW-451-r1.md](CODE-REVIEW-451-r1.md) | code · r1 | 🔴 красный | 1 | 2 | новый performance-профиль large-house-interaction-v1 не проходит собственный бюджет; обещанный в самом ТЗ «targeted production-bundle smoke» не создан; нет мутанта в scripts/mutation-gate.mjs для новых защитных механизмов; известная нестабильность smoke_smooth_zoom.mjs под нагрузкой (не регрессия, к сведению) | `demo/performance/budgets-large-house-interaction.json` `smoke_decor.mjs` `smoke_furniture.mjs` `smoke_decor_text.mjs` `smoke_resize_pointer_real_plan.mjs` `smoke_pan_any_zoom.mjs` `smoke_room_fit.mjs` `smoke_infinite_canvas.mjs` | | #451 | [CODE-REVIEW-451-r2.md](CODE-REVIEW-451-r2.md) | code · r2 | 🔴 красный | 3 | 0 | отпечаток скриншотов документации устарел, docs-джоба красная; новый код добавляет 11 непрокомментированных any, гейт красный; resize потерял видимую fail-closed реакцию на невозможную геометрию посреди жеста | `validate.yml` `src/houseplan-card.ts` `src/houseplan-editor-runtime.ts` `src/junction-limits.ts` `src/live-editor.ts` `src/resize-controller.ts` | | #451 | [CODE-REVIEW-451-r3.md](CODE-REVIEW-451-r3.md) | code · r3 | 🟡 жёлтый | 0 | 1 | не заявленный в ТЗ постоянный отказ от live-preflight на больших планах, противоречит с… | `src/resize-controller.ts` `src/houseplan-editor-runtime.ts` `demo/fixtures/large-house.mjs` `docs/CHANGELOG.md` `.ru.md` | | #451 | [CODE-REVIEW-451-r4.md](CODE-REVIEW-451-r4.md) | code · r4 | 🟡 жёлтый | 0 | 1 | локальный кандидат для physical-geometry исключает соседнюю комнату, от которой зависит… | `src/resize-live-preflight.ts` `src/houseplan-editor-runtime.ts` `test/fixtures/278-wall-union-isolation.json` `test/resize-controller.test.mjs` `demo/benchmark_large_house.mjs` `smoke_room_resize.mjs` | | #450 | [CODE-REVIEW-450-r1.md](CODE-REVIEW-450-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #449 | [SPEC-REVIEW-449-r1.md](SPEC-REVIEW-449-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 0 | Строка Touch editor: not exposed, закрывающая M1, называет несуществующий четвёртый ред…; / Low | `docs/specs/449-double-fit-all.md` `docs/USER-GUIDE.ru.md` `docs/UX-MODES.md` `scripts/check-docs.mjs` | | #449 | [SPEC-REVIEW-449-r2.md](SPEC-REVIEW-449-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #449 | [CODE-REVIEW-449-r1.md](CODE-REVIEW-449-r1.md) | code · r1 | 🔴 красный | 3 | 3 | custom_components/houseplan/frontend/ не синхронизирован с dist/: пользователь не получ…; docs-гейт красный: скрипты не пересняты после правки src/; заявленное доказательство AC3 красное: demo/smoke_kiosk_pan_lock.mjs; $ npm test → not ok: "#438 полоса шире наблюдаемого шума метрики" error: 'сверху меньше…; bundle budget: запас ушёл ниже шумовой полосы; мутант room-fit-enters-kiosk-double-tap-sequence больше ничего не ловит | `dist/houseplan-assets/houseplan-card-CbNfZuwV.js` `custom_components/houseplan/frontend/houseplan-assets/houseplan-card-BgNWi9NC.js` `test/bundle-tree-committed.test.mjs` `test/release-contract.test.mjs` `dist/houseplan-card.js` `src/houseplan-card.ts` `src/room-fit.ts` `demo/smoke_kiosk_pan_lock.mjs` | | #449 | [CODE-REVIEW-449-r2.md](CODE-REVIEW-449-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #448 | [SPEC-REVIEW-448-r1.md](SPEC-REVIEW-448-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | ТЗ не закрывает обязательный пункт DoR «влияние на touch» (docs/TOUCH-SUPPORT.md) | `docs/TOUCH-SUPPORT.md` `docs/specs/448-alpha-switch.md` `src/houseplan-card.ts` | | #448 | [SPEC-REVIEW-448-r2.md](SPEC-REVIEW-448-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #448 | [CODE-REVIEW-448-r1.md](CODE-REVIEW-448-r1.md) | code · r1 | 🟡 жёлтый | 0 | 2 | docs/RELEASE-NOTES.md потерял пункт #447 в обеих секциях; AGENTS.md §«Labs flags» не обновлён и описывает контракт, которого больше нет | `docs/RELEASE-NOTES.md` `docs/DEVELOPMENT.md` `AGENTS.md` `src/labs.ts` `docs/ISOMETRIC.md` `docs/STATUS.md` | | #448 | [CODE-REVIEW-448-r2.md](CODE-REVIEW-448-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #447 | [SPEC-REVIEW-447-r1.md](SPEC-REVIEW-447-r1.md) | spec · r1 | 🔴 красный | 1 | 0 | AC4 и §3 путают единицы «шага сетки»: render-space gridPitch vs normalised GRID_STEP_N,… | `docs/specs/447-exterior-furniture-snap-keyboard-nudge.md` `src/space-geometry.ts` `space-render.ts` `houseplan-card.ts` `src/houseplan-editor-runtime.ts` | | #447 | [SPEC-REVIEW-447-r2.md](SPEC-REVIEW-447-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #447 | [CODE-REVIEW-447-r1.md](CODE-REVIEW-447-r1.md) | code · r1 | ⚪ — | 0 | 0 | — | — | | #445 | [SPEC-REVIEW-445-r1.md](SPEC-REVIEW-445-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | угловой tie-break не имеет доказательства | `docs/specs/445-furniture-wall-face-snap.md` | | #445 | [SPEC-REVIEW-445-r2.md](SPEC-REVIEW-445-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #445 | [CODE-REVIEW-445-r1.md](CODE-REVIEW-445-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #443 | [SPEC-REVIEW-443-r1.md](SPEC-REVIEW-443-r1.md) | spec · r1 | ⚪ — | 0 | 1 | раздел «Release-артефакты» не называет два канонических документа, которые эта же правк…; «Карта реализации» называет несуществующий путь для i18n | `docs/specs/README.md` `docs/VACUUM.md` `docs/CONFIG-COMPATIBILITY.md` `CONFIG-COMPATIBILITY.md` `docs/USER-GUIDE.ru.md` | | #443 | [SPEC-REVIEW-443-r2.md](SPEC-REVIEW-443-r2.md) | spec · r2 | ⚪ — | 0 | 0 | — | — | | #443 | [CODE-REVIEW-443-r1.md](CODE-REVIEW-443-r1.md) | code · r1 | ⚪ — | 0 | 0 | — | — | | #442 | [SPEC-REVIEW-442-r1.md](SPEC-REVIEW-442-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | Неточное имя функции в теле issue (не в ТЗ); Явного раздела «i18n» нет — контент есть, но не под заголовком | `src/houseplan-editor-runtime.ts` | | #442 | [CODE-REVIEW-442-r1.md](CODE-REVIEW-442-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #441 | [CODE-REVIEW-441-r1.md](CODE-REVIEW-441-r1.md) | code · r1 | 🟡 жёлтый | 0 | 0 | — | — | | #440 | [SPEC-REVIEW-440-r1.md](SPEC-REVIEW-440-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #440 | [CODE-REVIEW-440-r1.md](CODE-REVIEW-440-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | предсуществующий (не #440) неточный мутант, вне блокировки | `scripts/mutation-gate.mjs` | | #439 | [CODE-REVIEW-439-r1.md](CODE-REVIEW-439-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #437 | [SPEC-REVIEW-437-r1.md](SPEC-REVIEW-437-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | Раздел 10 «i18n и визуальное соответствие» пропускает французскую локаль, которая являе…; Термин viewAllowed в формуле §5.3 не введён явно; Систематически пропущены пробелы перед числами в ряде мест текста | `docs/specs/437-summary-panel.md` `src/i18n/fr.json` `docs/CHANGELOG.md` `docs/CHANGELOG.ru.md` `docs/USER-GUIDE.ru.md` `CONTRIBUTING.md` | | #437 | [SPEC-REVIEW-437-r2.md](SPEC-REVIEW-437-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #437 | [CODE-REVIEW-437-r1.md](CODE-REVIEW-437-r1.md) | code · r1 | 🟡 жёлтый | 0 | 4 | существующий смок demo/smoke_kiosk.mjs падает необработанным исключением на этом SHA; исключение «удалённого устройства» в подсчёте Q2 не имеет свидетеля; tap-target реордер/удаления в форме настроек меньше заявленных 44×44 CSS px; идентичность карточки (AC21) не имеет ни выделенного резолвера, ни свидетеля теста | `demo/smoke_kiosk.mjs` `src/houseplan-card.ts` `scripts/smoke-select.mjs` `src/summary-panel-metrics.ts` `test/summary-panel.test.mjs` `src/summary-panel-style.ts` `summary-panel-editor.ts` `docs/TOUCH-SUPPORT.md` | | #437 | [CODE-REVIEW-437-r2.md](CODE-REVIEW-437-r2.md) | code · r2 | 🟡 жёлтый | 0 | 1 | регресс восстановления камеры View при возврате из редактора, унаследован из r1-материа…; prepareCameraCommand, bootSoftCancel, stagePointerDown (houseplan-card.ts) объединяют п…; та же строка import { measuredCardHeaderHeight, settleSoftStageLayout } from './boot-so…; src/summary-panel-identity.ts: structuralPath() по-прежнему строит идентичность через c… | `demo/smoke_zoom_out.mjs` `docs/houseplan-card.ts` `smoke_zoom_out.mjs` `houseplan-editor-runtime.ts` `src/boot-soft-layout.ts` `houseplan-card.ts` `src/summary-panel-identity.ts` | | #437 | [CODE-REVIEW-437-r3.md](CODE-REVIEW-437-r3.md) | code · r3 | 🟡 жёлтый | 0 | 0 | src/houseplan-card.ts:1448: measuredCardHeaderHeight(this.renderRoot, this._stageEl!, t…; docs/CHANGELOG.md/docs/CHANGELOG.ru.md (правка в этом же коммите, трейлеры соблюдены) о… | `src/houseplan-card.ts` `src/boot-soft-layout.ts` `docs/CHANGELOG.md` `docs/CHANGELOG.ru.md` | | #437 | [CODE-REVIEW-437-r4.md](CODE-REVIEW-437-r4.md) | code · r4 | 🟢 зелёный | 0 | 0 | — | — | | #434 | [SPEC-REVIEW-434-r1.md](SPEC-REVIEW-434-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | , в скоупе] Неверная цифра «20-минутный timeout» job smoke — фактическая ошибка, а не п… | `.github/workflows/validate.yml` `validate.yml` | | #434 | [SPEC-REVIEW-434-r2.md](SPEC-REVIEW-434-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #434 | [CODE-REVIEW-434-r1.md](CODE-REVIEW-434-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | decorAssetsCapabilityChanged в space-card.ts:711-732 не влияет на; dangerConfirmLocaleGate геттер может вызвать languageRenderGate() | `space-card.ts` `smoke_space_card_decor_capability.mjs` `config-store.ts` `test/space-card-audit-lows.test.mjs` `src/i18n/language-runtime.ts` `houseplan-card.ts` | | #434 | [CODE-REVIEW-434-r2.md](CODE-REVIEW-434-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #432 | [SPEC-REVIEW-432-r1.md](SPEC-REVIEW-432-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #432 | [CODE-REVIEW-432-r1.md](CODE-REVIEW-432-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #431 | [SPEC-REVIEW-431-r1.md](SPEC-REVIEW-431-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #431 | [CODE-REVIEW-431-r1.md](CODE-REVIEW-431-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #428 | [SPEC-REVIEW-428-r1.md](SPEC-REVIEW-428-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | формулировка граничного значения mime: "" в таблице раздела 2 неполна | — | | #428 | [CODE-REVIEW-428-r1.md](CODE-REVIEW-428-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | Первопричина и правка content_state(); content_manifest() (exporter); Plan-only проекция (_project_plan_only_decor, validate_plan_only_document); Тесты (tests_backend/test_ha_import_export.py); Документация и changelog (AC8) | — | | #427 | [CODE-REVIEW-427-r1.md](CODE-REVIEW-427-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #426 | [SPEC-REVIEW-426-r1.md](SPEC-REVIEW-426-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #426 | [CODE-REVIEW-426-r1.md](CODE-REVIEW-426-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #425 | [SPEC-REVIEW-425-r1.md](SPEC-REVIEW-425-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | нет обязательных разделов «Сценарий» и «Что человек увидит до и после» (§7.1); AC4 (и частично AC5) не называют способ доказательства; раздел «Откат» задублирован | `docs/specs/425-core-file-budget.md` | | #425 | [SPEC-REVIEW-425-r2.md](SPEC-REVIEW-425-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #425 | [CODE-REVIEW-425-r1.md](CODE-REVIEW-425-r1.md) | code · r1 | ⚪ — | 0 | 0 | — | — | | #424 | [CODE-REVIEW-424-r2.md](CODE-REVIEW-424-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #423 | [SPEC-REVIEW-423-r1.md](SPEC-REVIEW-423-r1.md) | spec · r1 | ⚪ — | 0 | 0 | — | — | | #423 | [CODE-REVIEW-423-r1.md](CODE-REVIEW-423-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #422 | [SPEC-REVIEW-422-r1.md](SPEC-REVIEW-422-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | AC9 не называет способ доказательства (снято) | `docs/specs/422-capture-and-anchor-gates.md` | | #422 | [CODE-REVIEW-422-r1.md](CODE-REVIEW-422-r1.md) | code · r1 | ⚪ — | 1 | 2 | коммит 653b9a76 кладёт в манифест неверный captureScriptSha256, гейт docs красный на эт…; AC8 не доказан: замера времени конвейера нет ни в issue, ни в коммитах; комитченный мутант AC1/AC2 не проверяет сам новый гейт; frameHashes/driftBetweenRuns бе…; комментарий в docs-screenshots.yml про «третий прогон» | `docs/images/screenshots.json` `demo/docs/capture.mjs` `capture.mjs` `clip.mjs` `check-docs.mjs` `validate.yml` `scripts/mutation-gate.mjs` `demo/docs/clip.mjs` | | #422 | [CODE-REVIEW-422-r2.md](CODE-REVIEW-422-r2.md) | code · r2 | 🔴 красный | 1 | 2 | — | — | | #421 | [SPEC-REVIEW-421-r1.md](SPEC-REVIEW-421-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | отсутствуют обязательные разделы §7.1; неточная формулировка каденции новой browser probe (снимаю с записью) | `docs/specs/421-negative-test-proofs.md` `screenshots.json` `CONFIG-COMPATIBILITY.md` `verify-guard.mjs` `.github/workflows/validate.yml` `scripts/mutation-gate.mjs` `mutation-gate.mjs` | | #421 | [SPEC-REVIEW-421-r2.md](SPEC-REVIEW-421-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #421 | [CODE-REVIEW-421-r1.md](CODE-REVIEW-421-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #420 | [CODE-REVIEW-420-r1.md](CODE-REVIEW-420-r1.md) | code · r1 | ⚪ — | 0 | 0 | — | — | | #419 | [SPEC-REVIEW-419-r1.md](SPEC-REVIEW-419-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | Формулировка «Full import/export и space-only import сохраняют контракты #126 без измен…; Контракт «второе подтверждение» (§3 п.4, AC6) и «ровно один confirmation refresh» (AC9)… | `CONFIG-COMPATIBILITY.md` | | #419 | [CODE-REVIEW-419-r1.md](CODE-REVIEW-419-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #418 | [SPEC-REVIEW-418-r1.md](SPEC-REVIEW-418-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | нет отдельных разделов «Сценарий» и «Что человек увидит до/после» (waived) | `PROCESS.md` `docs/SCOPE.md` | | #418 | [CODE-REVIEW-418-r1.md](CODE-REVIEW-418-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #417 | [CODE-REVIEW-417-r1.md](CODE-REVIEW-417-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #415 | [CODE-REVIEW-415-r1.md](CODE-REVIEW-415-r1.md) | code · r1 | ⚪ — | 1 | 0 | check-docs: отпечаток скриншотов документации устарел | `validate.yml` `src/houseplan-card.ts` `src/styles/plan.styles.ts` `src/styles/dialogs.styles.ts` | | #415 | [CODE-REVIEW-415-r2.md](CODE-REVIEW-415-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #411 | [CODE-REVIEW-411-r1.md](CODE-REVIEW-411-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #406 | [SPEC-REVIEW-406-r1.md](SPEC-REVIEW-406-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | , в скоупе] (а) Инвентарь мёртвых ключей .help.aria неверен — все 19, а не 6 из 19, исп…; , в скоупе] (б) AC6/AC7 не решают роль для HpConfirmKind.warning (диалог разблокировки) | `docs/specs/406-beta2-polish.md` `en.json` `houseplan-editor-runtime.ts` `houseplan-onboarding-runtime.ts` `houseplan-card.ts` `docs/SCOPE.md` | | #406 | [SPEC-REVIEW-406-r2.md](SPEC-REVIEW-406-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 2 | , в скоупе] №1 — (д) контракт описывает уже исправленный дефект и расходится с тем, что…; , в скоупе] №2 — (б) контракт не называет механизм, которым HA-ветка hp-dialog получает… | `docs/specs/406-beta2-polish.md` `docs-accept.mjs` `test/docs-accept.test.mjs` `test/docs-acceptance.test.mjs` `demo/smoke_free_walls.mjs` `src/hp-dialog.ts` `demo/smoke_esc_dialogs.mjs` | | #406 | [SPEC-REVIEW-406-r3.md](SPEC-REVIEW-406-r3.md) | spec · r3 | 🟡 жёлтый | 0 | 1 | , в скоупе] №1 — UX и Release-артефакты утверждают «оформление не меняется», хотя разде… | `docs/specs/406-beta2-polish.md` `hp-dialog.ts` `hp-confirm.ts` | | #406 | [SPEC-REVIEW-406-r4.md](SPEC-REVIEW-406-r4.md) | spec · r4 | 🟢 зелёный | 0 | 0 | — | — | | #406 | [CODE-REVIEW-406-r1.md](CODE-REVIEW-406-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | стал устаревшим отпечаток скриншотов документации | `scripts/source-fingerprint.mjs` `src/hp-dialog.ts` `src/hp-confirm.ts` `src/device-area-relocation.ts` `docs/images/screenshots.json` `demo/docs/screenshots.mjs` `check-docs.mjs` | | #406 | [CODE-REVIEW-406-r2.md](CODE-REVIEW-406-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | правка fix: preserve the ordinary dialog path не имеет собственного быстрого регресс-теста | `src/hp-dialog.ts` `check-docs.mjs` `docs/images/screenshots.json` `demo/smoke_danger_confirm_branches.mjs` `mutation-gate.mjs` | | #405 | [SPEC-REVIEW-405-r1.md](SPEC-REVIEW-405-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | таблица «Место» неполна: пропущена обёртка houseplan-card.ts:7856, и без неё правка не …; ссылка «#406 «д»» на несуществующий пункт | `houseplan-card.ts` `docs/specs/405-dropped-promise-and-witness-floor.md` `houseplan-editor-runtime.ts` `demo/srv/demo.html` `demo/serve.mjs` `src/houseplan-card.ts` `editor-secondary.ts` `scripts/docs-accept.mjs` | | #405 | [SPEC-REVIEW-405-r2.md](SPEC-REVIEW-405-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #405 | [CODE-REVIEW-405-r1.md](CODE-REVIEW-405-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #403 | [SPEC-REVIEW-403-r1.md](SPEC-REVIEW-403-r1.md) | spec · r1 | ⚪ — | 1 | 0 | ТЗ не называет два обязательных пункта DoR — влияние на touch/kiosk и на производительн…; Номер строк для сниппета M1 отстал от кода на SHA 1f9d9014 | `docs/specs/403-area-relocation-safety.md` `TOUCH-SUPPORT.md` `docs/TOUCH-SUPPORT.md` `docs/SCOPE.md` `docs/USER-GUIDE.ru.md` `USER-GUIDE.ru.md` `src/houseplan-card.ts` | | #403 | [SPEC-REVIEW-403-r2.md](SPEC-REVIEW-403-r2.md) | spec · r2 | 🟡 жёлтый | 1 | 0 | — | — | | #403 | [CODE-REVIEW-403-r1.md](CODE-REVIEW-403-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #402 | [SPEC-REVIEW-402-r1.md](SPEC-REVIEW-402-r1.md) | spec · r1 | ⚪ — | 1 | 1 | ТЗ не называет влияние на touch/kiosk — обязательный, объявленный блокирующим пункт DoR; «Не-скоуп»-обоснование для tapConfirm/_vacCalConfirm содержит фактическую неточность | `docs/specs/402-confirm-outside-main-branch.md` `TOUCH-SUPPORT.md` `docs/TOUCH-SUPPORT.md` `houseplan-editor-runtime.ts` `src/houseplan-card.ts` `docs/SCOPE.md` | | #402 | [SPEC-REVIEW-402-r2.md](SPEC-REVIEW-402-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | Число в цитате TOUCH-SUPPORT.md неверно; Явного упоминания touch-статуса пяти вызовов из houseplan-editor-runtime.ts по-прежнему… | `docs/specs/402-confirm-outside-main-branch.md` `docs/TOUCH-SUPPORT.md` `houseplan-editor-runtime.ts` | | #402 | [CODE-REVIEW-402-r1.md](CODE-REVIEW-402-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | AC2 не покрыт смоком буквально (ветки fixed_floor pending/invalid, !space); AC3 не проверен буквальным сценарием issue (клик по корзине → deleteServerPlan); AC8: тап по scrim не проверен явно; confirmDanger не проверяет языковой гейт warm явно | `smoke_danger_confirm_branches.mjs` `src/houseplan-card.ts` `houseplan-onboarding-runtime.ts` `houseplan-card.ts` `smoke_danger_confirmation.mjs` `src/i18n/language-runtime.ts` | | #400 | [SPEC-REVIEW-400-r1.md](SPEC-REVIEW-400-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #400 | [CODE-REVIEW-400-r1.md](CODE-REVIEW-400-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | Мутант furniture-edge-handles-steal-the-corner не воспроизводит регрессию, которую обяз…; AC4 доказан не тем видом теста, что назван в ТЗ; Число «2 654 Б gzip» для 38 help-строк в docs/ARCHITECTURE.md не перепроверено независимо | `scripts/mutation-gate.mjs` `src/houseplan-card.ts` `.github/workflows/mutation-gate.yml` `test/align-candidates.test.mjs` `demo/smoke_align_guides.mjs` `docs/ARCHITECTURE.md` | | #400 | [CODE-REVIEW-400-r2.md](CODE-REVIEW-400-r2.md) | code · r2 | 🟡 жёлтый | 0 | 1 | Дополнительно к находке r1: комментарий автора от 2026-08-31T05:14:07Z заявляет закрыти… | `src/houseplan-card.ts` `smoke_furniture.mjs` | | #400 | [CODE-REVIEW-400-r3.md](CODE-REVIEW-400-r3.md) | code · r3 | 🟢 зелёный | 0 | 0 | — | — | | #399 | [SPEC-REVIEW-399-r1.md](SPEC-REVIEW-399-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | «План автотестов» (п.4) не обновлён вслед за AC5 и описывает как раз ту слабую версию, … | `docs/specs/399-backend-gate-honesty.md` `validate.yml` `mutation-gate.yml` | | #399 | [SPEC-REVIEW-399-r2.md](SPEC-REVIEW-399-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #399 | [CODE-REVIEW-399-r1.md](CODE-REVIEW-399-r1.md) | code · r1 | ⚪ — | 1 | 0 | AC5 не доказан автотестом: возврат к прежнему хардкод-списку из | `test/validate-workflow.test.mjs` | | #399 | [CODE-REVIEW-399-r2.md](CODE-REVIEW-399-r2.md) | code · r2 | 🟡 жёлтый | 1 | 0 | — | — | | #398 | [SPEC-REVIEW-398-r1.md](SPEC-REVIEW-398-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | AC3 разрешает «путь 2», AC4 делает его невозможным | `docs/specs/398-sysmodules-guard-scope.md` `pure_imports.py` `conftest.py` | | #398 | [SPEC-REVIEW-398-r2.md](SPEC-REVIEW-398-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 1 | устранение «пути 2» открывает новый конфликт: AC1/AC2 не совместимы с AC3 для tests_bac… | `tests_backend/pure_imports.py` `tests_backend/conftest.py` `tests_backend/test_junction_limits.py` `pure_imports.py` `test/backend-test-hygiene.test.mjs` `test_junction_limits.py` `conftest.py` | | #398 | [SPEC-REVIEW-398-r3.md](SPEC-REVIEW-398-r3.md) | spec · r3 | 🟢 зелёный | 0 | 0 | план автотестов не называет явно позитивный контракт-тест для pure_imports.py как второ…; нумерация критериев приёмки нарушена: AC8 вставлен между AC3 и AC4, AC7 не существует | `pure_imports.py` `docs/specs/398-sysmodules-guard-scope.md` `conftest.py` `tests_backend/pure_imports.py` `test/backend-test-hygiene.test.mjs` | | #398 | [CODE-REVIEW-398-r1.md](CODE-REVIEW-398-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #397 | [SPEC-REVIEW-397-r1.md](SPEC-REVIEW-397-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | AC7 и половина AC5 не имеют способа доказательства; обрыв диапазона строк для persistDevicePlacement; отсутствует фраза "Доказательство" у AC3 | `PROCESS.md` `demo/smoke_layout_sync.mjs` `test/device-position-persist.test.mjs` `demo/smoke_device_position_history.mjs` `src/houseplan-card.ts` | | #397 | [SPEC-REVIEW-397-r2.md](SPEC-REVIEW-397-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | SHA не назван в комментарии-вердикте r1 | — | | #397 | [CODE-REVIEW-397-r1.md](CODE-REVIEW-397-r1.md) | code · r1 | ⚪ — | 0 | 1 | AC3 не имеет ни одного; AC1 доказан не тем способом, что назвало ТЗ; Юнит-план, пункт 3 («каноническая позиция не создаёт лишней | `docs/specs/397-device-position-echo.md` `demo/smoke_device_position_history.mjs` `test/device-position-echo.test.mjs` `test/device-position-persist.test.mjs` | | #397 | [CODE-REVIEW-397-r2.md](CODE-REVIEW-397-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #396 | [SPEC-REVIEW-396-r1.md](SPEC-REVIEW-396-r1.md) | spec · r1 | 🔴 красный | 1 | 0 | центральное фактическое утверждение B1 («семь мест») не совпадает с реальными вызовами … | `docs/specs/396-camera-transition-fixes.md` `houseplan-card.ts` | | #396 | [SPEC-REVIEW-396-r2.md](SPEC-REVIEW-396-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 1 | таблица приписывает строки :4188/:4216 несуществующей функции load; вторая функция в строке :1159/:2363 не названа | `docs/specs/396-camera-transition-fixes.md` `src/houseplan-card.ts` | | #396 | [SPEC-REVIEW-396-r3.md](SPEC-REVIEW-396-r3.md) | spec · r3 | 🟢 зелёный | 0 | 0 | — | — | | #396 | [CODE-REVIEW-396-r1.md](CODE-REVIEW-396-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #396 | [CODE-REVIEW-396-r2.md](CODE-REVIEW-396-r2.md) | code · r2 | ⚪ — | 0 | 0 | — | — | | #391 | [SPEC-REVIEW-391-r1.md](SPEC-REVIEW-391-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | нет явного раздела «откат» | `PROCESS.md` | | #391 | [CODE-REVIEW-391-r1.md](CODE-REVIEW-391-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | стал протухшим отпечаток скриншотов документации | `scripts/source-fingerprint.mjs` `src/houseplan-editor-runtime.ts` `docs/images/screenshots.json` | | #391 | [CODE-REVIEW-391-r2.md](CODE-REVIEW-391-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #390 | [CODE-REVIEW-390-r1.md](CODE-REVIEW-390-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | Утверждение в сообщении коммита неверно | — | | #389 | [CODE-REVIEW-389-r1.md](CODE-REVIEW-389-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #385 | [SPEC-REVIEW-385-r1.md](SPEC-REVIEW-385-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | Контракт (в) описывает предикат isRelease неполно, что рискует разойтись с AC4; «План автотестов» ссылается на несуществующий тестовый паттерн. Текст: «паттерн существ…; DoR-примечание не называет явно влияние на производительность. PROCESS.md §2.5 требует …; Формулировка «(б)–(г) — «мелкие уточнения»» в Release-артефактах двусмысленна. Раздел U… | `docs/specs/385-audit-lows.md` `scripts/process-gate.mjs` `AGENTS.md` `src/houseplan-editor-runtime.ts` `src/houseplan-card.ts` | | #385 | [SPEC-REVIEW-385-r2.md](SPEC-REVIEW-385-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | Абзац-обоснование перед «Контрактом» (в) сохраняет старую неточную формулировку предика… | `docs/specs/385-audit-lows.md` | | #385 | [CODE-REVIEW-385-r1.md](CODE-REVIEW-385-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #385 | [CODE-REVIEW-385-r2.md](CODE-REVIEW-385-r2.md) | code · r2 | 🟡 жёлтый | 0 | 0 | — | — | | #385 | [CODE-REVIEW-385-r3.md](CODE-REVIEW-385-r3.md) | code · r3 | 🟢 зелёный | 0 | 0 | — | — | | #384 | [SPEC-REVIEW-384-r1.md](SPEC-REVIEW-384-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | «Доки не задеты» неверно: три документа обещают безусловное участие стен/колонн в кадре | `docs/USER-GUIDE.md` `docs/USER-GUIDE.ru.md` `docs/CANVAS.md` | | #384 | [SPEC-REVIEW-384-r2.md](SPEC-REVIEW-384-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 1 | — | — | | #384 | [CODE-REVIEW-384-r1.md](CODE-REVIEW-384-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #383 | [SPEC-REVIEW-383-r1.md](SPEC-REVIEW-383-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | i18n-ключи галочек отражения не в том namespace; переиспользование имён flip_h/flip_v без ссылки на существующий смысл | `src/i18n/ru.json` `houseplan-editor-runtime.ts` `docs/USER-GUIDE.ru.md` `validation.py` `coordinate_canonicalization.py` `import_export.py` `docs/CONFIG-COMPATIBILITY.md` | | #383 | [CODE-REVIEW-383-r1.md](CODE-REVIEW-383-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | скриншоты документации не пересняты, docs станет красным на dev; расхождение числа в хендоффе (не блокирует) | `src/houseplan-card.ts` `src/houseplan-editor-runtime.ts` `src/furniture.ts` `src/styles/plan.styles.ts` | | #383 | [CODE-REVIEW-383-r2.md](CODE-REVIEW-383-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #381 | [SPEC-REVIEW-381-r1.md](SPEC-REVIEW-381-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | отсутствуют обязательные разделы «Риски» и «Откат» (§7.1); AC4 называет способ доказательства словом вне канонического словаря | `docs/specs/381-no-op-tap-action.md` `docs/specs/377-decor-default-persist.md` `docs/specs/378-value-face-source.md` `SPEC-REVIEW-376-r1.md` | | #381 | [SPEC-REVIEW-381-r2.md](SPEC-REVIEW-381-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 1 | — | — | | #381 | [CODE-REVIEW-381-r1.md](CODE-REVIEW-381-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #378 | [SPEC-REVIEW-378-r1.md](SPEC-REVIEW-378-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #378 | [CODE-REVIEW-378-r1.md](CODE-REVIEW-378-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | AC2 не доказан golden-сценарием, как того явно требует принятое ТЗ; index-таблица docs/specs/README.md нарушает сортировку по номеру issue | `docs/specs/378-value-face-source.md` `demo/golden/matrix.mjs` `demo/smoke_value_face_source.mjs` `docs/specs/README.md` | | #378 | [CODE-REVIEW-378-r2.md](CODE-REVIEW-378-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | нет новых. Low из r1 (docs/specs/README.md:113, нарушение | `docs/specs/README.md` | | #377 | [SPEC-REVIEW-377-r1.md](SPEC-REVIEW-377-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | контракт называет формат ключа DecorStyle неверно и не как предположение, а как провере… | `docs/specs/377-decor-default-persist.md` `src/editors/decor/types.ts` `src/editors/decor/geometry.ts` `types.ts` | | #377 | [SPEC-REVIEW-377-r2.md](SPEC-REVIEW-377-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #377 | [CODE-REVIEW-377-r1.md](CODE-REVIEW-377-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #377 | [CODE-REVIEW-377-r2.md](CODE-REVIEW-377-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #376 | [SPEC-REVIEW-376-r1.md](SPEC-REVIEW-376-r1.md) | spec · r1 | 🔴 красный | 1 | 2 | трек small не проходит собственные критерии §5 одновременно; прямой прецедент #369 уже …; раздел «откат» отсутствует полностью; пункты (б) и (д) заявлены в скоупе, но не имеют собственного AC | `space-card.ts` `houseplan-card.ts` `houseplan-editor-runtime.ts` `validation.py` `docs/CONFIG-COMPATIBILITY.md` `SPEC-REVIEW-369-r1.md` `SPEC-REVIEW-369-r2.md` `docs/specs/369-audit-lows.md` | | #376 | [SPEC-REVIEW-376-r2.md](SPEC-REVIEW-376-r2.md) | spec · r2 | 🟢 зелёный | 1 | 2 | Тело issue #376, строка сразу после заголовка «# ТЗ (лёгкий трек, редакция 2)»; gh issu…; Тело issue #376, раздел 6 (отсутствовал в редакции 1); Тело issue #376, раздел «2. AC», пункты 2 и 4 (в редакции 1 их не было — было только AC… | — | | #376 | [CODE-REVIEW-376-r1.md](CODE-REVIEW-376-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #376 | [CODE-REVIEW-376-r2.md](CODE-REVIEW-376-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #376 | [CODE-REVIEW-376-r3.md](CODE-REVIEW-376-r3.md) | code · r3 | 🟢 зелёный | 0 | 0 | — | — | | #375 | [SPEC-REVIEW-375-r1.md](SPEC-REVIEW-375-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | , в скоупе] Отсутствует обязательный раздел «Откат»; , не блокирует] DoR-пункты «миграция/compatibility» и «touch» не проговорены явно; , снято ревьюером] Заявленная сложность 4/10 против порога small ≤3 | `AGENTS.md` `PROCESS.md` `docs/CONFIG-COMPATIBILITY.md` `docs/TOUCH-SUPPORT.md` `glow-scene.ts` `space-render.ts` | | #375 | [SPEC-REVIEW-375-r2.md](SPEC-REVIEW-375-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #375 | [CODE-REVIEW-375-r1.md](CODE-REVIEW-375-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #374 | [SPEC-REVIEW-374-r1.md](SPEC-REVIEW-374-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #374 | [CODE-REVIEW-374-r1.md](CODE-REVIEW-374-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #373 | [SPEC-REVIEW-373-r1.md](SPEC-REVIEW-373-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | docs/specs/README.md не обновлён | `docs/specs/README.md` `docs/specs/373-space-card-house-fit.md` | | #373 | [CODE-REVIEW-373-r1.md](CODE-REVIEW-373-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | тест-план AC4/AC6 (state-tick + узкая/широкая ширина для house) не реализован в смоке, …; фолбэк «пустая/только-подложка структура → content-frame» не покрыт ни юнитом, ни смоко…; константы половины штриха (2.5, 0.6) в структурной рамке дублируют магические числа рен… | `demo/smoke_space_card.mjs` `src/space-render.ts` `test/canvas.test.mjs` `test/single-source-numbers.test.mjs` | | #373 | [CODE-REVIEW-373-r2.md](CODE-REVIEW-373-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #372 | [SPEC-REVIEW-372-r1.md](SPEC-REVIEW-372-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #372 | [CODE-REVIEW-372-r1.md](CODE-REVIEW-372-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #371 | [SPEC-REVIEW-371-r1.md](SPEC-REVIEW-371-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | К2 не покрывает второй файл в bundle-manifest.mjs, который тоже хардкодит список локалей; AC1 не решает судьбу двух German-специфичных тестов качества, добавленных как часть ори…; формулировка AC5 избыточна и путает мутанта; DoR-пункты touch/perf не проговорены явным предложением | `scripts/bundle-manifest.mjs` `bundle-manifest.mjs` `test/i18n.test.mjs` | | #371 | [SPEC-REVIEW-371-r2.md](SPEC-REVIEW-371-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #371 | [CODE-REVIEW-371-r1.md](CODE-REVIEW-371-r1.md) | code · r1 | ⚪ — | 0 | 0 | — | — | | #371 | [CODE-REVIEW-371-r2.md](CODE-REVIEW-371-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #369 | [SPEC-REVIEW-369-r1.md](SPEC-REVIEW-369-r1.md) | spec · r1 | 🟢 зелёный | 0 | 3 | AC7 не станет буквально «grep по репо пуст» даже после точечной правки; положительная п… | `docs/specs/369-audit-lows.md` `docs/FURNITURE.md` `docs/reviews/CODE-REVIEW-269-r1.md` | | #369 | [CODE-REVIEW-369-r3.md](CODE-REVIEW-369-r3.md) | code · r3 | 🟢 зелёный | 0 | 0 | — | — | | #368 | [CODE-REVIEW-368-r1.md](CODE-REVIEW-368-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #366 | [SPEC-REVIEW-366-r1.md](SPEC-REVIEW-366-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | AC4 не называет проверяемое доказательство однозначно; визуальная деградация подана как факт, а не как решение с owner-видимостью; строки в ТЗ отстали от dev на единицы; docs/LIGHT.md не назван в release-артефактах | `demo/smoke_glow.mjs` `docs/LIGHT.md` `houseplan-card.ts` `AGENTS.md` | | #366 | [SPEC-REVIEW-366-r2.md](SPEC-REVIEW-366-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | ′ (Low, не блокирует) — расхождение футера ревизии 2 с фактическим текстом ТЗ | `docs/LIGHT.md` `LIGHT.md` | | #366 | [CODE-REVIEW-366-r1.md](CODE-REVIEW-366-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #363 | [SPEC-REVIEW-363-r1.md](SPEC-REVIEW-363-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #363 | [CODE-REVIEW-363-r2.md](CODE-REVIEW-363-r2.md) | code · r2 | ⚪ — | 0 | 0 | — | — | | #362 | [SPEC-REVIEW-362-r1.md](SPEC-REVIEW-362-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #362 | [CODE-REVIEW-362-r1.md](CODE-REVIEW-362-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | верифицировано чтением, фикс не требуется | `src/houseplan-card.ts` `smoke_decor.mjs` `dialogs.styles.ts` `plan.styles.ts` | | #361 | [SPEC-REVIEW-361-r1.md](SPEC-REVIEW-361-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | план автотестов противоречит порядку гейтов из AGENTS.md | `AGENTS.md` `docs/specs/361-furniture-stroke-zoom.md` `demo/smoke_furniture.mjs` | | #361 | [SPEC-REVIEW-361-r2.md](SPEC-REVIEW-361-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #361 | [CODE-REVIEW-361-r1.md](CODE-REVIEW-361-r1.md) | code · r1 | ⚪ — | 0 | 1 | Golden-бейзлайны с реальной мебелью не обновлены под новый физический stroke; npm run g… | `.github/workflows/validate.yml` `demo/golden/matrix.mjs` | | #361 | [CODE-REVIEW-361-r2.md](CODE-REVIEW-361-r2.md) | code · r2 | ⚪ — | 0 | 0 | — | — | | #360 | [SPEC-REVIEW-360-r1.md](SPEC-REVIEW-360-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | не назван обязательный touch-статус фичи. docs/TOUCH-SUPPORT.md (раздел «Documentation …; не описано, что сохранение свойств уже существующего объекта перезаписывает тот же deco… | `docs/TOUCH-SUPPORT.md` `houseplan-editor-runtime.ts` | | #360 | [SPEC-REVIEW-360-r2.md](SPEC-REVIEW-360-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #360 | [CODE-REVIEW-360-r1.md](CODE-REVIEW-360-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #360 | [CODE-REVIEW-360-r2.md](CODE-REVIEW-360-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #359 | [SPEC-REVIEW-359-r1.md](SPEC-REVIEW-359-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | контрактный пункт 9 (invalid/unknown symbol) не имеет доказательства; «golden не требуется» слабо обосновано на фоне уже существующей практики | `docs/specs/359-furniture-placement-preview.md` `src/furniture.ts` `demo/golden/matrix.mjs` | | #359 | [SPEC-REVIEW-359-r2.md](SPEC-REVIEW-359-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #359 | [CODE-REVIEW-359-r1.md](CODE-REVIEW-359-r1.md) | code · r1 | 🔴 красный | 1 | 0 | 1 | `docs/images/screenshots.json` `src/furniture.ts` `src/houseplan-card.ts` `src/houseplan-editor-runtime.ts` `src/styles/plan.styles.ts` `validate.yml` `docs/FURNITURE.md` `docs/USER-GUIDE.ru.md` | | #359 | [CODE-REVIEW-359-r2.md](CODE-REVIEW-359-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #358 | [SPEC-REVIEW-358-r1.md](SPEC-REVIEW-358-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #358 | [CODE-REVIEW-358-r1.md](CODE-REVIEW-358-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #357 | [SPEC-REVIEW-357-r1.md](SPEC-REVIEW-357-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #357 | [CODE-REVIEW-357-r1.md](CODE-REVIEW-357-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #356 | [CODE-REVIEW-356-r1.md](CODE-REVIEW-356-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #354 | [SPEC-REVIEW-354-r1.md](SPEC-REVIEW-354-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #354 | [CODE-REVIEW-354-r1.md](CODE-REVIEW-354-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | юнит AC4 не проверяет то, что заявляет; docs/USER-GUIDE.ru.md не упоminает новый тост | `test/i18n-runtime.test.mjs` `src/i18n/registry.ts` `demo/smoke_german_locale.mjs` `docs/USER-GUIDE.ru.md` `USER-GUIDE.ru.md` | | #354 | [CODE-REVIEW-354-r2.md](CODE-REVIEW-354-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #353 | [SPEC-REVIEW-353-r1.md](SPEC-REVIEW-353-r1.md) | spec · r1 | 🟡 жёлтый | 1 | 1 | K3: замена статического реэкспорта на «голый» import().catch() рвёт гарантию await impo…; , в скоупе] K2 не имеет ни одного AC/доказательства; , снято с запиской] docs/USER-GUIDE.ru.md не упомянут в объёме задачи, хотя описывает к… | `dist/houseplan-card.js` `houseplan-card.ts` `demo/srv/demo.html` `demo/docs/capture.mjs` `demo/smoke_entry_stale.mjs` `editor-runtime-loader.test.mjs` `docs/USER-GUIDE.ru.md` | | #353 | [SPEC-REVIEW-353-r2.md](SPEC-REVIEW-353-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | , снято с запиской] AC5 не проговаривает, что структурная проверка обязана отличать «па… | `test/houseplan-source.mjs` | | #353 | [CODE-REVIEW-353-r1.md](CODE-REVIEW-353-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #348 | [SPEC-REVIEW-348-r1.md](SPEC-REVIEW-348-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | de-CH унаследует «ß», хотя стандартная швейцарская орфография его не использует; явного блока «принято предположительно, поменять свободно» в конце документа нет | `docs/specs/348-german-localization.md` | | #348 | [CODE-REVIEW-348-r1.md](CODE-REVIEW-348-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | AC8 не имеет обещанного в ТЗ smoke-доказательства «нет overflow». docs/specs/348-german…; src/i18n/language-runtime.ts определяет полноценный переиспользуемый класс LanguageRunt…; Initial View budget после follow-up-коммита — 255 986 / 256 000 B gzip, запас 14 байт и…; scripts/bundle-manifest.mjs: классификация editorRoots/onboardingRoots/ localeRoots сме…; Удалённые из en.json/ru.json ключи (title.add_device, title.show_all, title.markup_open… | `docs/specs/348-german-localization.md` `demo/smoke_dialog_footer_width.mjs` `demo/smoke_german_locale.mjs` `smoke_dialog_footer_width.mjs` `smoke_german_locale.mjs` `src/i18n/language-runtime.ts` `test/i18n-runtime.test.mjs` `src/i18n/registry.ts` | | #348 | [CODE-REVIEW-348-r2.md](CODE-REVIEW-348-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #341 | [CODE-REVIEW-341-r1.md](CODE-REVIEW-341-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #340 | [SPEC-REVIEW-340-r1.md](SPEC-REVIEW-340-r1.md) | spec · r1 | 🟢 зелёный | 0 | 1 | заведён отдельный issue; не блокирует, отмечено с решением «оставить как есть» | `custom_components/houseplan/websocket_api.py` `tests_backend/test_ha_websocket.py` `docs/TESTING.md` `docs/ARCHITECTURE.md` `docs/specs/340-config-set-revision.md` | | #340 | [CODE-REVIEW-340-r1.md](CODE-REVIEW-340-r1.md) | code · r1 | ⚪ — | 0 | 0 | — | — | | #339 | [CODE-REVIEW-339-r1.md](CODE-REVIEW-339-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #337 | [SPEC-REVIEW-337-r1.md](SPEC-REVIEW-337-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #337 | [CODE-REVIEW-337-r1.md](CODE-REVIEW-337-r1.md) | code · r1 | 🔴 красный | 5 | 3 | Warm-remount коммитит editor mode в обход loader-гейта — падения на уже существующих sm…; Kiosk-контролы, явно названные в принятом ТЗ eager (§6.3: «kiosk controls остаются eage…; Безопасность resize «fail-closed» сломана: принудительный отказ preflight-проверки всё …; Стрелочная навигация по вкладкам инвентаря устройств падает с необработанным исключение…; Визуальная порча вторичного тулбара Device editor + 3 неподтверждённых golden-дельты по…; Два существующих smoke ожидают, что houseplan-card-editor уже зарегистрирован на страни… | `src/houseplan-card.ts` `docs/WARM-REMOUNT.md` `demo/smoke_preloader_lifecycle.mjs` `demo/smoke_warm_dialogs.mjs` `demo/smoke_warm_owners.mjs` `docs/SCOPE.md` `demo/smoke_kiosk.mjs` `demo/smoke_room_resize.mjs` | | #337 | [CODE-REVIEW-337-r2.md](CODE-REVIEW-337-r2.md) | code · r2 | 🔴 красный | 2 | 1 | Warm-remount editor-камера теряет бит-точность — визуальный «прыжок» кадра, воспроизвод…; фикс устранил исключение, но обнажил под ним ещё один, ранее не наблюдаемый дефект в то… | `demo/smoke_warm_dialogs.mjs` `docs/WARM-REMOUNT.md` `src/houseplan-card.ts` | | #337 | [CODE-REVIEW-337-r3.md](CODE-REVIEW-337-r3.md) | code · r3 | 🔴 красный | 1 | 0 | check-docs красный на ревьюемом SHA — стало устаревшим ровно из-за этого коммита, AC13 … | `scripts/source-fingerprint.mjs` `src/houseplan-card.ts` `docs/images/screenshots.json` `docs/specs/337-lazy-editor-chunk.md` `PROCESS.md` | | #337 | [CODE-REVIEW-337-r4.md](CODE-REVIEW-337-r4.md) | code · r4 | 🟢 зелёный | 1 | 0 | — | — | | #335 | [SPEC-REVIEW-335-r1.md](SPEC-REVIEW-335-r1.md) | spec · r1 | 🟡 жёлтый | 1 | 1 | определение «маркер существует» игнорирует tombstone removed: true, из-за чего AC1 не з…; release-артефакты / User-Visible не названы | `src/devices.ts` `custom_components/houseplan/validation.py` `trails.py` `tests_backend/test_trail_recorder.py` `import_export.py` `src/houseplan-editor-runtime.ts` `docs/VACUUM.md` `houseplan-editor-runtime.ts` | | #335 | [SPEC-REVIEW-335-r2.md](SPEC-REVIEW-335-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #335 | [CODE-REVIEW-335-r1.md](CODE-REVIEW-335-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #333 | [SPEC-REVIEW-333-r1.md](SPEC-REVIEW-333-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | AC4 называет способ доказательства, который не проверяет заявленное (Medium, в скоупе з… | `scripts/check-docs.mjs` `README.md` `README.ru.md` `docs/USER-GUIDE.md` `.ru.md` `docs/TOUCH-SUPPORT.md` `docs/DECOR-EDITOR.md` `docs/VACUUM.md` | | #333 | [SPEC-REVIEW-333-r2.md](SPEC-REVIEW-333-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 1 | — | — | | #333 | [CODE-REVIEW-333-r1.md](CODE-REVIEW-333-r1.md) | code · r1 | 🟡 жёлтый | 1 | 1 | Optimize новым гейтом ломает существующий бэкенд-тест — подтверждённая регрессия | `junction_limits.py` `tests_backend/test_ha_websocket.py` `test/fixtures/optimize-storage-roundtrip.json` `optimize-storage-roundtrip.json` | | #333 | [CODE-REVIEW-333-r2.md](CODE-REVIEW-333-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #331 | [SPEC-REVIEW-331-r1.md](SPEC-REVIEW-331-r1.md) | spec · r1 | 🔴 красный | 1 | 4 | Ключ узла квантуется через round(), а не через уже принятый в этом репозитории cross-la…; Собственный пример AC1 не проходит собственный порог инцидентности; Не решено, распространяется ли fail-closed §2.6 на сторону previous, и не создаёт ли эт…; Максимальная ветвь ищется DFS-перебором вариантов; наихудшая сложность не оценена и не …; Release-артефакты не называют docs/USER-GUIDE.ru.md; §1 не отвечает на два обязательных продуктовых вопроса ТЗ в открытой форме — какая перс… | `docs/specs/331-junction-limit-precision.md` `src/coordinate-canonicalization.ts` `custom_components/houseplan/coordinate_canonicalization.py` `coordinate_canonicalization.py` `custom_components/houseplan/junction_limits.py` `docs/USER-GUIDE.ru.md` `check-docs.mjs` `docs/SCOPE.md` | | #331 | [SPEC-REVIEW-331-r2.md](SPEC-REVIEW-331-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 1 | M-r2-1 (наследник M2, закрыт частично). AC6 не различает сторону (previous/candidate) —…; §6 «Риски» (2) описывает механизм, которого §2.3 больше не содержит («максимальная ветв… | `docs/specs/331-junction-limit-precision.md` | | #331 | [SPEC-REVIEW-331-r3.md](SPEC-REVIEW-331-r3.md) | spec · r3 | 🟢 зелёный | 0 | 0 | — | — | | #331 | [CODE-REVIEW-331-r1.md](CODE-REVIEW-331-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #330 | [SPEC-REVIEW-330-r1.md](SPEC-REVIEW-330-r1.md) | spec · r1 | ⚪ — | 2 | 1 | Перф-бюджеты §5 недостижимы решением из §4: AC2 и AC6 непроверяемы как написаны; AC4 ссылается на бенч, который не вызывает изменяемый код; Отсутствуют обязательные разделы ТЗ по §7.1: i18n, touch, риски, release-артефакты | `docs/specs/330-junction-limits-performance.md` `junction_limits.py` `src/houseplan-card.ts` `benchmark_junction_limits.mjs` `demo/benchmark_safe_resize.mjs` `test-build/resize.js` `test-build/plan-geometry-preflight.js` `benchmark_safe_resize.mjs` | | #330 | [SPEC-REVIEW-330-r2.md](SPEC-REVIEW-330-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #330 | [CODE-REVIEW-330-r2.md](CODE-REVIEW-330-r2.md) | code · r2 | ⚪ — | 0 | 1 | заявленная «поведенческая половина» AC4 не различает наличие и отсутствие кэша | `demo/smoke_junction_limits.mjs` `scripts/mutation-gate.mjs` `test/junction-limits.test.mjs` | | #330 | [CODE-REVIEW-330-r3.md](CODE-REVIEW-330-r3.md) | code · r3 | 🔴 красный | 1 | 0 | докс-гейт красный на HEAD ревью (в скоупе, блокирует) | `src/houseplan-card.ts` `docs/images/screenshots.json` | | #330 | [CODE-REVIEW-330-r4.md](CODE-REVIEW-330-r4.md) | code · r4 | 🟢 зелёный | 0 | 0 | — | — | | #329 | [SPEC-REVIEW-329-r1.md](SPEC-REVIEW-329-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | UX отказа записи заявлен как факт, а не как решение, и не согласован с уже существующим…; AC5 описывает два разных теста одной фразой и непроверяем в текущей формулировке; параллель «5 см = 1 клетка» вводит в заблуждение при нестандартном cell_cm | `docs/specs/329-junction-limits.md` `docs/USER-GUIDE.ru.md` `houseplan-space-test2-2026-08-27_16-14-48.json` `src/grid-scale.ts` `src/plan-optimizer.ts` | | #329 | [SPEC-REVIEW-329-r2.md](SPEC-REVIEW-329-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 0 | — | — | | #329 | [SPEC-REVIEW-329-r3.md](SPEC-REVIEW-329-r3.md) | spec · r3 | 🟢 зелёный | 0 | 0 | — | — | | #329 | [CODE-REVIEW-329-r1.md](CODE-REVIEW-329-r1.md) | code · r1 | 🔴 красный | 1 | 4 | Бэкенд отказывает в легитимной правке легаси-плана — прямое нарушение §3; Мёртвый код в wall-thickness.ts, чьё удаление коммит уже задекларировал; Дублированный раздел в docs/USER-GUIDE.ru.md; USER-GUIDE описывает канал Resize неполно — читатель не узнает про тост; AC10 (постусловие Optimize) не доказан ни тестом, ни явным разбором | `import_export.py` `test_junction_limits.py` `wall-thickness.ts` `src/wall-thickness.ts` `docs/USER-GUIDE.ru.md` `docs/USER-GUIDE.md` `src/houseplan-card.ts` `smoke_junction_limits.mjs` | | #329 | [CODE-REVIEW-329-r2.md](CODE-REVIEW-329-r2.md) | code · r2 | 🔴 красный | 1 | 4 | — | — | | #329 | [CODE-REVIEW-329-r3.md](CODE-REVIEW-329-r3.md) | code · r3 | 🟢 зелёный | 0 | 0 | — | — | | #324 | [CODE-REVIEW-324-r1.md](CODE-REVIEW-324-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | избыточный повторный config/get при physicalGeometryRolledBack | `src/houseplan-card.ts` | | #323 | [CODE-REVIEW-323-r1.md](CODE-REVIEW-323-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #319 | [SPEC-REVIEW-319-r1.md](SPEC-REVIEW-319-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #319 | [CODE-REVIEW-319-r1.md](CODE-REVIEW-319-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #318 | [SPEC-REVIEW-318-r1.md](SPEC-REVIEW-318-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #318 | [CODE-REVIEW-318-r1.md](CODE-REVIEW-318-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #317 | [SPEC-REVIEW-317-r1.md](SPEC-REVIEW-317-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | 1. Терминология HA Area/HA-зона в плане документации. ТЗ систематически использует «HA … | `docs/USER-GUIDE.ru.md` `USER-GUIDE.ru.md` | | #317 | [CODE-REVIEW-317-r1.md](CODE-REVIEW-317-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | 1. Нет юнит-теста на дублирующиеся live-маркеры одного binding в roomClimateMap. Коммен… | `src/devices.ts` | | #316 | [SPEC-REVIEW-316-r1.md](SPEC-REVIEW-316-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | ТЗ не закрывает несколько обязательных разделов §7.1 / чек-листа DoR §2.5; AC3 описывает фикстуру, не достижимую в названном ею механизме; коллизия термина «инертный» | `ru.json` `en.json` `docs/CHANGELOG.md` `docs/CHANGELOG.ru.md` `docs/specs/README.md` `wall-segment-model.ts` `scripts/config-field-registry.mjs` `docs/CONFIG-COMPATIBILITY.md` | | #316 | [SPEC-REVIEW-316-r2.md](SPEC-REVIEW-316-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 2 | §5.1 указывает не тот абзац docs/CONFIG-COMPATIBILITY.md; §5.3 неточно утверждает отсутствие span+проём в существующих golden-сценах | `docs/CONFIG-COMPATIBILITY.md` `demo/golden/harness.mjs` `demo/golden/matrix.mjs` `baselines-index.json` | | #316 | [SPEC-REVIEW-316-r3.md](SPEC-REVIEW-316-r3.md) | spec · r3 | 🟡 жёлтый | 0 | 1 | §5.3 обосновывает «без изменений» неточным утверждением о контурных/независимых атомах | `demo/golden/harness.mjs` `276-coincident-partition.json` `src/wall-segment-model.ts` `matrix.mjs` `src/houseplan-card.ts` | | #316 | [SPEC-REVIEW-316-r4.md](SPEC-REVIEW-316-r4.md) | spec · r4 | 🟢 зелёный | 0 | 0 | — | — | | #316 | [CODE-REVIEW-316-r1.md](CODE-REVIEW-316-r1.md) | code · r1 | 🔴 красный | 1 | 0 | деградированный host (§3.3) может завести данные, которые бэкенд тут же отклоняет: мигр…; CHANGELOG заявляет то, чего код не гарантирует | `src/wall-segment-model.ts` `custom_components/houseplan/wall_segment_model.py` `websocket_api.py` `custom_components/houseplan/validation.py` `space-render.ts` `houseplan-card.ts` `physical-geometry.ts` `wall-segment-model.ts` | | #316 | [CODE-REVIEW-316-r2.md](CODE-REVIEW-316-r2.md) | code · r2 | 🔴 красный | 1 | 1 | история ветки переписана поверх уже отревьюженного коммита r1; бэкенд-релаксация host-проверки шире границы, заявленной в §2 ТЗ | `docs/reviews/CODE-REVIEW-316-r1.md` `docs/specs/316-opening-host-auto-resolution.md` `custom_components/houseplan/validation.py` `houseplan-card.ts` `demo/golden/harness.mjs` | | #314 | [SPEC-REVIEW-314-r1.md](SPEC-REVIEW-314-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | Сценарий не называет персону/job явно; Нет отдельного раздела «план автотестов» | `docs/specs/314-v8-draft-write-regression.md` `docs/SCOPE.md` | | #314 | [CODE-REVIEW-314-r1.md](CODE-REVIEW-314-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #313 | [SPEC-REVIEW-313-r1.md](SPEC-REVIEW-313-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #313 | [CODE-REVIEW-313-r1.md](CODE-REVIEW-313-r1.md) | code · r1 | 🔴 красный | 1 | 1 | 1; 1, в скоупе | `src/houseplan-card.ts` `src/types.ts` `docs/WALL-THICKNESS.md` `demo/serve.mjs` `scripts/mutation-gate.mjs` `test/wall-union-isolation.test.mjs` `mutation-gate.mjs` `demo/smoke_wallthick_standalone.mjs` | | #313 | [CODE-REVIEW-313-r2.md](CODE-REVIEW-313-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #310 | [SPEC-REVIEW-310-r1.md](SPEC-REVIEW-310-r1.md) | spec · r1 | 🔴 красный | 1 | 0 | AC5 и Риск №2 называют детектор, который структурно не видит узел-пару — риск «дыры на …; Технические решения реализации не оформлены явным блоком «принято предположительно, пом… | `docs/specs/310-pair-apex.md` `wall-thickness.ts` `test/fixtures/309-junction-teeth.json` `test/wall-thickness.test.mjs` | | #310 | [SPEC-REVIEW-310-r2.md](SPEC-REVIEW-310-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #310 | [CODE-REVIEW-310-r1.md](CODE-REVIEW-310-r1.md) | code · r1 | ⚪ — | 1 | 1 | недостоверный Baseline-Reviewed в коммите 0e6fbfb0; обещанный тест на пересечение #271+#310 отсутствует | `.github/workflows/validate.yml` `demo/golden/README.md` `PROCESS.md` `AGENTS.md` `validate-commit-provenance.mjs` `test/wall-thickness.test.mjs` | | #310 | [CODE-REVIEW-310-r2.md](CODE-REVIEW-310-r2.md) | code · r2 | 🟢 зелёный | 1 | 1 | 1 Честность нового Baseline-Reviewed; 2 Новый юнит-тест — умеет падать | — | | #309 | [SPEC-REVIEW-309-r1.md](SPEC-REVIEW-309-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | Отсутствуют несколько обязательных разделов §7.1, включая оба продуктовых; §3.5 и §4 повторяют формулировку «Все 16 junction-сцен» из docs/WALL-THICKNESS.md («Jun… | `docs/specs/309-junction-visual-limit.md` `docs/WALL-THICKNESS.md` `docs/CHANGELOG.md` `docs/CHANGELOG.ru.md` `docs/specs/README.md` `demo/golden/matrix.mjs` `AGENTS.md` | | #309 | [SPEC-REVIEW-309-r2.md](SPEC-REVIEW-309-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 1 | Раздел «Скоуп и не-скоуп» (§3.6) не закрывает находку r1 полностью, и одна из двух его … | `src/wall-thickness.ts` `docs/WALL-THICKNESS.md` `PROCESS.md` `docs/TOUCH-SUPPORT.md` | | #309 | [SPEC-REVIEW-309-r3.md](SPEC-REVIEW-309-r3.md) | spec · r3 | 🟢 зелёный | 0 | 1 | Нумерация AC в §5 разъезжается: новая строка помечена «7a», но названа в прозе «AC8», а… | `PROCESS.md` | | #309 | [CODE-REVIEW-309-r1.md](CODE-REVIEW-309-r1.md) | code · r1 | 🔴 красный | 0 | 1 | npm test красный на проверяемом SHA; AC5 доказана не буквально как записано в ТЗ | `test/golden-matrix.test.mjs` `demo/golden/matrix.mjs` `demo/golden/README.md` `docs/specs/309-junction-visual-limit.md` `test/fixtures/309-junction-teeth.json` `smoke_junction_holes.mjs` `302-junction-artifacts.json` `scripts/wall-strip-containment.mjs` | | #309 | [CODE-REVIEW-309-r2.md](CODE-REVIEW-309-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #307 | [SPEC-REVIEW-307-r1.md](SPEC-REVIEW-307-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #307 | [CODE-REVIEW-307-r1.md](CODE-REVIEW-307-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #306 | [SPEC-REVIEW-306-r1.md](SPEC-REVIEW-306-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | лимит wall_segments[] в ТЗ устарел и противоречит уже слитому #282 | `docs/specs/306-zero-thickness-walls.md` `custom_components/houseplan/validation.py` `docs/specs/282-stable-wall-segment-identity.md` `docs/specs/282-...md` | | #306 | [SPEC-REVIEW-306-r2.md](SPEC-REVIEW-306-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #306 | [CODE-REVIEW-306-r1.md](CODE-REVIEW-306-r1.md) | code · r1 | 🟡 жёлтый | 0 | 0 | 1 Гейты — что прогнано; 2 Что НЕ прогонялось и почему; Отчёт «Оптимизировать планы» показывает退ый термин «виртуальный»/«virtual», который это …; docs/CHANGELOG.md/docs/CHANGELOG.ru.md не содержат обязательного предупреждения о backu…; Четыре i18n-ключа из таблицы §15 ТЗ реализованы не под тем именем/точным текстом | `src/i18n/en.json` `ru.json` `src/houseplan-card.ts` `src/plan-optimizer.ts` `plan-optimizer.ts` `houseplan-card.ts` `docs/CHANGELOG.md` `docs/CHANGELOG.ru.md` | | #306 | [CODE-REVIEW-306-r2.md](CODE-REVIEW-306-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | 1 Гейты — что прогнано лично; 2 Что НЕ прогонялось и почему; 3 Разбор смок-выборки по дельте | — | | #304 | [SPEC-REVIEW-304-r1.md](SPEC-REVIEW-304-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #304 | [CODE-REVIEW-304-r1.md](CODE-REVIEW-304-r1.md) | code · r1 | 🟡 жёлтый | 1 | 0 | два golden-сценария неродственных фич стали «different» на канонической Linux CI и не п…; AC1 фиксирует «шесть узлов» через частный unit/smoke fixture, а не через golden-сцену с… | `demo/golden/harness.mjs` `demo/golden/matrix.mjs` | | #304 | [CODE-REVIEW-304-r2.md](CODE-REVIEW-304-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #303 | [SPEC-REVIEW-303-r1.md](SPEC-REVIEW-303-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #303 | [CODE-REVIEW-303-r1.md](CODE-REVIEW-303-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | счёт unit-тестов в отчёте разработчика на единицу отличается от факта | — | | #302 | [SPEC-REVIEW-302-r1.md](SPEC-REVIEW-302-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #302 | [CODE-REVIEW-302-r1.md](CODE-REVIEW-302-r1.md) | code · r1 | ⚪ — | 0 | 2 | docs/WALL-THICKNESS.md не переписан под решение №5, хотя спека требовала это явно; мутант junction-fans-disabled не работает, вопреки заявлению «краснота проверена исполн…; bevelMultiWallPaper осталась мёртвым кодом | `docs/WALL-THICKNESS.md` `docs/specs/302-junction-node-material.md` `wall-thickness.ts` `PROCESS.md` `AGENTS.md` `scripts/mutation-gate.mjs` `demo/smoke_junction_holes.mjs` `../test-build/wall-thickness.js` | | #302 | [CODE-REVIEW-302-r2.md](CODE-REVIEW-302-r2.md) | code · r2 | ⚪ — | 0 | 1 | AC6 не выполнен: узловая механика не «безоперационна по difference», спека это не признаёт | `src/wall-thickness.ts` `docs/specs/302-junction-node-material.md` `test/wall-thickness.test.mjs` `docs/WALL-THICKNESS.md` | | #302 | [CODE-REVIEW-302-r4.md](CODE-REVIEW-302-r4.md) | code · r4 | 🟢 зелёный | 0 | 0 | стек-документация JunctionNodeGeometry описывает не тот контракт | `src/wall-thickness.ts` `docs/WALL-THICKNESS.md` | | #301 | [SPEC-REVIEW-301-r1.md](SPEC-REVIEW-301-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | Контракт п.4.1/4.2 требует показывать entity_id вторичной подписью в двух местах (закры… | `PROCESS.md` | | #301 | [CODE-REVIEW-301-r1.md](CODE-REVIEW-301-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #300 | [SPEC-REVIEW-300-r1.md](SPEC-REVIEW-300-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | временное скрытие кнопки настроек комнаты — недекларированная догадка, выданная за прин…; AC11 требует относительный регресс-бюджет, которого не существует у названного инструмента | `docs/specs/300-resize-measurement-layout.md` `docs/RESIZE.md` `docs/UX-MODES.md` `docs/USER-GUIDE.ru.md` `demo/benchmark_safe_resize_render.mjs` `demo/benchmark_safe_resize.mjs` `benchmark_safe_resize.mjs` | | #300 | [SPEC-REVIEW-300-r2.md](SPEC-REVIEW-300-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 1 | новый текст утверждает, что footprint .rlgearbtn «screen-fixed», хотя размер кнопки явн… | `docs/specs/300-resize-measurement-layout.md` `styles.ts` | | #300 | [SPEC-REVIEW-300-r3.md](SPEC-REVIEW-300-r3.md) | spec · r3 | 🟡 жёлтый | 0 | 1 | §4 п.6 («Зафиксированные продуктовые решения») по-прежнему называет footprint кнопки «s… | `docs/specs/300-resize-measurement-layout.md` `src/space-geometry.ts` `src/styles.ts` | | #300 | [SPEC-REVIEW-300-r4.md](SPEC-REVIEW-300-r4.md) | spec · r4 | 🟢 зелёный | 0 | 0 | — | — | | #299 | [SPEC-REVIEW-299-r1.md](SPEC-REVIEW-299-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #298 | [SPEC-REVIEW-298-r1.md](SPEC-REVIEW-298-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | отсутствуют обязательные продуктовые разделы §7.1; способ доказательства не назван явно у двух AC; разделы «UX» и «i18n» не выделены явно | `PROCESS.md` `AGENTS.md` `docs/SCOPE.md` `demo/smoke_room_resize.mjs` `RESIZE.md` | | #298 | [SPEC-REVIEW-298-r2.md](SPEC-REVIEW-298-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #298 | [CODE-REVIEW-298-r1.md](CODE-REVIEW-298-r1.md) | code · r1 | 🔴 красный | 2 | 0 | AC4 (legacy/key-only записи) не реализован: fail-closed контракт §3.3 отсутствует, дефе…; AC2 не доказан: нет отдельного теста на репродукцию первого этажа | `src/wall-thickness.ts` `wall-thickness.ts` `real-plan-first-floor.json` `test/wall-thickness.test.mjs` `smoke_edit_walk.mjs` | | #296 | [SPEC-REVIEW-296-r1.md](SPEC-REVIEW-296-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #296 | [CODE-REVIEW-296-r1.md](CODE-REVIEW-296-r1.md) | code · r1 | 🔴 красный | 3 | 6 | backend не доказывает удаление partition без hosted opening (§8, AC6); AC7 нарушен: диагностический слой не виден в инструменте Draw (§9.2); smoke_edit_walk.mjs красный на новой фикстуре (AC6, §253-класс дефекта); check-docs красный, скриншоты не пересняты; счётчик удаления drafts делит сообщение с «мусором сетки» (одно число, два разных источ…; порядок слоёв: диагностика рисуется НАД transient-превью инструмента «Проём» | `custom_components/houseplan/validation.py` `tests_backend/test_validation.py` `src/houseplan-card.ts` `demo/smoke_plan_snap_overlay.mjs` `smoke_edit_walk.mjs` `demo/smoke_edit_walk.mjs` `real-plan-second-floor.json` `test/fixtures/real-plan-second-floor.json` | | #295 | [SPEC-REVIEW-295-r1.md](SPEC-REVIEW-295-r1.md) | spec · r1 | 🟡 жёлтый | 1 | 1 | контракт реверсит документированный и протестированный барьер #199 без единого слова об…; предикат «версия карточки ≠ версия интеграции» (§1.5) ссылается на несуществующий канал…; несогласованность detail: null в примере блока; влияние на производительность не названо явно | `src/plan-geometry-preflight.ts` `docs/CANVAS.md` `docs/ARCHITECTURE.md` `test/plan-geometry-preflight.test.mjs` `ARCHITECTURE.md` `custom_components/houseplan/websocket_api.py` `custom_components/houseplan/__init__.py` `import_export.py` | | #295 | [SPEC-REVIEW-295-r2.md](SPEC-REVIEW-295-r2.md) | spec · r2 | 🟡 жёлтый | 1 | 1 | — | — | | #295 | [CODE-REVIEW-295-r1.md](CODE-REVIEW-295-r1.md) | code · r1 | 🟡 жёлтый | 0 | 2 | диагностика меряет не тот отпечаток; фолбэк-блок диагностики не сбрасывается и может показать чужой отказ | `src/houseplan-card.ts` `smoke_preflight_diagnostics.mjs` | | #295 | [CODE-REVIEW-295-r2.md](CODE-REVIEW-295-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #294 | [SPEC-REVIEW-294-r1.md](SPEC-REVIEW-294-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | AC7 уже формулировкой не покрывает весь текст, который спецификация обязана исправить | `docs/specs/294-wall-esc-detach.md` `docs/USER-GUIDE.md` `docs/USER-GUIDE.ru.md` | | #294 | [SPEC-REVIEW-294-r2.md](SPEC-REVIEW-294-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #294 | [CODE-REVIEW-294-r1.md](CODE-REVIEW-294-r1.md) | code · r1 | 🔴 красный | 0 | 2 | Обязательный гейт node scripts/check-docs.mjs красный на ревьюемом SHA; Новый таргетированный смок demo/smoke_unified_wall_tool.mjs падает на двух ассертах, ко… | `src/houseplan-card.ts` `docs/images/screenshots.json` `demo/smoke_unified_wall_tool.mjs` | | #294 | [CODE-REVIEW-294-r2.md](CODE-REVIEW-294-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #293 | [SPEC-REVIEW-293-r1.md](SPEC-REVIEW-293-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | Отсутствуют два обязательных раздела §7.1 — «риски» и «откат»; docs/specs/293-resize-pointer-noop.md не добавлен в индекс docs/specs/README.md | `docs/specs/293-resize-pointer-noop.md` `docs/specs/README.md` | | #293 | [SPEC-REVIEW-293-r2.md](SPEC-REVIEW-293-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #293 | [CODE-REVIEW-293-r1.md](CODE-REVIEW-293-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #292 | [SPEC-REVIEW-292-r1.md](SPEC-REVIEW-292-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | обещание в §5 не имеет технической опоры и не проверяется ни одним AC; отсутствуют разделы, обязательные по PROCESS.md §7.1 и принятые в соседних ТЗ той же по…; AC1–AC8 не помечают явно способ доказательства | `docs/specs/292-resize-availability-audit.md` `src/resize.ts` `src/i18n/en.json` `src/i18n/ru.json` `PROCESS.md` `292-resize-availability-audit.md` `277-safe-resize.md` `276-coincident-partition-reconciliation.md` | | #292 | [SPEC-REVIEW-292-r2.md](SPEC-REVIEW-292-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #292 | [CODE-REVIEW-292-r1.md](CODE-REVIEW-292-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #291 | [SPEC-REVIEW-291-r1.md](SPEC-REVIEW-291-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | Отсутствуют обе обязательные продуктовые секции §7.1, и новый видимый UI предъявлен как…; Нет разделов «Риски» и «Откат», обязательных по DoR (§2.5) и присутствующих в каждом со…; AC3 иллюстрирует вывод CLI текстом, который не совпадает с реальным форматом инструмента; Issue #291 называет себя «Стадия 1 из ADR #282», хотя реальная Stage 1 ADR #282 — это «… | `docs/specs/291-lattice-coordinate-write-barrier.md` `docs/SCOPE.md` `src/i18n/ru.json` `docs/specs/252-optimize-orphan-layout-report.md` `docs/specs/279-near-orthogonal-junction.md` `docs/specs/226-entity-parent-dedup.md` `scripts/model-invariants.mjs` `docs/adr/282-wall-geometry-representation.md` | | #291 | [SPEC-REVIEW-291-r2.md](SPEC-REVIEW-291-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 1 | Раздел «i18n», обязательный по цепочке §7.1, отсутствует; новые строки отчёта Optimize …; остаётся. Не относится к файлу ТЗ, не блокирует | `docs/specs/291-lattice-coordinate-write-barrier.md` `PROCESS.md` `src/i18n/en.json` `src/i18n/ru.json` `docs/specs/252-optimize-orphan-layout-report.md` `docs/specs/094-universal-state-toggle.md` | | #291 | [SPEC-REVIEW-291-r3.md](SPEC-REVIEW-291-r3.md) | spec · r3 | 🟢 зелёный | 0 | 0 | Точность (число знаков/округление) нового placeholder {cm} в gs.optimize_lattice_summar…; остаётся. Не относится к файлу ТЗ, не блокирует | `docs/specs/291-lattice-coordinate-write-barrier.md` `src/houseplan-card.ts` `model-invariants.mjs` | | #291 | [CODE-REVIEW-291-r1.md](CODE-REVIEW-291-r1.md) | code · r1 | 🟡 жёлтый | 0 | 2 | AC4 не доказан ни автотестом, ни явной записью; docs/USER-GUIDE.ru.md не обновлён; не блокируют, зафиксированы без правки | `smoke_lattice_write_barrier.mjs` `smoke_optimize_coordinate_canonicalization.mjs` `docs/USER-GUIDE.ru.md` `docs/USER-GUIDE.md` `src/i18n/ru.json` | | #291 | [CODE-REVIEW-291-r2.md](CODE-REVIEW-291-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #290 | [SPEC-REVIEW-290-r1.md](SPEC-REVIEW-290-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | Отсутствуют обязательные разделы §7.1 «риски» и «откат»; AC исходного issue про npm run invariants на реальных данных и видимое снижение числа п…; AC4 неточно называет источник fixture | `docs/specs/290-near-axis-authoring-and-repair.md` `docs/specs/277-safe-resize.md` `docs/specs/279-near-orthogonal-junction.md` `scripts/model-invariants.mjs` `44.json` `test/fixtures/279-near-orthogonal-junction.json` | | #290 | [SPEC-REVIEW-290-r2.md](SPEC-REVIEW-290-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #290 | [CODE-REVIEW-290-r1.md](CODE-REVIEW-290-r1.md) | code · r1 | 🔴 красный | 1 | 2 | 1 Смок-выборка; 2 Инварианты и AC10 — реальные планы; Resize отключается на всей комнате из-за чужой, нетронутой near-axis стены (AC3 нарушен…; AC9: 3 из 6 обязательных мутантов отсутствуют; AC10: нет автотеста на двух реальных фикстурах; AC1 «source guard» не механизирован | `src/resize.ts` `test/fixtures/real-plan-second-floor.json` `scripts/mutation-gate.mjs` `test/near-axis.test.mjs` `mutation-gate.mjs` `smoke_near_axis_optimize.mjs` `test/model-invariants.test.mjs` `test/plan-optimizer.test.mjs` | | #290 | [CODE-REVIEW-290-r2.md](CODE-REVIEW-290-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | 1 Смок-выборка; 1 Проверка закрытия High H1 (не декларативно — воспроизведением на обоих состояниях кода); 2 Проверка закрытия Medium M1 (mutation-gate); 3 Проверка закрытия Medium M2 (AC10 автотест) | — | | #290 | [CODE-REVIEW-290-r3.md](CODE-REVIEW-290-r3.md) | code · r3 | ⚪ — | 0 | 0 | ТЗ AC1 (docs/specs/290-near-axis-authoring-and-repair.md:173-174) прямо обещает: «Autho… | `docs/specs/290-near-axis-authoring-and-repair.md` `src/wall-thickness.ts` `test/near-axis.test.mjs` `test/single-source-numbers.test.mjs` `src/near-axis.ts` `wall-thickness.ts` | | #290 | [CODE-REVIEW-290-r4.md](CODE-REVIEW-290-r4.md) | code · r4 | 🟢 зелёный | 0 | 0 | — | — | | #289 | [SPEC-REVIEW-289-r1.md](SPEC-REVIEW-289-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 3 | раздел «Риски» отсутствует полностью; раздел «Откат» отсутствует полностью; 6 из 9 AC не указывают способ доказательства; терминология «рукоятка» вместо канонической «ручка»; i18n-ключ не назван по имени | `docs/RESIZE.md` `demo/smoke_room_resize.mjs` `test/resize.test.mjs` `docs/USER-GUIDE.ru.md` `src/resize.ts` `src/i18n/en.json` `ru.json` | | #289 | [SPEC-REVIEW-289-r2.md](SPEC-REVIEW-289-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #289 | [CODE-REVIEW-289-r1.md](CODE-REVIEW-289-r1.md) | code · r1 | 🟢 зелёный | 1 | 1 | Незапланированный код #260 в ветке #289 ломает два golden-эталона, третий не принят (Hi…; Golden-эталон safe-resize-handles-clamp-{dark,light} не обновлён под настоящее поведени… | `demo/fixtures/wall-key.mjs` `test/fixture-wall-key.test.mjs` `demo/fixtures/large-house.mjs` `demo/fixtures/visual-matrix.mjs` `test/model-invariants.test.mjs` `demo/golden/harness.mjs` `large-house.mjs` `visual-matrix.mjs` | | #289 | [CODE-REVIEW-289-r2.md](CODE-REVIEW-289-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #288 | [SPEC-REVIEW-288-r1.md](SPEC-REVIEW-288-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | Отсутствуют обязательные разделы «Риски» и «Откат» (§7.1, DoR §2.5); «Связано» в шапке не включает #279, хотя AC4 явно на него ссылается | `docs/specs/288-bounded-multiwall-corridor.md` `docs/specs/275-multiwall-strip-containment.md` `docs/specs/278-wall-union-isolation.md` | | #288 | [SPEC-REVIEW-288-r2.md](SPEC-REVIEW-288-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #288 | [CODE-REVIEW-288-r1.md](CODE-REVIEW-288-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | нарушен собственный порядок релиза из §10/issue; AC3 не проверяет геометрию тела, только метаданные continuations | `docs/specs/288-bounded-multiwall-corridor.md` `demo/fixtures/wall-key.mjs` `check-docs.mjs` `wall-thickness.ts` `test/wall-thickness.test.mjs` `demo/smoke_real_plan_masonry.mjs` | | #288 | [CODE-REVIEW-288-r2.md](CODE-REVIEW-288-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #288 | [CODE-REVIEW-288-r3.md](CODE-REVIEW-288-r3.md) | code · r3 | 🟢 зелёный | 0 | 0 | — | — | | #282 | [SPEC-REVIEW-282-r1.md](SPEC-REVIEW-282-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | Не специфицирован порядок атомизации Stage 1 относительно уже существующего lattice-бар…; Заявленный UX отказа («предлагает Optimize либо исправление») не совпадает с фактически… | `docs/specs/282-stable-wall-segment-identity.md` `src/coordinate-canonicalization.ts` `docs/WALL-THICKNESS.md` | | #282 | [SPEC-REVIEW-282-r2.md](SPEC-REVIEW-282-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #282 | [CODE-REVIEW-282-r1.md](CODE-REVIEW-282-r1.md) | code · r1 | 🔴 красный | 2 | 4 | #278-guard «отклонить правку деградированного пространства» больше не срабатывает; Широкая регрессия структурных операций редактирования; AC15 добавил новую строку в Optimize-диалог — golden baseline не обновлён; AC5 «executable source/AST guard + bypass mutant for each writer family» реализован уже…; wall_model_client_outdated не срабатывает в реалистичном сценарии старого клиента; Регрессионный тест issue #248 ослаблен без обновления фикстуры | `demo/smoke_wall_union_isolation.mjs` `src/houseplan-card.ts` `wall-segment-model.ts` `smoke_resize_pointer_real_plan.mjs` `smoke_wall_chain_thickness.mjs` `smoke_unified_wall_tool.mjs` `smoke_wall_face_overlap.mjs` `smoke_edit_walk.mjs` | | #282 | [CODE-REVIEW-282-r2.md](CODE-REVIEW-282-r2.md) | code · r2 | 🔴 красный | 2 | 0 | npm test красный: диагностика больше не соответствует контракту, который сама же проверяет; AC7 нарушен: opening на обычной стене исчезает со Static-карточки после миграции в v8 | `test/open-passage-contract.test.mjs` `demo/smoke_open_passage.mjs` `src/space-render.ts` `space-card.ts` `ARCHITECTURE.md` `src/wall-segment-model.ts` `space-render.ts` `src/houseplan-card.ts` | | #282 | [CODE-REVIEW-282-r3.md](CODE-REVIEW-282-r3.md) | code · r3 | 🔴 красный | 1 | 0 | AC7 всё ещё нарушен: Static-карточка рисует сплошную стену прямо по месту прохода после… | `src/space-render.ts` `src/wall-segment-model.ts` `space-render.ts` `houseplan-card.ts` `demo/smoke_open_passage.mjs` `src/logic.ts` `docs/SCOPE.md` `smoke_open_passage.mjs` | | #282 | [CODE-REVIEW-282-r4.md](CODE-REVIEW-282-r4.md) | code · r4 | 🟢 зелёный | 0 | 0 | — | — | | #278 | [SPEC-REVIEW-278-r1.md](SPEC-REVIEW-278-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | отсутствует обязательный раздел «Риски». PROCESS.md §7.1 перечисляет обязательные разде… | `docs/specs/278-wall-union-isolation.md` `docs/specs/253-resize-wall-thickness.md` `docs/specs/275-multiwall-strip-containment.md` | | #278 | [SPEC-REVIEW-278-r2.md](SPEC-REVIEW-278-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #278 | [CODE-REVIEW-278-r1.md](CODE-REVIEW-278-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | docs/TESTING.md называет несуществующие id мутантов | `docs/TESTING.md` `scripts/mutation-gate.mjs` `TESTING.md` `mutation-gate.mjs` | | #278 | [CODE-REVIEW-278-r2.md](CODE-REVIEW-278-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #277 | [SPEC-REVIEW-277-r1.md](SPEC-REVIEW-277-r1.md) | spec · r1 | ⚪ — | 0 | 3 | нет обязательного раздела «риски» (§7.1); нет обязательного «что человек увидит до и после» одной фразой без терминов реализации …; из плана тестов выпала обязательная анонимизированная fixture реального плана | `docs/specs/277-safe-resize.md` | | #277 | [SPEC-REVIEW-277-r2.md](SPEC-REVIEW-277-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #277 | [CODE-REVIEW-277-r1.md](CODE-REVIEW-277-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | Кэш допустимости (eligibility) на самом деле не memo­изирует дорогую часть — рендер руч…; Мёртвый код и устаревший комментарий: rszSel теперь ничего не рендерит, хотя всё ещё вы… | `src/houseplan-card.ts` `docs/ARCHITECTURE.md` `demo/fixtures/large-house.mjs` `benchmark_safe_resize.mjs` | | #277 | [CODE-REVIEW-277-r2.md](CODE-REVIEW-277-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | Находка предыдущего раунда (M1) закрыта полностью — см. раздел ниже. Новых находок в пр… | `docs/reviews/CODE-REVIEW-277-r1.md` `src/houseplan-card.ts` | | #276 | [SPEC-REVIEW-276-r1.md](SPEC-REVIEW-276-r1.md) | spec · r1 | 🔴 красный | 1 | 3 | Заявленный Redo для серверной отмены Optimize не существует и не заявлен как новая работа; Раздел «Риски» отсутствует — обязательный пункт DoR; Не перечислены затронутые файлы и модули — обязательный пункт DoR; Ссылка на несуществующий канонический документ docs/PLAN-OPTIMIZE.md | `src/houseplan-card.ts` `docs/USER-GUIDE.ru.md` `docs/ARCHITECTURE.md` `docs/specs/275-multiwall-strip-containment.md` `src/plan-optimizer.ts` `src/wall-merge.ts` `src/physical-geometry.ts` `docs/PLAN-OPTIMIZE.md` | | #276 | [SPEC-REVIEW-276-r2.md](SPEC-REVIEW-276-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #276 | [SPEC-REVIEW-276-r3.md](SPEC-REVIEW-276-r3.md) | spec · r3 | 🟢 зелёный | 0 | 0 | Разное именование одной переменной в двух соседних формулах; AC1 сохраняет квалификатор «same-thickness», хотя условие эксплицитно расширено дельтой; Второй подряд неверный SHA в хендофф-комментарии автора — повтор находки r2 | `docs/reviews/SPEC-REVIEW-276-r2.md` | | #276 | [CODE-REVIEW-276-r1.md](CODE-REVIEW-276-r1.md) | code · r1 | 🟡 жёлтый | 0 | 3 | AC11 (перф-бюджет §10) не доказан ни автотестом, ни явным; AC3 «несколько hosted openings на одной partition» не покрыто тестом; AC5 «targeted golden» не добавлен ни в каком виде | `docs/specs/276-coincident-partition-reconciliation.md` `demo/benchmark_large_house.mjs` `demo/benchmark_optimize_geometry_preflight.mjs` `test/fixtures/276-coincident-partition.json` `test/coincident-partitions.test.mjs` `test/plan-optimizer.test.mjs` `src/coincident-partitions.ts` `demo/golden/matrix.mjs` | | #276 | [CODE-REVIEW-276-r2.md](CODE-REVIEW-276-r2.md) | code · r2 | 🟡 жёлтый | 0 | 3 | 2 (Medium, в скоупе, чинится тем же автором) — benchmark:coincident-partitions даёт сис… | `demo/benchmark_coincident_partitions.mjs` `demo/benchmark_optimize_geometry_preflight.mjs` | | #276 | [CODE-REVIEW-276-r3.md](CODE-REVIEW-276-r3.md) | code · r3 | 🟢 зелёный | 0 | 1 | — | — | | #275 | [SPEC-REVIEW-275-r1.md](SPEC-REVIEW-275-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | 1: делегирование доказательства AC3 существующей конвенции хендоффа, не тексту ТЗ; 2: план автотестов не выделен отдельным заголовком | `docs/specs/275-multiwall-strip-containment.md` `docs/specs/272-no-multiwall-holes.md` | | #275 | [SPEC-REVIEW-275-r2.md](SPEC-REVIEW-275-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 1 | 1: контракт не определяет узлы, где ray-пары смешивают rectilinear и non-rectilinear; 1 (снимаю без правки документа): величина angle-epsilon в §6.1 не названа числом | `docs/specs/275-multiwall-strip-containment.md` `docs/WALL-THICKNESS.md` | | #275 | [SPEC-REVIEW-275-r3.md](SPEC-REVIEW-275-r3.md) | spec · r3 | 🟢 зелёный | 0 | 0 | 1 (новая, снимаю без правки документа): числа «110 из 437» / «100 из 382» из хендоффа н… | `1.json` `2.json` | | #275 | [CODE-REVIEW-275-r1.md](CODE-REVIEW-275-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | незадокументированный golden-impact на двух существующих сценах | `src/wall-thickness.ts` `docs/TESTING.md` | | #274 | [SPEC-REVIEW-274-r1.md](SPEC-REVIEW-274-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | «До»-описание в §2 использует внутренний термин вместо простой фразы (снято); DoR-пункт «затронутые файлы и модули» не оформлен отдельным списком (снято) | `docs/specs/274-wireless-controller-presentation-parity.md` | | #274 | [CODE-REVIEW-274-r1.md](CODE-REVIEW-274-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #273 | [SPEC-REVIEW-273-r1.md](SPEC-REVIEW-273-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | заявленная защита от partition/draft-границы не имеет ни доказательства, ни видимого ме…; не все AC называют способ доказательства явным словом по шаблону §2.5 | `docs/specs/273-optimize-topology-island.md` `src/plan-optimizer.ts` `src/wall-thickness.ts` `test/plan-optimizer.test.mjs` | | #273 | [SPEC-REVIEW-273-r2.md](SPEC-REVIEW-273-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #273 | [CODE-REVIEW-273-r1.md](CODE-REVIEW-273-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #272 | [SPEC-REVIEW-272-r1.md](SPEC-REVIEW-272-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | 1: у большинства AC нет явной строки «Доказательство»; 2: «объявленный exterior sector» не определён алгоритмически; 1: неполное попадание в Core user jobs (снято, без правки документа) | `docs/specs/272-no-multiwall-holes.md` `docs/specs/261-white-wedges-root-cause.md` `docs/SCOPE.md` | | #272 | [SPEC-REVIEW-272-r2.md](SPEC-REVIEW-272-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #272 | [CODE-REVIEW-272-r1.md](CODE-REVIEW-272-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #271 | [SPEC-REVIEW-271-r1.md](SPEC-REVIEW-271-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #271 | [CODE-REVIEW-271-r1.md](CODE-REVIEW-271-r1.md) | code · r1 | 🔴 красный | 1 | 1 | AC6 не выполняется: собственная семантическая golden-проверка issue падает на обоих сце…; , в скоупе] AC4 не имеет собственного fixture/smoke с проёмом | `demo/golden/harness.mjs` `test/wall-thickness.test.mjs` `test/fixtures/197-junction-patch.json` `test/fixtures/249-multiwall-junction.json` `smoke_junction_patch_resilience.mjs` `src/wall-thickness.ts` | | #271 | [CODE-REVIEW-271-r2.md](CODE-REVIEW-271-r2.md) | code · r2 | 🟢 зелёный | 1 | 1 | — | — | | #271 | [CODE-REVIEW-271-r3.md](CODE-REVIEW-271-r3.md) | code · r3 | 🟢 зелёный | 0 | 0 | — | — | | #269 | [CODE-REVIEW-269-r1.md](CODE-REVIEW-269-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | буквальная формулировка AC2 не выполняется, хотя цель AC2 достигнута | `docs/USER-GUIDE.ru.md` | | #267 | [SPEC-REVIEW-267-r1.md](SPEC-REVIEW-267-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | заявление «git diff --check — green» в хендоффе не совпадает с фактом | `check-docs.mjs` | | #267 | [CODE-REVIEW-267-r1.md](CODE-REVIEW-267-r1.md) | code · r1 | 🔴 красный | 1 | 1 | три из сорока четырёх рядов не имеют реальной мутационной защиты, вопреки AC5; unverified в BindingPresentationLifecycle недостижим ни в одном реальном сценарии; правило «неизвестный decision ID ломает тест» (ТЗ §8, п.5) не реализовано | `scripts/mutation-gate.mjs` `test/fixtures/device-presentation-decisions.mjs` `src/device-presentation-policy.ts` `device-presentation-policy.ts` `src/device-presentation.ts` `docs/DEVICE-PRESENTATION.md` `src/devices.ts` `test/device-presentation-policy.test.mjs` | | #267 | [CODE-REVIEW-267-r2.md](CODE-REVIEW-267-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #266 | [SPEC-REVIEW-266-r1.md](SPEC-REVIEW-266-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | Medium (в скоупе) — заявленный «объективный критерий» (golden) не видит два реальных CS…; Low — неверная классификация вспомогательного скрипта; Low (наблюдение, не требует правки ТЗ) — лимит «≤ 1200 строк» на файл (AC2) может не вы… | `src/styles.ts` `demo/golden/harness.mjs` `demo/golden/run.mjs` `smoke_plan_snap_overlay.mjs` `smoke_preloader.mjs` `test/isometric-contract.test.mjs` `plan.styles.ts` `demo/smoke_plan_snap_overlay.mjs` | | #266 | [SPEC-REVIEW-266-r2.md](SPEC-REVIEW-266-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 1 | Medium (в скоупе) — новый AC2 противоречит сам себе: заявленный порог суммы уже нарушен… | `docs/specs/266-split-styles.md` | | #266 | [SPEC-REVIEW-266-r3.md](SPEC-REVIEW-266-r3.md) | spec · r3 | 🟢 зелёный | 0 | 0 | — | — | | #266 | [CODE-REVIEW-266-r1.md](CODE-REVIEW-266-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #265 | [SPEC-REVIEW-265-r1.md](SPEC-REVIEW-265-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 4 | «что человек увидит» слито со сценарием и написано языком реализации; поверхность/touch…; AC10 хеджирует «если отчёт станет виден пользователю», хотя §9 безусловно описывает нов…; AC1–AC9 не называют способ доказательства (в отличие от требования DoR и от прямого сос…; нет отдельного обязательного раздела «Риски» | `docs/specs/265-import-reference-seam.md` `244-orphan-space-references.md` `252-optimize-orphan-layout-report.md` `docs/TOUCH-SUPPORT.md` `docs/specs/244-orphan-space-references.md` | | #265 | [SPEC-REVIEW-265-r2.md](SPEC-REVIEW-265-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 1 | AC10 называет несуществующий гейт check-i18n как обязательное доказательство (Medium, в… | `docs/specs/265-import-reference-seam.md` `package.json` `test/i18n.test.mjs` `scripts/check-i18n.mjs` `check-docs.mjs` `scripts/check-docs.mjs` | | #265 | [SPEC-REVIEW-265-r3.md](SPEC-REVIEW-265-r3.md) | spec · r3 | 🟢 зелёный | 0 | 0 | — | — | | #265 | [CODE-REVIEW-265-r1.md](CODE-REVIEW-265-r1.md) | code · r1 | 🔴 красный | 1 | 2 | golden красный на заявленном SHA для самого нового экрана; заявление автора о зелёном g…; нет backend-теста на успешный cross-generation lineage repair (только exact-map и ambig…; нет synthetic maximum-size backend теста, требуемого AC9 | `demo/golden/harness.mjs` `src/houseplan-card.ts` `src/i18n/ru.json` `demo/golden/README.md` `AGENTS.md` `tests_backend/test_ha_import_export.py` `test/space-reference-repair.test.mjs` `custom_components/houseplan/import_export.py` | | #264 | [SPEC-REVIEW-264-r1.md](SPEC-REVIEW-264-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | утверждение «Escape в idle Resize уже сейчас сразу возвращает Draw» не соответствует коду; несуществующий файл смока в планируемом diff | `docs/specs/264-resize-controller.md` `src/houseplan-card.ts` `demo/smoke_hide_layers.mjs` `demo/smoke_pan_any_zoom.mjs` `demo/smoke_safe_resize.mjs` `demo/smoke_resize_wall_thickness.mjs` `demo/smoke_resize_inner_dimensions.mjs` `docs/RESIZE.md` | | #264 | [SPEC-REVIEW-264-r2.md](SPEC-REVIEW-264-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #264 | [CODE-REVIEW-264-r1.md](CODE-REVIEW-264-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #262 | [SPEC-REVIEW-262-r1.md](SPEC-REVIEW-262-r1.md) | spec · r1 | 🟢 зелёный | 0 | 1 | вне скоупа (не блокирует, заводится отдельным issue по §12 PROCESS.md) | `docs/USER-GUIDE.ru.md` `src/i18n/ru.json` `houseplan-card.ts` `ru.json` | | #262 | [CODE-REVIEW-262-r1.md](CODE-REVIEW-262-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #261 | [SPEC-REVIEW-261-r1.md](SPEC-REVIEW-261-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | «Что человек увидит до и после» смешивает продуктовое и техническое | `docs/specs/261-white-wedges-root-cause.md` | | #261 | [CODE-REVIEW-261-r1.md](CODE-REVIEW-261-r1.md) | code · r1 | ⚪ — | 0 | 0 | — | — | | #258 | [SPEC-REVIEW-258-r1.md](SPEC-REVIEW-258-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | «Что человек увидит» смешивает продуктовую и техническую лексику | `docs/specs/258-wall-key-storage-roundtrip.md` | | #258 | [CODE-REVIEW-258-r1.md](CODE-REVIEW-258-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | Release-артефакты заявляют больше, чем доказано, и противоречат собственному расследова…; scripts/model-invariants.mjs, titles внутри report(): ключ wall_key: 'Записи толщины, к… | `docs/CHANGELOG.md` `docs/CHANGELOG.ru.md` `CHANGELOG.md` `.ru.md` `scripts/model-invariants.mjs` | | #258 | [CODE-REVIEW-258-r2.md](CODE-REVIEW-258-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #256 | [CODE-REVIEW-256-r1.md](CODE-REVIEW-256-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #253 | [SPEC-REVIEW-253-r1.md](SPEC-REVIEW-253-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | риск MAX_WALLS=500 от роста числа записей не упомянут в разделе рисков. Новый контракт … | `custom_components/houseplan/validation.py` | | #253 | [CODE-REVIEW-253-r1.md](CODE-REVIEW-253-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #252 | [SPEC-REVIEW-252-r1.md](SPEC-REVIEW-252-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | ТЗ меняет задокументированный и опубликованный инвариант Optimize, не называя его | `docs/CANVAS.md` `docs/CHANGELOG.md` `docs/specs/252-optimize-orphan-layout-report.md` | | #252 | [SPEC-REVIEW-252-r2.md](SPEC-REVIEW-252-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #252 | [CODE-REVIEW-252-r1.md](CODE-REVIEW-252-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #252 | [CODE-REVIEW-252-r2.md](CODE-REVIEW-252-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #251 | [SPEC-REVIEW-251-r1.md](SPEC-REVIEW-251-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | не проговорено соответствие toast'а формулировке владельца «стандартными средствами HA»; не решён смешанный secure + unavailable случай в группе controls | `device-toggle.ts` `SCOPE.md` | | #251 | [CODE-REVIEW-251-r1.md](CODE-REVIEW-251-r1.md) | code · r1 | ⚪ — | 1 | 0 | golden-эталон device-icon-state-table-{light,dark} сломан этим же diff'ом, приёмки base… | `demo/golden/matrix.mjs` `artifacts/golden/golden-report.json` `.github/workflows/validate.yml` `docs/TESTING.md` `test/golden-matrix.test.mjs` `test/device-presentation.test.mjs` | | #251 | [CODE-REVIEW-251-r2.md](CODE-REVIEW-251-r2.md) | code · r2 | 🟢 зелёный | 1 | 0 | — | — | | #251 | [CODE-REVIEW-251-r3.md](CODE-REVIEW-251-r3.md) | code · r3 | 🟢 зелёный | 1 | 0 | — | — | | #250 | [SPEC-REVIEW-250-r1.md](SPEC-REVIEW-250-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #250 | [CODE-REVIEW-250-r1.md](CODE-REVIEW-250-r1.md) | code · r1 | ⚪ — | 0 | 0 | — | — | | #250 | [CODE-REVIEW-250-r2.md](CODE-REVIEW-250-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #249 | [SPEC-REVIEW-249-r1.md](SPEC-REVIEW-249-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | в скоупе задачи, чинится в этом же ТЗ; не блокирует, снимается ревьюером с записью | `PROCESS.md` | | #249 | [SPEC-REVIEW-249-r2.md](SPEC-REVIEW-249-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #249 | [CODE-REVIEW-249-r1.md](CODE-REVIEW-249-r1.md) | code · r1 | 🔴 красный | 1 | 1 | innerContourForRoom (clean floor) получает; AC2 не покрыт буквально | `src/wall-thickness.ts` `test/wall-thickness.test.mjs` `demo/smoke_multiwall_junction.mjs` | | #249 | [CODE-REVIEW-249-r2.md](CODE-REVIEW-249-r2.md) | code · r2 | ⚪ — | 0 | 0 | Два из восьми вызовов innerContourForRoom не получили sharedRoomWallGeometry | `src/houseplan-card.ts` | | #248 | [SPEC-REVIEW-248-r1.md](SPEC-REVIEW-248-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | не блокирует, оставлено на усмотрение автора | `docs/USER-GUIDE.ru.md` `USER-GUIDE.ru.md` | | #248 | [CODE-REVIEW-248-r1.md](CODE-REVIEW-248-r1.md) | code · r1 | 🟢 зелёный | 1 | 0 | — | — | | #244 | [SPEC-REVIEW-244-r1.md](SPEC-REVIEW-244-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | Не назван пункт DoR «влияние на touch». PROCESS.md §2.5 требует явно назвать влияние на… | `docs/TOUCH-SUPPORT.md` | | #244 | [SPEC-REVIEW-244-r2.md](SPEC-REVIEW-244-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #244 | [CODE-REVIEW-244-r1.md](CODE-REVIEW-244-r1.md) | code · r1 | 🔴 красный | 2 | 0 | Именованный в АС смок demo/smoke_orphan_space_references.mjs красный; Регрессия контракта #113: последнее занятое пространство больше не удаляется | `demo/smoke_orphan_space_references.mjs` `space-deletion.test.mjs` `test_ha_websocket.py` `CONFIG-COMPATIBILITY.md` `USER-GUIDE.md` `demo/smoke_optional_space_model.mjs` | | #244 | [CODE-REVIEW-244-r2.md](CODE-REVIEW-244-r2.md) | code · r2 | ⚪ — | 2 | 0 | — | — | | #244 | [CODE-REVIEW-244-r3.md](CODE-REVIEW-244-r3.md) | code · r3 | 🟢 зелёный | 0 | 0 | — | — | | #243 | [SPEC-REVIEW-243-r1.md](SPEC-REVIEW-243-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #243 | [CODE-REVIEW-243-r1.md](CODE-REVIEW-243-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #243 | [CODE-REVIEW-243-r2.md](CODE-REVIEW-243-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #242 | [SPEC-REVIEW-242-r1.md](SPEC-REVIEW-242-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #242 | [CODE-REVIEW-242-r1.md](CODE-REVIEW-242-r1.md) | code · r1 | 🟡 жёлтый | 1 | 1 | AC4 не выполнен: flip_v не меняет направление 10° поворота ворот на общей стене и на не…; заявленный golden-охват в handoff занижен на порядок; обязательные по §12.3 новые сцены… | `src/houseplan-card.ts` `src/render/opening-symbol.ts` `wall-thickness.ts` `docs/WALL-THICKNESS.md` `docs/ARCHITECTURE.md` `docs/ISOMETRIC.md` `docs/USER-GUIDE.ru.md` `test/opening-symbol.test.mjs` | | #242 | [CODE-REVIEW-242-r2.md](CODE-REVIEW-242-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | точный список из 67 существующих golden-сцен на самом деле содержит 2 сцены, не задетые… | `docs/TESTING.md` `demo/golden/matrix.mjs` `test/golden-matrix.test.mjs` | | #239 | [SPEC-REVIEW-239-r1.md](SPEC-REVIEW-239-r1.md) | spec · r1 | ⚪ — | 0 | 1 | §13 Acceptance criteria не указывает способ доказательства для AC13, AC14, AC16, и это …; §10 «Данные, i18n...» не называет конкретный текст/ключ новой imperial- подписи внутри … | `docs/specs/230-hatch-density-normalization.md` `docs/specs/238-opening-inner-distances.md` | | #239 | [SPEC-REVIEW-239-r2.md](SPEC-REVIEW-239-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 0 | — | — | | #239 | [CODE-REVIEW-239-r1.md](CODE-REVIEW-239-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | demo/smoke_grid_scale_invariance.mjs нестабилен на проверке darkViewPixelsMatch — ~43% … | `demo/smoke_grid_scale_invariance.mjs` `src/styles.ts` `AGENTS.md` | | #239 | [CODE-REVIEW-239-r2.md](CODE-REVIEW-239-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #238 | [SPEC-REVIEW-238-r1.md](SPEC-REVIEW-238-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #238 | [CODE-REVIEW-238-r1.md](CODE-REVIEW-238-r1.md) | code · r1 | 🔴 красный | 1 | 0 | Продуктовый коммит не обновил скомпилированный бандл; закоммиченный артефакт не содержи… | `dist/houseplan-card.js` `custom_components/houseplan/frontend/houseplan-card.js` `demo/srv/assets/houseplan-card.js` `src/houseplan-card.ts` `src/opening-dimensions.ts` `src/styles.ts` | | #238 | [CODE-REVIEW-238-r2.md](CODE-REVIEW-238-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #238 | [CODE-REVIEW-238-r3.md](CODE-REVIEW-238-r3.md) | code · r3 | 🟢 зелёный | 0 | 0 | — | — | | #234 | [SPEC-REVIEW-234-r1.md](SPEC-REVIEW-234-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | раздел i18n из обязательного списка §7.1 отсутствует в документе целиком. PROCESS.md §7…; граница > 0 vs текущее >= 0 не отражена явно в примерах AC1. wall-face-graph.ts:69 сего… | `PROCESS.md` `docs/specs/234-chain-segment-thickness.md` `wall-face-graph.ts` `docs/WALL-THICKNESS.md` | | #234 | [SPEC-REVIEW-234-r2.md](SPEC-REVIEW-234-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #234 | [CODE-REVIEW-234-r2.md](CODE-REVIEW-234-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | Диагноз и контракт по коду; Гейты — прогнаны на HEAD (c8e9597) в этой сессии; AC — чем доказано; Взаимодействие с #229 (ребейз) | — | | #233 | [SPEC-REVIEW-233-r1.md](SPEC-REVIEW-233-r1.md) | spec · r1 | ⚪ — | 2 | 0 | Контракт §6 не покрывает открытую сторону, к которой ведёт продуктовое решение §4.3 (High); §7 приписывает thicknessCmAt поведение, которого у неё нет: заявлено фактом, не провере… | `docs/specs/233-resize-inner-dimensions.md` `src/wall-thickness.ts` `docs/WALL-THICKNESS.md` `test/wall-thickness.test.mjs` `wall-thickness.ts` | | #233 | [SPEC-REVIEW-233-r2.md](SPEC-REVIEW-233-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #233 | [CODE-REVIEW-233-r1.md](CODE-REVIEW-233-r1.md) | code · r1 | 🟡 жёлтый | 0 | 2 | тест AC6b не строит сценарий, который он заявляет (и который был H2); не хватает мутанта из принятого §11 ТЗ | `test/wall-thickness.test.mjs` `docs/specs/233-resize-inner-dimensions.md` `scripts/mutation-gate.mjs` | | #233 | [CODE-REVIEW-233-r2.md](CODE-REVIEW-233-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #231 | [SPEC-REVIEW-231-r1.md](SPEC-REVIEW-231-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | Нормативная позиция decor относительно room hover fill не имеет привязанного AC/доказат… | `docs/specs/231-decor-layer-order.md` `demo/smoke_glow.mjs` `smoke_glow.mjs` | | #231 | [SPEC-REVIEW-231-r2.md](SPEC-REVIEW-231-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #231 | [CODE-REVIEW-231-r1.md](CODE-REVIEW-231-r1.md) | code · r1 | ⚪ — | 0 | 1 | golden regression на трёх существующих large-house сценах не определена и не учтена | `demo/fixtures/large-house.mjs` `large-house.mjs` `docs/TESTING.md` | | #231 | [CODE-REVIEW-231-r2.md](CODE-REVIEW-231-r2.md) | code · r2 | ⚪ — | 0 | 0 | — | — | | #230 | [SPEC-REVIEW-230-r1.md](SPEC-REVIEW-230-r1.md) | spec · r1 | 🟡 жёлтый | 1 | 1 | риск-анализ и AC10 построены на неверной посылке о golden-фикстурах; контракт «оба рендерера» не имеет собственного доказательства для статического рендерера; канонический документ подсистемы не входит в release-артефакты | `docs/specs/230-hatch-density-normalization.md` `demo/golden/harness.mjs` `demo/fixtures/large-house.mjs` `demo/fixtures/visual-matrix.mjs` `demo/golden/matrix.mjs` `houseplan-card.ts` `space-render.ts` `demo/smoke_wall_hatch_density.mjs` | | #230 | [SPEC-REVIEW-230-r2.md](SPEC-REVIEW-230-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | §5 «Цели» не обновлён вслед за исправлением §11/AC10–11 и противоречит им | `docs/specs/230-hatch-density-normalization.md` | | #230 | [CODE-REVIEW-230-r1.md](CODE-REVIEW-230-r1.md) | code · r1 | 🟡 жёлтый | 2 | 0 | Коммит с golden-эталонами не несёт обязательных трейлеров — CI уже красный на этом SHA; Четыре из семи новых мутантов не работают — гейт красен без мутации; AC7 не перепроверяет отсутствие scale на втором cell_cm | `demo/golden/baselines/baselines-index.json` `AGENTS.md` `scripts/validate-commit-provenance.mjs` `validate.yml` `scripts/mutation-gate.mjs` `mutation-gate.mjs` `test/mutation-gate.test.mjs` `.github/workflows/mutation-gate.yml` | | #230 | [CODE-REVIEW-230-r2.md](CODE-REVIEW-230-r2.md) | code · r2 | 🟢 зелёный | 2 | 0 | — | — | | #229 | [SPEC-REVIEW-229-r1.md](SPEC-REVIEW-229-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 3 | момент слияния при завершении цепочки шире, чем решение владельца о старых планах; допуск «есть причина оставить узел» не определён для трёх из четырёх причин; §8.4 не упоминает материализованную legacy-проекцию проёма (x/y/angle) | `docs/specs/229-merge-collinear-partitions.md` `1.json` `docs/CONFIG-COMPATIBILITY.md` `houseplan-card.ts` | | #229 | [SPEC-REVIEW-229-r2.md](SPEC-REVIEW-229-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 1 | критерий «ребро комнаты» для допуска EPS_JOIN (правка M2) сам по себе противоречит кано… | `docs/specs/229-merge-collinear-partitions.md` `docs/specs/141-wall-junctions.md` `src/plan-snap-overlay.ts` `src/logic.ts` `plan-snap-overlay.ts` | | #229 | [SPEC-REVIEW-229-r3.md](SPEC-REVIEW-229-r3.md) | spec · r3 | 🟢 зелёный | 0 | 0 | новый абзац §8.2 цитирует §13.1 фразой, которая на самом деле находится в §13.2 | `docs/specs/229-merge-collinear-partitions.md` `docs/specs/141-wall-junctions.md` | | #229 | [CODE-REVIEW-229-r1.md](CODE-REVIEW-229-r1.md) | code · r1 | 🔴 красный | 2 | 0 | «узел на стыке с комнатой» не работает: слияние проходит сквозь T-стык к стене комнаты …; слияние «во что упёрлась цепочка» не работает через реальный клик-путь (§8.6); комментарий про допуски (EPS_ANGLE) не соответствует реализации, поведение корректно | `src/houseplan-card.ts` `src/plan-optimizer.ts` `houseplan-card.ts` `plan-optimizer.ts` `test-build/plan-optimizer.js` `docs/specs/141-wall-junctions.md` `test/wall-merge.test.mjs` `test/plan-optimizer.test.mjs` | | #229 | [CODE-REVIEW-229-r2.md](CODE-REVIEW-229-r2.md) | code · r2 | 🟡 жёлтый | 0 | 1 | регрессионное покрытие High-1 закрывает только один из двух исправленных вызовов; точный SHA предыдущего вердикта не был назван явно | `src/houseplan-card.ts` `src/plan-optimizer.ts` `test/plan-optimizer.test.mjs` `scripts/mutation-gate.mjs` `plan-optimizer.ts` `houseplan-card.ts` `demo/smoke_wall_chain_merge.mjs` `plan-optimizer.test.mjs` | | #229 | [CODE-REVIEW-229-r3.md](CODE-REVIEW-229-r3.md) | code · r3 | 🟢 зелёный | 0 | 0 | — | — | | #228 | [SPEC-REVIEW-228-r1.md](SPEC-REVIEW-228-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #228 | [CODE-REVIEW-228-r1.md](CODE-REVIEW-228-r1.md) | code · r1 | 🟡 жёлтый | 0 | 2 | негативный сценарий «hosted opening» не доказан автотестом; неоднозначный «gap > 2 см» диагностируется как единственный | `src/houseplan-card.ts` `docs/specs/228-plan-drawing-problems.md` `test/wall-face-repair.test.mjs` `demo/smoke_plan_drawing_repairs.mjs` | | #228 | [CODE-REVIEW-228-r2.md](CODE-REVIEW-228-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #228 | [CODE-REVIEW-228-r3.md](CODE-REVIEW-228-r3.md) | code · r3 | 🟢 зелёный | 0 | 0 | — | — | | #226 | [SPEC-REVIEW-226-r1.md](SPEC-REVIEW-226-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | в скоупе задачи | `docs/FILTERING.md` `PROCESS.md` | | #226 | [SPEC-REVIEW-226-r2.md](SPEC-REVIEW-226-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #226 | [CODE-REVIEW-226-r1.md](CODE-REVIEW-226-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #225 | [SPEC-REVIEW-225-r1.md](SPEC-REVIEW-225-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | в скоупе задачи | `import_export.py` | | #225 | [SPEC-REVIEW-225-r2.md](SPEC-REVIEW-225-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #225 | [CODE-REVIEW-225-r1.md](CODE-REVIEW-225-r1.md) | code · r1 | 🟡 жёлтый | 0 | 2 | internal_path доверяет path даже при непустых scheme/netloc; заявленный мутационный гейт не зарегистрирован | `scripts/mutation-gate.mjs` `import_export.py` `scripts/backend-test-guard.mjs` `test_ha_import_export.py` `.github/workflows/mutation-gate.yml` | | #225 | [CODE-REVIEW-225-r2.md](CODE-REVIEW-225-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #224 | [SPEC-REVIEW-224-r1.md](SPEC-REVIEW-224-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #224 | [CODE-REVIEW-224-r1.md](CODE-REVIEW-224-r1.md) | code · r1 | 🔴 красный | 1 | 2 | golden не остаётся прежним, вопреки AC12 и §2/§15 ТЗ (High, в скоупе); check-docs.mjs красный: отпечаток скриншотов не обновлён (Medium, в скоупе); AC6 заявляет доказательство, которого нет (Medium, в скоупе); двойной инкремент cfgEpoch в writeConfig (Low) | `golden-report.json` `demo/fixtures/visual-matrix.mjs` `demo/golden/harness.mjs` `check-docs.mjs` `src/houseplan-card.ts` `src/coordinate-canonicalization.ts` `docs/images/screenshots.json` `test/coordinate-canonicalization.test.mjs` | | #224 | [CODE-REVIEW-224-r2.md](CODE-REVIEW-224-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #223 | [SPEC-REVIEW-223-r1.md](SPEC-REVIEW-223-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | AC4 не покрывает партиции и колонны, где snapN() вызывается безусловно, а результат при…; новый показатель делит слово «канонизировано» с уже существующим показателем другого см… | `src/align-grid.ts` `docs/CANVAS.md` `align-grid.ts` `src/i18n/ru.json` `src/i18n/en.json` `src/plan-optimizer.ts` | | #223 | [SPEC-REVIEW-223-r2.md](SPEC-REVIEW-223-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 1 | замена термина для находки r1 №2 меняет одну коллизию на другую: «нормализовано»/«norma… | `docs/specs/223-optimize-coordinate-canonicalization.md` `docs/CANVAS.md` `docs/ARCHITECTURE.md` `align-grid.ts` | | #223 | [SPEC-REVIEW-223-r3.md](SPEC-REVIEW-223-r3.md) | spec · r3 | 🟢 зелёный | 0 | 0 | — | — | | #223 | [CODE-REVIEW-223-r1.md](CODE-REVIEW-223-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | AC2 (неконечные числа) не имеет отдельного unit-доказательства | `src/align-grid.ts` `docs/specs/223-optimize-coordinate-canonicalization.md` `test/align-grid.test.mjs` | | #220 | [SPEC-REVIEW-220-r1.md](SPEC-REVIEW-220-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | Medium, в скоупе. Отсутствует обязательная touch-классификация; Medium, в скоупе. §9 утверждает «нет нового поля», хотя §8.3/§17.3 предполагают обратное; не является блокирующим, не требует правки | `docs/TOUCH-SUPPORT.md` `devices.ts` `houseplan-card.ts` `PROCESS.md` `docs/CONFIG-COMPATIBILITY.md` | | #220 | [SPEC-REVIEW-220-r2.md](SPEC-REVIEW-220-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 1 | Medium, в скоупе. §17.3 маркирует нормативное требование как «свободно меняемое» | `docs/specs/220-space-tab-reorder.md` | | #220 | [SPEC-REVIEW-220-r3.md](SPEC-REVIEW-220-r3.md) | spec · r3 | 🟢 зелёный | 0 | 0 | — | — | | #220 | [CODE-REVIEW-220-r1.md](CODE-REVIEW-220-r1.md) | code · r1 | 🔴 красный | 1 | 2 | материализация неверно определяет «зависимые от порядка» маркеры: обычный маркер устрой…; перетаскивание вкладки не захватывает указатель: отпускание за пределами панели оставля…; мутационный гейт реализован не полностью относительно принятого §14 ТЗ | `src/space-order.ts` `src/devices.ts` `houseplan-card.ts` `test/space-order.test.mjs` `docs/TOUCH-SUPPORT.md` `demo/smoke_space_tab_reorder.mjs` `docs/specs/220-space-tab-reorder.md` `scripts/mutation-gate.mjs` | | #219 | [SPEC-REVIEW-219-r1.md](SPEC-REVIEW-219-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | в скоупе задачи | `docs/USER-GUIDE.ru.md` `AGENTS.md` `docs/TESTING.md` `TESTING.md` `USER-GUIDE.ru.md` | | #219 | [SPEC-REVIEW-219-r2.md](SPEC-REVIEW-219-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #219 | [CODE-REVIEW-219-r1.md](CODE-REVIEW-219-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | AC7/§16 не называют все golden-сцены, которые изменит эта правка | — | | #218 | [SPEC-REVIEW-218-r1.md](SPEC-REVIEW-218-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | отсутствует обязательный раздел «Риски»; §8.1 ТЗ утверждает: «quantum 1e-6 единицы плана = 10⁻⁹ м». Пересчёт по GRID_PITCH = NOR… | `docs/specs/218-glow-floor-geometry.md` `SPEC-REVIEW-217-r1.md` `mutation-gate.mjs` `src/space-geometry.ts` `src/houseplan-card.ts` | | #218 | [SPEC-REVIEW-218-r2.md](SPEC-REVIEW-218-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #218 | [CODE-REVIEW-218-r1.md](CODE-REVIEW-218-r1.md) | code · r1 | ⚪ — | 0 | 0 | двойной проход нормализации на здоровом пути (не блокирует, снято с записью) | `src/physical-geometry.ts` `budgets-glow-smoke.json` | | #217 | [SPEC-REVIEW-217-r1.md](SPEC-REVIEW-217-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #217 | [CODE-REVIEW-217-r1.md](CODE-REVIEW-217-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #213 | [SPEC-REVIEW-213-r1.md](SPEC-REVIEW-213-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | оставлено с запиской (не блокирует) | `src/styles.ts` | | #213 | [CODE-REVIEW-213-r1.md](CODE-REVIEW-213-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #212 | [SPEC-REVIEW-212-r1.md](SPEC-REVIEW-212-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | межевой случай «plan-wide setting» из #22 закрыт молча, без явной пометки | `docs/specs/212-device-icons-polish.md` | | #212 | [CODE-REVIEW-212-r1.md](CODE-REVIEW-212-r1.md) | code · r1 | 🟡 жёлтый | 0 | 2 | три существующих regression-смока сломаны миграцией mouse→pointer событий (Medium, в ск…; hp-device-preview.ts гейтирует hover, но никто не выставляет ему атрибут (Medium, в ско… | `src/houseplan-card.ts` `smoke_touch_tips.mjs` `smoke_feedback_v2.mjs` `smoke_help_affordance.mjs` `smoke_device_icon_design.mjs` `demo/smoke_glow.mjs` `demo/smoke_room_settings.mjs` `demo/smoke_ux_fixes.mjs` | | #212 | [CODE-REVIEW-212-r2.md](CODE-REVIEW-212-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | исправлено, доказано реальным поведением, не только тестом; исправлено, доказано смоком, который умеет упасть | `src/houseplan-card.ts` `smoke_ux_fixes.mjs` `smoke_device_preview_parity.mjs` `device-marker-polish-contract.test.mjs` `hp-device-preview.ts` | | #211 | [SPEC-REVIEW-211-r1.md](SPEC-REVIEW-211-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | целевое соотношение «MDI viewport = 0.5 × core» не подтверждено ни одним источником арх…; §4 называет нормативным источником несуществующий файл COMPARISON_NOTES.md; обязательный тег Touch editor: … присутствует по смыслу, но не дословно | `docs/specs/211-device-icons-visual-parity.md` `SPECIFICATION.md` `DEVELOPER_HANDOFF.md` `ACTIVE_ANIMATION_SPEC.md` `Index.html` `COMPARISON_NOTES.md` `README.md` `manifest.json` | | #211 | [SPEC-REVIEW-211-r2.md](SPEC-REVIEW-211-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #211 | [CODE-REVIEW-211-r1.md](CODE-REVIEW-211-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #211 | [CODE-REVIEW-211-r2.md](CODE-REVIEW-211-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #210 | [SPEC-REVIEW-210-r1.md](SPEC-REVIEW-210-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | контракт не говорит явно, что очистка floor в GUI должна удалять ключ, а не записывать …; обязательный раздел «i18n» присутствует по содержанию, но не оформлен отдельным заголовком | `docs/specs/210-fixed-floor-card.md` `src/editor.ts` `en.json` `ru.json` | | #210 | [SPEC-REVIEW-210-r2.md](SPEC-REVIEW-210-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | закрыто | `en.json` `ru.json` | | #210 | [CODE-REVIEW-210-r1.md](CODE-REVIEW-210-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #209 | [SPEC-REVIEW-209-r1.md](SPEC-REVIEW-209-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #209 | [CODE-REVIEW-209-r1.md](CODE-REVIEW-209-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #205 | [SPEC-REVIEW-205-r1.md](SPEC-REVIEW-205-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | раздел 1 не называет персону и поверхность по имени (снято ревьюером) | `docs/specs/205-vacuum-trail-resume-grace.md` `docs/SCOPE.md` | | #205 | [CODE-REVIEW-205-r1.md](CODE-REVIEW-205-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #205 | [CODE-REVIEW-205-r2.md](CODE-REVIEW-205-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #204 | [SPEC-REVIEW-204-r1.md](SPEC-REVIEW-204-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #204 | [CODE-REVIEW-204-r1.md](CODE-REVIEW-204-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #203 | [SPEC-REVIEW-203-r1.md](SPEC-REVIEW-203-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | план тестов не даёт мутанта третьей, независимо ломающейся ветке (форсированная HTML-по…; истёкший Labs-флаг iso не упомянут, хотя ТЗ строит на нём AC3; «затронутые файлы и модули» (DoR, §2.5) не собраны в один список | `docs/specs/203-hide-room-names.md` `houseplan-card.ts` `space-render.ts` `src/houseplan-card.ts` `docs/TESTING.md` `src/labs.ts` `demo/smoke_isometric_contract.mjs` `AGENTS.md` | | #203 | [SPEC-REVIEW-203-r2.md](SPEC-REVIEW-203-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | таблица «What a space may choose not to draw» в docs/UX-MODES.md не получает строку sho…; release-артефакты не называют явно, что запись в changelog обязана отметить снятие .rla… | `docs/UX-MODES.md` `docs/specs/203-hide-room-names.md` `USER-GUIDE.ru.md` `STYLING-HOOKS.md` `TESTING.md` `UX-MODES.md` `docs/STYLING-HOOKS.md` | | #203 | [CODE-REVIEW-203-r1.md](CODE-REVIEW-203-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | новая строка show_names в docs/UX-MODES.md цитирует не тот UI-текст; два предсуществующих golden-сценария теперь показывают «different» и не названы в хендоффе | `docs/UX-MODES.md` `src/i18n/ru.json` `docs/USER-GUIDE.ru.md` `UX-MODES.md` `demo/golden/matrix.mjs` `demo/golden/harness.mjs` `AGENTS.md` `PROCESS.md` | | #201 | [SPEC-REVIEW-201-r1.md](SPEC-REVIEW-201-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | release-артефакты не называют обновление docs/WALL-THICKNESS.md §8 | `docs/WALL-THICKNESS.md` `docs/specs/201-atomic-thickness-lookup.md` `docs/TESTING.md` `WALL-THICKNESS.md` | | #201 | [CODE-REVIEW-201-r1.md](CODE-REVIEW-201-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #200 | [SPEC-REVIEW-200-r1.md](SPEC-REVIEW-200-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | неточная формулировка причины дефекта в §3 ТЗ | `docs/specs/200-room-label-parity.md` `houseplan-card.ts` | | #200 | [CODE-REVIEW-200-r1.md](CODE-REVIEW-200-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #199 | [SPEC-REVIEW-199-r1.md](SPEC-REVIEW-199-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | Английский текст сообщения об отказе и подсказки не зафиксирован дословно — только «экв…; Хендофф-комментарий автора ТЗ в issue содержит артефакт шаблона: «Коммит: $sha.» — пере… | `docs/specs/199-optimize-geometry-preflight.md` `docs/specs/223-optimize-coordinate-canonicalization.md` | | #199 | [SPEC-REVIEW-199-r2.md](SPEC-REVIEW-199-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #199 | [CODE-REVIEW-199-r1.md](CODE-REVIEW-199-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | / информационная — абсолютный p95-бюджет §10 нестабилен в CI-песочнице (не блокирует) | `validate.yml` `performance.yml` | | #198 | [SPEC-REVIEW-198-r1.md](SPEC-REVIEW-198-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #198 | [CODE-REVIEW-198-r1.md](CODE-REVIEW-198-r1.md) | code · r1 | 🟡 жёлтый | 0 | 2 | AC5 не доказан заявленным способом; AC8 не доказан заявленным способом | `test/plan-optimizer.test.mjs` `test-build/plan-optimizer.js` `docs/WALL-THICKNESS.md` `test/wall-thickness.test.mjs` `src/wall-thickness.ts` `src/plan-optimizer.ts` `test-build/wall-thickness.js` `plan-optimizer.test.mjs` | | #198 | [CODE-REVIEW-198-r2.md](CODE-REVIEW-198-r2.md) | code · r2 | 🟡 жёлтый | 0 | 1 | новый AC5-тест не хермитичен к сценарию входной мутации, который он должен доказывать; нет (закрыта) | `test/plan-optimizer.test.mjs` `src/plan-optimizer.ts` `test-build/plan-optimizer.js` `test/wall-thickness.test.mjs` `docs/WALL-THICKNESS.md` | | #198 | [CODE-REVIEW-198-r3.md](CODE-REVIEW-198-r3.md) | code · r3 | 🟢 зелёный | 0 | 0 | — | — | | #197 | [SPEC-REVIEW-197-r1.md](SPEC-REVIEW-197-r1.md) | spec · r1 | 🔴 красный | 1 | 1 | центральное фактическое утверждение ТЗ (единственный патч → | `docs/specs/197-junction-patch-fail-dark.md` `src/wall-thickness.ts` | | #197 | [SPEC-REVIEW-197-r3.md](SPEC-REVIEW-197-r3.md) | spec · r3 | 🟢 зелёный | 0 | 0 | одно диагностическое утверждение §3 не воспроизводится буквально при разумной интерпрет… | `docs/specs/197-junction-patch-fail-dark.md` | | #197 | [CODE-REVIEW-197-r1.md](CODE-REVIEW-197-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #196 | [SPEC-REVIEW-196-r1.md](SPEC-REVIEW-196-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | AC2 частично привязывает smoke-доказательство к утверждению, проверяемому только кодом | — | | #196 | [CODE-REVIEW-196-r1.md](CODE-REVIEW-196-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #195 | [CODE-REVIEW-195-r1.md](CODE-REVIEW-195-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #195 | [CODE-REVIEW-195-r2.md](CODE-REVIEW-195-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #193 | [SPEC-REVIEW-193-r1.md](SPEC-REVIEW-193-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | отсутствует обязательная декларация Touch editor: … | `docs/specs/193-passage-placement-preview.md` `docs/TOUCH-SUPPORT.md` | | #193 | [CODE-REVIEW-193-r1.md](CODE-REVIEW-193-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #192 | [SPEC-REVIEW-192-r1.md](SPEC-REVIEW-192-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | AC3 не разделяет явно, какая часть критерия доказывается golden, а какая — только чтени… | — | | #192 | [CODE-REVIEW-192-r1.md](CODE-REVIEW-192-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | thumb hue-шкалы теряет контраст с треком в диапазоне циан/синий/индиго (~195°–260°) | `src/hp-color-opacity.ts` `demo/smoke_color_picker.mjs` `demo/serve.mjs` | | #192 | [CODE-REVIEW-192-r2.md](CODE-REVIEW-192-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #189 | [CODE-REVIEW-189-r1.md](CODE-REVIEW-189-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | нет теста на composite-hosted проём после этого диффа | `src/houseplan-card.ts` `src/partition-openings.ts` | | #187 | [CODE-REVIEW-187-r1.md](CODE-REVIEW-187-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | AC1 помечен «unit», но фактическую регрессию покрывает только smoke | `test/physical-geometry.test.mjs` `demo/smoke_glow_fail_dark.mjs` `physical-geometry.ts` `houseplan-card.ts` | | #186 | [SPEC-REVIEW-186-r1.md](SPEC-REVIEW-186-r1.md) | spec · r1 | 🔴 красный | 1 | 0 | «строгая» проверка full import противоречит уже принятому владельцем round-trip-инвариа…; нет отдельного раздела «Проблема» | `docs/specs/186-partition-opening-jamb-margin.md` `docs/USER-GUIDE.ru.md` `docs/SCOPE.md` `websocket_api.py` `import_export.py` | | #186 | [SPEC-REVIEW-186-r2.md](SPEC-REVIEW-186-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | «что человек увидит» использует термины реализации | `docs/specs/186-partition-opening-jamb-margin.md` | | #186 | [CODE-REVIEW-186-r1.md](CODE-REVIEW-186-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #184 | [CODE-REVIEW-184-r1.md](CODE-REVIEW-184-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #180 | [SPEC-REVIEW-180-r1.md](SPEC-REVIEW-180-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | CSS-селектор input[type='color'] не упомянут в плане очистки | `src/styles.ts` `styles.ts` `houseplan-card.ts` | | #180 | [CODE-REVIEW-180-r1.md](CODE-REVIEW-180-r1.md) | code · r1 | 🔴 красный | 1 | 0 | перекрывающиеся, нечитаемые подписи в строке "Цвет пульсации / Размер пульсации" на узк… | `src/houseplan-card.ts` `src/hp-color-opacity.ts` | | #180 | [CODE-REVIEW-180-r2.md](CODE-REVIEW-180-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #179 | [SPEC-REVIEW-179-r1.md](SPEC-REVIEW-179-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 5 | цвет внешней тени искажён относительно нормативного источника; цвет continuous-пульсации для reason presence не определён; easing для Short и Alert не зафиксирован; стоимость и выбор backdrop-blur для Dark не решены; не назван обязательный тег Touch editor: из TOUCH-SUPPORT.md; Light-only combo-эталоны (Selected + Hover/Working/Green/Alert | `docs/specs/179-device-icons-redesign.md` `SPECIFICATION.md` `ACTIVE_ANIMATION_SPEC.md` `DEVELOPER_HANDOFF.md` `src/device-pulse.ts` `manifest.json` `docs/SCOPE.md` `docs/TOUCH-SUPPORT.md` | | #179 | [SPEC-REVIEW-179-r2.md](SPEC-REVIEW-179-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | Обе Light-тени переписаны на rgb(37 40 45 / 12%) / rgb(37 40 45 / 18%); §10.1/§10.4 получили mapping presence→green, running/working/open/unlocked→amber, neutr…; Обе секции получили cubic-bezier(.22,.61,.36,1); §7.1 фиксирует production = Dark/Icon Default No Blur.svg, backdrop-filter запрещён; ри…; Добавлена строка Touch editor: best effort / intentionally degraded в §11 | — | | #179 | [CODE-REVIEW-179-r1.md](CODE-REVIEW-179-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #179 | [CODE-REVIEW-179-r2.md](CODE-REVIEW-179-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #178 | [SPEC-REVIEW-178-r1.md](SPEC-REVIEW-178-r1.md) | spec · r1 | 🔴 красный | 1 | 0 | отсутствуют обязательные разделы: риски, откат, влияние на touch/производительность; способ доказательства не привязан к номеру AC явно | `docs/specs/178-toggle-entity.md` `docs/TOUCH-SUPPORT.md` `docs/specs/174-linked-virtual-light-controller.md` `docs/specs/164-washer-active-cycle.md` | | #178 | [SPEC-REVIEW-178-r2.md](SPEC-REVIEW-178-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | раздел touch не называет явно runtime-эффект на View/kiosk | `docs/specs/178-toggle-entity.md` `docs/PROCESS.md` `docs/TOUCH-SUPPORT.md` `src/device-toggle.ts` | | #178 | [CODE-REVIEW-178-r1.md](CODE-REVIEW-178-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #176 | [SPEC-REVIEW-176-r1.md](SPEC-REVIEW-176-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #176 | [CODE-REVIEW-176-r1.md](CODE-REVIEW-176-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #174 | [SPEC-REVIEW-174-r1.md](SPEC-REVIEW-174-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | формулировка AC6 читается двусмысленно в отрыве от §9.1 | `docs/specs/174-linked-virtual-light-controller.md` `devices.ts` | | #174 | [CODE-REVIEW-174-r1.md](CODE-REVIEW-174-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #173 | [SPEC-REVIEW-173-r1.md](SPEC-REVIEW-173-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | нет отдельного раздела «Проблема»; docs/UX-MODES.md уже называет текущий инструмент «Walls»; опечатка в AC17 | `docs/specs/173-unified-wall-tool.md` `138-adjacent-room-autoclose.md` `172-zero-divider-taper.md` `docs/UX-MODES.md` `UX-MODES.md` | | #173 | [CODE-REVIEW-173-r1.md](CODE-REVIEW-173-r1.md) | code · r1 | 🟢 зелёный | 0 | 2 | мёртвый код старого инструмента partition не удалён; AC8 не имеет unit/smoke-доказательства именно для новой интеграции; activateMarkupTool использует if/else без скобок на одной значимой ветке; accepted-click измерение не оформлено как отдельный отслеживаемый бюджет | `src/i18n/en.json` `ru.json` `test/wall-face-graph.test.mjs` `demo/smoke_unified_wall_tool.mjs` `demo/smoke_room_autoclose.mjs` `wall-face-graph.test.mjs` `src/houseplan-card.ts` `wall-face-graph.ts` | | #173 | [CODE-REVIEW-173-r2.md](CODE-REVIEW-173-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #172 | [SPEC-REVIEW-172-r1.md](SPEC-REVIEW-172-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | «что человек увидит» длиннее одной фразы; эпсилон/half-depth границы локального cap не формализованы числом | `docs/specs/172-zero-divider-taper.md` `docs/WALL-THICKNESS.md` `src/wall-thickness.ts` | | #172 | [CODE-REVIEW-172-r1.md](CODE-REVIEW-172-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | AC4 не имеет отдельного исполняемого теста на fixture из АК1; неверная ссылка на процесс в хендоффе при пропуске named-smoke | `test/wall-thickness.test.mjs` `AGENTS.md` `demo/smoke_zero_divider_taper.mjs` | | #172 | [CODE-REVIEW-172-r2.md](CODE-REVIEW-172-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | AC4 не имеет отдельного исполняемого теста на fixture из АК1; неточная ссылка на процесс в хендоффе первого цикла | — | | #162 | [SPEC-REVIEW-162-r1.md](SPEC-REVIEW-162-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | «compatible source» в §11.3.2 не определено и не проверяемо по факту схемы run | `docs/specs/162-vacuum-map-space-routing.md` `custom_components/houseplan/trails.py` | | #162 | [SPEC-REVIEW-162-r2.md](SPEC-REVIEW-162-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #162 | [CODE-REVIEW-162-r1.md](CODE-REVIEW-162-r1.md) | code · r1 | 🔴 красный | 1 | 1 | калибровка мимо своего этажа в пути «высокий residual → ручная подгонка»; §9.3 «Добавить источник карты» не реализован | `src/houseplan-editor-runtime.ts` `smoke_vacuum_firstuse.mjs` `smoke_vacuum_multifloor.mjs` `src/houseplan-card.ts` `src/editors/vacuum-maps-section.ts` | | #162 | [CODE-REVIEW-162-r2.md](CODE-REVIEW-162-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #160 | [SPEC-REVIEW-160-r1.md](SPEC-REVIEW-160-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | «Workflow boundary» (§16) ссылается на устное решение владельца, не отражённое в issue | — | | #160 | [CODE-REVIEW-160-r1.md](CODE-REVIEW-160-r1.md) | code · r1 | 🔴 красный | 1 | 3 | node scripts/check-docs.mjs красный: скриншоты документации не пересняты (High, блокирует); floor anchor opening lock badge вычисляется двумя независимыми формулами (Medium, в ско…; реальный алгоритм isoRoomSafePoint (grid-search fallback) не покрыт ни одним тестом (Me…; leafBasis (src/iso-openings.ts:187-209): flipH не тестируется независимо от flipV (Medi…; не блокируют, оставлены с записью | `docs/images/screenshots.json` `scripts/source-fingerprint.mjs` `src/iso-projection.ts` `src/iso-overlays.ts` `src/iso-openings.ts` `src/iso-scene-render.ts` `src/houseplan-card.ts` `src/styles/plan.styles.ts` | | #160 | [CODE-REVIEW-160-r2.md](CODE-REVIEW-160-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | новый M2-тест не независимо доказывает «вне любой дыры» (Low, запись без блокировки); приёмка скриншотов сменила заявленную платформу на win32 без видимого основания в хендо… | `test/iso-overlays.test.mjs` `iso-overlays.ts` `docs/images/screenshots.json` `scripts/docs-accept.mjs` `scripts/capture-environment.mjs` | | #159 | [SPEC-REVIEW-159-r1.md](SPEC-REVIEW-159-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | — | — | | #159 | [CODE-REVIEW-159-r1.md](CODE-REVIEW-159-r1.md) | code · r1 | ⚪ — | 1 | 1 | AC4 и AC9 не доказаны: golden:verify красный на финальном SHA, эталоны не приняты; README пакета не фиксирует SHA-256 исходного архива | `golden-report.json` `PROCESS.md` `AGENTS.md` `assets/furniture/houseplan-0.3.0/README.md` `README.md` `pack.json` `docs/FURNITURE.md` `docs/specs/159-furniture-pack.md` | | #159 | [CODE-REVIEW-159-r2.md](CODE-REVIEW-159-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #156 | [CODE-REVIEW-156-r1.md](CODE-REVIEW-156-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #152 | [SPEC-REVIEW-152-r1.md](SPEC-REVIEW-152-r1.md) | spec · r1 | 🔴 красный | 2 | 2 | ни один AC не указывает способ доказательства; потерян отдельный проверяемый AC про синхронность hit targets во время перехода; accessibility-раздел выдаёт «существующую accessible-подпись» за факт, хотя такой досту…; «существующий» double-click/tap fit-all на фоне на деле существует только в kiosk; Low-1. §10 обсуждает #28 как открытую задачу, которой перед реализацией «нужно изменить… | `docs/specs/152-room-click-fit.md` `docs/specs/146-four-phase-sun-background.md` `docs/specs/138-adjacent-room-autoclose.md` `docs/specs/146-...md` `AGENTS.md` `src/houseplan-card.ts` `docs/SCOPE.md` `docs/UX-MODES.md` | | #152 | [SPEC-REVIEW-152-r2.md](SPEC-REVIEW-152-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #152 | [CODE-REVIEW-152-r1.md](CODE-REVIEW-152-r1.md) | code · r1 | 🔴 красный | 1 | 2 | demo/smoke_pan_any_zoom.mjs падает необработанным исключением — новый код не переживает…; Подпись комнаты в редакторах Devices/Decor получает нерабочую клавиатурную кнопку — нар…; Защита AC15 (запрет saveZoom для reason room) не зарегистрирована в mutation-gate, хотя…; 1. AC5 (вложенные комнаты) и AC9 (retarget между двумя разными комнатами во время tween… | `demo/smoke_pan_any_zoom.mjs` `src/houseplan-card.ts` `smoke_backdrop.mjs` `smoke_editor_gestures.mjs` `smoke_hide_layers.mjs` `smoke_pan_any_zoom.mjs` `houseplan-card.ts` `validate.yml` | | #152 | [CODE-REVIEW-152-r2.md](CODE-REVIEW-152-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #150 | [CODE-REVIEW-150-r1.md](CODE-REVIEW-150-r1.md) | code · r1 | 🔴 красный | 1 | 0 | Собственный AC7-smoke красный при первом запуске — фикстура не включает show_borders, а… | `demo/smoke_wall_thickness_transition.mjs` `src/wall-thickness.ts` `src/houseplan-card.ts` `demo/smoke_split_corner_wall.mjs` `AGENTS.md` `docs/WALL-THICKNESS.md` `docs/TESTING.md` `smoke_split_corner_wall.mjs` | | #146 | [SPEC-REVIEW-146-r1.md](SPEC-REVIEW-146-r1.md) | spec · r1 | 🟢 зелёный | 0 | 1 | azimuth тайно расширяет owner-решение о fallback-триггерах на саму фазу; «что человек увидит» длиннее одной фразы и использует термины реализации; нет буквальной touch-editor метки по docs/TOUCH-SUPPORT.md | `docs/specs/146-four-phase-sun-background.md` `docs/TOUCH-SUPPORT.md` | | #146 | [CODE-REVIEW-146-r1.md](CODE-REVIEW-146-r1.md) | code · r1 | 🔴 красный | 1 | 0 | .zoomwrap's новый z-index: 1 прячет .zoombadge за планом на любом zoom>100% — независим… | `src/styles.ts` `src/houseplan-card.ts` `styles.ts` | | #146 | [CODE-REVIEW-146-r2.md](CODE-REVIEW-146-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #141 | [SPEC-REVIEW-141-r1.md](SPEC-REVIEW-141-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | нет явной метки touch-контракта по docs/TOUCH-SUPPORT.md; «что человек увидит» длиннее одной фразы; доказательство AC10 («code review») до кода не проверяемо, но это ожидаемо для code-rev… | `docs/TOUCH-SUPPORT.md` `docs/specs/141-wall-junctions.md` `PROCESS.md` | | #141 | [CODE-REVIEW-141-r1.md](CODE-REVIEW-141-r1.md) | code · r1 | 🔴 красный | 1 | 0 | Живой rubber-band превью первого сегмента контура/перегородки не рисуется вовсе | `src/wall-thickness.ts` `test-build/wall-thickness.js` `demo/smoke_wall_junctions.mjs` `docs/SCOPE.md` `physical-geometry.ts` | | #140 | [CODE-REVIEW-140-r1.md](CODE-REVIEW-140-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #138 | [SPEC-REVIEW-138-r1.md](SPEC-REVIEW-138-r1.md) | spec · r1 | 🔴 красный | 1 | 0 | контракт автозамыкания перехватывает и блокирует обычный второй клик по той же стене | `docs/specs/138-adjacent-room-autoclose.md` `houseplan-card.ts` | | #138 | [SPEC-REVIEW-138-r2.md](SPEC-REVIEW-138-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | из r1 — статус: исправлено | — | | #137 | [SPEC-REVIEW-137-r1.md](SPEC-REVIEW-137-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | терминология инструмента «Контур» вместо «Контур комнаты»; «что человек увидит» длиннее одной фразы; типы доказательства AC12–AC14 не входят буквально в перечень §2.5; план golden не описывает явно, чем доказывается forced-colours | `docs/specs/137-plan-snap-overlay.md` `src/i18n/ru.json` `docs/USER-GUIDE.ru.md` `PROCESS.md` `demo/golden/matrix.mjs` `harness.mjs` | | #132 | [SPEC-REVIEW-132-r1.md](SPEC-REVIEW-132-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | §2 использует термин реализации «host-сегмент»; нет обязательного маркера Touch editor: … по docs/TOUCH-SUPPORT.md; i18n-раздел не перечисляет конкретные ключи en/ru | `docs/specs/132-partition-openings.md` `PROCESS.md` `docs/USER-GUIDE.ru.md` `docs/TOUCH-SUPPORT.md` | | #132 | [CODE-REVIEW-132-r1.md](CODE-REVIEW-132-r1.md) | code · r1 | 🔴 красный | 1 | 3 | импорт/дублирование space с partition-hosted проёмом всегда отклоняется; находки (заведены отдельными issue); → #186 — нет jamb safety margin; → #187 — fallback-гвард источника света не fail-dark «по построению»; → #188 — тест junction-patch не умеет падать | `custom_components/houseplan/import_export.py` `custom_components/houseplan/validation.py` `validation.py` `tests_backend/test_ha_import_export.py` `src/partition-openings.ts` `src/space-render.ts` `src/houseplan-card.ts` `src/wall-thickness.ts` | | #132 | [CODE-REVIEW-132-r2.md](CODE-REVIEW-132-r2.md) | code · r2 | 🟢 зелёный | 0 | 1 | Нет. High-1 из r1 исправлен корректно (см. «Как проверялось» — фикс, тест и зелёный CI); Второй компонент этого коммита восстанавливает presentation-cut для legacy room-wall op…; → #189 — presentation snap-overlay не режет ось независимой перегородки в месте её собс…; Нет новых Low в этом цикле. Три Low из SPEC-REVIEW-132-r1 были закрыты до начала кода (… | `demo/serve.mjs` `src/houseplan-card.ts` `src/plan-snap-overlay.ts` `docs/CANVAS.md` `smoke_partition_openings.mjs` | | #131 | [SPEC-REVIEW-131-r1.md](SPEC-REVIEW-131-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | плотная формулировка §7.2 про hash/warm-viewport взаимодействие | `docs/specs/131-readonly-cold-start.md` `src/houseplan-card.ts` | | #126 | [SPEC-REVIEW-126-r1.md](SPEC-REVIEW-126-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | в скоупе задачи (возврат автору); снимаются с записью (реализатор решает сам, без возврата цикла) | `docs/specs/126-ha-area-marker-relocation.md` `src/types.ts` `src/houseplan-card.ts` `custom_components/houseplan/validation.py` `src/devices.ts` | | #126 | [SPEC-REVIEW-126-r2.md](SPEC-REVIEW-126-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #126 | [CODE-REVIEW-126-r1.md](CODE-REVIEW-126-r1.md) | code · r1 | 🟡 жёлтый | 1 | 1 | Save диалога устройства без изменения комнаты больше не пишет явный room override; регр…; Browser smoke не покрывает 4 из 8 сценариев, обязательных по §19 ТЗ | `src/houseplan-editor-runtime.ts` `houseplan-editor-runtime.ts` `demo/smoke_subarea.mjs` `demo/smoke_marker_stay.mjs` `smoke_subarea.mjs` `smoke_marker_stay.mjs` `docs/specs/126-ha-area-marker-relocation.md` `demo/smoke_area_relocation.mjs` | | #126 | [CODE-REVIEW-126-r2.md](CODE-REVIEW-126-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #123 | [SPEC-REVIEW-123-r1.md](SPEC-REVIEW-123-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | тип доказательства AC11 не входит буквально в перечень §2.5 | `docs/specs/123-corner-split-wall.md` `PROCESS.md` | | #123 | [CODE-REVIEW-123-r1.md](CODE-REVIEW-123-r1.md) | code · r1 | 🔴 красный | 1 | 0 | новый браузерный смок падает на первой же строке и не подтверждает ни один AC | `demo/smoke_split_corner_wall.mjs` `src/houseplan-card.ts` `demo/srv/assets/houseplan-card.js` `docs/WALL-THICKNESS.md` `src/wall-thickness.ts` `src/space-render.ts` `smoke_opening_measure.mjs` `AGENTS.md` | | #122 | [SPEC-REVIEW-122-r1.md](SPEC-REVIEW-122-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | отсутствует буквальная декларация «Touch editor: …»; три AC используют тип доказательства вне буквального перечня §2.5 | `docs/specs/122-isometric-stage2.md` `docs/TOUCH-SUPPORT.md` `docs/specs/089-isometric-view-stage1.md` `TOUCH-SUPPORT.md` `PROCESS.md` | | #122 | [CODE-REVIEW-122-r1.md](CODE-REVIEW-122-r1.md) | code · r1 | 🔴 красный | 2 | 1 | три копии бандла не пересобраны; CI уже красный на этом SHA; show_borders:false в Iso не сохраняет пиксель-идентичный Stage-1 «no-volume» сценарий; регрессия пикселей во Flat-сценарии при выключенном Labs → #134 | `dist/houseplan-card.js` `custom_components/houseplan/frontend/houseplan-card.js` `demo/srv/assets/houseplan-card.js` `artifacts/golden/golden-report.json` `src/houseplan-card.ts` `demo/golden/matrix.mjs` `docs/ISOMETRIC.md` | | #122 | [CODE-REVIEW-122-r2.md](CODE-REVIEW-122-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #117 | [SPEC-REVIEW-117-r1.md](SPEC-REVIEW-117-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | нет отдельных разделов «Сценарий» и «Что человек увидит»; AC1–AC10 (§11) не несут инлайн-тег способа доказательства; матрица (§6) не содержит отдельной строки для registry-less entity в состоянии unavaila… | `docs/specs/117-registryless-opening-entity.md` `PROCESS.md` `ha-binding-status.test.mjs` `demo/smoke_lock_action.mjs` `demo/smoke_lock_invariant.mjs` `smoke_lock_action.mjs` `smoke_lock_invariant.mjs` `src/logic.ts` | | #117 | [CODE-REVIEW-117-r1.md](CODE-REVIEW-117-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #117 | [CODE-REVIEW-117-r2.md](CODE-REVIEW-117-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #113 | [SPEC-REVIEW-113-r1.md](SPEC-REVIEW-113-r1.md) | spec · r1 | 🟢 зелёный | 0 | 1 | AC8 не имеет предъявленного механизма доказательства; риск и контракт расходятся; нет отдельных заголовков «Сценарий» и «Что человек увидит до/после»; AC1…AC10 не несут явной пометки способа доказательства; нет буквальной метки touch-контракта по docs/TOUCH-SUPPORT.md | `docs/specs/113-optional-space-model.md` `houseplan-card.ts` `113-optional-space-model.md` `PROCESS.md` `docs/TOUCH-SUPPORT.md` | | #113 | [CODE-REVIEW-113-r1.md](CODE-REVIEW-113-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #113 | [CODE-REVIEW-113-r2.md](CODE-REVIEW-113-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #113 | [CODE-REVIEW-113-r3.md](CODE-REVIEW-113-r3.md) | code · r3 | 🟢 зелёный | 0 | 0 | — | — | | #107 | [SPEC-REVIEW-107-r1.md](SPEC-REVIEW-107-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | раздел «Проблема» не выделен отдельно; нет консолидированного раздела «Риски» | `docs/specs/107-virtual-light-toggle.md` `docs/specs/131-readonly-cold-start.md` | | #107 | [CODE-REVIEW-107-r1.md](CODE-REVIEW-107-r1.md) | code · r1 | 🔴 красный | 1 | 1 | Собственная презентация маркера (иконка/CSS-класс on/off) не отражает ручное состояние,…; tests_backend/test_virtual_lights.py не собирается pytest без установленного homeassist… | `src/device-presentation.ts` `src/houseplan-card.ts` `src/space-card.ts` `src/space-render.ts` `demo/smoke_virtual_light_toggle.mjs` `devices.test.mjs` `device-toggle.test.mjs` `tests_backend/test_virtual_lights.py` | | #103 | [SPEC-REVIEW-103-r1.md](SPEC-REVIEW-103-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | сценарий не называет персону/поверхность явной фразой; AC1–AC10 не промаркированы построчно типом доказательства; нормативная матрица §6 группирует cover-состояния не так, как резолвер | `docs/specs/103-toggle-confirmation-state.md` `docs/SCOPE.md` `TOUCH-SUPPORT.md` `SCOPE.md` `PROCESS.md` `src/device-toggle.ts` | | #103 | [CODE-REVIEW-103-r1.md](CODE-REVIEW-103-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | — | — | | #94 | [CODE-REVIEW-issue-094-2026-08-12.md](CODE-REVIEW-issue-094-2026-08-12.md) | code · 2026-08-12 | ⚪ — | 0 | 0 | — | — | | #89 | [SPEC-REVIEW-089-isometric-view-stage1.md](SPEC-REVIEW-089-isometric-view-stage1.md) | spec · isometric-view-stage1 | 🔴 красный | 0 | 8 | Spike ADR должен фиксировать больше, чем выбор renderer; Fingerprint перечисляет не все входы iso geometry; since/expires требуют точной version semantics; Не определён runtime owner механизма Labs; Scope houseplan-space-card не указан; Performance contract не совпадает с существующей инфраструктурой | `src/space-card.ts` `src/space-render.ts` `compare.mjs` | | #89 | [SPEC-REVIEW-89-r1.md](SPEC-REVIEW-89-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | риски не собраны в отдельный раздел; «нормативная» таблица слоёв формально противоречит собственному запрету ТЗ на новый око… | `089-isometric-view-stage1.md` `089-isometric-view.md` | | #89 | [CODE-REVIEW-89-r2.md](CODE-REVIEW-89-r2.md) | code · r2 | 🔴 красный | 1 | 0 | обязательный по ТЗ смок demo/smoke_isometric_live_touch.mjs красный на сданном коммите; три файла с лишней пустой строкой в конце (git diff --check) | `demo/smoke_isometric_live_touch.mjs` `src/sun.ts` `AGENTS.md` `089-isometric-view-stage1.md` `docs/adr/089-isometric-stage1-renderer.md` `src/iso-projection.ts` `test/iso-projection.test.mjs` | | #89 | [CODE-REVIEW-89-r3.md](CODE-REVIEW-89-r3.md) | code · r3 | 🟢 зелёный | 0 | 0 | три файла с лишней пустой строкой в конце; коллизия имени файла ревью из-за смешанной нумерации циклов | `docs/adr/089-isometric-stage1-renderer.md` `src/iso-projection.ts` `test/iso-projection.test.mjs` `docs/reviews/CODE-REVIEW-89-r2.md` | | #86 | [CODE-REVIEW-86-r1.md](CODE-REVIEW-86-r1.md) | code · r1 | ⚪ — | 2 | 1 | Манифест скриншотов документации подделан, а не пересчитан (High, в скоупе); npm run golden:verify красный: 6 эталонов расходятся с рендером (High, в скоупе); Onboarding-путь 5 space-подсказок не доказан исполнением (Medium, в скоупе); .help-ключ не совпадает буквально с ключом видимого label (Low, снимается без правки) | `docs/images/screenshots.json` `scripts/docs-accept.mjs` `docs-accept.mjs` `houseplan-onboarding-runtime.ts` `demo/golden/matrix.mjs` `houseplan-editor-runtime.ts` `matrix.mjs` `demo/smoke_help_affordance.mjs` | | #86 | [CODE-REVIEW-86-r2.md](CODE-REVIEW-86-r2.md) | code · r2 | 🟡 жёлтый | 0 | 1 | AC7 «browser zoom 200%» не доказан ничем (Medium, в скоупе); .help-ключ не совпадает буквально с ключом видимого label (Low, снимается без правки) | `src/styles/dialogs.styles.ts` | | #86 | [CODE-REVIEW-86-r3.md](CODE-REVIEW-86-r3.md) | code · r3 | 🟡 жёлтый | 0 | 1 | AC7 «представительный reviewed golden» для browser zoom 200% так и не появился (Medium,…; .help-ключ не совпадает буквально с ключом видимого label (Low, снимается без правки) | `demo/golden/matrix.mjs` | | #86 | [CODE-REVIEW-86-r4.md](CODE-REVIEW-86-r4.md) | code · r4 | 🟢 зелёный | 0 | 0 | — | — | | #86 | [CODE-REVIEW-86-r5.md](CODE-REVIEW-86-r5.md) | code · r5 | 🟢 зелёный | 0 | 0 | — | — | | #82 | [SPEC-REVIEW-82-r1.md](SPEC-REVIEW-82-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | AC13 частично доказывается гейтом, недоступным на этой стадии цикла; общий easing-хелпер между ModeTransitionController и новым camera controller не специфи…; «дальний hint «Показать»» добавлен в матрицу §6, не упомянутый в исходном тексте issue | `docs/STATUS.md` `docs/superpowers/specs/2026-08-10-plan-visual-continuity-design.md` `src/mode-transition.ts` `src/houseplan-card.ts` | | #82 | [CODE-REVIEW-82-r1.md](CODE-REVIEW-82-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | 1. Коммит 55cf36d6 fix: preserve structural adoption guard — не функциональный фикс. Ди… | `src/houseplan-card.ts` `src/viewport-transition.ts` `smoke_smooth_zoom.mjs` | | #82 | [CODE-REVIEW-82-r2.md](CODE-REVIEW-82-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #74 | [SPEC-REVIEW-74-r1.md](SPEC-REVIEW-74-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | неверные пути трёх скриптов в §14 «Регрессия и gates»; нет явного блока «принято предположительно, поменять свободно» и явной строки про bundl… | `docs/specs/074-device-position-undo.md` `scripts/check-docs.mjs` `scripts/no-new-any.mjs` `scripts/smoke-select.mjs` `src/device-position-history.ts` `AGENTS.md` | | #74 | [CODE-REVIEW-74-r1.md](CODE-REVIEW-74-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | новый Undo/Redo toolbar рендерится без иконок из-за неактуального demo/srv/assets/icons…; AC2 «два устройства в LIFO-порядке» не продемонстрирован реальным перетаскиванием двух …; AC13 «доступные имена на поддерживаемых ширинах» проверены на одной ширине/теме | `demo/srv/assets/icons.js` `docs/specs/074-device-position-undo.md` `demo/smoke_device_position_history.mjs` `src/command-stack.ts` `test/command-stack.test.mjs` `src/houseplan-card.ts` `demo/golden/matrix.mjs` `demo/smoke_editor_tabs.mjs` | | #74 | [CODE-REVIEW-74-r2.md](CODE-REVIEW-74-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #68 | [CODE-REVIEW-issue-068-2026-08-12.md](CODE-REVIEW-issue-068-2026-08-12.md) | code · 2026-08-12 | ⚪ — | 0 | 0 | — | — | | #62 | [SPEC-REVIEW-62-r1.md](SPEC-REVIEW-62-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | CONTRIBUTING.md останется противоречить новому contribution flow — AC9 не покрывает сущ…; AC2 не имеет явного маркера «Доказательство:» в отличие от остальных восьми AC. Формули…; AC5 и AC8 подмешивают в доказательство слово «inspection» (inspection compiled schema, … | `CONTRIBUTING.md` `docs/specs/062-i18n-registry.md` `src/i18n.ts` `src/i18n/registry.ts` `src/editor.ts` | | #62 | [SPEC-REVIEW-62-r2.md](SPEC-REVIEW-62-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #62 | [CODE-REVIEW-62-r1.md](CODE-REVIEW-62-r1.md) | code · r1 | 🔴 красный | 1 | 0 | 1 | `src/i18n/registry.ts` `src/i18n.ts` `CONTRIBUTING.md` `registry.ts` `test/i18n.test.mjs` | | #62 | [CODE-REVIEW-62-r2.md](CODE-REVIEW-62-r2.md) | code · r2 | 🟢 зелёный | 1 | 0 | — | — | | #57 | [SPEC-REVIEW-57-r1.md](SPEC-REVIEW-57-r1.md) | spec · r1 | 🟢 зелёный | 0 | 1 | ТЗ молча сужает названные в issue call sites: «ripple» пропущен, параллельная семья «Об…; нет буквальной декларации Touch editor: … по docs/TOUCH-SUPPORT.md | `docs/specs/057-color-opacity-picker.md` `src/houseplan-card.ts` `houseplan-card.ts` `docs/TOUCH-SUPPORT.md` `docs/specs/068-help-affordance.md` | | #57 | [CODE-REVIEW-57-r1.md](CODE-REVIEW-57-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | реализация меняет визуальный рендер ещё в 4 golden-сценариях, не названных нигде в ТЗ/T… | `docs/TESTING.md` | | #54 | [SPEC-REVIEW-54-r1.md](SPEC-REVIEW-54-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | нет обязательного раздела «Затронутые файлы и модули». PROCESS.md §2.5 (DoR) требует бу…; имя персоны не совпадает с таблицей docs/SCOPE.md. §1 ТЗ: «Персона — Enthusiast/Power U…; формулировка AC14 «backend/HA contract smoke on Linux CI» не согласована с явным заявле…; численные performance-бюджеты не зафиксированы в ТЗ, откладываются на измеренный dev-ст… | `PROCESS.md` `226-entity-parent-dedup.md` `238-opening-inner-distances.md` `264-resize-controller.md` `340-config-set-revision.md` `348-german-localization.md` `docs/SCOPE.md` `AGENTS.md` | | #54 | [SPEC-REVIEW-54-r2.md](SPEC-REVIEW-54-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #54 | [CODE-REVIEW-54-r1.md](CODE-REVIEW-54-r1.md) | code · r1 | 🟡 жёлтый | 0 | 1 | невалидный ответ Zigbee2MQTT на верном топике зависает на полный 150-секундный таймаут …; custom_components/houseplan/diagnostics.py:41 отдаёт config.get("settings", {}) без фил…; pushDirectionalLink (zigbee-topology.ts:114-126) маркирует код duplicate_link как для б…; плотность диффа в нескольких местах указывает на автоматическую вставку без переноса ст… | `src/zigbee-topology-runtime.ts` `custom_components/houseplan/diagnostics.py` `docs/CONFIG-COMPATIBILITY.md` `docs/SUPPORT-PRIVACY.md` `support_package.py` `diagnostics.py` `zigbee-topology.ts` `houseplan-card.ts` | | #54 | [CODE-REVIEW-54-r2.md](CODE-REVIEW-54-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #53 | [SPEC-REVIEW-53-r1.md](SPEC-REVIEW-53-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 4 | docs/SCOPE.md не содержит заявленного исключения для #53; Коллизионное правило противоречит гарантии «нельзя опускать» для непрямоугольных комнат; AC6 проверяет правило, которого нет в контракте внешних размеров; Порог производительности ссылается на несуществующую конфигурацию фикстуры | `docs/SCOPE.md` `SCOPE.md` `AGENTS.md` `demo/fixtures/large-house.mjs` | | #53 | [SPEC-REVIEW-53-r2.md](SPEC-REVIEW-53-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | предложение об i18n-потребителях в §9 не покрывает новый ключ на листе | — | | #53 | [CODE-REVIEW-53-r1.md](CODE-REVIEW-53-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | расхождение текста ТЗ §8.3 с фактическим поведением фолбэка шрифта | `docs/specs/053-pdf-export.md` `src/pdf/pdf-writer.ts` `src/pdf/pdf-font.generated.ts` | | #51 | [SPEC-REVIEW-51-r1.md](SPEC-REVIEW-51-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | отсутствует обязательная литеральная строка Touch editor: … | `docs/TOUCH-SUPPORT.md` `TOUCH-SUPPORT.md` | | #51 | [CODE-REVIEW-51-r1.md](CODE-REVIEW-51-r1.md) | code · r1 | ⚪ — | 0 | 0 | — | — | | #51 | [CODE-REVIEW-51-r2.md](CODE-REVIEW-51-r2.md) | code · r2 | 🟡 жёлтый | 0 | 1 | — | — | | #51 | [CODE-REVIEW-51-r3.md](CODE-REVIEW-51-r3.md) | code · r3 | 🟡 жёлтый | 0 | 1 | — | — | | #51 | [CODE-REVIEW-51-r4.md](CODE-REVIEW-51-r4.md) | code · r4 | ⚪ — | 0 | 0 | — | — | | #44 | [SPEC-REVIEW-44-r1.md](SPEC-REVIEW-44-r1.md) | spec · r1 | 🔴 красный | 2 | 0 | Сценарий и AC4 построены на неверном факте: причина «исключена; Контракт №3 («оба значения читаются из одного источника всеми; Название вкладки инбокса не совпадает с интерфейсным словарём | `docs/specs/044-filter-grouping-policy.md` `src/i18n/en.json` `de.json` `fr.json` `ru.json` `src/houseplan-editor-runtime.ts` `src/device-inbox.ts` `houseplan-editor-runtime.ts` | | #44 | [SPEC-REVIEW-44-r2.md](SPEC-REVIEW-44-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 1 | Ревизия 3 не убрала два места, где документ прямо утверждает то, что H1 уже опроверг: п…; Термин вкладки всё ещё «Доступные» в трёх местах, «Доступны» — в одном | `docs/specs/044-filter-grouping-policy.md` `docs/USER-GUIDE.ru.md` | | #44 | [SPEC-REVIEW-44-r3.md](SPEC-REVIEW-44-r3.md) | spec · r3 | 🟢 зелёный | 0 | 0 | — | — | | #44 | [CODE-REVIEW-44-r1.md](CODE-REVIEW-44-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | у M1/M2 нет отдельного регресс-теста, доказательство — чтение + обратное воспроизведение | — | | #43 | [SPEC-REVIEW-43-r1.md](SPEC-REVIEW-43-r1.md) | spec · r1 | ⚪ — | 0 | 1 | support-relay/ не попадает ни в один класс изменений; отсутствует явная пометка Touch editor: … | `docs/specs/043-private-support-report.md` `AGENTS.md` `process-gate.mjs` `docs/ARCHITECTURE.md` `docs/SUPPORT-PRIVACY.md` `docs/TESTING.md` `docs/TOUCH-SUPPORT.md` | | #43 | [SPEC-REVIEW-43-r2.md](SPEC-REVIEW-43-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 0 | — | — | | #43 | [SPEC-REVIEW-43-r3.md](SPEC-REVIEW-43-r3.md) | spec · r3 | 🟢 зелёный | 0 | 1 | Требование к источнику rate-limit не зафиксировано в ТЗ, хотя код и тесты уже реализуют…; Продакшн-канал ha_webhook целиком зависит от одной автоматизации на личном Home Assista… | `docs/specs/043-private-support-report.md` `scripts/support-relay/tests/test_relay.py` `hp_relay/app.py` `app.py` `scripts/support-relay/README.md` | | #43 | [SPEC-REVIEW-43-r4.md](SPEC-REVIEW-43-r4.md) | spec · r4 | 🟡 жёлтый | 0 | 1 | §9.2 закрывает находку r3 частично: описывает доверие к X-Forwarded-For как безусловный… | `scripts/support-relay/hp_relay/app.py` `config.py` `hp_relay/app.py` | | #43 | [SPEC-REVIEW-43-r5.md](SPEC-REVIEW-43-r5.md) | spec · r5 | 🟢 зелёный | 0 | 0 | — | — | | #43 | [CODE-REVIEW-43-r1.md](CODE-REVIEW-43-r1.md) | code · r1 | 🟡 жёлтый | 0 | 3 | 1 Дешёвые гейты (прогнаны лично, HEAD 1ba53630); 2 Бэкенд Python (доступность харнесса); 3 Relay (scripts/support-relay/); 4 Смоки и golden; 5 Инварианты модели; 6 Одно число — один источник | `AGENTS.md` `PROCESS.md` `docs/images/screenshots.json` `houseplan-card.ts` `houseplan-editor-runtime.ts` `validate.yml` `demo/smoke_feedback_v2.mjs` `demo/smoke_help_affordance.mjs` | | #43 | [CODE-REVIEW-43-r2.md](CODE-REVIEW-43-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #42 | [SPEC-REVIEW-42-r1.md](SPEC-REVIEW-42-r1.md) | spec · r1 | ⚪ — | 0 | 2 | AC5 не покрывает коды, эмитируемые не литералом в send_error(...); раздел «i18n» (обязателен по PROCESS.md §7.1) отсутствует; повторное использование err.…; Разделы «UX» и «Модель данных и миграция», формально обязательные по PROCESS.md §7.1 ка… | `docs/specs/042-backend-engineering-quality.md` `websocket_api.py` `validation.py` `junction_limits.py` `houseplan-card.ts` `src/i18n/en.json` `src/i18n/ru.json` | | #42 | [SPEC-REVIEW-42-r2.md](SPEC-REVIEW-42-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 1 | AC5 и её мутант не синхронизированы с исправленным блоком 5; критерий приёмки снова нед… | `docs/specs/042-backend-engineering-quality.md` | | #42 | [SPEC-REVIEW-42-r3.md](SPEC-REVIEW-42-r3.md) | spec · r3 | 🟡 жёлтый | 0 | 1 | MarkerControlError описан в блоке 5/AC5 только по двум префиксным семействам; ~14 её ли… | `docs/specs/042-backend-engineering-quality.md` `validation.py` `websocket_api.py` | | #42 | [SPEC-REVIEW-42-r4.md](SPEC-REVIEW-42-r4.md) | spec · r4 | 🔴 красный | 0 | 1 | заявленный метод извлечения кода MarkerControlError («regex по вызовам MarkerControlErr… | `docs/specs/042-backend-engineering-quality.md` `validation.py` | | #42 | [CODE-REVIEW-42-r1.md](CODE-REVIEW-42-r1.md) | code · r1 | 🔴 красный | 2 | 0 | no-new-any красный на HEAD: новый необоснованный any; requirements_test.txt невозможно установить: бэкенд-CI не работал ни разу | `src/houseplan-card.ts` `scripts/no-new-any.mjs` `.github/workflows/mutation-gate.yml` | | #42 | [CODE-REVIEW-42-r2.md](CODE-REVIEW-42-r2.md) | code · r2 | 🔴 красный | 2 | 0 | docs-гейт красный: манифест скриншотов не совпадает ни с одним закоммиченным файлом; AC1 (coverage-baseline) недоказан прогоном ветки, но блокер внешний и уже заведён; ruff-долг scripts/+tests_backend/ шире объявленного include, но вне CI-скоупа; golden-расхождений на самом деле 8, не 4, но все вне скоупа #42 | `docs/images/screenshots.json` `capture.mjs` `validate.yml` `tests_backend/test_backend_quality.py` | | #42 | [CODE-REVIEW-42-r6.md](CODE-REVIEW-42-r6.md) | code · r6 | 🟡 жёлтый | 0 | 1 | Mypy strict (блок 3, AC4) не имеет механизма исполнения в CI — только текстовый контрак…; 1. pyproject.toml [tool.ruff] include перечисляет scripts/.py и tests_backend//.py нара… | `validate.yml` `mutation-gate.yml` `const.py` `projection.py` `plans.py` `scripts/gate-reuse.mjs` `tests_backend/test_validation.py` `scripts/process-gate.mjs` | | #39 | [SPEC-REVIEW-39-r1.md](SPEC-REVIEW-39-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 4 | нет обязательных продуктовых разделов §7.1 «сценарий» и «что человек увидит»; i18n-раздел не перечисляет ключи, DoR §2.5 не закрыть; нет разделов «Риски» и «Release-артефакты», обязательных по §7.1; AC4 объединяет два разных момента наступления hard без единого UI-контракта | `docs/specs/039-large-backdrops.md` | | #39 | [SPEC-REVIEW-39-r2.md](SPEC-REVIEW-39-r2.md) | spec · r2 | 🟡 жёлтый | 0 | 2 | — | — | | #39 | [SPEC-REVIEW-39-r3.md](SPEC-REVIEW-39-r3.md) | spec · r3 | 🟢 зелёный | 0 | 0 | — | — | | #39 | [CODE-REVIEW-39-r1.md](CODE-REVIEW-39-r1.md) | code · r1 | 🟡 жёлтый | 0 | 3 | отмена гард-диалога во время busy не отменяет применение; «одно число, один источник» нарушено для HARD_DIMENSION; AC8 (EXIF-ориентация) не доказан ни тестом, ни явной записью; AC3/AC9 в ТЗ помечены «паритет-юнит», а по факту паритет base64 (b64ParityWithLegacyLoo… | `src/backdrop-pick.ts` `src/hp-dialog.ts` `demo/serve.mjs` `backdrop-pick.ts` `backdrop-probe.ts` `PROCESS.md` `docs/TESTING.md` `demo/smoke_backdrop_guard.mjs` | | #39 | [CODE-REVIEW-39-r2.md](CODE-REVIEW-39-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | два из трёх новых stillCurrent()-чеков не имеют собственного мутанта | `src/backdrop-pick.ts` `src/backdrop-probe.ts` `smoke_backdrop_guard.mjs` | | #33 | [SPEC-REVIEW-33-r1.md](SPEC-REVIEW-33-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 3 | статус implemented не существует ни в перечислении, ни в каноне; 4 из 7 «const-деклараций фронта» для parity-теста не существуют; AC6 описывает несуществующее поведение как «расширение теста» | `scripts/config-field-registry.mjs` `docs/CONFIG-COMPATIBILITY.md` `houseplan-card.ts` `houseplan-editor-runtime.ts` `CONFIG-COMPATIBILITY.md` `src/logic.ts` `src/types.ts` `src/plan-optimizer.ts` | | #33 | [SPEC-REVIEW-33-r2.md](SPEC-REVIEW-33-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #33 | [CODE-REVIEW-33-r1.md](CODE-REVIEW-33-r1.md) | code · r1 | 🟡 жёлтый | 0 | 3 | AC7-тест не может поймать то, для чего он написан; Дубликат записи в обоих CHANGELOG и в ARCHITECTURE.md; config-audit.mjs расширил exit-code 3 за пределы согласованного контракта, и для decisi… | `test/config-schema-parity.test.mjs` `scripts/config-schema-manifest.json` `scripts/config-schema.json` `src/houseplan-card.ts` `config-schema.json` `docs/CHANGELOG.md` `docs/CHANGELOG.ru.md` `docs/ARCHITECTURE.md` | | #33 | [CODE-REVIEW-33-r2.md](CODE-REVIEW-33-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | AC6 не имеет штатного регрессионного теста на изолированные decision-required/drop-on-v… | `test/config-audit.test.mjs` `oldest-supported.json` | | #32 | [SPEC-REVIEW-32-r1.md](SPEC-REVIEW-32-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 1 | DoR-пункт «влияние на производительность и бюджеты названо» не закрыт, хотя задача доба… | `docs/specs/032-unified-danger-confirmation.md` `hp-confirm.ts` `AGENTS.md` `docs/specs/337-lazy-editor-chunk.md` `bundle-budget.mjs` | | #32 | [SPEC-REVIEW-32-r2.md](SPEC-REVIEW-32-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | — | — | | #32 | [CODE-REVIEW-32-r1.md](CODE-REVIEW-32-r1.md) | code · r1 | 🟡 жёлтый | 1 | 0 | миграция ломает существующие смоки: 2 дают неверный вердикт, 3 виснут навсегда; шесть старых односложных ключей i18n остались без потребителей | `demo/smoke_free_walls.mjs` `demo/smoke_registryless_opening.mjs` `demo/smoke_binding_picker.mjs` `demo/smoke_hidden_flag.mjs` `demo/smoke_optional_space_model.mjs` `smoke_lock_action.mjs` `smoke_lock_invariant.mjs` `smoke_saved_plans.mjs` | | #32 | [CODE-REVIEW-32-r2.md](CODE-REVIEW-32-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | из r1 — статус: снимаю решением ревьюера, с записью | `test/i18n.test.mjs` | | #29 | [SPEC-REVIEW-29-r1.md](SPEC-REVIEW-29-r1.md) | spec · r1 | 🟡 жёлтый | 0 | 2 | исчезновение призрачного показа скрытых/HA-disabled маркеров на плане не названо как пр…; устаревающая строка i18n не включена в план обновления | `docs/specs/029-device-inbox-lifecycle.md` `docs/FILTERING.md` `docs/USER-GUIDE.ru.md` `demo/smoke_hidden_flag.mjs` `src/i18n/ru.json` `src/i18n/en.json` | | #29 | [SPEC-REVIEW-29-r2.md](SPEC-REVIEW-29-r2.md) | spec · r2 | 🟢 зелёный | 0 | 0 | риск в §18 ссылается не на тот AC | `docs/specs/029-device-inbox-lifecycle.md` | | #29 | [CODE-REVIEW-29-r1.md](CODE-REVIEW-29-r1.md) | code · r1 | ⚪ — | 1 | 1 | demo/smoke_editor_tabs.mjs сломан этим диффом (High, в скоупе); «комната» в каталоге — это имя HA-зоны, а не название комнаты плана (Medium, в скоупе); DeviceInboxRow.canOpenHa — мёртвое поле (Low) | `demo/smoke_editor_tabs.mjs` `AGENTS.md` `src/houseplan-card.ts` `src/device-inbox.ts` `docs/USER-GUIDE.ru.md` `houseplan-card.ts` | | #29 | [CODE-REVIEW-29-r2.md](CODE-REVIEW-29-r2.md) | code · r2 | 🟢 зелёный | 0 | 0 | — | — | | #20 | [SPEC-REVIEW-20-r1.md](SPEC-REVIEW-20-r1.md) | spec · r1 | 🟢 зелёный | 0 | 0 | влияние на touch не названо отдельной строкой | `PROCESS.md` `docs/TOUCH-SUPPORT.md` | | #20 | [CODE-REVIEW-20-r1.md](CODE-REVIEW-20-r1.md) | code · r1 | 🟢 зелёный | 0 | 0 | AC7 для контурной (не partition) стены доказан только чтением кода, не тестом | `test/physical-geometry.test.mjs` `demo/smoke_glow.mjs` `src/houseplan-card.ts` `test/houseplan-runtime-contract.test.mjs` |