12 KiB
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