Files
houseplan-card/docs/reviews/SPEC-REVIEW-360-r2.md
T
2026-08-29 08:14:17 +00:00

11 KiB
Raw Blame History

SPEC-REVIEW-360-r2

Issue: #360 · этап: spec (S4-spec-review) · трек: small (лёгкий) · заход: r2 · блокирующих циклов израсходовано: 1 из 2 (лимит лёгкого трека, §4 — r1 был жёлтым и потратил цикл, зелёный r1 бюджет бы не тратил, но r1 был жёлтым)

Ревьюер: Claude (роль «ревьюер ТЗ»), отдельная сессия от r1 и от автора. ТЗ по-прежнему живёт в теле issue #360 (revision 2), файл docs/specs/ не создаётся — верно для small. Кода нет: issue в S4-spec-review, Rule #1 не разрешает трогать src/** раньше S5-ready, и на dev (HEAD 6ce42b33) изменений класса A по #360 нет.

Разбор по дельте (PROCESS.md §2.10)

Второй заход — разбор ограничен дельтой revision 1 → revision 2, а не ТЗ целиком. Дельта локальна: ни ребейза, ни смены контракта поведения, ни новой подсистемы, объём дельты (два добавленных предложения) несопоставимо меньше исходной задачи. Полный повторный разбор не требуется.

Как найдена дельта. Тело issue не версionируется в git, поэтому вместо git diff <SHA>..HEAD использован эквивалент для spec-этапа: GitHub userContentEdits (GraphQL) с историей правок тела issue. Ревизия 1 (та, что читал r1) — снимок тела issue непосредственно перед правкой в 08:00:23Z, без слов «Touch editor» и без _decorSaveShape; это дословно совпадает с тем, что процитировано в docs/reviews/SPEC-REVIEW-360-r1.md. Текущее тело (revision 2, правка в 08:08:24Z) сверено с этим снимком построчным diff.

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

Находка r1 Чем закрыта Где это видно
M1 — не названа обязательная формула туча из docs/TOUCH-SUPPORT.md («New editor feature specifications... must state one of: Touch editor: supported / best effort / intentionally degraded / not exposed») Пункт 8 контракта поведения дополнен буквальной формулой Тело issue, п.8: «Touch editor: best effort / intentionally degraded. Background editor сохраняет действующий desktop-first контракт; на touch View/kiosk нет изменений и регрессий.» — точное совпадение одного из трёх канонических вариантов docs/TOUCH-SUPPORT.md:165-167
M2 — не описано, что сохранение properties-диалога существующего line/rect/ellipse/furniture перезаписывает тот же _decorStyle, который задача делает постоянно видимым Новый п.9 контракта плюс расширение AC5 и шага 4 плана тестов Тело issue, п.9: «Сохранение properties-диалога уже существующего line/rect/ellipse/furniture сохраняет текущую семантику _decorSaveShape: его color/opacity становятся новым _decorStyle... Это не ретроактивная перекраска других объектов и не новая побочная связь.»; AC5 добавлена фраза «сохранение нового цвета/opacity в properties-диалоге существующего line/rect/ellipse/furniture обновляет main picker по текущему контракту _decorSaveShape, и следующий объект получает последнее значение»; план тестов, шаг 4, добавлено «Затем сохранить новый цвет/opacity через properties-dialog уже существующих line, rect, ellipse и furniture и проверить main picker и стиль следующего объекта»

Обе находки закрыты добавлением текста без изменения архитектуры контракта или номеров AC — ровно так, как r1 и предписывал. Других правок в теле issue между ревизиями 1 и 2 нет: построчный diff (см. ниже) вне пп. 8, 9, AC5 и шага 4 плана тестов состоит только из переноса строк markdown (тот же текст, другая раскладка по ширине), без содержательных изменений.

Проверка дельты по коду (не только по формулировке)

