Files
houseplan-card/docs/reviews/CODE-REVIEW-448-r2.md
T
2026-09-04 14:00:07 +00:00

13 KiB

CODE-REVIEW-448-r2

  • Issue: #448
  • Материал: git diff 658f284b..HEAD (докоммиты ed4ac972), плюс наследуемый диапазон r1 origin/dev..658f284b
  • SHA материала: ed4ac972b3784a0120710e81f3392907709fb5dc (сверено git rev-parse HEAD перед выводом)
  • Заход: r2 (код-ревью) · блокирующих циклов израсходовано 1 из 4 — r1 был жёлтым (тратит бюджет), это ревью зелёное и цикла не образует (§4, #227)
  • Вердикт: зелёный

Скоуп раунда

Разбор по дельте (PROCESS.md §2.9/2.10): r1 (docs/reviews/CODE-REVIEW-448-r1.md, SHA 658f284b) вернул жёлтый вердикт с двумя Medium в скоупе. Автор ответил единственным коммитом:

  • ed4ac972 — docs: close alpha review findings (Issue: #448, User-Visible: no) — правит docs/RELEASE-NOTES.md и AGENTS.md, плюс кладёт в дерево docs/reviews/CODE-REVIEW-448-r1.md (артефакт публикации r1, не предмет этого раунда).

Класс изменения — C (документация): ни один файл класса A (src/**, custom_components/houseplan/**/*.py, manifest.json, hacs.json, i18n) и класса B (тесты/скрипты/CI) не тронут. git diff 658f284b..HEAD --stat подтверждает: только AGENTS.md, docs/RELEASE-NOTES.md и добавление docs/reviews/CODE-REVIEW-448-r1.md. Продуктовый код, тесты и бандл, зелёные в r1, дельтой не задеты — Validate на ed4ac972 зелёный (см. вводные условия раунда), пересобирать и перегонять typecheck/test/build не требуется: диф не трогает src/**, test/**, scripts/**.

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

Находка r1 Чем закрыта Где это видно
M1 — docs/RELEASE-NOTES.md молча потерял пункт #447 в обеих языковых секциях (заменён пунктом #448 вместо добавления) Пункт #447 возвращён в обе секции; чтобы удержать лимит «не более четырёх пунктов» (проверяется validateReleaseNotes из scripts/release-contract.mjs, тест test/release-contract.test.mjs:111 — /at most four bullets/), #152 и #447 объединены в один пункт с деталями обеих задач и обеими ссылками git diff 658f284b..HEAD -- docs/RELEASE-NOTES.md: RU-секция «## Основное» и EN-секция «## Highlights» — по 4 пункта каждая, [#152](...) и [#447](...) присутствуют в обеих; grep -n '#447' docs/RELEASE-NOTES.md → 2 совпадения (RU+EN)
M2 — AGENTS.md §«Labs flags» не обновлён: описывал активацию ?hp-labs=<id>/-<id>/off и обязательные since/expires, которых в контракте hp_alpha больше нет Раздел переименован в «Alpha experiments», текст переписан под единый hp_alpha=1/0 (query/hash, persisted), явно называет отсутствие per-feature ключей и since/expires, фиксирует, что legacy hp-labs/houseplan_card_labs_v1 игнорируются и не мигрируются git diff 658f284b..HEAD -- AGENTS.md (строки 402-416); чтением сверено с фактическим LabsFlag в src/labs.ts (лишён since/expires уже в 169fed01, дельта этого раунда код не трогает) — текст раздела теперь соответствует коду

Обе находки r1 были Medium в скоупе задачи — по PROCESS.md §2.7/§4 отдельный issue не заводился, чинились в этой же задаче; здесь подтверждено предметно, а не по заявлению автора.

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

Без повторной проверки — документ docs/reviews/CODE-REVIEW-448-r1.md, материал SHA 658f284b44610fbb583cc795e12a3b4fae798f9c (дерево 417fc35379c08ddc060ba43fd37e6c5b835d6446):

  • Все 13 AC (AC1–AC13), включая три защитных (AC4, AC6, AC9) и таблицу «чем краснеет» — дельта этого раунда не трогает src/labs.ts, src/houseplan-card.ts ни один тестовый/smoke/golden-файл, поэтому доказательства AC не могли быть задеты.
  • Гейты r1: npx tsc --noEmit, npm test (1907/1908, 1 skipped), npm run build + побайтовая сверка dist↔custom_components/houseplan/frontend, bundle-tree.mjs, bundle:sync, no-new-any.mjs, check-docs.mjs, bundle:budget, 10 прямых smoke-совпадений + smoke_isometric_contract/smoke_isometric_live_touch, npm run golden:verify (157/157, включая 7 isometric-сценариев) — все зелёные на 658f284b, дельта их не инвалидирует (docs-only diff вне src/**/test/**).
  • Раздел «Что проверено и корректно» r1 (precedence резолвера, единственный источник LabsSnapshot.alpha→active, kiosk/редакторы без проекции, регрессионный барьер golden-harness, запрет legacy-полей в матрице контрактным тестом, changelog RU+EN в том же коммите 169fed01).
  • Раздел «Чего не проверял» r1 (benchmark:large-house-isometric не запускался — тяжёлый гейт вне минимума; pytest tests_backend не запускался — Python не тронут; model-invariants.mjs не запускался — геометрия/layout/marker.space/open_spans не тронуты; 209/221 смоков не относятся к диффу; AC12 доказан только чтением).

Как проверялось в этом раунде — гейты

Гейт Команда Результат
Дешёвые гейты (typecheck/test/build) не перегонялись Validate зелёный на точном SHA ed4ac972 (ссылка на прогон дана как условие раунда); диф этого раунда не трогает src/**/test/**/scripts/**, перегонять нечего
node scripts/check-docs.mjs автор: node scripts/check-docs.mjs → Documentation checks passed (коммит ed4ac972) pass — не обязателен для этого раунда (diff не трогает src/**), но выполнен автором и подтверждён
node --test test/release-contract.test.mjs автор: 10/10 pass подтверждает контракт validateReleaseNotes (маркер тега, RU/EN эквивалентность, лимит 4 пунктов) на синтетической фикстуре теста, не на самом docs/RELEASE-NOTES.md — фактический файл сверен ревьюером вручную (см. ниже)
Ручная сверка docs/RELEASE-NOTES.md sed -n '1,40p' docs/RELEASE-NOTES.md, grep -n '#447' RU и EN секции — по 4 пункта, #447 присутствует в обеих, RU/EN списки эквивалентны по числу пунктов, маркер тега <!-- release: v1.72.0-beta.1 --> и ссылки на CHANGELOG не изменены
Ручная сверка AGENTS.md git diff 658f284b..HEAD -- AGENTS.md, grep по всему дереву на якорь Labs flags/#labs-flags новый текст не содержит устаревших since/expires/?hp-labs; ссылок на старый заголовок раздела из активных (не-исторических) документов не найдено — только в замороженных ревью SPEC-REVIEW-203-* (исторический артефакт другой задачи, не правится)
Smoke/golden/backend/invariants не перегонялись не относятся к дельте — дельта не содержит кода, геометрии, Python или визуальных изменений

Защитных AC в дельте этого раунда нет (M1/M2 — не защитные находки: несоответствие текста документации фактическому контракту, не guard/limit/invariant), таблица «чем краснеет» не требуется по исключению PROCESS.md §2.7.

Находки

Не найдено. High: 0, Medium: 0, Low: 0.

Что проверено и корректно

  • Обе находки r1 закрыты по существу, а не текстуально: M1 — числовое ограничение «не более четырёх пунктов» (тест release-contract.test.mjs:111) соблюдено объединением, а не удалением содержимого; #447 не потерялся дважды. M2 — раздел AGENTS.md теперь описывает ровно тот контракт, что в коде (hp_alpha, отсутствие since/expires, non-migration legacy).
  • Дельта не расширяет скоуп задачи (PROCESS.md §2.6): оба файла были прямо названы находками r1, новых поверхностей не появилось.
  • Трейлеры коммита ed4ac972: Issue: #448, User-Visible: no — корректно для чисто документационной правки без нового пользовательского поведения.
  • RU/EN версии RELEASE-NOTES.md остаются симметричными по структуре и содержанию (одно и то же объединение #152+#447 сделано в обеих секциях).

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

  • Не перегонял tsc --noEmit, npm test, npm run build — дельта раунда docs-only, вне src/**/test/**, а Validate уже зелёный на точном SHA ed4ac972 (условие раунда). Это решение по дельте (§2.10), а не пропуск.
  • Не перегонял smoke/golden/backend/model-invariants — ни один не относится к дельте (без кода, геометрии, Python, визуальных изменений); полные наборы — предрелизный гейт (§8), не гейт ревью.
  • Не проверял фактическое поведение npm run release:prerelease (генерация тела релиза из RELEASE-NOTES.md) — тег v1.72.0-beta.1 ещё не опубликован, это отдельный релизный шаг вне код-ревью.

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

  • SHA: ed4ac972b3784a0120710e81f3392907709fb5dc (сверено git rev-parse HEAD непосредственно перед выводом вердикта)
  • Диапазон дельты: 658f284b..HEAD, 1 коммит (ed4ac972)
  • Дерево: b55955d59283a59ecb751673f9d5d29094b7bc11
    git log --all --format='%H %T' | grep b55955d59283
    
  • Унаследованный материал r1: SHA 658f284b44610fbb583cc795e12a3b4fae798f9c, дерево 417fc35379c08ddc060ba43fd37e6c5b835d6446, документ docs/reviews/CODE-REVIEW-448-r1.md

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

  • Ветка: issue/448-alpha-switch, коммит ed4ac972b378 — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
  • Дерево материала: b55955d59283a59ecb751673f9d5d29094b7bc11
    git log --all --format='%H %T' | grep b55955d59283
    
  • ТЗ docs/specs/448-alpha-switch.md, блоб 951eaa1266d5845a7674a8ef61950cd78b8e140b
    git log --all --find-object=951eaa1266d5845a7674a8ef61950cd78b8e140b -- docs/specs/448-alpha-switch.md