Files
houseplan-card/docs/reviews/SPEC-REVIEW-288-r2.md
T
2026-08-24 15:56:48 +03:00

146 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SPEC-REVIEW-288-r2
- **Issue:** https://github.com/Matysh/houseplan-card/issues/288
- **Этап:** spec (PROCESS.md §2.4)
- **Заход:** r2 · блокирующих циклов израсходовано 1 из 4 (r1 был жёлтым и
потратил 1 цикл; зелёный вердикт цикла не образует, #227)
- **Документ ТЗ:** `docs/specs/288-bounded-multiwall-corridor.md`
- **SHA r1 (найден в документе r1, не в комментарии-вердикте):**
`cb0f9e7351e919701666dfd05b53f0e218e672a5`
- **SHA r2 (текущий HEAD, дельта этого раунда):**
`fba615e9f6ec8841c6e6e0f9a7cc5fe0d1fc7c25`
- **Разбор — по дельте** (PROCESS.md §2.10): единственный коммит между SHA r1
и HEAD — `fba615e9 docs: add risks and rollback to junction spec`
(`docs/specs/288-bounded-multiwall-corridor.md`, +21/-4 строк). Дельта
локальна: только текст, только два новых раздела плюс одна строка в шапке;
не задета ни одна формулировка сценария, контракта, scope или AC. Условия
«разбор остаётся полным» (ребейз на ушедший вперёд `dev`, смена контракта
поведения, новая подсистема, объём дельты сопоставим с исходной задачей) не
выполнено ни одно — исходное ТЗ 208 строк, дельта 25 строк правки двух
разделов. Полный повторный разбор не требуется.
## Дельта (что менялось)
```
git diff cb0f9e73..fba615e9 -- docs/specs/288-bounded-multiwall-corridor.md
```
- добавлен раздел «7. Риски и меры» (3 пункта: регрессия семи прежних
junction-контрактов → мера AC4/оба плана/golden; над-/недосечение соседней
стены → мера AC3/AC5/AC7; расхождение polygon между Plan/View/Static/Iso →
мера AC5 + запрет consumer-specific post-fix);
- добавлен раздел «8. Откат» (один абзац: чистый revert, флаг/миграция не
нужны, т.к. persisted model не меняется);
- последующие разделы («Ожидаемые файлы», «Release…», «Принятые технические
предположения») перенумерованы 7→9, 8→10, 9→11 без потери и без дублей
(проверено `grep -n "^## "` по всему файлу — последовательность 1…11 без
пропусков);
- в шапку «Связано» добавлен `#279`.
Коммит несёт корректные трейлеры: `Issue: #288`, `User-Visible: no` (класс C,
поведение не меняется).
## Закрытие раунда r1
| Находка r1 | Чем закрыта | Где это видно |
|---|---|---|
| **M1** (Medium, в скоупе) — отсутствуют обязательные разделы «Риски» и «Откат» (§7.1, DoR §2.5) | Добавлены разделы «7. Риски и меры» (3 пункта с мерами, привязанными к AC3/AC4/AC5/AC7) и «8. Откат» (чистый revert, без флага/миграции) | `docs/specs/288-bounded-multiwall-corridor.md:170-185`, коммит `fba615e9` |
| **L1** (Low) — «Связано» не включает #279, хотя AC4 на него ссылается | `#279` добавлен в строку «Связано» | `docs/specs/288-bounded-multiwall-corridor.md:11`, коммит `fba615e9` |
Оба пункта закрыты содержательно, а не формальным упоминанием слова: риск 1
прямо называет затронутый общий код (`bevelMultiWallBody`) и все семь прежних
контрактов по номерам, риск 2 и 3 — конкретные меры отказа (перекрытие,
недосечение, рассинхронизация consumers) с привязкой к конкретным AC, а не
общими словами. Формулировки рисков корректно хеджированы («может вернуть»,
«может разойтись») — это анализ риска, а не факт о поведении, выданный без
основания. Откат сформулирован как утверждение и совпадает с уже
зафиксированным в шапке фактом «persisted model не меняется» — не новое
недоказанное утверждение, а следствие уже принятого в r1 факта.
## Унаследовано из r1
Всё, что не затронуто дельтой, принимается без повторной проверки по
документу `docs/reviews/SPEC-REVIEW-288-r1.md` (SHA `cb0f9e7351e919701666dfd05b53f0e218e672a5`):
- диагноз причины (узел `577,299`, лучи `349/120/5` шагов, толщины `30/30/30`
см, соседняя стена `20` см, радиус `4×15=60`, вырез `60−15=45`) — сверен
ревьюером r1 с телом issue буквально;
- существование и корректность использования идентификаторов контракта
(`MITRE_LIMIT`, `MultiWallNodeRay.supports`/`halfDepth`) в
`src/wall-thickness.ts` — проверено чтением кода в r1, дельта этого файла
не касается;
- привязка AC1/AC2 к существующему `demo/smoke_real_plan_masonry.mjs` и
корректность его логики подсчёта разрывов — не менялась;
- table-driven конструкция AC3 как независимая от AC1 unit-гарантия — текст
AC3 не тронут дельтой;
- список регрессионных контрактов AC4 (#249/#261/#271/#272/#275/#278/#279),
сверенный с `docs/WALL-THICKNESS.md`, — текст AC4 не тронут; #279 добавлен
только в шапку «Связано», в самом AC4 он уже присутствовал в r1;
сверено `git diff cb0f9e73..HEAD -- docs/specs/288-bounded-multiwall-corridor.md`
— раздел AC (строки 98–156 текущего файла) в дельте не участвует;
мутационное требование AC7 — не менялось;
- корректность Scope/«Не входит» (исключение #289/#290 и глобальных
констант) — не менялось;
«Принятые технические предположения» — не менялись по содержанию, только
перенумерованы (9→11);
- отсутствие продуктовых вопросов, требующих участия владельца, — не
менялось; новый текст рисков и отката тоже не содержит продуктовой
развилки, ниже проверено отдельно.
- совместимость/touch/performance (раздел 6) — не менялась.
## Что проверено заново в этом раунде
- Полный просмотр итогового файла (`docs/specs/288-bounded-multiwall-corridor.md`,
226 строк) для проверки целостности нумерации разделов и отсутствия висячих
перекрёстных ссылок на старые номера — ссылок по номеру раздела в тексте
документа нет вообще (`grep -n "раздел\|§[0-9]"` — 0 совпадений), поэтому
перенумерация 7→9/8→10/9→11 безопасна.
- Содержательность нового раздела «Риски и меры»: каждый из трёх пунктов
называет конкретный failure mode и конкретную меру, привязанную к
проверяемому AC, а не общую фразу «будем осторожны». Прецедентная сверка
формы с `docs/specs/275-multiwall-strip-containment.md` и
`docs/specs/278-wall-union-isolation.md` (использовались как эталон в r1)
показывает сопоставимую структуру: конкретный риск → конкретная мера.
- Раздел «Откат»: соответствует требованию DoR §2.5 «откат: как выключить
или вернуть назад» — здесь ответ «чистый revert» обоснован отсутствием
изменений модели данных, что само по себе уже было зафиксировано в шапке
ТЗ («Модель данных: schema, config, layout и Optimize не меняются») и в
r1 это не оспаривалось.
- Продуктовая рамка не пересматривалась целиком (не требуется по §2.10, дельта
не продуктовая), но точечно проверено: новые два раздела не вводят решения,
которое следовало бы адресовать владельцу (нет пограничного случая, нет
конфликта персон, нет вопроса об объёме видимых изменений) — оба раздела
чисто технические, что соответствует их месту в документе (после AC,
до release-раздела).
- Трейлеры коммита `fba615e9`: `Issue: #288`, `User-Visible: no` — корректно
для документации класса C без изменения поведения.
## Гейты
Этап — spec, продуктовый код не менялся (diff ограничен `docs/specs/288-*.md`,
класс C). Как и в r1, гейты §8 (`typecheck`/`test`/`build`/`check-docs`/
smoke/invariants/golden) к этапу spec-review не относятся и не запускались —
это гейты этапа code-review (§2.7), где эта задача окажется позже. Дельта
этого раунда тем более не продуктовая (только текст ТЗ), так что необходимость
их прогона не возникла и по факту дельты.
## Находки
Нет. High: 0, Medium: 0, Low: 0. Обе находки r1 закрыты содержательно (см.
таблицу выше), новых находок дельта не порождает.
## Чего не проверял
- Повторно не проверял идентичность кода `src/wall-thickness.ts` контракту
§3.1 — код не менялся с r1, наследуется.
- Не запускал `demo/smoke_real_plan_masonry.mjs` и `npm run invariants` —
реализации ещё нет, как и в r1; вопрос сохраняется до code-review.
- Не проверял golden baseline — как и в r1, AC6 описывает будущую работу.
## Вердикт
```
Вердикт: зелёный · заход r2 · блокирующих циклов 1/4 · High: 0 · Medium: 0
Документ: docs/reviews/SPEC-REVIEW-288-r2.md
```