Обе добавленные фразы — не пересказ, а утверждения о поведении текущего кода, которые обязаны быть сверены (это ровно тот класс, где ТЗ может выдать догадку за решение):

  • М1-текст. Формула Touch editor: best effort / intentionally degraded сверена дословно с docs/TOUCH-SUPPORT.md:163-167 («Documentation rule») — совпадает буква в букву, это один из трёх легальных вариантов, а не собственная формулировка автора.
  • М2-текст. Утверждение «сохранение properties-диалога существующего line/rect/ellipse/furniture пишет color/opacity в общий _decorStyle» сверено чтением src/houseplan-editor-runtime.ts:4422-4485 (_decorSaveShape): строки 4476–4480 действительно присваивают this.host._decorStyle = { ...style, fill/fillColor/fillOpacity сохраняются из предыдущего _decorStyle кроме rect/ellipse } — подтверждено. Функция правит только элемент с shape.id === d.id (строка 4434), других размещённых объектов не касается — подтверждает фразу «не ретроактивная перекраска других объектов».
  • Также проверено чтением, что _decorSaveText (houseplan-editor-runtime.ts:4381-4419, диалог текста) не пишет в _decorStyle — то есть ограничение п.9 списком «line/rect/ellipse/furniture» без text точное, а не случайно узкое.

Обе фразы дельты — не догадка, а корректно сформулированный факт кода.

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

Без повторной проверки в этом раунде приняты все выводы docs/reviews/SPEC-REVIEW-360-r1.md (заход r1, снимок тела issue на 08:00:23Z, т.е. revision 1) — дельта их не затрагивает:

  • обязательные разделы §7.1 присутствуют (сценарий, «что человек увидит», проблема, скоуп/не-скоуп, контракт, данные/i18n/совместимость, файлы, AC1–AC8, план тестов, риски/откат, release-артефакты, принятые предположения);
  • сверка утверждений ТЗ с деревом на SHA 0decce8d: единый _decorStyle как source для line/rect/ellipse/text/furniture, структура .decorbar/.editbar-tools/.editbar-end, flex-wrap вместо скролла, хрупкие тесты demo/smoke_decor.mjs:132-134 и test/color-picker.test.mjs:57-62, независимость fillColor/fillOpacity, отсутствие новых i18n-ключей — все подтверждены и делтой не задеты; _decorStyle со времени SHA 0decce8d в этом файле не менялся (единственные изменения на пути к 6ce42b33 — сам документ ревью и предыдущий golden/фикс furniture-обводки, не относящиеся к decor-style contract), поэтому вывод остаётся в силе и на текущем HEAD;
  • product-question gate соблюдён, блокирующих продуктовых вопросов у автора нет;
  • трек small подтверждён верно (одна поверхность, риск/сложность ≤3, нет миграции, нет нового UX-контракта, лимит ревью ТЗ — 2 цикла);
  • откат описан и достаточен;
  • Low-находок сверх M1/M2 не было и не появилось.

Что проверено заново в этом раунде

  • Текст п.8 и п.9 (весь текст, добавленный дельтой);
  • AC5 в новой редакции — единственный AC, чьё доказательство дельта расширяет;
  • шаг 4 плана тестов в новой редакции;
  • код _decorSaveShape и _decorSaveText (чтением, не исполнением — на этапе spec кода задачи нет, поэтому запуск невозможен и не требуется).

Гейты

Этап — spec, не code. src/** по issue #360 не изменялся (Rule #1: код разрешён только из S5-ready), поэтому typecheck/test/build/ check-docs/model-invariants/смоки к этому раунду неприменимы — гейты кода запускаются на этапе код-ревью. Единственная проверка этого раунда — чтение кода _decorSaveShape/_decorSaveText в текущем дереве dev (см. выше), выполненное вручную.

Находки

Новых High/Medium/Low находок в дельте revision 1 → revision 2 нет. Обе Medium-находки r1 закрыты полностью и точно.

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

  • Реальную браузерную/визуальную проверку (кода нет, применимо к код-ревью после реализации) — без изменений относительно r1;
  • demo/golden и фактический рендер light/dark — неприменимо к ТЗ;
  • соответствие итогового кода контракту — предмет отдельного код-ревью.

Вердикт

Зелёный. High: 0. Medium: 0 (обе находки r1 закрыты, новых нет). Issue готов к переходу в S5-ready.