12 KiB
CODE-REVIEW-192-r2
Issue: #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) уже подтвердил AC1, AC2, AC4, AC5 исполнением и дал жёлтый вердикт из-за частично проваленной AC3: заявленное «thumb остаётся различимым» не выполнялось на hue ≈195°–260° (включая hue=205° — значение по умолчанию в обеих golden-сценах), Medium заведён как #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 дефект
воспроизводится именно на 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 → нет