mirror of
https://github.com/Matysh/houseplan-card
synced 2026-10-04 05:41:34 +00:00
Проверка (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
Issue: #594 User-Visible: no
168 lines
17 KiB
Markdown
168 lines
17 KiB
Markdown
# 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**
|
||
|
||
---
|
||
|
||
<!-- material-anchors: сгенерировано конвейером (#414) -->
|
||
|
||
## Материал раунда
|
||
|
||
- Ветка: `dev`, коммит `df7a62c82ef0` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
|
||
- Дерево материала: `88a9dda26ca79ae183fd194a408b9421b2eb9a24`
|
||
```
|
||
git log --all --format='%H %T' | grep 88a9dda26ca7
|
||
```
|
||
- Тело issue: `594c7771e678dae203db75069c75806da3eec9c1d9b155a3d7ba2236d338052a`
|
||
- Вердикт конвейера: `green` · High 0
|