Files
houseplan-card/docs/reviews/CODE-REVIEW-192-r2.md
T
2026-08-19 07:28:37 +00:00

133 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 → нет**