mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-29 03:09:36 +00:00
@@ -0,0 +1,150 @@
|
||||
# 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).
|
||||
Reference in New Issue
Block a user