docs: review document for #32

Issue: #32
User-Visible: no
This commit is contained in:
claude[bot]
2026-08-30 21:29:56 +00:00
parent 4ba1b2730f
commit 2782f3b1f3
+161
View File
@@ -0,0 +1,161 @@
# SPEC-REVIEW-32-r2
- Issue: https://github.com/Matysh/houseplan-card/issues/32
- Этап: ревью ТЗ (PROCESS.md §2.4), заход r2
- Материал: `docs/specs/032-unified-danger-confirmation.md` на SHA `4ba1b273`
(коммит «docs: budget unified confirmation surface»), тело issue #32, все
комментарии по 2026-08-30 включительно
- Предыдущий раунд: `docs/reviews/SPEC-REVIEW-32-r1.md`, вердикт жёлтый,
материал зафиксирован на SHA `206bcd1a`. SHA был назван в самом документе r1
(в его теле, не в комментарии-вердикте issue — комментарий #4 SHA не
называет; сам документ его называет дважды: в шапке «Материал» и в финальной
строке вердикта)
- Трек: полный (владелец снял `small` 2026-08-30)
- Бюджет: заход r2, блокирующих циклов израсходовано **1 из 4** (r1 был
жёлтым и потратил цикл; текущий раунд, если зелёный, цикла не образует, #227)
## Скоуп проверки r2 — по дельте (PROCESS.md §2.9/§2.10)
Дельта объявлена командой `git diff 206bcd1a..HEAD -- docs/specs/032-unified-danger-confirmation.md`
и ограничена ровно шестью добавленными строками в одном файле:
```
+ (в §5.2, после строки про eager root)
+ Это осознанный прирост initial View graph: Lit и `hp-dialog` уже находятся в
+ eager-графе, поэтому новый presentation/controller должен добавить не более
+ **3 KiB gzip** к baseline 284055 B и оставить весь initial View ниже
+ действующего бюджета **300000 B gzip** (headroom до задачи: 15945 B).
+ (новая строка в таблице §9)
+ | AC-13 | Initial View остаётся ≤300000 B gzip, а прирост к baseline 284055 B — ≤3 KiB gzip | `npm run bundle:budget` + сравнение manifest initial graph |
+ (в списке команд §10)
+ npm run bundle:budget
```
Второй файл в диапазоне, `docs/reviews/SPEC-REVIEW-32-r1.md` (150 строк), —
это сам документ предыдущего раунда, положенный конвейером; он не редактировался
автором и не входит в предмет разбора.
Дельта локальна по критерию §2.10: не ребейз (dev не продвинулся —
`git merge-base --is-ancestor origin/dev HEAD` истинно, слияние чистое), не
смена контракта поведения, не задета новая подсистема, объём (6 строк)
несопоставим с исходной задачей. Полный повторный разбор не требуется —
проверяю закрытие M1 и всё, до чего дотягивается эта дельта: раздел §5.2,
таблицу AC (только новая строка AC-13) и список команд §10. Остальные разделы
и AC-1…AC-12 наследуются из r1 без повторной проверки (раздел ниже).
## Закрытие раунда r1
| Находка r1 | Чем закрыта | Где это видно |
|---|---|---|
| **M1** — DoR-пункт «влияние на производительность и бюджеты названо» не закрыт: §5.2 сознательно кладёт controller в eager root graph, но не называет ожидаемый прирост/headroom, AC не привязан к размеру eager-бандла, §10 не требует `bundle:budget` | Все три требуемых фикса внесены в одну правку: (1) в §5.2 добавлено предложение с ожидаемым порядком прироста «не более 3 KiB gzip» и headroom «15945 B»; (2) добавлен AC-13 с явным порогом и способом доказательства; (3) `npm run bundle:budget` добавлен в список §10 рядом с `bundle:sync` | `docs/specs/032-unified-danger-confirmation.md` §5.2 (после строки «Controller находится в eager root…»), таблица §9 строка AC-13, список команд §10 (строка `npm run bundle:budget` сразу после `npm run bundle:sync`) |
Числа не голое заявление автора — перепроверены исполнением, не чтением:
собрал бандл (`npm run build && npm run bundle:sync`) и прогнал сам гейт:
```
$ npm run bundle:budget
initial View: 284055 B gzip (budget 300000 B, headroom 15945 B)
lazy editor: 143904 B gzip
lazy locale: 47816 B gzip
```
Совпадение точное: `284055 B` baseline, `300000 B` бюджет, `15945 B` headroom —
все три числа из правки §5.2/AC-13 совпадают с фактическим текущим состоянием
дерева побайтово. Это не догадка, выданная за факт (запрещённый спеке паттерн,
PROCESS.md §7.1): автор явно исполнил гейт перед тем, как вписать числа в ТЗ,
и они прошли независимую перепроверку. Дополнительно проверил внутреннюю
арифметику: `300000 − 284055 = 15945` (сходится) и что заявленный лимит роста
`≤3 KiB` не съедает весь headroom — после гипотетического прироста в 3072 Б
остаётся ещё 12873 Б до стены, то есть формулировка согласована сама с собой.
Также проверил, что число `300000 B` (а не устаревшее `256000 B` из
`AGENTS.md` #337) — актуальный порог: `scripts/bundle-budget.mjs` экспортирует
`INITIAL_VIEW_GZIP_BUDGET = 300_000`, рекалибровано решением по #367 задолго до
этой задачи. `AGENTS.md` не переправлен после той рекалибровки и называет
старое число — это не находка этого ревью (файл не в диффе issue #32, ошибка
предшествует задаче и не создана и не унаследована текстом ТЗ #32 — ТЗ, в
отличие от AGENTS.md, использует правильное, актуальное число). Оставляю как
наблюдение, не завожу отдельный issue: по PROCESS.md документация уступает
факту автоматизации, актуальный факт уже верно отражён в правке #32, и
единственный практический эффект устаревшей строки в AGENTS.md — не связанный
с этой задачей риск ввести в заблуждение будущего читателя `AGENTS.md`, что не
является дефектом дельты #32.
M1 закрыт полностью и подтверждён исполнением, не чтением.
## Унаследовано из r1
Без повторной проверки в r2, источник — `docs/reviews/SPEC-REVIEW-32-r1.md` на
SHA `206bcd1a` (дельта их не касается):
- Полнота охвата 8 call sites `confirm(` в `src/**` и соответствие таблице §4.1.
- Границы со специализированными диалогами (`_roomDeleteDialog`,
`_partitionDeleteDialog`, `confirm.erase_decor`, backup/import/optimize) —
не дублируются, уже свой `hp-dialog`.
- Существующий focus/autofocus/Escape-контракт `hp-dialog.ts` (строки 237–396),
на который ссылается §6.1 ТЗ, — не выдуман.
- Race-safety claim по `_deleteSpace` (blocker-проверка до `confirm()`).
- Lock-инвариант `docs/SCOPE.md` не нарушается и не переопределяется; AC-9 (в
прежней нумерации r1 это тот же AC-9, номер не сдвинулся) отдельно требует
отсутствия unlock после cancel/stale state.
- Обязательные разделы §7.1 присутствуют (сценарий, «до/после», проблема,
scope/не-scope, контракт, UX, данные/миграция, AC1-12 на тот момент, план
автотестов, риски, откат, release-артефакты).
- §6.1 «warning/on акцент» для unlock-кнопки — явно сформулированное как
открытый на усмотрение реализации техническое допущение, не догадка,
выданная за факт.
- Открытых продуктовых вопросов нет — комментарий владельца от 2026-08-30
закрывает тему; новых продуктовых вопросов дельта r2 не поднимает (правка
чисто техническая — числовой бюджет).
- Ссылки issue ↔ ТЗ на месте в обоих направлениях.
- i18n-ключи: точные имена не названы (признано приемлемым в r1, паритет
проверяется `test/i18n.test.mjs` через AC-11) — дельта r2 эту область не
трогает, вывод не пересматривается.
- Соответствие `docs/CONFIG-COMPATIBILITY.md` («миграция отсутствует») —
не пересматривается, дельта миграций не касается.
## Находки нового раунда
Нет. Дельта r2 — точечный, полностью проверенный числами фикс единственной
находки r1, новых проблем не вносит.
## Что проверено и корректно (r2, сверх наследования)
- Дельта ограничена одним файлом класса C (`docs/specs/032-*.md`), продуктовый
код не тронут — `git diff --stat 206bcd1a..HEAD` показывает только
`docs/reviews/SPEC-REVIEW-32-r1.md` (публикация r1, не редактировалась) и
сам файл ТЗ.
- `git merge-base --is-ancestor origin/dev HEAD` — истина: ветка не отстаёт от
`dev` (`8955c02e`), рёбейз не требуется, полный разбор по этой причине не
предписан.
- Все три числа новой правки (`284055`, `300000`, `15945`) подтверждены
реальным прогоном `npm run build && npm run bundle:sync && npm run
bundle:budget` на этом дереве, а не переписаны с чужих слов.
- AC-13 сформулирован проверяемо и однозначно, способ доказательства назван
(`npm run bundle:budget` + сверка manifest initial graph), согласуется с
остальной таблицей §9 по формату.
## Чего не проверял
- AC-1…AC-12 заново — дельта их доказательства не задевает, наследуются из r1
без повторного чтения кода (см. раздел выше).
- Реализацию — её всё ещё нет, стадия `S4-spec-review`.
- `npx tsc --noEmit` / `npm test` для этой правки не требовались и не
гонялись отдельно от `bundle:budget` — правка не в `src/**`, `npm run build`
внутри `bundle:sync` уже включает `tsc --noEmit` как первый шаг и прошёл
чисто (лог показал `tsc --noEmit && rollup -c` без ошибок).
- `check-docs.mjs` не гонял — дельта не в `src/**`, автор уже отчитался
«passed» под свою правку, а сам гейт по построению не зависит от текста ТЗ.
- Стабильность числа `284055 B` во времени (не проверял, изменится ли оно к
моменту реализации) — это ожидаемо: AC-13 меряет фактический бандл на
момент кода, число в §5.2 — целевой ориентир, не заморожённая константа;
ревью кода перепроверит тем же гейтом на своём SHA.
## Вердикт
M1 закрыт полностью, закрытие подтверждено исполнением гейта, а не чтением
текста. Новых High/Medium-находок в дельте r2 нет. DoR-пункт «влияние на
производительность и бюджеты названо» теперь выполнен. Итог: **зелёный** —
issue готов к переходу в `S5-ready`.