15 KiB
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 нет. Циклы ревью для этой задачи исчерпывать не нужно — документ готов к переходу на следующий этап.