# 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 → нет**