Files
houseplan-card/docs/reviews/SPEC-REVIEW-521-r3.md
T
2026-09-10 19:05:32 +00:00

16 KiB

SPEC-REVIEW — issue #521 — заход r3

Этап: S4-spec-review (PROCESS.md §2.4) · Трек: полный (нарушен критерий §5 «нет влияния на производительность и на touch-контракт», названо самим автором в S2) · Заход: r3 (третий) · Бюджет циклов: 2/4 израсходовано до этого вердикта (r1 — жёлтый, цикл 1; r2 — жёлтый, цикл 2; зелёный вердикт цикла не образует и бюджет не тратит, #227).

Скоуп ревью

Материал — тело issue #521, раздел ## ТЗ, в редакции после комментария автора «Исправление по ревью ТЗ r2 → заход r3» (2026-09-10T19:01:46Z). Автор заявляет дельту r2→r3 как «одни скобки в „Продуктовой рамке“» — правку единственной находки r2 (Medium: ссылка на несуществующий CLAUDE.md §4). Контракт, AC1–AC9, риски, откат и release-артефакты, по заявлению автора, не менялись.

Дельта локальна: не ребейз (see below), не смена контракта поведения, не новая подсистема, объём несопоставим с исходной задачей — единственная правка одного вложенного уточнения в одном абзаце. По §2.10 разбор веду по дельте: находка r2 проверяется на закрытие, всё остальное наследуется из r1 и r2 без повторной проверки.

Как проверялось

  • прочитано текущее тело issue #521 целиком (gh issue view 521 --json body) и построчно сверено с абзацем «Продуктовой рамки», как он цитируется в docs/reviews/SPEC-REVIEW-521-r2.md (находка и «Чем закрывается»);
  • прочитаны все шесть комментариев issue в хронологическом порядке (аналитика S2, «ТЗ готово», вердикт r1, «Исправление r1→r2», вердикт r2, «Исправление r2→r3»), чтобы отличить объявленную дельту от подтверждённой чтением;
  • заявление автора «Контракт, AC1–AC9, откат и release-артефакты не тронуты» проверено не на слово: текущий текст разделов «Контракт» (п.1–6), таблицы AC1–AC9, «Риски», «Откат», «Release-артефакты» побайтово совпадает по содержанию с тем, что цитируют/описывают документы r1 и r2 — расхождений, кроме заявленной правки, не найдено;
  • сама правка проверена буквально:
    • текущий текст абзаца: «…изобретать формулировки в обход руководства запрещает AGENTS.md («interface wording comes from there and is not invented»)» — ссылки на CLAUDE.md в теле issue больше нет;
    • grep -rn "CLAUDE.md" --include="*.md" . по всему репозиторию (включая docs/reviews/*, где сама фраза цитируется как история находки) — единственные совпадения лежат в архивных документах SPEC-REVIEW-521-r2.md, описывающих прошлую находку, в актуальном тексте ТЗ (теле issue) — ноль совпадений;
    • find . -iname "CLAUDE.md" и git log --all --diff-filter=A --name-only | grep -i "^CLAUDE.md$" — пусто, файла в репозитории нет и не было; переисполнено самостоятельно, не принято на слово автора или r2;
    • AGENTS.md:21-23 — существует, дословно: «For work that changes visible behaviour, also read docs/USER-GUIDE.ru.md — interface wording comes from there and is not invented, or the UI starts speaking developer.» — единственная оставшаяся ссылка точна;
    • docs/USER-GUIDE.ru.md, 2241 строка, grep -n -i "выравнив|направляющ|якор|align" — ноль совпадений, факт «долг документации» в абзаце по-прежнему подтверждён независимо, а не только предыдущими раундами;
  • проверено, что материал не ребейзнут: git merge-base --is-ancestor 9592092b 548e7a85 → true, git log --oneline 9592092b..548e7a85 содержит ровно один коммит — публикацию документа `SPEC-REVIEW-521-r2.md» самим конвейером (0 изменений кода). Это подтверждает, что между r2 и r3 в ветку не прилетело ничего постороннего — этап spec, продуктового кода в диапазоне нет вовсе;
  • этап spec: продуктовый код не менялся, гейты код-ревью (§8) здесь не применяются — не запускались, как и в r1/r2.

Закрытие раунда r2

Находка r2 Чем закрыта Где это видно
Medium: абзац «Продуктовой рамки» ссылался на несуществующий документ CLAUDE.md §4 — файла нет и никогда не было в репозитории Ссылка убрана целиком; в скобках осталась только AGENTS.md с точной цитатой требования Тело issue #521, ## ТЗ → «Продуктовая рамка»: «…изобретать формулировки в обход руководства запрещает AGENTS.md («interface wording comes from there and is not invented»)» — CLAUDE.md в тексте больше не упоминается; подтверждено grep -rn "CLAUDE.md" --include="*.md" . (ноль совпадений в теле issue)

Находка закрыта по существу, а не только формально: ложная ссылка убрана полностью, а не заменена другой недоказанной. Автор дополнительно объяснил происхождение ошибки (смешение репозиторного контекста с внерепозиторным рабочим файлом CLAUDE.md в папке владельца) и зафиксировал правило на будущее («впредь в ТЗ и ревью ссылаюсь только на то, что лежит в репозитории») — это не предмет проверки ревью (комментарий, не текст ТЗ), но показывает, что механизм ошибки не повторится тем же способом в этой задаче.

Унаследовано из r1 и r2

Без повторной проверки в этом раунде приняты выводы docs/reviews/SPEC-REVIEW-521-r1.md (материал: dev, коммит c50bc725c895; тело issue sha256 bf26b17118240771206ed2a7f26f10c82783ea586679def63cbc17e538c38cfe) и docs/reviews/SPEC-REVIEW-521-r2.md (материал: dev, коммит 9592092b8eb9; тело issue sha256 ecdf5deb2acf08068eeb2f5e74e98a262d18f2011f4e26c672428abd72123093), поскольку дельта r3 их не задевает:

  • диагноз и причинность регресса (два независимых слома от c0d61ca3/#451, подтверждённых на всех трёх жестах) — проверены r1 построчно по коду на dev;
  • контракт п.1–6 — технически осуществим, ссылки на _renderAlignGuides(), _livePos, scheduleHouseplanEditor, makeTransparent точны (r1);
  • таблица AC1–AC9 «AC · чем доказан · чем краснеет» — заполнена без пустых ячеек, каждый пункт однозначен и называет способ доказательства и мутацию; ссылки на существующие мутанты/сценарии (#400, noneInView) реальны, не выдуманы (r1);
  • требование «смок обязан покраснеть на текущем dev до правки» — часть AC1–AC6, проверено r1 как условие приёмки, а не пожелание;
  • откат — один revert, не касается данных/конфига/публичных контрактов (r1);
  • release-артефакты — тексты обоих changelog названы дословно, User-Visible: yes (r1);
  • перф и touch — риски названы явно, соответствуют требованию DoR при нарушенном критерии small (r1);
  • объём задачи (все три жеста в одной issue) — продуктовый вопрос уже задан автором владельцу в установленной форме (что неясно · дефолт · приглашение возразить), повторный запрос от ревьюера был бы дублированием (r1);
  • факт отсутствия описания направляющих в docs/USER-GUIDE.ru.md — переподтверждён в r2 самостоятельным grep, и в этом раунде ещё раз (см. «Как проверялось») — воспроизводится стабильно на неизменном файле.

Технические разделы «Что не проверял» из r1/r2 (не запускались гейты код-ревью; не оценивалась реализуемость подавления .hp-editor-only-layer для режимов devices/decor; не оценивался бюджет тестового счётчика осевых циклов) остаются в силе тем же образом — это предмет код-ревью, а не этого этапа.

Находки

Новых находок нет. Единственная находка r2 закрыта без появления нового экземпляра того же или другого класса дефекта — весь текст новой правки (удаление трёх слов и пары скобок) проверен построчно, ничего не добавлено.

Что проверено и признано корректным

  • Дельта соответствует заявленной. Сравнение текущего тела с описанием находки r2 и с комментарием автора «Исправление по ревью ТЗ r2 → заход r3» подтверждает: правка ограничена одной вложенной ссылкой в абзаце «Продуктовой рамки»; контракт, AC1–AC9, риски, откат и release-артефакты текстуально не менялись (сверено построчно, не на слово автора).
  • Единственная оставшаяся нормативная ссылка (AGENTS.md) точна и существует. Цитата дословна, строки 21–23 файла её подтверждают.
  • Материал не ребейзнут между r2 и r3 — единственный коммит в диапазоне публикует документ предыдущего раунда, кода не касается.
  • Абзац «Продуктовой рамки» теперь не содержит ни одного непроверяемого утверждения о внешнем документе: источник поведения — код и тесты, названные явно и существующие; отсутствие описания в пользовательском руководстве названо прямо как открытый долг, а не как факт задокументированного поведения.

Чего не проверял

  • Не перепроверял построчно код (_renderAlignGuides, _alignPoint, live-editor.ts, houseplan-editor-runtime.ts) — дельта r3 его не касается, вывод r1 наследуется без повторной проверки.
  • Не запускал tsc/test/build/смоки — этап spec-review, продуктового кода ещё нет, гейты §8 к этому этапу не относятся.
  • Не связывался с владельцем по вопросу объёма задачи (три жеста в одной issue) — вопрос уже задан автором в установленной форме в r1, статус не изменился.
  • Не проверял технические AC-детали, не задетые дельтой (счётчик осевых циклов, бюджет test/**/demo/**, реализуемость подавления .hp-editor-only-layer для devices/decor) — они остаются предметом код-ревью, как и было записано в r1/r2.

Вердикт

Находка r2 закрыта по существу, новых находок нет, High нет, Medium в скоупе — 0 незакрытых. ТЗ готово к разработке: полная цепочка §7.1 (сценарий, что человек увидит, проблема, скоуп/не-скоуп, контракт, AC1–AC9 с доказательством, откат, release-артефакты) заполнена и не содержит непроверяемых или недоказанных утверждений.

Вердикт: зелёный · заход r3 · блокирующих циклов 2/4 · High: 0 · Medium: 0 → в задаче


Материал раунда

  • Ветка: dev, коммит 548e7a8563d6ad523b0b715d08cd6bdda34948ad.
  • Тело issue проверено по gh issue view 521 --json body на момент разбора; дельта r2→r3 — удаление ссылки на CLAUDE.md §4 из «Продуктовой рамки».
  • Вердикт: green · High 0 · Medium 0

Материал раунда

  • Ветка: dev, коммит 548e7a8563d6 — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
  • Дерево материала: 37d7b40eef9319cb230aa1232018d933afad2ee2
    git log --all --format='%H %T' | grep 37d7b40eef93
    
  • Тело issue: 1e7f8d192f340e80e878aec0d6de383c982263254b408f8fc928f383130f5684
  • Вердикт конвейера: green · High 0