diff --git a/docs/reviews/SPEC-REVIEW-526-r2.md b/docs/reviews/SPEC-REVIEW-526-r2.md new file mode 100644 index 00000000..5a3ee521 --- /dev/null +++ b/docs/reviews/SPEC-REVIEW-526-r2.md @@ -0,0 +1,85 @@ +# 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