# SPEC-REVIEW — issue #521 — заход r2 **Этап:** S4-spec-review (PROCESS.md §2.4) · **Трек:** полный (нарушен критерий §5 «нет влияния на производительность и на touch-контракт», названо самим автором в S2) · **Заход:** r2 (второй) · **Бюджет циклов:** 1/4 израсходовано до этого вердикта (r1 — жёлтый, потратил цикл 1; зелёный цикла не тратит, #227). ## Скоуп ревью Материал — тело issue #521, раздел `## ТЗ`, в редакции после комментария автора «Исправление по ревью ТЗ r1 → заход r2» (2026-09-10T18:52:31Z). Автор заявляет дельту r1→r2 как «один абзац рамки и один пункт рисков» — правку единственной находки r1 (Medium: «Продуктовая рамка» ссылалась на несуществующее описание в `docs/USER-GUIDE.ru.md`). Тема ТЗ (регресс направляющих выравнивания во всех трёх живых жестах редактора) и весь контракт/AC/откат/ release-артефакты не менялись. Разбор веду по §2.10: находка r1 проверяется на закрытие, AC/контракт наследуются без повторной проверки, поскольку дельта их не касается. Полный повторный разбор не требуется — дельта локальна (переписан один абзац одного раздела плюс добавлен один пункт риска), подсистема та же, контракт поведения не менялся. ## Как проверялось - прочитано текущее тело issue #521 целиком (`gh issue view 521 --json body`) и сверено с документом `docs/reviews/SPEC-REVIEW-521-r1.md` (вердикт, находка, материал раунда); - прочитаны все четыре комментария issue в хронологическом порядке (аналитика S2, «ТЗ готово — на ревью», вердикт r1, «Исправление по ревью ТЗ r1 → заход r2»), чтобы отличить объявленную дельту от подтверждённой чтением; - заявление автора «Контракт, AC1–AC9, откат и release-артефакты не тронуты» проверено не на слово: сопоставлены разделы «Контракт» (п.1–6), таблица AC1–AC9 и разделы «Откат»/«Release-артефакты» текущего тела с их описанием в документе r1 (конкретные ссылки на код, номера мутантов `align-point-reads-frozen-snapshot`, `live-editor-devices-drops-align-guides` и т.д., которые r1 разбирал построчно) — расхождений не найдено, дельта подтверждается содержанием, а не только словами автора; - заново прочитан переписанный абзац «Продуктовой рамки» и новый пункт «Долг документации» в «Рисках» — построчно, не по пересказу автора; каждая ссылка и утверждение в них перепроверены независимо (см. «Находки» и «Закрытие раунда r1»): - `grep -n -i "выравнив\|направляющ\|якор\|align" docs/USER-GUIDE.ru.md` — подтверждено, 0 совпадений на 2241 строку, ссылка на отсутствие описания в руководстве в новой редакции верна; - `_renderAlignGuides`, классы `.alignline`/`.aligndot`, `demo/smoke_align_guides.mjs`, #400, `c0d61ca3` — все существуют и соответствуют тому, что подтвердил r1 построчной сверкой с кодом на `dev`; здесь не перепроверялись заново (наследуются, см. ниже), новых ссылок на код в этом абзаце не добавлено; - `AGENTS.md` (репозиторий) — существует, строки 21–23 действительно формулируют «interface wording comes from there and is not invented»; ссылка на него в новой редакции точна; - `CLAUDE.md §4` — **проверено и не подтверждено**, см. находку ниже: `find . -iname "CLAUDE.md"`, `git log --all --diff-filter=A --name-only` и полнотекстовый `grep -rn "CLAUDE.md" --include="*.md" .` по всему дереву репозитория (включая всю историю веток) — файла нет и никогда не было, ни одна документация репозитория на него не ссылается; - этап spec: продуктовый код не менялся, гейты код-ревью (§8) здесь не применяются — не запускались, как и в r1. ## Закрытие раунда r1 | Находка r1 | Чем закрыта | Где это видно | |---|---|---| | Medium: «Продуктовая рамка» утверждала, что восстанавливаемое поведение «описано в `docs/USER-GUIDE.ru.md» — полнотекстовый поиск даёт 0 совпадений, факт не подтверждён | Абзац переписан: источник поведения назван явно — код и тесты (`_renderAlignGuides`, `.alignline`/`.aligndot`, смок, #400, диагностика `c0d61ca3`); отсутствие описания в руководстве названо прямо и помечено как «долг документации», а не выдано за факт задокументированного поведения | Тело issue #521, `## ТЗ` → «Продуктовая рамка», абзац, начинающийся «Ничего нового не появляется. Восстанавливаемое поведение зафиксировано **в коде и тестах, а не в документации пользователя**…»; тот же факт продублирован новым пунктом «Долг документации» в разделе «Риски» | Находка закрыта по существу — старой ложной ссылки на `docs/USER-GUIDE.ru.md` как источник поведения в тексте больше нет, а сам факт (поведение задокументировано только в коде/тестах, не в пользовательском руководстве) подтверждается независимо. Но правка ввела новую ссылку того же типа — утверждение о существовании документа, которого нет (см. находку ниже): устранение находки r1 механически корректно, содержательно — нет, потому что на её месте появился новый экземпляр той же категории дефекта. ## Унаследовано из r1 Без повторной проверки в этом раунде приняты выводы `docs/reviews/SPEC-REVIEW-521-r1.md` (материал того раунда: `dev`, коммит `c50bc725c895`; тело issue — sha256 `bf26b17118240771206ed2a7f26f10c82783ea586679def63cbc17e538c38cfe`), поскольку дельта r2 их не задевает: - диагноз и причинность регресса (два независимых слома от `c0d61ca3`/#451) — подтверждены r1 построчно по коду на `dev`; - контракт п.1–6 — технически осуществим, ссылки на `_renderAlignGuides()`, `_livePos`, `scheduleHouseplanEditor`, `makeTransparent` точны; - таблица AC1–AC9 «AC · чем доказан · чем краснеет» — заполнена без пустых ячеек, каждый пункт однозначен и называет способ доказательства и мутацию; проверено r1, что ссылки на существующие мутанты/сценарии (#400, `noneInView`) реальны, а не выдуманы; - откат — один revert, не касается данных/конфига/публичных контрактов; - release-артефакты — тексты обоих changelog названы дословно, `User-Visible: yes`; - перф и touch — риски названы явно, соответствуют требованию DoR при нарушенном критерии `small`; - объём задачи (все три жеста в одной issue) — продуктовый вопрос уже задан автором владельцу в установленной форме (что неясно · дефолт · приглашение возразить), повторный запрос от ревьюера был бы дублированием. Технические разделы «Что не проверял» из r1 (не запускались гейты код-ревью; не оценивалась реализуемость подавления `.hp-editor-only-layer`; не оценивался бюджет тестового счётчика осевых циклов) остаются в силе тем же образом — это предмет код-ревью, а не этого раунда. ## Находки ### Medium — новая ссылка на несуществующий документ в том же абзаце, который правил находку r1 **Файл:** тело issue #521, раздел `## ТЗ` → `### Продуктовая рамка` (правка r1→r2). **Формулировка.** Переписанный абзац заканчивается: «у поведения нет принятого владельцем названия в интерфейсной терминологии, а изобретать его в обход `docs/USER-GUIDE.ru.md` запрещено (`AGENTS.md`, CLAUDE.md §4)». Файла `CLAUDE.md` в репозитории нет — ни сейчас, ни когда-либо в истории: ``` find . -iname "CLAUDE.md" → пусто git log --all --diff-filter=A --name-only | grep -i "^CLAUDE.md$" → пусто grep -rn "CLAUDE.md" --include="*.md" . → пусто (кроме этого ТЗ) ``` Ни один канонический документ проекта (`AGENTS.md`, `PROCESS.md`, `docs/SCOPE.md`) не упоминает `CLAUDE.md` и не ссылается на него как на источник правил. «§4» этого документа — ссылка на несуществующий раздел несуществующего файла. **Почему это находка, а не мелочь.** Это ровно тот же класс дефекта, что и закрытая находка r1: утверждение о существовании нормативного документа, поданное как факт без пометки «предположение», не подтверждаемое ничем в репозитории. Разница лишь в том, что здесь дефект попал в текст **той самой правки**, которая закрывала предыдущий экземпляр того же дефекта — то есть причина находки r1 (ссылка бралась «из привычки», по словам автора, без проверки) не устранена как практика, только конкретное ложное утверждение заменено на другое. `AGENTS.md` (единственный существующий из двух названных источников) действительно требует того же самого по существу — запрет изобретать интерфейсную терминологию в обход `docs/USER-GUIDE.ru.md` — поэтому нормативная опора у фразы есть, но она наполовину состоит из выдуманной ссылки. **Не блокирует контракт.** Как и в r1, AC1–AC9 не опираются на эту фразу: она живёт исключительно в продуктовой рамке, поясняющей, почему долг документации не закрывается в этой задаче. Технической правки контракта или AC не требует. **Чем закрывается.** Убрать `CLAUDE.md §4` из скобок, оставив `AGENTS.md` (единственная реально существующая и подходящая по содержанию ссылка), либо дать точную ссылку на реальный раздел, если автор имел в виду что-то другое. ## Что проверено и признано корректным - **Дельта соответствует заявленной.** Сравнение текущего тела с описанием находки r1 и с комментарием автора «Исправление по ревью ТЗ r1 → заход r2» подтверждает: правка ограничена абзацем «Продуктовой рамки» и одним новым пунктом «Долг документации» в «Рисках»; контракт, AC1–AC9, откат и release-артефакты текстуально не менялись (сверено построчно, не на слово автора). - **Факт отсутствия описания направляющих в `docs/USER-GUIDE.ru.md`** — переподтверждён самостоятельным `grep`, не только цитатой из r1: 0 совпадений на `выравнив|направляющ|якор|align` в 2241 строке. - **Ссылка на `AGENTS.md` в новом абзаце** — точна: строки 21–23 файла действительно формулируют требование не изобретать интерфейсную терминологию в обход `docs/USER-GUIDE.ru.md`. - **Новый пункт «Долг документации» в «Рисках»** — не блокирует задачу, корректно описывает открытый вопрос (терминологию называет владелец) и не расширяет скоуп задачи. ## Чего не проверял - Не перепроверял построчно код (`_renderAlignGuides`, `_alignPoint`, `live-editor.ts`, `houseplan-editor-runtime.ts`) — дельта r2 его не касается, вывод r1 наследуется (см. «Унаследовано из r1»). - Не запускал `tsc`/`test`/`build`/смоки — этап spec-review, продуктового кода ещё нет, гейты §8 к этому этапу не относятся. - Не связывался с владельцем по вопросу объёма задачи (три жеста в одной issue) — вопрос уже задан автором в установленной форме в r1, статус не изменился. - Не проверял технические AC-детали, не задетые дельтой (счётчик осевых циклов, бюджет `test/**`/`demo/**`) — они остаются предметом код-ревью, как и было записано в r1. ## Вердикт Единственная находка — Medium, в скоупе задачи (текстовая правка одной вставки в теле ТЗ, без изменения контракта/AC), High нет. По PROCESS.md §2.4/§2.10/§4 это жёлтый вердикт: автор правит ТЗ, фикс проходит следующий заход ревью по дельте. Вердикт: жёлтый · заход r2 · блокирующих циклов 2/4 · High: 0 · Medium: 1 → в задаче --- ## Материал раунда - Ветка: `dev`, коммит `9592092b8eb9` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. - Дерево материала: `01299fe4f0fe65c68b865d475932bf811e60d9ac` ``` git log --all --format='%H %T' | grep 01299fe4f0fe ``` - Тело issue: `ecdf5deb2acf08068eeb2f5e74e98a262d18f2011f4e26c672428abd72123093` - Вердикт конвейера: `yellow` · High 0