Files
houseplan-card/docs/reviews/SPEC-REVIEW-489-r2.md
T
2026-09-08 18:08:10 +00:00

11 KiB
Raw Blame History

SPEC-REVIEW-489-r2

  • Issue: https://github.com/Matysh/houseplan-card/issues/489
  • Этап: ТЗ на ревью (PROCESS.md §2.4)
  • Материал: docs/specs/489-data-hp-contract.md на SHA e072b222749d38fc1c7b5000b16907438bc5c6ee (commit e072b222, ветка issue/489-data-hp-contract).
  • Предыдущий раунд: r1, вердикт жёлтый, SHA 9cf10bdde7696e13c049fe83b4dc284622386127 (commit 9cf10bdd), документ docs/reviews/SPEC-REVIEW-489-r1.md. SHA в вердикте комментария не был назван явно — восстановлен по истории коммитов (9cf10bdd — единственный коммит, добавивший этот файл, непосредственный родитель следующего коммита-документа a48827ec).
  • Заход: r2. Блокирующих циклов израсходовано 1 из 4 (лимит на полном треке — 4).

Скоуп разбора

Дельта — git diff 9cf10bdd..e072b222 -- docs/specs/489-data-hp-contract.md: 26 строк (18 добавлено / 8 удалено), без ребейза (история линейна, git merge-base 9cf10bdd e072b222 = 9cf10bdd, HEAD — прямой потомок). Дельта целиком лежит в четырёх местах документа, и все четыре — это ровно три находки r1:

  1. §6.2 — строка data-hp-mode (M3);
  2. §6.3 — три строки zoom-in/zoom-out/zoom-fit (M1);
  3. §10 AC7/AC8 — формулировка гейта документации (M2);
  4. §14 release-артефакты + §15 принятые предположения — те же M2/M3, раскрытые подробнее.

Новых подсистем, нового публичного поведения или изменения контракта дельта не вводит — это правки формулировок в тех же разделах, что r1 уже разобрал построчно. Объём разбора этого раунда: закрытие всех трёх находок проверено чтением актуального кода/скриптов (не только текста ТЗ), продуктовая рамка и разделы, которых дельта не касается, — унаследованы из r1 без повторной проверки (раздел ниже).

Закрытие раунда r1

