17 KiB
SPEC-REVIEW-651-r2
Issue: #651 — «2.5D: значки устройств смещаются при зуме и меняют взаимное выравнивание относительно 2D»
Этап: spec (ревью ТЗ, PROCESS.md §2.4)
Заход: r2 · блокирующих циклов израсходовано: 1 из 4
Материал раунда: тело issue #651, раздел ## ТЗ r1 (текст правлен на месте, версия раздела не переименована — это не находка, номер раунда ведёт документ ревью, а не заголовок ТЗ), снятое на момент этого ревью (2026-09-26); комментарий автора «Замечание SPEC-REVIEW-651-r1 исправлено…»; предыдущий документ docs/reviews/SPEC-REVIEW-651-r1.md; канонические документы docs/ISOMETRIC.md, docs/USER-GUIDE.ru.md, docs/STATUS.md.
Вердикт
Зелёный. High: 0 · Medium: 0 · Low: 0.
Единственная находка r1 (устаревшая формулировка «экспериментальный 2.5D-вид» и вытекающий из неё запрет на раскрытие способа активации в changelog) закрыта точно предписанной правкой: статус функции в тексте ТЗ теперь соответствует canonical-документам, вредная инструкция для release-артефакта убрана. Остальной текст ТЗ — все обязательные разделы §7.1, однозначность и доказуемость AC1–AC9, продуктовая история вопроса — не тронут и был полностью проверен в r1; новых расхождений правка не внесла.
Скоуп проверки (r2 — по дельте, PROCESS.md §2.10)
Раунд не первый, а дельта локальна: единственная находка r1 была точечной (два фрагмента текста), автор прямо заявил, что «поведенческий контракт не менялся», и это подтверждается сравнением полного текста ТЗ до/после. Поэтому разбор ограничен:
- Дельта текста issue между материалом r1 (цитаты в
SPEC-REVIEW-651-r1.md) и текущим телом issue — построчное сравнение обоих правленных фрагментов и полнотекстовый поиск оставшихся упоминаний «эксперимент»/«альфа». - Проверка, что правка не создала новую неоднозначность или противоречие с
docs/ISOMETRIC.md/docs/USER-GUIDE.ru.md/docs/STATUS.md. - Проверка, что ни один другой раздел ТЗ (сценарий, AC1–AC9, риски, откат, затронутые модули, технические предположения) не изменился по существу — т.е. что закрытие находки не стало поводом незаметно расширить или сузить контракт.
- Проверка состояния задачи (ветка, лейбл, гейты) на предмет несоответствий процессу.
Разделы, не задетые дельтой (полный список §7.1, доказуемость AC, продуктовая история эпика #644, существование артефактов тестов/perf-фикстур), не переразбираются — они унаследованы из r1 (раздел ниже).
Как проверялось
- Тело issue #651 получено через
gh issue view 651 --json body --repo Matysh/houseplan-card(MCPget_issue/get_issue_commentsне были разрешены пользователем в этой сессии — как и в r1, использованghCLI как эквивалентный путь к тому же публичному API). - Все комментарии issue получены через
gh issue view 651 --json comments; проверена цепочка: аналитика → ТЗ r1 → вердикт r1 (жёлтый) → правка автора → «Повторно передаю ТЗ на ревью» (последний комментарий, инициирующий r2). - Полнотекстовый
grep -i "эксперимент|альфа|alpha"по свежевыгруженному телу issue — 0 совпадений. - Построчное сравнение фрагментов п.1 «Пользовательский сценарий» и п.13 «Release-артефакты» с цитатами находки r1 (см. таблицу ниже).
- Сверка новой формулировки со статусом функции:
docs/ISOMETRIC.md:7-8(«Since Stage 6 (#649) the 2.5D View is a public mode»),docs/USER-GUIDE.ru.md:338-346(«Объёмный вид плана включает администратор один раз: Общие настройки → Отображение → Объёмный вид плана (2.5D)»),docs/STATUS.md:42-43. - Полный текст ТЗ (все 15 пунктов) перечитан целиком и сверен с изложением из
SPEC-REVIEW-651-r1.md— расхождений, кроме двух правленных фрагментов, не найдено. - Проверено состояние issue:
gh issue view 651 --json labels,state→S4-spec-review,open, меткиbug/P1/polish. Соответствует ожиданию для повторного захода на этом этапе. - Проверено, что ветка
issue/651-iso-device-layout-stabilityсуществует только на remote (git branch -a), локальный рабочий каталог — detached HEAD на общемdev(правки реализации на этом SHA отсутствуют, что и ожидаемо: на этапе spec кода ещё нет). - Гейты (
tsc/npm test/npm run build) не запускались — на этапе spec предмет ревью текст ТЗ, а не диффа кода; код по задаче ещё не написан (тот же вывод, что в r1). - Проверены строки подсистемы 2.5D/iso в
docs/reviews/INDEX.mdперед разбором (REVIEWER.md требование): история #160/#583/#649 подтверждает, чтоiso-overlays.ts/iso-scene-render.ts— зона с прежними находками именно по overlay-размещению (дублирующиеся формулы floor-anchor, непокрытый тестами grid-search fallback) — не меняет вердикт по тексту ТЗ, но подтверждает, что план автотестов (п.10) реалистично целится в подтверждённо хрупкое место.
Закрытие раунда r1
| Находка r1 | Чем закрыта | Где это видно |
|---|---|---|
| Medium: формулировка «экспериментальный 2.5D-вид» (п.1 «Пользовательский сценарий») противоречит публичному статусу функции после Stage 6 (#649) | Слово «экспериментальный» заменено на «публичный» | Тело issue #651, п.1: «…включает публичный 2.5D-вид, масштабирует и перемещает план…» (было: «включает экспериментальный 2.5D-вид…», дословная цитата из SPEC-REVIEW-651-r1.md) |
| Medium: инструкция «Не раскрывать способ включения экспериментальных функций» (п.13 «Release-артефакты») предписывала бы обеднить/обфусцировать публичную запись changelog | Инструкция убрана целиком; вместо неё — обычное требование к понятному пользователю тексту | Тело issue #651, п.13: «CHANGELOG.md и CHANGELOG.ru.md: понятное пользователю описание исправления дрейфа/распада раскладки значков в публичном 2.5D-режиме (User-Visible: yes)». Запрещающего предложения из r1 в тексте больше нет (подтверждено grep) |
Обе правки в точности соответствуют разделу «Чем закрывается» находки r1 и не расширяют и не сужают поведенческий контракт: слово «публичный» лишь исправляет статус функции, требование к changelog осталось про то же самое исправление, только без вредной инструкции.
Унаследовано из r1 (без повторной проверки по существу)
Документ: docs/reviews/SPEC-REVIEW-651-r1.md, вердикт жёлтый, материал — тело issue на SHA дерева a6750c5fd9b9b80f3a4f0f7b1642a5148c938b6f / issue body sha256 ea257bbcd4d329123e5400e69da0f9fb7460dfd29bcd0ddd2871e5e0a81b9e97. Принято без повторной проверки, т.к. соответствующий текст не изменился (подтверждено построчным сравнением в этом раунде):
- Наличие и полнота всех обязательных разделов §7.1 (сценарий, проблема, скоуп/не-скоуп, поведенческий контракт 5.1–5.5, UX, данные/миграция, i18n, AC1–AC9, план автотестов, риски, откат, release-артефакты, затронутые модули, технические предположения).
- Однозначность и доказуемость каждого AC1–AC9 — конкретный тестовый файл/тип проверки и наблюдаемый критерий у каждого.
- Соответствие
docs/SCOPE.md— задача чинит J1/J2/J3 в рамках исключения #89, новой модели/камеры/настройки/редактора не вводит. - Продуктовая история вопроса по первоисточнику (эпик #644, Q1/Q5) и обоснованность пересмотра деградации в §5.3.5–6/§15.5 (single-split fallback из #644 явно и корректно отменён более поздним требованием #651).
- Существование артефактов, на которые ссылаются AC и план автотестов:
resolveIsoOverlayPlacement,resolveIsoOverlayCollisions,buildIsoOverlayRenderScene(реальные экспорты), perf-бюджетыlarge-house-isometricиisometric-stage3-dense. - Отсутствие миграции/схемы и i18n-строк — верно для presentation-only фикса.
Что проверено и корректно (r2, сверх унаследованного)
- Оба правленных фрагмента (п.1, п.13) читаются однозначно и не создают новой неопределённости: «публичный 2.5D-вид» и «публичный 2.5D-режим» — согласованная терминология с остальным текстом ТЗ (везде далее по документу используется короткая форма «2.5D», например п.2, п.4, п.5.3.6, п.13 «докс/ISOMETRIC.md»), которая не расходится по существу с полным UI-именем из
docs/USER-GUIDE.ru.md(«Объёмный вид плана (2.5D)») — краткая форма используется как техническое сокращение внутри ТЗ, а не как новая пользовательская формулировка, вводящая читателя в заблуждение. - Никаких иных изменений в тексте ТЗ, кроме двух указанных фрагментов, не найдено: разделы 2–12, 14, 15 совпадают дословно с тем, что цитируется/пересказывается в
SPEC-REVIEW-651-r1.md. - Полнотекстовый поиск не находит оставшихся упоминаний «эксперимент»/«альфа» нигде в теле issue.
- Комментарии подтверждают корректный процессный путь: жёлтый вердикт r1 → точечная правка автором → явное заявление «поведенческий контракт не менялся» → «повторно передаю ТЗ на ревью» (лейбл
S4-spec-reviewсохранён, что и ожидается при возврате на этап spec).
Чего не проверял
- Не перепроверял по существу продуктовую историю вопроса (эпик #644, пересмотр деградации 5.3.5–6) — это было полностью разобрано в r1 и не задето дельтой; правка терминологии не связана с этим содержанием.
- Не запускал
tsc/npm test/npm run build— код по задаче ещё не написан (ветка содержит только правку тела issue, реализации нет), гейты этого этапа не касаются. - Не проверял вручную поведение в браузере — нет реализации, нечего запускать; это работа код-ревью следующего этапа.
- Не пересчитывал вручную sha256-нормализацию тела issue против якоря r1 (её генерирует конвейер при публикации, `#414``) — для целей этого раунда было достаточно прямого построчного сравнения текста, что и было сделано.
Комментарий в issue (для справки)
Вердикт: зелёный · заход r2 · блокирующих циклов 1/4 · High: 0 · Medium: 0
Единственная находка r1 (устаревшая формулировка «экспериментальный 2.5D-вид» + запрещающая инструкция для release-артефакта) закрыта точно предписанной правкой: п.1 теперь называет режим «публичным», п.13 больше не требует скрывать способ активации задокументированной публичной настройки. Остальной текст ТЗ не изменился и был полностью проверен в r1 (обязательные разделы §7.1, однозначность и доказуемость AC1–AC9, продуктовая история эпика #644) — повторно не переразбирался, дельта локальна. Задача готова к статусу «Готово к разработке».
Материал раунда
- Ветка:
issue/651-iso-device-layout-stability, коммит9d4f68a4eef9— ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. - Дерево материала:
d79af0adfcbc78eb8d8c97ab96b75c82fa89c5dcgit log --all --format='%H %T' | grep d79af0adfcbc - Тело issue:
699e063899bf674ad775879fc1a0c889489a2f90b14fde467497787cc8f69442 - Вердикт конвейера:
green· High 0