Files
houseplan-card/docs/reviews/SPEC-REVIEW-526-r2.md
T
2026-09-11 06:23:19 +00:00

12 KiB

SPEC-REVIEW-526-r2

Issue: #526 — «CSS-комментарии едут пользователю: минификатор шаблонов не снял ~23 КБ пояснений» Этап: ревью ТЗ (PROCESS.md §2.4), заход r2, блокирующих циклов израсходовано 1 из 4 (лимит 4 — полный трек) Трек: полный. Критерий §5, который задача не проходит: «нет влияния на производительность» (правка целиком про размер начального чанка).

Скоуп разбора

Это второй заход ревью ТЗ — разбор по дельте (PROCESS.md §2.10), не заново.

Предыдущий вердикт: жёлтый · заход r1 · блокирующих циклов 0/4 · High: 0 · Medium: 1 → в задаче (комментарий claude, 2026-09-11T06:18:45Z; документ docs/reviews/SPEC-REVIEW-526-r1.md).

Материал r1 (из якорного блока документа r1): ветка dev, коммит 9609040d312c3121c5703b37bab080f84ff69e6c. SHA резолвится (git cat-file -t → commit, предок текущего HEAD) — не осиротевший, объявление по содержимому не потребовалось.

Дельта r1→r2: ответ автора (комментарий Matysh, 2026-09-11T06:19:58Z) и правка тела issue — вставлен один новый раздел ### Сценарий и что человек увидит в начало ## ТЗ, между строкой «Полный трек. Критерий §5…» и ### Контракт. Это подтверждается самим текстом r1-находки, которая дословно цитирует границу отсутствовавшего раздела («весь раздел от строки «Полный трек. Критерий §5…» до «### Контракт»»): в r1 между этими двумя точками текста не было, сейчас — есть. Автор прямо заявляет: «Остальной текст ТЗ не трогал: контракт, AC и допущения остались прежними» — и текущее тело issue это подтверждает: К1–К5, AC1–AC8, файлы, i18n/миграция/бэкенд, перф, touch, откат, риски, блок допущений — присутствуют дословно в тех же формулировках и числах, что цитировал документ r1 (300 111 Б → 287 284 Б, запас 955 → 13 782 Б, AC1…AC8 те же восемь пунктов).

Дельта локальна (вставка одного раздела в ответ на единственную находку), контракт не менялся, новая подсистема не задета, объём дельты несопоставимо меньше исходной задачи — полный повторный разбор не требуется по критериям §2.10. Разбираю только дельту и её последствия для тех AC/разделов, которых она касается (а она касается только вопроса «отвечает ли ТЗ на два обязательных продуктовых вопроса §7.1»).

Гейты (typecheck/test/build) на этапе ревью ТЗ не прогоняются: продуктового кода ещё нет, материал ревью — только текст issue.

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

Находка r1 Чем закрыта Где это видно
Medium (в скоупе): в ## ТЗ нет обязательных разделов «сценарий» и «что человек увидит до и после» (§7.1) Добавлен раздел ### Сценарий и что человек увидит с тремя подпунктами: Сценарий (персона — «любой пользователь», поверхность — карточка на дашборде / страница в боковом меню / киоск на планшете, момент — первая/холодная загрузка, особенно на узком канале и медленном устройстве), До и После (интерфейс не меняется ни на пиксель, план появляется чуть раньше) Тело issue #526, ## ТЗ, сразу после строки «Полный трек. Критерий §5…», перед ### Контракт
Low (снята решением ревьюера без возврата): раздел «UX» не выделен отдельно Не переоткрывается — r1 закрыла её сам ревьюер записью в документе, без обязательства для автора docs/reviews/SPEC-REVIEW-526-r1.md, раздел «Находки → Low»

Проверка по существу, а не по факту наличия заголовка: персона названа обобщённо («любой пользователь»), но это согласуется с текстом самой r1-находки, которая тоже восстановила ответ как «персона — любая из трёх» — автор не сузил и не исказил рамку, предложенную ревьюером. Поверхность и момент названы конкретно (три поверхности, холодная загрузка). Фраза «что человек увидит» присутствует буквально: «Интерфейс не меняется ни на пиксель… план просто появляется чуть раньше» — это и есть ответ без терминов реализации, который в r1 отсутствовал вовсе.