Находка Чем закрыта Где это видно
M1 — условие «когда отображается header» для zoom-кнопок требовало нового render-условия либо вводило в заблуждение Формулировка заменена на «как сейчас: в ordinary plan render; в kiosk остаётся в DOM внутри скрытого CSS header» — выбран вариант (a) из r1: хук существует как сегодня, kiosk не меняет DOM docs/specs/489-data-hp-contract.md §6.3, строки zoom-in/zoom-out/zoom-fit. Проверено чтением src/houseplan-card.ts:11400 (<div class="hdr ${this._kiosk ? 'kioskhide' : ''}">) — .zoomctl (строка 11471) рендерится безусловно внутри .hdr, kiosk добавляет только CSS-класс kioskhide, элемент остаётся в DOM. Формулировка ТЗ теперь совпадает с кодом дословно
M2 — гейт check-docs не назван обязательным, команда не та (check:docs вместо check-docs.mjs), пересъёмка скриншотов не упомянута в §14 AC7/AC8 переписаны на точную команду node scripts/check-docs.mjs, названную обязательной («поскольку меняется src/**, дополнительно обязателен»); §14 получил новый пункт про канонический комплект docs screenshots из workflow Docs screenshots, принятый npm run docs:accept -- --reviewed --from=<распакованный-артефакт>, с явным запретом локальной пересъёмки §10 AC7/AC8 и §14. Проверено: scripts/check-docs.mjs существует и реализует ровно то поведение, что описано (scripts/docs-freshness.mjs — по умолчанию strict, т.е. без флага фейлит при устаревшем отпечатке, не просто предупреждает); npm run docs:accept в package.json:18 → node scripts/docs-accept.mjs, поддерживает --reviewed --from=; формулировка о workflow Docs screenshots и запрете локальной пересъёмки совпадает дословно с PROCESS.md §8 (строки 648–651)
M3 — data-hp-mode="device" (ед. число) расходился с уже опубликованным mode-devices без объяснения Значение изменено на devices, словарь view/plan/devices/decor; §15 явно фиксирует: «devices сохраняет уже опубликованное имя .stage.mode-devices... отдельное третье имя device... не вводится» §6.2 и §15. Проверено: docs/STYLING-HOOKS.md:286 обещает стабильность mode-devices; внутренний код везде использует _mode === 'devices' (src/houseplan-card.ts:1768, 2947, 5727, 6826 и др.) и data-editor-navigation="devices" уже существует (src/houseplan-card.ts:11446 при m из ['plan','devices','decor']). Новое значение ТЗ совпадает с обоими существующими публичными именами, расхождение устранено, а не переименовано в третье

Все три находки закрыты по существу, не декларативно: формулировки ТЗ после правки проверены построчно против текущего кода и скриптов, а не приняты на слово автора.

Унаследовано из r1

Без повторной проверки в этом раунде приняты выводы docs/reviews/SPEC-REVIEW-489-r1.md (SHA 9cf10bdde7696e13c049fe83b4dc284622386127), поскольку дельта их не задевает:

  • структура документа содержит все обязательные разделы §7.1;
  • продуктовая рамка (сценарий, персона, отсутствие нового пользовательского поведения, соответствие job'у из docs/SCOPE.md через инфраструктуру тестирования) — без конфликта;
  • открытых продуктовых вопросов владельцу нет и не должно быть — все решения технические;
  • §6.3 space-add/space-settings, §6.4 (три редактора, toolbar/tool/ editor-close/tray, EditorSecondaryController как кандидат под tray), §6.5 (диалоги, выборка 10 из 33 call site), §6.6 (панель #486, единственный menu-обработчик и заголовок) — сверены с кодом в r1, дельта их не трогает; доверяю выводу без повторного построчного сравнения;
  • §9 i18n (тривиально выполнено — ссылки в USER-GUIDE.ru.md пока нет);
  • пустое состояние (§6.3 empty/create-space) и три его ветки — без расхождений в r1;
  • открытые технические детали, оставленные на этап кода без блокировки: полнота словаря data-tool по launcher-группам, оставшиеся 23 из 33 call site диалогов, реализуемость regex/AST-сканера AC6.

Что проверено в этом раунде (сверх таблицы закрытия)

  • Линейность истории между r1 и r2: git log --oneline, git merge-base — ребейза не было, полный разбор по этому основанию не требуется.
  • Дельта не выходит за пределы четырёх мест, перечисленных в «Скоуп разбора»: сверено полным git diff 9cf10bdd..e072b222 (не только упомянутые в коммит-сообщении места).
  • Внутренняя согласованность новых формулировок друг с другом и с остальным документом (§14 бюллет не дублирует и не противоречит AC7/AC8; §15 пункт про devices не противоречит §6.2).

Чего не проверял

  • Гейты (typecheck/test/build) не гонялись: правка — только markdown ТЗ, кода для проверки нет, как и в r1.
  • Разделы вне дельты (см. «Унаследовано») не перечитывались построчно повторно.

Вердикт

Вердикт: зелёный · заход r2 · блокирующих циклов 1/4 · High: 0 · Medium: 0

Все три Medium из r1 закрыты по существу и подтверждены чтением актуального кода/скриптов, а не только текста правки. Новых находок дельта не создала. ТЗ готово к переходу на код-ревью (S7).


Материал раунда

  • Ветка: issue/489-data-hp-contract, коммит e072b222749d — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
  • Дерево материала: 885a8d6d361cac9ce02dae5c998fd60df6c65759
    git log --all --format='%H %T' | grep 885a8d6d361c
    
  • ТЗ docs/specs/489-data-hp-contract.md, блоб 127ce9505c272a9a4152b92157d71d78b96b1070
    git log --all --find-object=127ce9505c272a9a4152b92157d71d78b96b1070 -- docs/specs/489-data-hp-contract.md