From e29dfdeb723014ce564e6b4c20f233c6d74b2d04 Mon Sep 17 00:00:00 2001 From: "claude[bot]" <209825114+claude[bot]@users.noreply.github.com> Date: Wed, 23 Sep 2026 05:04:32 +0000 Subject: [PATCH] docs: review document for #608 Issue: #608 User-Visible: no --- docs/reviews/CODE-REVIEW-608-r2.md | 154 +++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 docs/reviews/CODE-REVIEW-608-r2.md diff --git a/docs/reviews/CODE-REVIEW-608-r2.md b/docs/reviews/CODE-REVIEW-608-r2.md new file mode 100644 index 00000000..435b0f38 --- /dev/null +++ b/docs/reviews/CODE-REVIEW-608-r2.md @@ -0,0 +1,154 @@ +# 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-находок в +этом раунде нет. Задача готова к слиянию. + +--- + +--- + + + +## Материал раунда + +- Ветка: `issue/608-range-line-draft-input`, коммит `edfe8af52ab9` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. +- Дерево материала: `865ab790fa9d395fca2b601b6f417aa3dc9c286e` + ``` + git log --all --format='%H %T' | grep 865ab790fa9d + ``` +- Тело issue: `518c09d725e03b4ca93b0be8a8b6d61805af4e27b25679ddc71a5237c333055e` +- Вердикт конвейера: `green` · High 0