Files
houseplan-card/docs/reviews/SPEC-REVIEW-219-r2.md
T
2026-08-20 11:48:34 +00:00

151 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SPEC-REVIEW — issue #219, цикл r2
- **Issue:** https://github.com/Matysh/houseplan-card/issues/219
- **ТЗ:** `docs/specs/219-lock-orange-palette.md`, коммит `16c8a28` (ветка
`issue/219-lock-orange-palette`)
- **Предыдущий раунд:** r1, вердикт жёлтый (High: 0 · Medium: 1 → в задаче),
получен на SHA `28d6b9c` — SHA в тексте вердикта r1 не был назван явно,
восстановлен из истории коммитов ТЗ (`git log docs/specs/219-lock-orange-palette.md`)
и из комментария автора «ТЗ опубликовано... Коммит: `28d6b9c`»,
сопоставленного с `docs/reviews/SPEC-REVIEW-219-r1.md`.
- **Трек:** обычный полный (не `small`), лимит циклов ревью ТЗ — 4
- **Ревьюер:** Claude (роль «Ревьюер ТЗ», отдельная сессия от автора)
- **Вердикт:** зелёный · цикл r2/4 · High: 0 · Medium: 0
## Скоуп проверки (по дельте, PROCESS.md §2.9/2.10)
Между вердиктом r1 (`28d6b9c`) и текущим состоянием (`16c8a28`) изменён
единственный файл — `docs/specs/219-lock-orange-palette.md`, единственным
коммитом `16c8a28 docs: require user guide palette update`. Дельта локальна:
это точечная правка текста ТЗ по единственной находке M1 предыдущего раунда,
не ребейз, не смена контракта поведения, не новая подсистема. Объём разбора
этого раунда ограничен дельтой:
1. закрытие M1 — построчная сверка нового текста §6/§10/§14(AC7)/§16 с тем,
что требовал фикс r1;
2. проверка, что AC7 (единственный AC, чьё доказательство дельта задевает)
остаётся однозначным и доказуемым после правки;
3. проверка, что делта не вносит новых догадок, противоречий или
расширения скоупа.
Остальные разделы ТЗ (§1–§5, §7–§9, §11–§13, §15, §17, §18, AC1–AC6)
дельтой не затронуты и наследуются из r1 без повторной проверки — см.
раздел «Унаследовано из r1» ниже.
## Как проверялось
- `git log --oneline 28d6b9c..HEAD -- docs/specs/219-lock-orange-palette.md`
— один коммит `16c8a28`.
- `git diff 28d6b9c..HEAD -- docs/specs/219-lock-orange-palette.md` —
построчный дифф ТЗ, единственный источник объёма этого раунда.
- `git show --stat 16c8a28` — подтверждено, что коммит трогает только
`docs/specs/219-lock-orange-palette.md` (14 insertions, 9 deletions),
продуктовый код не менялся (класс C).
- Прочитаны трейлеры коммита `16c8a28`: `Issue: #219`, `User-Visible: no`.
`User-Visible: no` корректен — коммит правит только текст ТЗ, видимое
поведение продукта не меняется этим коммитом.
- Прочитан комментарий автора в issue #219 от 2026-08-20 «Исправил
SPEC-REVIEW r1, M1 в `16c8a28`» и сверен построчно с реальным диффом —
заявление автора не принято на слово.
- Проверено текущее состояние `docs/USER-GUIDE.ru.md`: строки 524 («###
Замок»), 778 (строка «Жёлтая подложка», пример «lock unlocked/open»),
779 («Чёрный значок замка | Замок заблокирован | lock locked») — те же
три места, что и в находке M1 r1, всё ещё описывают заменяемую
чёрно-жёлтую lock-палитру и однозначно идентифицируются новым текстом
ТЗ («раздел «Замок»» и «строки таблицы «Жёлтая подложка»/«Чёрный значок
замка»»), хотя новый текст не повторяет точные номера строк 526-527/778/779.
- Проверено `node scripts/check-docs.mjs --external` — прочитан код
проверки (`scripts/check-docs.mjs`): скрипт валидирует наличие публичных
документов, ссылки, якоря заголовков и screenshot-манифест, но не
проверяет содержательное соответствие текста новой red/green палитре —
это не расходится с AC7, где `check-docs` заявлен доказательством наряду
с `diff`/`hash comparison`, а не единственным доказательством
содержательной корректности текста.
- Гейты кода (`tsc`, `npm test`, `npm run build`) в этом цикле не
запускались: предмет ревью — ТЗ, продуктовый код не менялся ни в этом,
ни в предыдущем коммите ветки; наследуется решение r1 не запускать их
на этапе `S4-spec-review`.
## Находки
Не найдено.
## Закрытие раунда r1
| Находка | Чем закрыта | Где это видно |
|---|---|---|
| **M1** — ТЗ не называет `docs/USER-GUIDE.ru.md` обязательным release-артефактом, хотя документ фиксирует заменяемый black/amber lock-контракт в трёх местах (строки 526-527, 778, 779) | В `16c8a28` в §6 «Scope» добавлен пункт «обязательное обновление `docs/USER-GUIDE.ru.md`: раздел «Замок» и строки таблицы постоянных статусов, где сейчас зафиксированы заменяемые black/amber Lock/Unlock и orange unlocked/open примеры»; тот же файл назван в списке файлов §10; AC7 переформулирован явным перечислением `docs/USER-GUIDE.ru.md` наряду с changelog/`TESTING.md`; §16 «Release-артефакты» получил пункт с указанием конкретных строк таблицы («Жёлтая подложка»/«Чёрный значок замка») | `docs/specs/219-lock-orange-palette.md:72-75` (§6), `:147-148` (§10), `:204-207` (AC7), `:235-237` (§16); дифф `git diff 28d6b9c..16c8a28 -- docs/specs/219-lock-orange-palette.md` |
Фикс закрывает находку по существу: указан конкретный файл (не расплывчатое
«при необходимости канонический документ device icon states», как было в
`28d6b9c`), названы конкретные разделы/строки таблицы, требование обозначено
словом «обязательное»/«обязательная», а не факультативным «если необходимо».
Это устраняет риск, из-за которого находка была Medium, а не Low: разработчик
теперь не может реализовать задачу, не открыв `USER-GUIDE.ru.md`, — файл
явно в scope, в списке архитектурных файлов и в AC7.
Единственное отличие от буквальной формулировки фикса, ожидаемого r1
(«…строки 526-527, 778, 779… с той же нормативной таблицей цветов, что и в
§8.1/§8.2 ТЗ»): новый текст называет разделы по названию («раздел «Замок»»,
конкретные строки таблицы по их текстовому лейблу), а не по номеру строки, и
не повторяет таблицу §8.1/§8.2 внутри §6/§16. Это не находка: номера строк —
техническая деталь текстового файла, а не часть контракта; описание по
названию раздела и по существующему текстовому лейблу таблицы полностью
однозначно идентифицирует место правки (в файле единственный раздел «Замок»
и единственная таблица постоянных статусов), а таблица цветов §8.1/§8.2 уже
является нормативным источником для всего ТЗ по приоритету, заданному в §4 —
дублировать её текст в каждом упоминании не требуется.
## Унаследовано из r1
Разделы, доказательство которых дельта `16c8a28` не задевает, приняты без
повторной проверки на основании `docs/reviews/SPEC-REVIEW-219-r1.md`,
полученного на SHA `28d6b9c`:
- §1 «Сценарий и персона», §2 «Что человек увидит до и после», §3
«Подтверждённая причина» — сверено r1 построчно с `src/styles.ts`
(`.dev.on`, `.dev.open`, `.oplock.*`, `.dev.lock-*`);
- §4 «Нормативные источники и приоритет», §5 «Цели»;
- §7 «Не входит в задачу» — граница скоупа (геометрия, MDI, hit-area,
действия, alarm/unavailable/selected, оранжевые линии проёмов, Glow,
info-card) дельтой не расширена и не сужена;
- §8.1/§8.2 «Нормативная таблица состояний» — сама таблица red/green/white/
`#252525` не менялась этим коммитом;
- §9 «Приоритет состояний и взаимодействие» — cascade alarm/hover/focus/
selected/unavailable/virtual не затронут;
- §11 «Данные, i18n, accessibility, privacy и security», §12 «Performance»,
§13 «Риски» — таблица рисков не менялась;
- AC1–AC6 — ни один не ссылается на `docs/USER-GUIDE.ru.md`, дельта их
текст не трогает (сверено построчным диффом: правки только в AC7);
- §15 «Проверки реализации и ревью», §17 «Откат», §18 «Принятые
предположения» — не менялись;
- вывод r1 «продуктовых вопросов владельцу нет и не должно быть» — issue
дало решение целиком, дельта этого не меняет;
- вывод r1 о корректности выбора обычного полного трека (не `small`) —
не переоценивался, дельта не меняет число затронутых поверхностей.
## Что проверено и корректно
- Единственная находка предыдущего раунда (M1) закрыта по существу, а не
на словах — проверено сравнением текста фикса с текстом требования и с
реальным состоянием `docs/USER-GUIDE.ru.md`.
- AC7 после правки остаётся однозначным: перечислены конкретные артефакты
(`docs/CHANGELOG.md`, `docs/CHANGELOG.ru.md`, `docs/TESTING.md`,
конкретные строки `docs/USER-GUIDE.ru.md`) и способ доказательства (diff,
hash comparison бандлов, `check-docs`), без расплывчатых формулировок.
- Коммит `16c8a28` ограничен ожидаемым классом (C, только `docs/specs/**`),
трейлеры `Issue`/`User-Visible` корректны.
- Дельта не вводит новых догадок за факт, не расширяет и не сужает скоуп
задачи, не противоречит §8.1/§8.2 или другим разделам ТЗ.
## Чего не проверял
- Полный повторный разбор ТЗ (структура §7.1, все AC1-AC7 по отдельности,
сверка с кодом заново) — не требовался: дельта локальна и не меняет
контракт поведения; см. «Унаследовано из r1».
- Гейты кода (`tsc`, `npm test`, `npm run build`, golden, contract tests) —
не запускались: реализации ещё нет, продуктовый код не менялся ни в этом,
ни в предыдущем коммите ветки, этап — `S4-spec-review`.
- Историческая полнота предыдущих SPEC-REVIEW #179/#211/#213/#217 — вне
предмета этого ревью, не проверялась повторно (не проверялась и в r1).