Отдельное наблюдение (Low, снимаю с записью, не возвращаю автору). Подпункты «До»/«После» перед этой фразой приводят байты gzip и размер чанка — термины реализации, что §7.1 просит выносить за скобки фразы «что человек увидит». Разница с r1 принципиальная: тогда наблюдаемого эффекта в тексте не было вообще, сейчас он есть отдельной ясной фразой, а цифры соседствуют с ней как подтверждающая метрика, а не подменяют её. Меняющая переписывание ради буквы правила ценности не добавляет — сам r1 отметил, что «смысл важнее буквы». Снимаю без возврата.

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

Без повторной проверки, по документу docs/reviews/SPEC-REVIEW-526-r1.md, материал — коммит 9609040d312c3121c5703b37bab080f84ff69e6c:

  • Причина дефекта установлена измерением (инструментированная сборка), не гипотезой — code.includes('css\') не совпадает с выводом TypeScript-компилятора (css ``).
  • К1–К5 однозначны, не пересекаются, К5 явно исключает ленивый граф/перенос чанков/правки стилей.
  • AC1–AC8 проверяемы, у каждого назван способ доказательства; защитный AC4 имеет мутанта AC7 (таблица «чем краснеет» будет обязательна уже на код-ревью).
  • Блок «Принятые технические предположения» — три пункта, все технические, ни один не подменяет продуктовое решение.
  • Числа согласованы между аналитикой (S2) и ТЗ (один источник, не разошлись при добавлении нового раздела).
  • Откат конкретен и исполним (ревёрт коммита без флагов/миграций).
  • Выбор полного трека обоснован названным критерием §5.
  • i18n/миграция/бэкенд — «Ничего», корректно для задачи, не трогающей конфиг/данные.
  • Release-артефакты названы (AC8: оба changelog + docs/DEVELOPMENT.md), User-Visible: yes уместен.
  • Low «раздел UX не выделен» — снята ревьюером r1 без возврата, остаётся снятой.

Находки r2

Нет High. Нет Medium. Один новый Low (см. «Отдельное наблюдение» выше) — снят с записью, не возвращается автору.

Что проверено и корректно (дельта)

  • Новый раздел встроен структурно верно: ровно там, где r1 просила его увидеть (в начале ## ТЗ, до ### Контракт), не задевая К1–К5, AC1–AC8 и прочий текст.
  • Персона/поверхность/момент названы явно и согласуются с docs/SCOPE.md (три поверхности — карточка на дашборде, страница в боковом меню, киоск на планшете — соответствуют персонам «Home admin», «household members», «guests/kiosk»).
  • Фраза «что человек увидит» присутствует буквально и без терминов реализации: «Интерфейс не меняется ни на пиксель… план просто появляется чуть раньше».
  • Числа в новом разделе (300 111 Б → 287 284 Б, −12,8 КБ) совпадают с числами в разделе «Производительность и бюджеты» и с комментарием аналитики — один источник, расхождений нет.
  • Автор не заявил новых продуктовых решений и не тронул AC/контракт — риск регрессии от самой правки текста отсутствует.

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

  • Полный повторный разбор К1–К5, AC1–AC8, рисков и допущений — не требовался по §2.10 (дельта их не касается), унаследовано из r1 списком выше.
  • Код, тесты, сборку — на этапе ТЗ их не существует, проверять нечего.
  • scripts/mutation-gate.mjs и корректность самого regex/парсера К1 — вне ТЗ, дело код-ревью, как и было отмечено r1.
  • Продуктовых вопросов владельцу не возникло ни в r1, ни в дельте r2.

Вердикт

Единственная блокирующая находка r1 закрыта по существу, а не по факту наличия заголовка. Новых High/Medium делта не создала. Задача готова к разработке.

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


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

  • Ветка: dev, коммит 4451cf50d930 — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
  • Дерево материала: 2453777ffa8421c27b4d6f3995849f1e2bea5c5b
    git log --all --format='%H %T' | grep 2453777ffa84
    
  • Тело issue: 2cb0efd54b1cd5a5a4f8733121da3241c0cb7b0f2b2376759717d163f0b496dd
  • Вердикт конвейера: green · High 0