Files
2026-09-26 00:21:46 +00:00

17 KiB
Raw Permalink Blame History

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 была точечной (два фрагмента текста), автор прямо заявил, что «поведенческий контракт не менялся», и это подтверждается сравнением полного текста ТЗ до/после. Поэтому разбор ограничен:

  1. Дельта текста issue между материалом r1 (цитаты в SPEC-REVIEW-651-r1.md) и текущим телом issue — построчное сравнение обоих правленных фрагментов и полнотекстовый поиск оставшихся упоминаний «эксперимент»/«альфа».
  2. Проверка, что правка не создала новую неоднозначность или противоречие с docs/ISOMETRIC.md / docs/USER-GUIDE.ru.md / docs/STATUS.md.
  3. Проверка, что ни один другой раздел ТЗ (сценарий, AC1–AC9, риски, откат, затронутые модули, технические предположения) не изменился по существу — т.е. что закрытие находки не стало поводом незаметно расширить или сузить контракт.
  4. Проверка состояния задачи (ветка, лейбл, гейты) на предмет несоответствий процессу.

Разделы, не задетые дельтой (полный список §7.1, доказуемость AC, продуктовая история эпика #644, существование артефактов тестов/perf-фикстур), не переразбираются — они унаследованы из r1 (раздел ниже).

Как проверялось

  • Тело issue #651 получено через gh issue view 651 --json body --repo Matysh/houseplan-card (MCP get_issue/get_issue_comments не были разрешены пользователем в этой сессии — как и в r1, использован gh CLI как эквивалентный путь к тому же публичному 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 — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
  • Дерево материала: d79af0adfcbc78eb8d8c97ab96b75c82fa89c5dc
    git log --all --format='%H %T' | grep d79af0adfcbc
    
  • Тело issue: 699e063899bf674ad775879fc1a0c889489a2f90b14fde467497787cc8f69442
  • Вердикт конвейера: green · High 0