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

13 KiB
Raw Blame History

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