Files
houseplan-card/docs/reviews/SPEC-REVIEW-594-r3.md
T
claude[bot] 073c45b043
Проверка (CI) / Классификация изменённых файлов (push) Successful in 17s
Проверка (CI) / Мутанты по диффу (1/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (2/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (3/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (4/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (5/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (6/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Предполёт: документация, провенанс, процесс (push) Failing after 31s
Проверка (CI) / HACS: валидация репозитория (push) Failing after 22s
Проверка (CI) / Hassfest: манифест интеграции (push) Failing after 21s
Проверка (CI) / Переиспользование: это дерево уже проверено (push) Failing after 38s
Проверка (CI) / Геометрия: TS/Python parity исполнена (push) Skipped
Проверка (CI) / Бэкенд: pytest в Home Assistant (push) Skipped
Проверка (CI) / Фронтенд: типы, юниты, мутанты, синхрон бандла (push) Failing after 7m40s
Проверка (CI) / Смоки в браузере (шард 1 из 3) (push) Skipped
Проверка (CI) / Смоки в браузере (шард 2 из 3) (push) Skipped
Проверка (CI) / Смоки в браузере (шард 3 из 3) (push) Skipped
Проверка (CI) / Смоки: все шарды зелёные (push) Skipped
Проверка (CI) / Golden-кадры против принятых эталонов (push) Skipped
Проверка (CI) / Перф-смок: бюджет времени кадра (push) Skipped
Проверка (CI) / Доказательство выполненных проверок (push) Failing after 17s
docs: review document for #594
Issue: #594
User-Visible: no
2026-09-18 20:16:21 +00:00

17 KiB
Raw Blame History

SPEC-REVIEW-594-r3

Issue: https://github.com/Matysh/houseplan-card/issues/594 Этап: ревью ТЗ (PROCESS.md §2.4), заход r3, блокирующих циклов израсходовано 2 из 4 (полный трек — меток small/trivial на issue нет).

Материал раунда

  • Тело issue #594 в текущем виде (снято через gh issue view 594 --json body), sha256 нормализованного тела (LF, UTF-8): 594c7771e678dae203db75069c75806da3eec9c1d9b155a3d7ba2236d338052a, длина 18279 байт. Ветка/дерево репозитория для сверки кода: df7a62c82ef0f320ac1367a1272761f479af2612 (рабочая копия), код в src/** относительно материала r2 (7ce9e6437f25) не менялся — этап spec, диффа кода нет и быть не должно.
  • Найден комментарий-редакция Matysh, id 5735598406, 2026-09-18T20:10:18Z: «Редакция r3: Medium закрыта, обе Low тоже» — заявляет правку раздела i18n, раздела «Release-артефакты» и явный заголовок «Проблема».
  • Важная деталь материала, которую сам автор указал в этом же комментарии: REST API issue-таймлайна не отдаёт событие edited (это подтвердил и вывод gh api .../events в этом раунде — типы событий только labeled/unlabeled/parent_issue_added/referenced), из-за чего r2 ошибочно заключил «тело не редактировалось». Автор утверждает, что правка была (в 16:11, до заведения issue в его нынешнем виде). Для целей этого раунда это не имеет значения: важен не факт прошлой правки, а то, что текущее тело отличается от текста, который цитировал/пересказывал r2, — и это подтверждено прямым построчным сравнением ниже, а не косвенным признаком «есть ли edited в таймлайне». Фиксирую как находку процесса (не блокирует): вывод «дельты нет» нельзя делать по отсутствию edited-события — нужно сравнивать сам текст (blob/sha256), как и предлагал сам r2 в своей находке процесса.

Закрытие раунда r2

# Находка r2 Чем закрыта Где это видно
Medium (в скоупе): раздел i18n не называет ключи заголовков четырёх групп («Основное», «Заливка», «Источники», «Размеры») Закрыта. Раздел ### i18n переписан: явная таблица решений по каждому из четырёх заголовков Тело issue, раздел ### i18n (строки 83–102 текущего тела): room.group_basics / room.group_fill / room.group_sources — новые ключи; room.sizes_section — переиспользуется как есть; room.settings_section — удаляется из кода и всех 4 локалей; плюс 4 пары *.help/*.help.aria. Итог посчитан явно: «11 новых × 4 локали минус 1 удалённый × 4»
Low: «Release-артефакты» ссылаются на кадр room-card (View), а не на диалог настроек Закрыта. Раздел переписан: указано, что ни один из 10 сценариев demo/docs диалог не открывает, приёмка — npm run docs:accept -- --identical на полном наборе Тело issue, раздел ### Release-артефакты (строки 143–147)
Low: раздел «Проблема» не выделен явным заголовком Закрыта. Добавлен явный ### Проблема Тело issue, строка 53

Независимая проверка находок (не просто цитирование заявления автора)

Каждое фактическое утверждение новой редакции сверено чтением кода/скриптов, а не принято на слово:

  • src/editors/room-settings-dialog.ts:60 и :93 — подтверждено: room.settings_section сегодня один заголовок покрывает и блок заливки, и блок источников (радиосписок заливки, hp-color-opacity, roomTemperatureControls, оба _renderRoomSource), а room.sizes_section стоит перед блоком масштабов — ровно то разбиение, которое описывает новая таблица.
  • src/i18n/{en,ru,fr,de}.json:774 — room.settings_section = «Room settings (override the space)» / «Настройки комнаты (переопределяют пространство)» — текст совпадает с тем, что цитирует ТЗ.
  • src/i18n/{en,ru,fr,de}.json:792 — room.sizes_section = «Font sizes» / «Размеры шрифтов» — совпадает с ТЗ, ключ обоснованно переиспользуется без нового.
  • src/i18n/en.json:783-784 — room.temp_range.help / room.temp_range.help.aria существуют, подтверждает строку «переиспользуется без правок».
  • src/houseplan-editor-runtime.ts:1263-1268 (_help) — контракт подтверждён дословно: сигнатура принимает Extract<I18nKey, \${string}.help`>, сама строит ${key}.aria, и при отсутствии перевода любой из двух возвращает nothing(ничего не рисует) — ровно то, что заявляет новый абзац про парность.help/.help.aria`.
  • test/i18n-dead-keys.test.mjs — существует, сканирует только src/**/*.ts и красит тест на любом ключе словаря без потребителя в src; после удаления room.settings_section из room-settings-dialog.ts (единственного консьюмера в src) он должен быть удалён и из всех локалей, иначе именно этот тест покраснеет — заявление ТЗ подтверждено чтением реализации теста.
  • demo/smoke_room_settings.mjs:72 — подтверждена точная строка: c._t('room.settings_section') используется как ожидаемый текст подписи. ТЗ явно объявляет, что эта строка будет заменена на проверку «четырёх заголовков групп» — то есть смок расширяется, а не просто перестаёт видеть удалённый ключ по случайности. Согласовано.
  • Арифметика раздела i18n перепроверена построчно: 3 новых заголовка (group_basics/fill/sources)
    • 4 новые пары .help/.help.aria (group_basics, group_fill, group_sources, sizes_section) = 3 + 8 = 11 новых ключей; минус room.settings_section (1 ключ) — итог, который называет ТЗ, сходится.
  • demo/docs/screenshots.mjs — подтверждено ровно 10 записей id: (view-desktop, view-touch, space-create, room-contour-close, plan-context-tray, device-editor, device-display-preview, background-editor, room-card, device-info, pdf-export), и сцена room-card использует mode: 'view' без dialog — диалог настроек комнаты она не открывает. Подтверждает и число «10», и заявление «не открывает ни один сценарий».
  • scripts/check-docs.mjs:209 — отпечаток документации (visualFingerprint) считается от корня репозитория (включает src/**), что подтверждает переписанный вывод раздела «Release-артефакты» про полный, а не выборочный отпечаток.
  • Все файлы, перечисленные в «Плане автотестов» и AC как «без правок», существуют: demo/smoke_room_settings.mjs, demo/smoke_help_affordance.mjs, demo/smoke_color_picker_consumers.mjs, demo/smoke_room_temperature_thresholds.mjs, demo/smoke_font_scales.mjs, demo/smoke_editor_tabs.mjs, demo/smoke_summary_panel.mjs, demo/smoke_summary_panel_polish.mjs, test/bundle-assets.test.mjs, test/editor-dialog-modules.test.mjs; INITIAL_VIEW_GZIP_CEILING определена (scripts/bundle-budget.mjs:294).
  • docs/TOUCH-SUPPORT.md:9-25 — подтверждает независимо унаследованное (не новое в этом раунде) заявление ТЗ «редактор desktop-first, деградация допустима»: Plan editor поимённо отнесён к «Reference editing environment / Best effort».

Новых дефектов в переписанных фрагментах (i18n, Проблема, Release-артефакты) не найдено — ни одно фактическое утверждение не разошлось с кодом, арифметика ключей и подсчёт сценариев сошлись.

Унаследовано из r2 (дельта их не касается)

Дельта этого раунда локальна: три раздела текста (i18n, Release-артефакты, явный заголовок Проблема), без изменения контракта К1–К7, скоупа/не-скоупа, AC1–AC11 (кроме текстовой связки AC6 с новой i18n-таблицей — сверено выше, содержательно не изменилась), плана рисков и отката. Полный повторный аудит этих разделов не требуется по PROCESS.md §2.10 п.4, ниже — что именно наследуется и откуда:

  • К1 (ключи черновика), К2 (условия «Сохранить»), К3 (hp-color-opacity/событие), К4 (переезд пояснений под «?»), К5 (генератор со скоупом/префиксом), К6 (панель не рендерится в этом шаге), К7 (клавиатура сегментированного переключателя) — унаследованы из r1/r2, текст этих пунктов не менялся между материалом r2 и текущим телом.
  • Скоуп/не-скоуп, UX (группы и порядок полей), «Модель данных и миграция: нет» — унаследованы, без изменений текста.
  • AC1–AC5, AC7–AC11 — унаследованы; доказательства (test/form-kit.test.mjs, smoke_room_settings.mjs, golden:verify, bundle:budget, замороженная фикстура AC11) проверены r2 чтением кода и не затронуты правкой этого раунда. AC6 текстуально сверен заново (см. «Независимая проверка» выше), так как он напрямую ссылается на i18n-раздел.
  • Golden-сцены room-temperature-dialog-{desktop-en,mobile-ru} и соответствие диалога классу roomdialog — унаследовано из r2, повторно не перепроверялось (дельта не про golden).
  • Шесть вариантов заливки (ROOM_FILL_MODES + fill.inherit) — унаследовано из r2.
  • Согласие ТЗ с решениями владельца от 18.09 (набор+диалог одним issue; правка стилей панели разрешена, но перенос — следующим issue) — унаследовано, текст этих разделов не менялся.

Источник наследования: docs/reviews/SPEC-REVIEW-594-r2.md (в репозитории, коммит df7a62c8), материал r2 — тело issue на момент material_issue_body = 97f5a0277d2aee81abd986c24d874aa94949902428cc33bd2eb845990d48b37b, дерево кода 7ce9e6437f25.

Находки этого раунда

Нет. Единственная Medium-находка (i18n) закрыта содержательно, обе Low-находки закрыты. Новых дефектов в изменённых фрагментах не выявлено (см. «Независимая проверка» выше).

Что проверено и корректно

  • Дельта установлена прямым сравнением текста (а не по признаку edited в таймлайне, который, как выяснилось в этом раунде, ненадёжен для issue).
  • Все фактические утверждения новой редакции i18n-раздела (имена ключей, тексты переводов, номера строк кода, поведение _help(), поведение i18n-dead-keys.test.mjs, номер строки смока) проверены самостоятельным чтением кода и совпали.
  • Арифметика счётчика ключей (11 новых × 4 локали минус 1 удалённый × 4) пересчитана и верна.
  • Число и состав сценариев demo/docs (10, без диалога комнаты) пересчитаны и верны.
  • ТЗ по-прежнему формально полно по всем обязательным разделам §7.1 и DoR §2.5: сценарий, что человек увидит, явная «Проблема», скоуп/не-скоуп, контракт К1–К7, UX, модель данных, i18n (полный список), AC1–AC11 с доказательством, план автотестов, риски, откат, release-артефакты, раздел принятых предположений. Открытых продуктовых вопросов к владельцу нет.

Чего не проверял

  • Гейты кода (typecheck/test/build/golden/смоки) — этап spec, реализации ещё нет, гейты неприменимы к ревью ТЗ.
  • Полный повторный аудит K1–K7, AC1–AC5/AC7–AC11, скоупа, рисков «с нуля» — дельта их не касается, см. «Унаследовано из r2».
  • Не связывался с владельцем: находки этого раунда и предыдущих были техническими (полнота списка i18n-ключей, корректность ссылки на скриншот), решались автором и ревьюером без продуктовых вопросов.

Вывод

Дельта r3 — три локальных текстовых правки (i18n, Release-артефакты, заголовок «Проблема»), адресующие ровно находки r1/r2. Все три закрыты содержательно и подтверждены независимым чтением кода, а не приняты на слово. Новых находок правка не внесла. ТЗ формально полно, открытых продуктовых вопросов нет — задача готова к переходу в «Готово к разработке».

Вердикт: зелёный · заход r3 · блокирующих циклов 2/4 · High: 0 · Medium: 0


Материал раунда

  • Ветка: dev, коммит df7a62c82ef0 — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
  • Дерево материала: 88a9dda26ca79ae183fd194a408b9421b2eb9a24
    git log --all --format='%H %T' | grep 88a9dda26ca7
    
  • Тело issue: 594c7771e678dae203db75069c75806da3eec9c1d9b155a3d7ba2236d338052a
  • Вердикт конвейера: green · High 0