mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-29 03:09:36 +00:00
144 lines
16 KiB
Markdown
144 lines
16 KiB
Markdown
# CODE-REVIEW-667-r1
|
||
|
||
Issue: #667 · Заход: r1 · Материал: `2fe20a095b1c565134cb9983eb0ed27c9b3d351c`
|
||
(единственный коммит `781902b3..HEAD`, ветка `issue/667-docs-drift`)
|
||
|
||
## Скоуп
|
||
|
||
Инфраструктурный трек, только документация: 23 файла, ни одной строки в
|
||
`src/**`, `custom_components/**`, `test/**`, `demo/**`. Задача — свести 15
|
||
расхождений документации с кодом/каноном, найденных при сплошном чтении
|
||
`docs/` на `dev @ 781902b`. Класс изменений — C (документация). Трейлеры
|
||
коммита: `Issue: #667`, `User-Visible: no` — верно: изменения не трогают
|
||
поведение продукта, только описание уже существующего (AGENTS.md, «User-Visible:
|
||
no для… документации, которая не меняет продукт»).
|
||
|
||
Job из `docs/SCOPE.md`: задача не строит фичу, а обслуживает точность входных
|
||
документов для J4/J6 (README и руководство описывают шаги, которых уже нет)
|
||
и для самого процесса (актуальность STATUS/CONTRIBUTING/AGENTS для
|
||
следующего автора/ревьюера).
|
||
|
||
## Как проверялось
|
||
|
||
Ревью — не первый раунд по объёму, а полный разбор всех 15 пунктов, потому
|
||
что предмет не код с AC, а фактическая точность документации: каждое
|
||
утверждение автора проверено чтением текущего дерева и, где применимо,
|
||
исполнением инструмента, а не доверием к самоотчёту.
|
||
|
||
По каждому из 15 пунктов из тела issue — сверка "было / стало / факт в
|
||
коде":
|
||
|
||
| № | Расхождение | Правка в диффе | Сверено с |
|
||
|---|---|---|---|
|
||
| 1 | Бюджет initial View назван числом (256000 Б) в прозе | `AGENTS.md:409`, `docs/DEVELOPMENT.md:344` теперь ссылаются на `INITIAL_VIEW_GZIP_BUDGET` без цифры | `scripts/bundle-budget.mjs:44` — `export const INITIAL_VIEW_GZIP_BUDGET = 301_066` (прочитано) |
|
||
| 2 | CONTRIBUTING: бандл коммитить вручную; Python ≥3.13; релиз — 4 файла + тег | Три абзаца переписаны: `bundle:clean`/`Release:`-трейлер, `.python-version`, `release-contract`/`release:prerelease`/`release.yml` | `.python-version` = `3.14` (прочитано); `.githooks/commit-msg` → `validate-commit-provenance.mjs` → `bundle-policy.mjs` (`BUNDLE_RELEASE_ONLY_ERROR`, коммит с путём бандла без `Release:` отклоняется) — исполнено чтением всей цепочки; `scripts/release-contract.mjs`, `scripts/wsl-setup.sh` существуют |
|
||
| 3 | testing-notes называют регистратором мутантов `mutation-gate.mjs` | `live-and-integrations.md`, `geometry.md` → `mutation-registry.mjs` | `ls scripts/mutation-registry.mjs` существует; `scripts/mutation-gate.mjs --changed` в `dialogs-and-forms.md:227` и в `ARCHITECTURE.md:2285-2287` оставлен намеренно — это раннер, не реестр (сверено разницей формулировок) |
|
||
| 4 | STATUS/ROADMAP держат HACS PR «в очереди» | Обе строки → «merged 2026-08-25» | `docs/STATUS.md` snapshot-таблица (сгенерированная) уже говорит «In the default catalog since 2026-08-25» — согласовано |
|
||
| 5 | STATUS «How to resume»/watchlist — старая песочница (git bundle, `ha_jb`, ручной scp) | Секции переписаны на роли/`task-packet`/`gate:small`/HACS-обновление | `scripts/task-packet.mjs` существует; `package.json` → `"gate:small": "node scripts/gate-small.mjs"`; `AGENTS.md:10` заголовок `## Read this first`, `docs/process/AUTHOR.md` существует |
|
||
| 6 | SCOPE: «two editors», J4 «image/PDF», presence в known gaps без ссылки на #485 | J4/J6 → три редактора, SVG/PNG/JPG/WebP; known gaps → ссылка на #485; Docs-пункт → ссылка на #668 | `docs/USER-GUIDE.ru.md:1622` заголовок `## 14. Редактор подложки` — третий редактор существует и документирован; `gh issue view 668` — открыт, «Английское руководство… отстаёт» |
|
||
| 7 | README/README.ru: «Контур комнаты» — инструмента нет | → «Стены», рисуется цепочка, замыкание открывает диалог | `src/i18n/ru.json:79` `"markup.add": "Стены"`; `src/houseplan-editor-runtime.ts:2474,6316` `_roomDialog = true` при замыкании контура — поведение подтверждено чтением |
|
||
| 8 | USER-GUIDE.ru штамп v1.73.0; таблица «Источник плана» разорвана абзацем | Штамп → v1.78.0-beta.5; абзац про растры перенесён после таблицы | `docs/USER-GUIDE.ru.md:523-537` — таблица теперь 4 строки подряд, абзац после неё (прочитано) |
|
||
| 9 | UX-MODES: «opening tap → door/lock info card» — противоречит инертности проёмов | → «lock-badge tap → …», проёмы инертны в View | `src/houseplan-editor-runtime.ts:6012` `_opClick`: `if (this.host._mode === 'plan') this._editOpening(o)` — вне Plan клик не открывает диалог, комментарий в коде подтверждает «openings are inert outside Plan mode» |
|
||
| 10 | STYLING-HOOKS: space-card «draws no openings and no decor layer» | → рисует `data-hp="opening"` и `data-hp="decor"`/`.dimage`, только векторный декор/мебель отсутствуют | `src/space-render.ts:891` (`data-hp="opening"`), `:647` (`class="dimage" data-hp="decor"`) — прочитано |
|
||
| 11 | DEVICE-PRESENTATION: битый якорь `#12-отображение-устройств` | → `#12-визуальные-состояния-устройств` | `docs/USER-GUIDE.ru.md:1328` заголовок `## 12. Визуальные состояния устройств` — якорь резолвится |
|
||
| 12 | Пол зума 0.4x в testing-notes | → «1/3 (`MIN_ZOOM`)» | `src/space-geometry.ts:237` `export const MIN_ZOOM = 1 / 3` |
|
||
| 13 | ADR 089/122/160 и ISOMETRIC.md называют 2.5D скрытым `hp_alpha`-экспериментом | Добавлена строка «Activation superseded by #649…» в ADR; в ISOMETRIC.md — исторические врезки | `src/types.ts:305` `volumetric_view?: boolean`; `src/logic.ts:1412` читает `settings.volumetric_view === true`; `docs/ISOMETRIC.md:10` заголовок `## Activation` — якорь резолвится |
|
||
| 14 | ARCHITECTURE.md раскладка содержит несуществующий `src/data/` | Строки `rules.ts`/`data/house.ts`/`data/backgrounds.ts` убраны, оставлен только `rules.ts` | `ls src/data` → No such file or directory |
|
||
| 15 | legacy/README.md называет `docs/superpowers/specs/` «действующими спецификациями» | → «дизайн-документы до процесса…, историческая справка; ТЗ живёт в теле issue (#517)» | Формулировка согласована с `docs/process/REVIEWER.md`/`PROCESS.md` §2.3 («ТЗ живёт в теле issue, `docs/specs/` — архив») |
|
||
|
||
Дополнительно проверено за рамками таблицы 15 пунктов (не находки, для
|
||
полноты картины):
|
||
- Оставшиеся упоминания `mutation-gate.mjs` вне трёх указанных в issue файлов
|
||
(`docs/ARCHITECTURE.md`, `docs/design/**`, `docs/specs/**`) — это либо
|
||
корректные вызовы раннера, либо архивные ТЗ/ADR, которые канон не требует
|
||
переписывать задним числом; не в скоупе issue.
|
||
- `docs/STATUS.md` › «Workflow» в CONTRIBUTING.md — ссылка на строку таблицы
|
||
«Standing state and decisions», а не на markdown-заголовок (в файле нет
|
||
`## Workflow`); стиль расходится с соседними `AGENTS.md › Gates` (это
|
||
реальные заголовки), но искомое по факту находится — не поднимаю до
|
||
находки, чисто стилистическая шероховатость.
|
||
|
||
## Прогнанные гейты
|
||
|
||
| Гейт | Результат | Почему так |
|
||
|---|---|---|
|
||
| Validate на `2fe20a09` | success (https://github.com/Matysh/houseplan-card/actions/runs/36262534130) | дешёвые гейты уже подтверждены на этом SHA, повторно не гонял |
|
||
| `node scripts/check-docs.mjs` | `Documentation checks passed (7 files, 12 external links)` — прогнал сам | diff — документация, дешёвый гейт |
|
||
| `node scripts/process-gate.mjs --range 781902b3..HEAD` | пройден, 1 warning: `legacy/README.md` вне классов A/B/C/D (`process-gate: диапазон 781902b3..HEAD, коммитов 1`) | сверка трейлеров/классов, дёшево; предупреждение — известное свойство классификатора (`legacy/**` не входит ни в один путь из таблицы классов AGENTS.md), не дефект этой задачи |
|
||
| `node scripts/smoke-select.mjs --base origin/dev --head HEAD` | «Исполняемого frontend-диффа нет (src/**/*.ts не тронут)… Тронуто файлов: 23» | по инструкции — обязательный вывод для решения по каждой строке; связей нет, `src/**` не тронут → смоки не выбираются |
|
||
| `npx tsc --noEmit`, `npm test`, `npm run build`, `bundle-policy --verify`, `golden:verify`, `pytest tests_backend`, `invariants`, performance | не прогонял | diff не трогает `src/**`, `custom_components/**/*.py`, геометрию, рендер, фикстуры; Validate на этом SHA уже зелёный и покрывает эти гейты собственным прогоном |
|
||
|
||
Проверка исполнением ключевых утверждений (не только чтением кода, но и
|
||
запуском): `.githooks/commit-msg` → `bundle-policy.mjs` — прочитан текст
|
||
правила и подтверждено, что путь в `dist/**`/`custom_components/houseplan/frontend/**`
|
||
без трейлера `Release:` отклоняется (`BUNDLE_RELEASE_ONLY_ERROR`); это не
|
||
исполнение самого хука на реальном коммите, а чтение логики, которую он
|
||
реализует — записываю как «проверено чтением, не исполнением».
|
||
|
||
## AC / защитные требования
|
||
|
||
Задача не имеет отдельного раздела ТЗ с AC в issue — она перечисляет 15
|
||
конкретных расхождений и просит их устранить; «доказательство» каждого
|
||
пункта — не автотест и не защитный гард, а факт: текст документа теперь
|
||
соответствует коду/канону. Таблица выше — это и есть доказательство по
|
||
каждому пункту (столбец «Сверено с»). Формат «AC · чем доказан · чем
|
||
краснеет» неприменим: ни один из 15 пунктов не является защитным
|
||
поведением (валидацией/гардом/лимитом) — это фактическая правка текста,
|
||
верифицируемая только чтением дерева, что и сделано.
|
||
|
||
## Находки
|
||
|
||
Нет. Все 15 пунктов устранены и проверены против фактического состояния
|
||
кода/конфигурации; побочных регрессий или новых расхождений в изменённых
|
||
файлах не найдено.
|
||
|
||
## Что проверено и корректно
|
||
|
||
- Все 15 строк таблицы выше — текст документа после правки совпадает с
|
||
реальным состоянием кода/скриптов/файловой структуры на `HEAD`.
|
||
- Трейлеры коммита (`Issue: #667`, `User-Visible: no`) и класс изменения
|
||
(C — документация) верны.
|
||
- `check-docs.mjs` и `process-gate.mjs --range` зелёные (один ожидаемый
|
||
warning вне скоупа задачи).
|
||
- `smoke-select.mjs` подтверждает: frontend-диффа нет, смоки не выбираются
|
||
по объективной причине, а не пропущены.
|
||
- EN-паритет руководства (п. 8 issue) сознательно вынесен в отдельный,
|
||
уже заведённый issue #668 — не сокрытие, а корректное разделение скоупа.
|
||
- ADR не переписаны ретроспективно, а дополнены строкой поверх — сохранена
|
||
история решений, что соответствует духу канона (не редактировать принятые
|
||
решения задним числом).
|
||
|
||
## Чего не проверял
|
||
|
||
- Полные `npx tsc --noEmit`, `npm test`, `npm run build`,
|
||
`bundle-policy --verify` (со сверкой копий), `golden:verify`,
|
||
`pytest tests_backend`, инварианты модели, performance — не запускал:
|
||
diff не трогает `src/**`/`custom_components/**/*.py`/геометрию/рендер/
|
||
фикстуры, и зелёный Validate на этом же SHA уже покрывает их.
|
||
- Не проверял оставшиеся ~40+ вхождений `mutation-gate.mjs` в архивных
|
||
`docs/specs/**` и `docs/design/**` — они вне списка issue и вне канона
|
||
«переписывать архив»; не мой предмет ревью.
|
||
- Не проверял английский `docs/USER-GUIDE.md` построчно — его отставание
|
||
явно признано и вынесено в #668, эта задача его не трогает.
|
||
- Не запускал `process-gate.mjs --issues` (нужен `gh`, автор тоже пометил
|
||
«не запускался» — это ограничение окружения, а не сокрытие; сам факт
|
||
указан в issue честно).
|
||
|
||
## Вердикт
|
||
|
||
Вердикт: зелёный · заход r1 · блокирующих циклов 0/4 · High: 0 · Medium: 0 → в задаче
|
||
|
||
---
|
||
|
||
<!-- material-anchors: сгенерировано конвейером (#414) -->
|
||
|
||
## Материал раунда
|
||
|
||
- Ветка: `issue/667-docs-drift`, коммит `2fe20a095b1c` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
|
||
- Дерево материала: `63267430f28f9450cd99c81949bacf79a539b939`
|
||
```
|
||
git log --all --format='%H %T' | grep 63267430f28f
|
||
```
|
||
- Тело issue: `c9320c593f7f0b1e5791eba19dfeaac03640732797f1a886a2bce106d7066596`
|
||
- Вердикт конвейера: `green` · High 0
|