mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-29 03:09:36 +00:00
@@ -0,0 +1,223 @@
|
||||
# SPEC-REVIEW-192-r1
|
||||
|
||||
- **Issue:** https://github.com/Matysh/houseplan-card/issues/192
|
||||
- **ТЗ под ревью:** тело issue #192 (лёгкий трек, файл `docs/specs/` не
|
||||
создаётся — метка `small` подтверждена)
|
||||
- **Роль:** ревьюер ТЗ (не автор), этап `S4-spec-review`
|
||||
- **Трек:** лёгкий (`small`), лимит циклов ревью ТЗ — 2 (§4 PROCESS.md)
|
||||
- **Цикл:** r1/2
|
||||
|
||||
## Скоуп ревью
|
||||
|
||||
ТЗ #192: шкала «Оттенок» в общем компоненте `hp-color-opacity` (используется
|
||||
в 8 call sites House Plan) получает полноценный циклический hue-gradient на
|
||||
треке вместо нативной серой дорожки; `accent-color` продолжает управлять
|
||||
только thumb. Изменение затрагивает один файл (`src/hp-color-opacity.ts`),
|
||||
без миграции, i18n, backend или расширения touch-контракта.
|
||||
|
||||
Не в скоупе ревью: продуктовый код не написан (issue в `S4-spec-review`;
|
||||
ветки `issue/192-*` в репозитории нет — проверено `git branch -r`), поэтому
|
||||
реализация, тесты и гейты — предмет будущего код-ревью (PROCESS.md §2.7).
|
||||
|
||||
## Как проверялось
|
||||
|
||||
1. Прочитаны `docs/SCOPE.md`, `AGENTS.md`, `PROCESS.md` целиком (актуальная
|
||||
редакция, включая §2.4/§2.5/§5/§7.1/§8).
|
||||
2. Прочитано тело issue #192 и единственный комментарий — аналитика
|
||||
владельца (`Matysh`, `authorAssociation: OWNER`, 2026-08-19): оценка
|
||||
4/10 · 2/10 · 3/10 · P3 · `feature`/`polish`, обоснование легитимности
|
||||
лёгкого трека, явное решение владельца по опциональному объёму
|
||||
(«меняется только шкала «Оттенок»; отдельные градиенты S/V/opacity не
|
||||
нужны — это принятое предположение, продуктового вопроса нет»).
|
||||
3. Прочитан `src/hp-color-opacity.ts` целиком (741 строка) и построчно
|
||||
сверены технические утверждения ТЗ:
|
||||
- Проблема (§«Проблема» ТЗ) подтверждена: `.hue-range` (строка 234-236)
|
||||
содержит только `accent-color: var(--hp-picker-hue, #f00)`, трек
|
||||
остаётся нативным серым; `input[type='range']` (строка 225-233) задаёт
|
||||
`height: 40px` — заявленная в ТЗ существующая интерактивная область
|
||||
подтверждена, а не выдумана.
|
||||
- `.hue-range` — единственный range с этим классом; `saturation`/`value`
|
||||
(строки 682, 689) и `opacity` (707) не имеют отдельного класса —
|
||||
scope `.hue-range`-селектором из §«Скоуп»/Risks реально изолирует
|
||||
только hue-трек.
|
||||
- `accent-color: var(--hp-picker-hue, ...)` и переменная `hueColor`
|
||||
(строка 653, 676) — существующий механизм, ТЗ верно ссылается на его
|
||||
сохранение, а не переизобретает.
|
||||
4. Проверено, нет ли других hue-подобных range-элементов вне
|
||||
`hp-color-opacity.ts`, которые ТЗ должно было бы затронуть, но не
|
||||
затрагивает (по прецеденту Medium-1 из `SPEC-REVIEW-57-r1`, где ТЗ #57
|
||||
молча пропустило часть call sites): `grep -rn "type=\"range\"" src/*.ts`
|
||||
вне `hp-color-opacity.ts` находит только `_rangeInput()`
|
||||
(`houseplan-card.ts:14482-14495`, обобщённый opacity/numeric slider для
|
||||
диалога «Общие настройки», без hue) и `.colorrow input[type='range']`
|
||||
(`styles.ts:2157`, тот же класс). Ни один не является hue-контролом —
|
||||
скоуп ТЗ (только `.hue-range` внутри `hp-color-opacity`) реально полон,
|
||||
пропущенных hue-поверхностей нет.
|
||||
5. Прочитан `test/color-picker.test.mjs` (50 строк) и `demo/smoke_color_picker.mjs`
|
||||
(144 строки) — оба существуют, названы в плане автотестов точно; текущий
|
||||
smoke уже проверяет `hue.value = '120'` → `picker.color === '#00ff00'` и
|
||||
`shiftArrowUsesTenStep` — заявленные в AC2 факты («120° даёт зелёный»,
|
||||
«Shift+Arrow меняет на 10°») подтверждены существующим кодом теста, а не
|
||||
придуманы для ТЗ.
|
||||
6. Проверен `demo/golden/matrix.mjs`: сцена `decor-color-popover-mobile-ru`
|
||||
(строка 269, `theme: 'dark'`) существует и совпадает с описанием ТЗ;
|
||||
отдельной light-сцены этого picker пока нет — ТЗ корректно относит её к
|
||||
«при необходимости» в разделе «Затронутые файлы», а не выдаёт за уже
|
||||
существующую.
|
||||
7. Прочитан `docs/USER-GUIDE.ru.md:189-193` — термин «Оттенок» и описание
|
||||
палитры («Оттенок, насыщенность, яркость, точное значение HEX и
|
||||
прозрачность... доступны вместе») совпадают с текстом ТЗ; обещанное
|
||||
release-уточнение («шкала оттенка показывает spectrum») не противоречит
|
||||
и не переопределяет существующую формулировку.
|
||||
8. Прочитан `docs/TOUCH-SUPPORT.md`, раздел «Documentation rule»
|
||||
(строки 142-154): требование буквальной строки `Touch editor: …`. ТЗ
|
||||
содержит `### Performance и touch` → «**Touch editor:** picker
|
||||
поддерживается как в #57; hit area и события не меняются» — по факту
|
||||
покрывает требование (см. «Что проверено» ниже).
|
||||
9. Проверен прецедент `SPEC-REVIEW-137-r1.md` (Low-4): golden-харнесс
|
||||
(`demo/golden/matrix.mjs`/`harness.mjs`) параметризует тему только как
|
||||
`light`/`dark` (`emulateMedia({ colorScheme })`), отдельного
|
||||
`forced-colors` emulation-пути нет — сверено с тем же выводом, актуальным
|
||||
и для AC3 этого ТЗ (см. Low-1 ниже).
|
||||
10. Проверены `docs/CHANGELOG.md`, `docs/CHANGELOG.ru.md` — существуют,
|
||||
ссылки ТЗ на release-артефакты не ведут в никуда.
|
||||
11. Проверено, что issue не помечен `trivial`: тип `feature`/`polish`, а не
|
||||
`bug` — `trivial` неприменим по критериям §5.1 корректно, как и пишет
|
||||
сам автор аналитики.
|
||||
|
||||
Гейты (`typecheck`/`test`/`build`) не прогонялись — на этапе ревью ТЗ
|
||||
продуктового кода нет; прогон гейтов не относится к этому этапу (PROCESS.md
|
||||
§2.7/§8).
|
||||
|
||||
## Обязательные разделы (§7.1 PROCESS.md, лёгкий трек — тело issue)
|
||||
|
||||
| Раздел | Есть | Комментарий |
|
||||
|---|---|---|
|
||||
| Сценарий (персона/поверхность/момент) | ✅ | персона, поверхность, момент названы явно |
|
||||
| Что человек увидит до/после | ✅ | одна фраза «До»/«После», без терминов реализации |
|
||||
| Проблема | ✅ | подтверждена чтением `hp-color-opacity.ts` (см. «Как проверялось» п.3) |
|
||||
| Скоуп / не-скоуп | ✅ | скоуп полон — подтверждено отсутствием иных hue-поверхностей (п.4) |
|
||||
| Контракт поведения и UX | ✅ | включает touch-строку (п.5 контракта) |
|
||||
| Модель данных и миграция | ✅ | «нет изменений», обоснованно для presentation-only CSS |
|
||||
| i18n | ✅ | «новых строк нет», используется существующий ключ |
|
||||
| AC1…ACn с доказательством | ✅ | 5 штук, у каждого назван способ доказательства |
|
||||
| План автотестов | ✅ | unit/smoke/golden по отдельности, ссылается на реальные файлы |
|
||||
| Риски | ✅ | таблица риск/мера, 4 строки, включая thumb-контраст и селектор-scope |
|
||||
| Откат | ✅ | revert engine-specific стилей, без миграции |
|
||||
| Release-артефакты | ✅ | commit/changelog/USER-GUIDE/golden — все ссылки на существующие механизмы |
|
||||
|
||||
Присутствует также блок «Принятые предположения», корректно отделяющий
|
||||
технические допущения (равномерные CSS stops, Chromium-only browser smoke)
|
||||
от уже принятого владельцем продуктового решения по объёму (см. «Как
|
||||
проверялось» п.2).
|
||||
|
||||
## Находки
|
||||
|
||||
### Low-1 — AC3 не разделяет явно, какая часть критерия доказывается golden, а какая — только чтением кода
|
||||
|
||||
**Файл:** тело issue #192, раздел «Критерии приёмки», AC3.
|
||||
|
||||
AC3 требует одновременно: (a) spectrum/thumb читаемы в light/dark, (b)
|
||||
forced-colors не получает нечитаемую заливку, (c) reduced-motion не
|
||||
меняется — и называет одно доказательство на все три: «dark/light golden
|
||||
candidates + source-contract/code review». Как подтверждено в «Как
|
||||
проверялось» п.9, golden-харнесс параметризует тему только как
|
||||
`light`/`dark`; отдельного `forced-colors` emulation-пути нет. Формально ТЗ
|
||||
не лжёт: «dark/light golden» относится к пункту (a), а «source-contract/code
|
||||
review» — к (b) и (c), но эта граница не проведена явно внутри самого AC3.
|
||||
Тот же класс находки уже фиксировался как Low в `SPEC-REVIEW-137-r1` (Low-4)
|
||||
и не блокировал приёмку.
|
||||
|
||||
**Воспроизведение неоднозначности:** код-ревьюер, сверяя «AC3 доказан
|
||||
golden-ом целиком?», должен самостоятельно вывести, что golden покрывает
|
||||
только light/dark-часть, а `forced-colors`/`reduced-motion` проверяются
|
||||
исключительно чтением CSS, а не эмуляцией браузера.
|
||||
|
||||
**Решение ревьюера:** Low, не блокирует. При реализации/код-ревью явно
|
||||
зафиксировать в хендоффе, что forced-colors и reduced-motion доказаны
|
||||
«проверено чтением, не исполнением», а golden покрывает только light/dark
|
||||
readability — снимаю находку без правки текста ТЗ, тем же способом, что и
|
||||
прецедент.
|
||||
|
||||
## Что проверено и корректно
|
||||
|
||||
- **Соответствие `docs/SCOPE.md`:** задача — editor/settings usability
|
||||
polish общего компонента, используемого в J4/J6-поверхностях
|
||||
(настройка декора/комнат/устройств); не создаёт нового job'а, View/kiosk
|
||||
не затрагиваются.
|
||||
- **Легитимность лёгкого трека:** сложность 3/10, одна поверхность
|
||||
(`hp-color-opacity.ts`), без миграции/i18n/backend/touch-контракта —
|
||||
критерии §5 PROCESS.md выполнены все одновременно; `trivial` корректно
|
||||
признан неприменимым (не `bug`).
|
||||
- **Продуктовый вопрос закрыт до написания ТЗ.** Единственный потенциально
|
||||
продуктовый вопрос — объём видимых изменений («только Hue или все шкалы»)
|
||||
— уже решён самим владельцем текстом комментария аналитики
|
||||
(«В рамках #192 меняется только шкала «Оттенок»... продуктового вопроса
|
||||
владельцу нет»), а не додуман автором задним числом.
|
||||
- **Технический диагноз проблемы не голословен** — подтверждён прямым
|
||||
чтением `src/hp-color-opacity.ts:225-236` (см. «Как проверялось» п.3):
|
||||
трек `.hue-range` действительно остаётся нативным серым, `accent-color`
|
||||
красит только thumb.
|
||||
- **Скоуп реально полон** — построчный поиск по `src/*.ts` не находит
|
||||
других hue-подобных range-элементов вне `.hue-range`; в отличие от
|
||||
прецедента `SPEC-REVIEW-57-r1` (Medium-1, пропущенные call sites), здесь
|
||||
пропущенных hue-поверхностей нет.
|
||||
- **Существующие тестовые файлы и golden-сцена, на которые ссылается ТЗ,
|
||||
реальны** — `test/color-picker.test.mjs`, `demo/smoke_color_picker.mjs`,
|
||||
`decor-color-popover-mobile-ru` в `demo/golden/matrix.mjs:269` — не
|
||||
выдуманы, факты AC2 (120°→зелёный, Shift+Arrow→10°) уже покрыты текущим
|
||||
smoke-кодом.
|
||||
- **Touch-контракт корректно ограничен**: ТЗ явно относит touch-поддержку
|
||||
picker к уже реализованной в #57, не расширяя её, и явно называет
|
||||
родительские редакторы desktop-first по `docs/TOUCH-SUPPORT.md`; строка
|
||||
`**Touch editor:** picker поддерживается как в #57` по существу закрывает
|
||||
требование буквальной декларации из «Documentation rule» этого документа.
|
||||
- **AC1-AC5 однозначны**, каждый снабжён допустимым по §2.5 PROCESS.md
|
||||
способом доказательства (unit/smoke/golden/code review), включая
|
||||
корректное делегирование полной изоляции (AC4) предрелизному golden-гейту,
|
||||
а не локальному прогону — соответствует PROCESS.md §8 («полные наборы —
|
||||
предрелизный гейт»).
|
||||
- **Откат тривиален и корректен** — CSS-only изменение без миграции данных.
|
||||
- **Release-артефакты** ссылаются на существующие файлы
|
||||
(`docs/CHANGELOG.md`, `docs/CHANGELOG.ru.md`, `docs/USER-GUIDE.ru.md`),
|
||||
формулировка уточнения не противоречит текущему тексту гайда.
|
||||
- **«Принятые предположения»** корректно отделяют свободные технические
|
||||
решения реализации (интерполяция stops, Chromium-only smoke) от уже
|
||||
принятого продуктового решения по объёму — не маскируют продуктовый
|
||||
вопрос под техническое решение.
|
||||
|
||||
## Чего не проверял
|
||||
|
||||
- Реализацию — её нет: issue в `S4-spec-review`, ветки `issue/192-*` не
|
||||
существует (`git branch -r` пуст по этому номеру) — проверено.
|
||||
- Гейты `typecheck`/`test`/`build`/browser smoke/golden — не относятся к
|
||||
этапу ревью ТЗ; предмет будущего код-ревью (PROCESS.md §2.7/§8).
|
||||
- `python -m pytest tests_backend` — backend не затрагивается ни кодом, ни
|
||||
ТЗ этой задачи.
|
||||
- Реальный визуальный результат градиента в браузере (Chromium/Firefox
|
||||
track pseudo-elements, контраст thumb на разных секторах) — на этом этапе
|
||||
CSS не написан; заявленные риски (thumb теряется на ярком секторе,
|
||||
расхождение WebKit/Gecko) зафиксированы в ТЗ как риски с мерами, а не
|
||||
проверены исполнением.
|
||||
- Точность числовых оценок аналитики (ценность 4/10, сложность 3/10, P3) по
|
||||
существу — поле владельца (PROCESS.md §2.2), уже принятое явным решением
|
||||
до написания ТЗ.
|
||||
- Полный список всех `<input type="range">` в `demo/` и `custom_components/`
|
||||
— поиск ограничен `src/*.ts`, как единственным местом, где мог бы
|
||||
находиться продуктовый hue-контрол; `demo/`/backend не содержат
|
||||
собственных UI-контролов picker'а.
|
||||
|
||||
## Вердикт
|
||||
|
||||
Зелёный. High: 0, Medium: 0, Low: 1 (неявное разделение доказательства AC3
|
||||
между golden и code review для forced-colors/reduced-motion — тот же класс,
|
||||
что прецедент `SPEC-REVIEW-137-r1` Low-4; снимается без правки текста ТЗ,
|
||||
фиксируется в хендоффе код-ревью). ТЗ корректно и проверяемо решает
|
||||
заявленный узкий скоуп: единственный потенциально продуктовый вопрос
|
||||
(объём видимых изменений) уже закрыт владельцем в комментарии аналитики,
|
||||
технический диагноз проблемы подтверждён чтением кода, скоуп реально полон
|
||||
(других hue-поверхностей вне `.hue-range` не существует), AC однозначны и
|
||||
снабжены допустимыми способами доказательства.
|
||||
|
||||
**Вердикт: зелёный · цикл r1/2 · High: 0 · Medium: 0 → нет · Документ:
|
||||
docs/reviews/SPEC-REVIEW-192-r1.md**
|
||||
Reference in New Issue
Block a user