docs: review document for #192

Issue: #192
User-Visible: no
This commit is contained in:
claude[bot]
2026-08-19 07:28:37 +00:00
committed by claude[bot]
parent 29ce5d9e65
commit fbbaed22de
+132
View File
@@ -0,0 +1,132 @@
# CODE-REVIEW-192-r2
Issue: [#192](https://github.com/Matysh/houseplan-card/issues/192) — «Колор-пикер:
шкала «Оттенок» показывает реальную радугу вместо одноцветного слайдера».
Лёгкий трек (`small`); ТЗ живёт в теле issue. Лимит цикла код-ревью для
лёгкого трека — 2; это второй и последний цикл.
Диапазон: `origin/dev..HEAD` = `508d38c` (Show spectrum on hue slider),
`c27c1e4` (docs: review document for #192 — документ r1),
`0d58f77` (Keep hue slider thumb visible — исправление по итогам r1).
Диапазон соответствует ветке `issue/192-hue-gradient`.
## Скоуп проверки
r1 (см. [CODE-REVIEW-192-r1.md](CODE-REVIEW-192-r1.md)) уже подтвердил AC1,
AC2, AC4, AC5 исполнением и дал жёлтый вердикт из-за частично проваленной
AC3: заявленное «thumb остаётся различимым» не выполнялось на hue ≈195°–260°
(включая hue=205° — значение по умолчанию в обеих golden-сценах), Medium
заведён как [#194](https://github.com/Matysh/houseplan-card/issues/194).
r2 — это review исправляющего коммита `0d58f77`. Задача этого цикла: не
повторять весь r1 с нуля, а (а) подтвердить, что исправление действительно
закрывает найденный дефект, (б) убедиться, что оно не расширило скоуп и не
задело остальное, (в) держать общую картину AC1/2/4/5 в поле зрения, раз они
не менялись со времён r1.
## Как проверялось
| Гейт | Прогнан | Результат |
|---|---|---|
| `npx tsc --noEmit` | да | зелёный, без вывода |
| `npm test` | да | 889 passed, 0 failed — совпадает с хендоффом |
| `npm run build` + сверка 3 копий бандла | да | `cmp` тождественны; SHA-256 `d66b779574aebd9222ddf432b746cdf5195cae3030b2cc8ba149dad6f98ce89d` — совпадает с указанным в хендоффе |
| `node demo/smoke_color_picker.mjs` | да | 16/16 true, включая новый `hueThumbContrastContract` |
| Фальсифицируемость unit-теста | да | во временном worktree на pre-fix коммите `508d38c` с тестовыми файлами из HEAD: `hue-range exposes one cyclic spectrum...` падает ровно на новой ассерции (box-shadow/thumb-shadow), остальные 4 подтеста того же теста проходят |
| Фальсифицируемость smoke-проверки | да | тот же pre-fix коммит, пересобранный бандл: `hueThumbContrastContract: false` (единственный провал), после применения `0d58f77` — `true` |
| Визуальная проверка контраста thumb | да, вручную через Playwright/`demo/serve.mjs` | скриншоты открытого picker на hue=205° (dark, mobile-профиль) и hue=235° (тот же профиль) — кольцо чётко видно на голубом/синем участке трека, ранее проблемном по r1 |
| `npm run golden:capture -- --scenario=decor-color-popover-desktop-en` | да | `missing-baseline` (ожидаемо, эталона ещё нет); candidate открыт — кольцо видно и в light-теме на hue=205° |
| `node scripts/process-gate.mjs` (офлайн) | да | «гейт пройден», 1 ожидаемое WARN (ТЗ в теле issue при `small`, а не в `docs/specs/`) |
| Трейлеры коммитов | да, чтением `git log` | все три коммита несут `Issue: #192` и корректный `User-Visible:`; `User-Visible: yes` на `508d38c` и `0d58f77` сопровождается правками обоих changelog в том же коммите |
**Не прогонялось и почему:**
- `npm run golden:verify` (полный набор, 67 сценариев) — не гонял повторно.
r1 уже прогонял полный набор и получил ожидаемую картину (65 passed + 2
ожидаемых расхождения ровно в двух `decor-color-popover-*` сценах). Диапазон
правки `0d58f77` строго ограничен селекторами `.hue-range::-webkit-slider-thumb`
и `.hue-range::-moz-range-thumb` — то есть тем же самым hue-thumb внутри тех
же двух сцен, что уже были единственными расхождениями в r1. Полный прогон
здесь не добавил бы уверенности к тому, что дают точечные `golden:capture`
двух затронутых сцен (сделаны) плюс unit-контракт изоляции (`commonRange`
не содержит `linear-gradient|hp-picker-hue-track`, не тронут). Это гейт,
соразмерный задаче (PROCESS.md §8): полный набор — предрелизный, не ревью.
- `python -m pytest tests_backend -q` — не гонял: `custom_components/**/*.py`
не тронут ни в одном из трёх коммитов (diffstat это подтверждает).
- performance-профили — не гонял: в AC не названы, правка — один статичный
CSS `box-shadow`, без новых вычислений в рантайме.
- Firefox/Safari реальным движком — недоступно в этом окружении (только
Chromium), это принятое предположение самого ТЗ («Принятые предположения»,
автоматизированный smoke остаётся Chromium; Gecko/WebKit declarations
доказываются source-contract и код-ревью). Прочитаны декларации
`::-moz-range-thumb` — синтаксически корректны и симметричны webkit-версии.
## Находки
Нет ни одной High- или Medium-находки в этом цикле.
Low (не блокирует, снимается с записью, дальнейшая правка не нужна):
корректирующий коммит не добавил отдельного smoke/unit-теста, который бы
проверял именно *визуальный* контраст (пиксельное сравнение thumb/track) —
только наличие CSS custom property. Единственное реальное доказательство
контраста на конкретном hue — это golden-эталон (проверяется людьми при
приёмке) и ручной скриншот, сделанный в этом ревью. Это соответствует
принятому в ТЗ способу доказательства AC3 (golden + source-contract/code
review), поэтому не поднимаю до Medium — но фиксирую, что «различимость
thumb» как факт живёт исключительно в golden-baseline review, а не в
автотесте, который умеет упасть сам по себе на будущей регрессии этого рода.
Информационно, не находка: описанный в
[#194](https://github.com/Matysh/houseplan-card/issues/194) дефект
воспроизводится именно на pre-`0d58f77` коде и не воспроизводится после —
проверено выше и unit-тестом, и smoke, и скриншотами на hue=205° и hue=235°.
Закрытие #194 — не в полномочиях этого ревью (§12: закрывает issue
релиз-менеджер/владелец, не ревьюер кода), фиксирую здесь как факт для того,
кто будет разбирать #194 дальше.
## Что проверено и корректно
- **AC1 (спектр).** Без изменений с r1: `linear-gradient` с ключевыми stops
на `.hue-range`, эквивалентные `::-webkit-slider-runnable-track` и
`::-moz-range-track`. Подтверждено исполнением (unit + smoke,
`hueTrackContract: true`).
- **AC2 (управление).** Без изменений с r1 и без затронутого кода в r2:
`min=0/max=359/step=1`, mouse/touch/keyboard/`Shift+Arrow`/emit не тронуты.
889/889 unit + 16/16 smoke, включая `shiftArrowUsesTenStep` и
`hueUpdatesSharedDraft`.
- **AC3 (темы и accessibility) — предмет этого цикла.** Ранее проваленная
часть («thumb остаётся различимым») теперь выполняется: двухконтурное
`box-shadow` (`--card-background-color` внутренний контур,
`--primary-text-color` внешний) не зависит от hue и поэтому контрастен на
любом участке трека — проверено чтением реализации и визуально на двух
ранее проблемных значениях (205°, 235°) в обоих затронутых golden-сценах
(dark/mobile, light/desktop). `forced-colors: active` корректно отключает
декоративную тень (`box-shadow: none` внутри того же media-блока,
подтверждено чтением diff) — системный рендеринг thumb остаётся. Native
размер/цвет/hit area бегунка не переопределены, значит риск нарушить
hit-area или fallback без color отсутствует. `prefers-reduced-motion`
блок не тронут.
- **AC4 (изоляция).** Правка `0d58f77` меняет ровно 4 селектора внутри уже
существующего scoped-блока `.hue-range`/forced-colors; unit-тест явно
проверяет, что `input[type='range']` (общий блок) не содержит новых
свойств. Изменённых golden-сцен по-прежнему ровно две — те же, что в r1.
- **AC5 (совместимость).** Public API, данные, i18n, стили остальных range
не изменены — diffstat и unit source-contract это подтверждают.
- **Трейлеры и changelog.** `Issue: #192` на каждом коммите; `User-Visible:
yes` на `508d38c` и `0d58f77` — в обоих оба changelog правятся в том же
коммите (проверено чтением `git show`). `USER-GUIDE.md`/`USER-GUIDE.ru.md`
обновлены той же формулировкой («contrasting ring» / «контрастный контур»)
синхронно с кодом.
- **Гейты.** Все обязательные (typecheck/test/build+сверка) зелёные и
воспроизведены самостоятельно, не только со слов хендоффа; SHA-256
бандла совпал.
## Вердикт
Дефект AC3, из-за которого r1 получил жёлтый вердикт, исправлен и
верифицирован независимым исполнением (unit, smoke, ручной визуальный
скриншот на конкретных ранее проблемных hue-значениях), а не только
прочитан. Новых High/Medium-находок нет. Скоуп не расширен: правка
ограничена thumb-декорацией того же `.hue-range`.
**Вердикт: зелёный · цикл r2/2 · High: 0 · Medium: 0 → нет**