Files
houseplan-card/docs/reviews/CODE-REVIEW-478-r3.md
T
claude[bot] d12b1f20b0
Проверка (CI) / Классификация изменённых файлов (push) Successful in 48s
Проверка (CI) / Предполётные проверки: документация, провенанс, процесс (push) Successful in 53s
Проверка (CI) / HACS: валидация репозитория (push) Skipped
Проверка (CI) / Hassfest: манифест интеграции (push) Skipped
Проверка (CI) / Фронтенд: типы, юниты, мутанты, синхрон бандла (push) Skipped
Проверка (CI) / Переиспользование: это дерево уже проверено (push) Successful in 43s
Проверка (CI) / Смоки в браузере (шард 1 из 3) (push) Skipped
Проверка (CI) / Смоки в браузере (шард 2 из 3) (push) Skipped
Проверка (CI) / Смоки в браузере (шард 3 из 3) (push) Skipped
Проверка (CI) / Смоки: все шарды зелёные (push) Skipped
Проверка (CI) / Golden-кадры против принятых эталонов (push) Skipped
Проверка (CI) / Перф-смок: бюджет времени кадра (push) Skipped
Проверка (CI) / Бэкенд: pytest в Home Assistant (push) Skipped
docs: review document for #478
Issue: #478
User-Visible: no
2026-09-06 16:20:37 +00:00

14 KiB
Raw Blame History

