Files
houseplan-card/docs/reviews/SPEC-REVIEW-329-r3.md
T
2026-08-27 23:29:49 +03:00

164 lines
15 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-329-r3
Issue: #329 · Этап: spec (S4-spec-review) · Заход: r3 · Трек: обычный ·
Блокирующих циклов израсходовано до этого раунда: 2/4
ТЗ: `docs/specs/329-junction-limits.md`. Ревизия под ревью — коммит
`1d2748d64bf2eafbcc8aade31652e226edf0e14a` («docs: spec #329 revision 3 —
AC7 proves the per-surface refusal channels»), базовый SHA раунда r2 —
`783c04d1813b0b201efb21b8bae1b0c497978cf1`. Класс C (`docs/specs/**`),
продуктовый код не тронут — `git show --stat 1d2748d6` подтверждает
единственный изменённый файл.
## Скоуп ревью (по дельте, PROCESS.md §2.9)
Раунд не первый. Предыдущий вердикт — жёлтый, r2, найден в комментарии
issue `claude[bot]` от 2026-08-27, зафиксирован на SHA `783c04d1`
(назван в шапке `docs/reviews/SPEC-REVIEW-329-r2.md`, committed at
`87792f4b`). Автор объявил делту в комментарии от 2026-08-27: «Ревизия 3
(1d2748d6): r2-M1 — AC7 разделён на AC7a (Resize: упор/приглушённая
ручка, объяснение называет правило, тост исключён, смок проверяет текст)
и AC7b («Толщина»: значение не применяется, тост с названием правила по
образцу #313, смок проверяет текст); §6 план тестов пополнен смоками
каналов отказа».
Дельта — `git diff 783c04d1..1d2748d6 -- docs/specs/329-junction-limits.md`:
16 строк (12 добавлено, 4 удалено) внутри одного файла, три места:
строка статуса в шапке (косметика — счётчик ревизии), одна строка в §6
(план тестов), блок AC7 → AC7a/AC7b в §8. Остальной документ (§1, §2,
§3, §4, §5, §7, AC1–AC6, AC8–AC10, §9, §10, §11) байт-не тронут диффом.
Делта локальна: не ребейз, не смена контракта поведения продукта (AC7a/b
дословно переносят уже принятый в r2 нормативный текст §2 в проверяемую
форму, новых решений не вводят), не задета новая подсистема, объём
сопоставим с точечной правкой одной находки. Полный разбор документа не
требуется — разбираю делту плюс то, до чего она логически дотягивается
(соответствие AC7a/b тексту §2 и адекватность как замены единственной
оставшейся находки r2).
## Как проверялось
- Прочитан диф `git diff 783c04d1..1d2748d6` построчно — сверен с
требованием r2-M1 дословно (AC должен доказывать специфику §2: текст
объяснения ручки Resize называет правило и не сопровождается тостом;
трей «Толщины» показывает тост с названием правила).
- Перечитано §2 (не тронуто диффом, но AC7a/b должны ему соответствовать)
— сверка терминов: «упирается в последнюю допустимую позицию»,
«приглушена», «объяснение по hover/focus/нажатию называет нарушенное
правило», «тост не используется» (Resize); «отказ значением в трее...
тостом с названием правила (П3/П5)» («Толщина») — формулировки AC7a/b
переносят эти фразы почти дословно, новых утверждений о поведении не
вводят.
- Перечитан обновлённый фрагмент §6 — новая строка называет ровно то, что
r2-M1 отметил отсутствующим («§6 тоже не называет конкретный тест на
текст ручки/тоста»): «смоки каналов отказа: текст объяснения ручки
Resize и текст тоста «Толщины» (AC7a/AC7b)».
- Перечитаны AC5a/AC5b (§8, не тронуты диффом r2→r3) как образец, по
аналогии с которым r2-M1 просил построить AC7a/AC7b — форма совпадает:
тот же паттерн «подпункт на surface + явный способ доказательства
(смок) + пункт в §6».
- `git show --stat 1d2748d6` — подтверждено, что кроме
`docs/specs/329-junction-limits.md` ничего не менялось: гейты кода
(`tsc`/`test`/`build`/`check-docs`/инварианты/смоки) не относятся к
чисто документационной ревизии на этапе spec, не прогонял — так же,
как в r1/r2.
- Проверено, что AC7a покрывает все пять правил П1–П5 (текст: «Resize,
приводящий к нарушению любого из П1–П5»), а AC7b — ровно П3/П5, что
совпадает с §2 («толщина участвует в П3/П5») и не расширяет и не
сужает область правил произвольно.
- Проверено отсутствие противоречий между новой формулировкой AC7a/b и
§9 («принято предположительно») — AC7a/b не вводят новых допущений,
которые требовалось бы туда добавить: канал уже был нормативным
решением §2 в r2, здесь только достроена проверяемость.
## Закрытие раунда r2
| Находка r2 | Чем закрыта | Где это видно |
|---|---|---|
| **r2-M1** — AC7 не обновлён вместе с §2 и не проверяет заявленный канал отказа (текст объяснения ручки Resize называет правило и не сопровождается тостом; трей «Толщины» показывает тост с названием правила); §6 тоже не называет такой тест | AC7 разделён на AC7a (Resize: упор в последнюю допустимую позицию, приглушённая ручка, объяснение по hover/focus/нажатию называет нарушенное правило, тост явно исключён — «тост не показывается», план байт-неизменен, способ доказательства — смок, который «проверяет и байт-неизменность, и текст объяснения ручки») и AC7b («Толщина»: значение не применяется, тост с названием правила П3/П5 по образцу #313, план байт-неизменен, «смок проверяет текст тоста»). §6 дополнен строкой «смоки каналов отказа: текст объяснения ручки Resize и текст тоста «Толщины» (AC7a/AC7b)» | `docs/specs/329-junction-limits.md` §8, AC7a/AC7b; §6, добавленная строка (см. diff `783c04d1..1d2748d6`) |
Находка закрыта по существу: формулировки AC7a/AC7b дословно связывают
проверку с конкретными фразами §2 (channel per surface), а не
переформулируют проблему уклончиво. Гранулярность совпадает с тем, что
запрашивал r2-M1 («текст hover/focus/click называет нарушенное правило»,
«трей показывает отказ значения с тостом, называющим правило») — без
избыточной детализации (не требуется отдельный AC на каждое из пяти
правил П1–П5 для Resize; r2-M1 такой детализации и не просил).
## Унаследовано из r2
Не проверялось заново — делта r2→r3 (`git diff 783c04d1..1d2748d6`) эти
разделы байт-не тронула, и ни одно новое r3-наблюдение до них логически
не дотягивается:
- Продуктовая рамка (`docs/SCOPE.md`, соответствие J6/J1/J5/J7) —
принято без повторной проверки (унаследовано ещё из r1 через r2).
- §1 (сценарий), §4 (рендер легаси-острия, ссылки на #309/#310), §5
(бэкенд, прецедент `invalid_partition_opening_jamb_margin`) — принято
без повторной проверки.
- §2 (нормативные ограничения, каналы отказа по поверхностям) — сама
делта r3 её не меняла; закрытие M1 r1 и подтверждение прецедента
#313 (коммит `5e5dad27`) остаются в силе из r2. AC7a/b в этом раунде
сверены с текстом §2 на предмет соответствия (см. «Как проверялось»),
но сам текст §2 повторно на корректность не проверялся.
- §3 (граница применения), §7 (производительность/touch) — принято без
повторной проверки.
- AC1–AC4, AC5a/AC5b, AC6, AC8–AC10 — формулировки не менялись диффом
r2→r3, границы и способ доказательства уже проверены в r1/r2 (AC5b —
с независимым пересчётом математики в r2) — принято без повторной
проверки.
- §9 («принято предположительно»), §10 (риски), §11 (откат) — не
менялись, принято без повторной проверки.
- Обязательные разделы §7.1 присутствуют по содержанию, артефакт
корректного класса (полноценный файл ТЗ, issue не помечен `small` —
перепроверено меткой issue в этом раунде, см. ниже) — принято без
повторной проверки структуры документа в остальном.
- Пять численных ограничений П1–П5 совпадают с решением владельца в
чате issue дословно (проверено в r1) — делта r2→r3 их не касалась.
Источник: `docs/reviews/SPEC-REVIEW-329-r2.md` (committed at
`87792f4bc33b96da0db29954dca0f99585993f82`), вывод получен на SHA
`783c04d1813b0b201efb21b8bae1b0c497978cf1`.
## Что проверено и корректно (делта r3)
- r2-M1 закрыт по существу: AC7a/AC7b проверяемо доказывают ровно те
специфичные утверждения §2, которые в r2 были нормативным текстом без
привязанного AC (текст ручки Resize называет правило и не
сопровождается тостом; трей «Толщины» показывает тост с названием
правила П3/П5).
- §6 (план тестов) больше не расходится с §8: строка про смоки каналов
отказа явно ссылается на AC7a/AC7b.
- AC7a/b не вводят новых продуктовых решений и не расширяют скоуп —
это перенос уже принятого в r2 нормативного текста §2 в форму
acceptance criteria, дословно, без новых чисел/условий.
- Метка issue перепроверена (`gh issue view 329 --json labels`): `bug`,
`P2`, `S4-spec-review` — не `small`, что подтверждает необходимость
полноценного файла ТЗ (уже установлено в r1, здесь просто
перепроверено, так как метки могли измениться за три раунда).
- `git show --stat` подтверждает единственный изменённый файл — класс C,
гейты кода не применимы.
## Чего не проверял
- Весь материал, перечисленный в разделе «Унаследовано из r2» — делта
его не касается (см. обоснование там же), включая сам текст §2,
который в этом раунде не менялся.
- Код не менялся в этом коммите (только `docs/specs/**`, класс C) —
гейты `typecheck`/`test`/`build`/`check-docs`/инварианты
модели/смоки не прогонял: они не относятся к чисто документационной
правке на этапе spec-review.
- Не проверял, как именно разработчик реализует текст ручки/тоста и сам
смок AC7a/AC7b — это предмет код-ревью; здесь оценивается только то,
что критерий теперь проверяем и не расходится с §2.
- Не запрашивал у владельца дополнительных продуктовых уточнений — вся
делта r3 технического характера (согласованность AC с уже принятым в
r2 продуктовым решением), новых продуктовых вопросов не возникло.
## Вердикт
Зелёный. Единственная находка r2 (r2-M1, Medium) закрыта по существу и
не переоткрывается; новых находок в делте r3 нет. Циклы ревью для этой
задачи исчерпывать не нужно — документ готов к переходу на следующий
этап.