Files
houseplan-card/docs/reviews/CODE-REVIEW-608-r2.md
T
2026-09-23 05:04:32 +00:00

155 lines
13 KiB
Markdown

# CODE-REVIEW-608-r2
- **Issue:** #608 «Числовые поля со слайдером (rangeLine) клампят каждый символ»
- **Этап:** code (PROCESS.md §2.7)
- **Заход:** r2 · блокирующих циклов израсходовано 1 из 4
- **Материал:** `edfe8af52ab98ddd3fcee21ae594dc943915e1c0` (рабочая копия уже на
нём); диапазон против r1 — `git diff 8a4ecdea632e776e8b17df3ee1690a0beb8af8c3..HEAD`
(два коммита: `0d969a53` — публикация конвейером документа r1,
`edfe8af5` — правка автора по M1).
## Скоуп раунда
Разбор ведётся по дельте (PROCESS.md §2.9/§2.10): r1 вынес жёлтый вердикт
с единственной находкой M1 (сломанное предложение в русском changelog),
High-находок не было. Дельта r2 состоит из одного авторского коммита
`edfe8af5`, который трогает ровно два файла — `docs/CHANGELOG.md` и
`docs/CHANGELOG.ru.md`, по 4 строки в каждом (плюс служебный коммит
`0d969a53`, публикующий сам документ CODE-REVIEW-608-r1.md — не
продуктовое изменение, класс C, сгенерирован конвейером). Продуктовый код
(`src/editors/form-kit.ts`), смоки, мутант, бандл — не в диффе, `git diff
8a4ecdea..edfe8af5 --stat` подтверждает: только два changelog-файла плюс
новый файл документа ревью.
`git merge-base --is-ancestor 8a4ecdea edfe8af5` → true: ребейза не было,
SHA r1 жив в истории ветки, материал раунда объявлен корректно.
Дельта локальна по критерию §2.10: чисто текстовая правка одного
предложения в двух файлах документации, не задета новая подсистема, объём
несравним с исходной задачей. Полный повторный разбор не требуется.
## Закрытие раунда r1
| Находка | Чем закрыта | Где это видно |
|---|---|---|
| **M1** (Medium, в скоупе) — русский changelog: «значение применяется после выхода из поля, ввода, привязывается к шагу шкалы...» не парсится, висящее «ввода,» без опоры | Коммит `edfe8af5` убрал висящий фрагмент «ввода,» и объединил перенос строки: `docs/CHANGELOG.ru.md:11-13` теперь читается «значение применяется после выхода из поля, привязывается к шагу шкалы и остаётся синхронным с ползунком» — грамматически цельное предложение, три однородных сказуемых при подлежащем «значение» | `docs/CHANGELOG.ru.md:11-13` на `edfe8af5` (см. текст ниже); синхронно уточнена и английская версия `docs/CHANGELOG.md:6-8` («the value is committed when the field is left, snaps to the slider step and stays synchronized with the slider») — тоже цельное перечисление трёх сказуемых, смысл не изменился |
Текущее содержание (проверено чтением обоих файлов на `edfe8af5`):
```
RU: значение применяется после выхода из поля, привязывается к шагу шкалы и
остаётся синхронным с ползунком
EN: the value is committed when the field is left, snaps to the slider step
and stays synchronized with the slider
```
Обе версии парсятся, оба сказуемых-перечисления параллельны, смысл RU и EN
совпадает. Находка закрыта полностью, новых искажений смысла правка не
внесла.
Раздельно отмечу деталь, не являющуюся находкой: у обеих записей в
исходном тексте (`.md`) короткие «рваные» переносы строк внутри пункта
списка (напр. `the field is left,` — 20 символов на отдельной строке) —
это было так уже в материале r1 (`8a4ecdea`, до правки M1) и не меняется
этой дельтой; CommonMark схлопывает мягкие переносы внутри пункта списка в
пробелы, поэтому на отрендеренный текст это не влияет. Не новый дефект —
не подниму как находку.
## Унаследовано из r1
Всё, кроме текста двух changelog-записей, принимается без повторной
проверки — дельта их не задевает:
- **AC1–AC6** (посимвольный ввод, off-step коммит 123→125, слайдер
побеждает над незавершённым текстом, все 7 вызовов `rangeLine(` через
общий helper без правок диалогов, typecheck/unit/build зелёные) —
приняты по `docs/reviews/CODE-REVIEW-608-r1.md`, материал
`8a4ecdea632e776e8b17df3ee1690a0beb8af8c3`, дерево
`ad2bcb990bfb8c4143ea90fcdbf1af7515e2cbbd`. Продуктовый код
(`src/editors/form-kit.ts`), `demo/smoke_range_line_draft.mjs`,
`demo/smoke_dialog_config_parity.mjs`, `scripts/mutation-registry.mjs`
не в дельте r2 — их поведение не могло измениться.
- **Мутационный тест** (`range-line-clamps-every-keystroke`, «поймано 1 из
1», зелёный прогон + красный мутант) — принят по тому же документу r1,
тот же материал; мутант живёт в `scripts/mutation-registry.mjs`,
файл не в дельте r2.
- **Гейты build/bundle-tree/bundle-budget/check-docs** — приняты по
документу r1, где они лично прогнаны ревьюером на `8a4ecdea`; дельта r2
не трогает `src/**`, бандл и fingerprint скриншотов, пересчитывать
нечего.
- **Трейлеры и changelog-требование §16** — на `8a4ecdea` уже были на
месте (Issue: #608, User-Visible: yes, оба changelog в том же коммите);
дельта их не меняет.
- **Скоуп ТЗ** (§5 «Не входит» — диапазоны/шаги/единицы/расположение
контролов не менялись) — не затронут дельтой r2.
## Гейты — что прогнано в r2 и почему остальное не потребовалось
| Гейт | Статус | Как |
|---|---|---|
| `npx tsc --noEmit`, `npm test`, `npm run build` (со сверкой бандла) | **не перегонял** | Дешёвые гейты уже подтверждены зелёным CI Validate на точном SHA `edfe8af5` (ссылка в задании ревью); дельта r2 не трогает `src/**`, продуктовый код не менялся с `8a4ecdea`, где эти же гейты уже прогонялись лично в r1 |
| `node scripts/check-docs.mjs` | **не перегонял** | дельта не трогает `src/**` — фингерпринт скриншотов не мог устареть; автор также сообщил зелёный прогон на этом коммите |
| Смоки (`smoke_range_line_draft.mjs`, `smoke_dialog_config_parity.mjs`) | **не перегонял** | продуктовый код и сами смоки не в дельте r2; уже прогнаны лично в r1 на неизменном с тех пор коде |
| `node scripts/mutation-gate.mjs --id=range-line-clamps-every-keystroke` | **не перегонял** | мутант и защищаемый код не в дельте r2, прогнан лично в r1 |
| `npm run invariants` | **не прогонял** | геометрия/толщина/layout/marker.space/open_spans не затронуты ни исходной задачей, ни дельтой |
| `npm run golden:verify` | **не прогонял** | визуальный результат не меняется; дельта — только текст двух `.md`-файлов |
| `python -m pytest tests_backend -q` | **не прогонял** | `custom_components/**/*.py` не тронут ни в исходной задаче, ни в дельте |
| performance-профили | **не прогонял** | не названы в AC, дельта не касается перф-путей |
| Чтение обоих changelog-файлов на `edfe8af5` | **прогнал сам** | текст приведён выше, парсится, смысл RU/EN совпадает |
Смок-селектор (`scripts/smoke-select.mjs`) для дельты r2 не запускался
повторно: он анализирует изменения `src/**`, а дельта их не содержит —
запуск не дал бы новой информации сверх уже полученной в r1 (см. её вывод
в CODE-REVIEW-608-r1.md).
## Находки
Нет. Единственная находка r1 (M1) закрыта дельтой, новых дефектов дельта
не вносит.
## Что проверено и корректно
- M1 закрыта: русская и английская записи changelog читаются цельными
параллельными перечислениями, смысл не разошёлся.
- Оба changelog-файла по-прежнему обновлены в одном коммите с
`User-Visible: yes` (§16 ТЗ, правило 11 PROCESS.md) — `edfe8af5` трогает
оба файла разом.
- Трейлеры дельта-коммита: `Issue: #608`, `User-Visible: yes` — на месте
(`git show -s --format=full edfe8af5`).
- Ребейза/потери материала между r1 и r2 не было — SHA `8a4ecdea` жив как
предок `edfe8af5`.
- Продуктовый код, тесты и AC1–AC6 не затронуты дельтой — унаследованы из
r1 без повторной проверки (см. раздел выше), сама дельта чисто
документационная, риска регрессии не несёт.
## Чего не проверял и почему
- Смотри таблицу гейтов выше — все пропуски объясняются тем, что
соответствующая поверхность (код, смоки, бандл, геометрия, backend,
перф) не входит в дельту r2 и была полностью проверена в r1 на
неизменном с тех пор материале.
## Вывод
Дельта r2 — точечная правка одного предложения в двух changelog-файлах,
закрывающая единственную Medium-находку r1 (M1) без побочных эффектов.
Продуктовый код, тесты, мутант и все AC не менялись и наследуются из
r1 без повторной проверки. High-находок нет и не было; Medium-находок в
этом раунде нет. Задача готова к слиянию.
---
---
<!-- material-anchors: сгенерировано конвейером (#414) -->
## Материал раунда
- Ветка: `issue/608-range-line-draft-input`, коммит `edfe8af52ab9` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
- Дерево материала: `865ab790fa9d395fca2b601b6f417aa3dc9c286e`
```
git log --all --format='%H %T' | grep 865ab790fa9d
```
- Тело issue: `518c09d725e03b4ca93b0be8a8b6d61805af4e27b25679ddc71a5237c333055e`
- Вердикт конвейера: `green` · High 0