CODE-REVIEW-478-r3

  • Issue: #478 — отказ от сущности «черновик контура» (room_drafts), wall model v9 → v10
  • Ветка: issue/478-remove-room-drafts
  • SHA материала: 4beb5c882907d17b63a1761e6040c84f17516d13 (сверено git rev-parse HEAD непосредственно перед выводом, §2.7)
  • SHA предыдущего раунда (r2): 0c670a9862ab4266a677b5553c070f2e41bab0c0 — назван явно в документе docs/reviews/CODE-REVIEW-478-r2.md (раздел «Материал раунда»: SHA материала, дерево, блоб ТЗ) и подтверждён вердиктом в issue от 2026-09-06T16:14:47Z. SHA резолвится напрямую, архаичное восстановление по дереву/блобу не потребовалось.
  • Диапазон дельты: git diff 0c670a98..HEAD — 2 файла:
    • docs/CONFIG-COMPATIBILITY.md — 7 вставок / 6 удалений (продукт-документация, класс C);
    • docs/reviews/CODE-REVIEW-478-r2.md — добавлен пайплайном публикации предыдущего раунда, к предмету этого раунда не относится (это протокол r2, а не правка автора). Единственная правка автора в этом раунде — коммит 4beb5c88 («docs: describe deterministic legacy id repair», Issue: #478 · User-Visible: no).
  • Заход: r3 · блокирующих циклов израсходовано 0 из 4 (значение объявлено на входе в раунд; зелёные вердикты бюджет не тратят, красный r1 и жёлтый r2 уже были учтены до этого раунда — §4, #227).

Вердикт

Зелёный. High: 0, Medium: 0, Low: 0.

Дельта r2→r3 — ровно то, что и должна была быть: закрытие единственного Medium из r2 (расхождение docs/CONFIG-COMPATIBILITY.md с фактическим поведением миграции), больше ничего не менялось. Новых находок дельта не вносит.

Скоуп

Полный повторный разбор не требуется — ни одно условие «разбор остаётся полным» не выполняется:

  • dev не двигался: git merge-base origin/dev HEAD == git rev-parse origin/dev == c82ba84cc7867e0b8e20aaa39ac3270e675c341f (то же значение, что зафиксировал r2 — ребейза не было);
  • контракт поведения не меняется — правка только в тексте канонического документа, ни один файл src/** или custom_components/**/*.py дельтой не тронут;
  • новая подсистема не затронута;
  • объём дельты (1 файл продукт-документации, 13 строк) на два порядка меньше исходной задачи (154 файла на r1) и меньше даже дельты r1→r2 (50 файлов).

Предмет раунда — единственный коммит 4beb5c88, правящий абзац «Ordinary wall chains — model v10 (#478)» в docs/CONFIG-COMPATIBILITY.md.

Закрытие раунда r2

Находка r2 Чем закрыта Где это видно
Medium-1 — docs/CONFIG-COMPATIBILITY.md:203 утверждал «an id collision fails closed», хотя фикс High-1 (r1→r2) заменил это поведение на детерминированную регенерацию id с числовым суффиксом; документ описывал состояние SHA 1cadd520, а не HEAD Абзац переписан: «A unique existing segment id is retained; a missing, empty or colliding id is replaced deterministically from the space, draft and edge index, with a stable numeric suffix when needed. … Malformed geometry or invalid thickness fails closed» — коллизия убрана из списка отказов, взамен описано реальное поведение (регенерация + суффикс) docs/CONFIG-COMPATIBILITY.md:198-203 (коммит 4beb5c88). Сверено с кодом обоих движков на HEAD: src/wall-segment-model.ts:779-786 (if (!id || used.has(id)) { … for (let suffix = 2; used.has(id); suffix++) id = \${base}-${suffix}`; }) и custom_components/houseplan/wall_segment_model.py:690-698(тот же алгоритм:while segment_id in used: segment_id = f"{base}-{suffix}"). Оба файла не менялись этой дельтой — код тот же, что r2 уже проверил исполнением (28/28, откат к r1 ловит duplicate-id`); проверено чтением, что новый текст документа буквально соответствует этому коду

Прочие расхождения соседних фраз не возникло: grep -n -i "collision\|fails closed" по всему файлу даёт единственное вхождение — исправленную строку 203. Остальной абзац (сохранение существующего уникального id, порядок черновика, cm, атомарное удаление carrier-записи, отказ для malformed geometry/thickness, отклонение stale v9-записи с room_drafts поверх v10) дельтой не тронут и по-прежнему соответствует коду, не изменённому с r2.

Унаследовано из r2

Без повторной проверки принято (дельта их не касается):

  • обе High-находки r1 и весь список Medium/Low r1 — закрыты и подтверждены исполнением на SHA 0c670a98, из docs/reviews/CODE-REVIEW-478-r2.md, раздел «Закрытие раунда r1»;
  • продуктовая рамка и соответствие docs/SCOPE.md (J6) — из docs/reviews/CODE-REVIEW-478-r1.md, SHA 1cadd520;
  • полнота ТЗ и решения владельца — docs/reviews/SPEC-REVIEW-478-r1.md (зелёный, 0 циклов), из вердикта в issue от 2026-09-06T12:05:47Z, SHA ТЗ 30a16ed3;
  • вся продуктовая логика миграции v9→v10, атомарность приёма комнаты (_applyWallFaceBatch, _commitRoom), fixed-point Optimize сразу после accept, session-only цепочка, golden-харнесс, мутационный свидетель room-accept-leaves-coincident-partitions, инварианты модели на мигрированной фикстуре — из docs/reviews/CODE-REVIEW-478-r2.md, разделы «Как проверялось» и «Что проверено и корректно», SHA 0c670a98. Ни один из этих файлов не входит в дельту r2→r3. AC1–AC15 — все либо доказаны исполнением в r1/r2, либо унаследованы без изменений; эта дельта не задевает ни одного доказательства.

Как проверялось (этот раунд)

Дельта не трогает src/**, custom_components/**/*.py, тесты, смоки, схему или геометрию — только текст канонического документа. Дешёвые гейты и тяжёлые гейты, специфичные для этой дельты, не требуются: изменение не могло сломать typecheck/build/tests (ни одна строка кода не менялась) и не меняет видимый пользователю результат.

Гейт Статус Обоснование
npx tsc --noEmit / npm test / npm run build + сверка 3 копий бандла не перегонял Validate зелёный на точном SHA 4beb5c88: https://github.com/Matysh/houseplan-card/actions/runs/34044883164 (указан в задаче ревью, номер run проверен)
node scripts/check-docs.mjs не запускал диф не трогает src/** — по правилу необязателен; автор отчитался о зелёном прогоне с --external на этом же SHA
Инварианты модели / mutation-gate / golden / smoke / backend pytest не применимо дельта не трогает геометрию, layout, marker.space, open_spans, рендер-путь, Python или продуктовый TS-код — только формулировку одного абзаца документации
Чтение кода против нового текста документа выполнено src/wall-segment-model.ts:779-786, custom_components/houseplan/wall_segment_model.py:690-698 — оба соответствуют новой формулировке дословно (см. таблицу закрытия выше)
grep -n -i "collision|fails closed" docs/CONFIG-COMPATIBILITY.md выполнено единственное вхождение — исправленная строка; побочных несогласованных упоминаний коллизии в файле нет
Трейлеры коммита 4beb5c88 выполнено чтением Issue: #478, User-Visible: no — корректно: правка не меняет видимое поведение продукта, изменений changelog не требуется
git merge-base origin/dev HEAD vs origin/dev выполнено совпадают (c82ba84c…) — dev не двигался, ребейза нет, полный разбор не требуется

Чего не проверял и почему

  • Полный набор дешёвых и тяжёлых гейтов (tsc, npm test, npm run build, golden, смоки, backend pytest, инварианты модели, mutation-gate) — не прогонял ни один: диапазон дельты не содержит ни одной строки кода, теста или фикстуры, только абзац документации, а зелёный Validate на этом точном SHA уже подтверждён. Прогон был бы тратой бюджета без предмета — сама правка физически не может их затронуть.
  • Полное повторное чтение src/houseplan-editor-runtime.ts, wall-segment-model.ts/.py целиком — не требовалось: читал только два фрагмента, на которые ссылается исправленный абзац, чтобы сверить текст с кодом буквально; остальное унаследовано из r2 без изменений.

Находки

Нет.

Что проверено и корректно

  • Единственный Medium из r2 закрыт точно и без побочных эффектов: новый текст документа дословно соответствует коду обоих движков (TS и Python), которые сам код в этой дельте не менял.
  • Остальной текст абзаца «Ordinary wall chains — model v10 (#478)» не пострадал от правки и по-прежнему верен (сверено grep на слово «collision»/«fails closed» — расхождений нет).
  • Трейлеры коммита корректны, changelog не требуется по существу изменения.
  • dev не двигался, дельта локальна и мала — сокращённый разбор оправдан.

Итог

Ни одной находки любого уровня. Раунд закрывает единственный отложенный вопрос r2 (доку́мент ↔ код) и не вводит новых. Задача готова к очереди на пре-релиз.

Материал раунда

  • git diff 0c670a98..HEAD (дельта r2→r3, предмет разбора)
  • git diff origin/dev...HEAD (сверка, что dev не двигался — не как предмет полного разбора)
  • Issue #478 и все комментарии, включая тексты docs/reviews/CODE-REVIEW-478-r1.md (SHA b754d362) и docs/reviews/CODE-REVIEW-478-r2.md (SHA c9194bfb)
  • docs/specs/478-remove-room-drafts.md (не менялся с r1)
  • docs/CONFIG-COMPATIBILITY.md, docs/SCOPE.md, AGENTS.md, PROCESS.md
  • Ветка: issue/478-remove-room-drafts, коммит 4beb5c882907d17b63a1761e6040c84f17516d13
  • Дерево материала: 32e8c1d340a8f48bfeaf10952eed0192fcb2819a

Материал раунда

  • Ветка: issue/478-remove-room-drafts, коммит 4beb5c882907 — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
  • Дерево материала: 32e8c1d340a8f48bfeaf10952eed0192fcb2819a
    git log --all --format='%H %T' | grep 32e8c1d340a8
    
  • ТЗ docs/specs/478-remove-room-drafts.md, блоб 70719ed585a993825720f90a2483fa760747bb06
    git log --all --find-object=70719ed585a993825720f90a2483fa760747bb06 -- docs/specs/478-remove-room-drafts.md