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

14 KiB
Raw Blame History

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).