mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-29 03:09:36 +00:00
docs: review document for #478
Проверка (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
Проверка (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
Issue: #478 User-Visible: no
This commit is contained in:
@@ -0,0 +1,146 @@
|
||||
# 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`
|
||||
|
||||
---
|
||||
|
||||
<!-- material-anchors: сгенерировано конвейером (#414) -->
|
||||
|
||||
## Материал раунда
|
||||
|
||||
- Ветка: `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
|
||||
```
|
||||
Reference in New Issue
Block a user