mirror of
https://github.com/Matysh/houseplan-card
synced 2026-10-01 20:29:00 +00:00
133 lines
12 KiB
Markdown
133 lines
12 KiB
Markdown
# 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 → нет**
|