mirror of
https://github.com/Matysh/houseplan-card
synced 2026-10-02 12:49:56 +00:00
146 lines
12 KiB
Markdown
146 lines
12 KiB
Markdown
# 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
|
||
```
|