mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-29 03:09:36 +00:00
155 lines
13 KiB
Markdown
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
|