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

12 KiB
Raw Blame History

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