mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-29 03:09:36 +00:00
@@ -0,0 +1,139 @@
|
||||
# CODE-REVIEW-677-r1
|
||||
|
||||
**Issue:** #677 «Гигиена, волна 0 — секреты и приватная инфраструктура вон из публичных доков (эпик #674)»
|
||||
**Материал раунда:** `94712afb55249531cbbe835d322754a268a4920d` (рабочая копия проверена на этом SHA, `git diff` пуст, `git status` чист)
|
||||
**Заход:** r1 · блокирующих циклов израсходовано 0 из 4
|
||||
**Вердикт:** зелёный
|
||||
|
||||
> Ниже намеренно не цитируются значения удалённых секретов (пароль стенда,
|
||||
> имя SSH-ключа, хост/порт/IP домашнего инстанса и стенда) — по требованию
|
||||
> самого ТЗ («в комментариях задачи и ревью значения не цитировать»).
|
||||
> Проверка велась через `git grep` по этим токенам с подсчётом совпадений,
|
||||
> без вывода строк с находками.
|
||||
|
||||
## Скоуп
|
||||
|
||||
Единственный коммит `94712afb`, класс C (документация, `docs/**`), трейлеры
|
||||
`Issue: #677` / `User-Visible: no` на месте (доки не описывают продуктовое
|
||||
поведение — верно). Три файла, +8/−60:
|
||||
|
||||
- `docs/TESTING-DEMO.md:4` — учётные данные basic-auth dev-стенда убраны из
|
||||
строки про `dev.houseplan.tech`.
|
||||
- `docs/STATUS.md` — из строки `GitHub` убран хвост про SSH-ключ и место
|
||||
хранения PAT; строка `Home instance` удалена целиком; из строки
|
||||
`Demo stand` убраны хост-с-ключом, IP и ссылка на заметку памяти.
|
||||
- `docs/DEVELOPMENT.md` — разделы «Deployment to the dacha» (SSH, порт, путь
|
||||
конфигурации, curl-проверка) и «Production objects in HA» (имена
|
||||
дашборда/сущностей домашнего инстанса) удалены; вместо первого — три
|
||||
строки «Deployment» про самообновление через HACS. Дополнительно снят
|
||||
раздел «Environment (cowork sessions)» — не в исходном чек-листе ТЗ, см.
|
||||
находку L-1.
|
||||
|
||||
Это ровно объём эпика #674, волна 0 (без переписывания git-истории — решение
|
||||
эпика, зафиксированное отдельно и в этой задаче не пересматривается).
|
||||
|
||||
## Как проверялось
|
||||
|
||||
| Гейт | Статус | Как |
|
||||
|---|---|---|
|
||||
| `typecheck`, `npm test`, `npm run build` + `bundle-policy --verify` | не перегонялись повторно | Validate зелёный на этом же SHA `94712afb` (run 36333295924, ссылка дана в задаче ревью) — доверяю по правилу «дешёвые гейты уже подтверждены» |
|
||||
| `node scripts/check-docs.mjs --external --screenshots=warn` | прогнал сам | `Documentation checks passed (7 files, 12 external links)`, exit 0; diff не трогает `src/**`, так что этот гейт формально не обязателен по общему правилу REVIEWER.md, но назван самим ТЗ как способ доказательства — прогнал |
|
||||
| Отсутствие секретов в дереве (пароль стенда, имя SSH-ключа `ha_jb`, IP стенда, домен домашнего инстанса, `.git-credentials`) | прогнал сам | `git grep -c` по каждому токену (кроме `docs/reviews/`, `legacy/`) — везде 0 совпадений, кроме генерического порта `22222`, все 5 совпадений которого — тестовые фикстуры (`test/logic.test.mjs`, `test/space-reference-repair.test.mjs`, unproven-diff фикстура), не относящиеся к SSH |
|
||||
| Целостность ссылок/якорей на удалённые разделы | прогнал сам | `git grep` по заголовкам «Deployment to the dacha», «Production objects in HA», «Environment (cowork sessions)», «Home instance» — нигде в дереве, кроме самого `DEVELOPMENT.md` до правки, никто не ссылался; `check-docs.mjs` (`PUBLIC_DOCS`) эти три файла не покрывает вовсе (список — `README*`, `USER-GUIDE*`, `TOUCH-SUPPORT.md`, `DECOR-EDITOR.md`, `VACUUM.md`), поэтому доказательство целиком ручное, как и требует зависимость из ТЗ |
|
||||
| `test/release-gate.test.mjs:139-146` (раздел Release в `DEVELOPMENT.md` не задет) | прогнал сам (чтением) | раздел `## Release` остался на месте (`docs/DEVELOPMENT.md:517`), содержит все четыре фразы, которые матчит тест; diff их не касается |
|
||||
| Смоки, golden, pytest, invariants, performance | не прогонялись | diff не трогает ни `src/**`, ни `custom_components/**/*.py`, ни геометрию/её ссылки; ни один не назван в AC — неприменимо, а не пропущено |
|
||||
|
||||
## Проверка AC (по чтению, не исполнением — доменные доки, автотестов на прозу нет)
|
||||
|
||||
| AC | Чем доказан | Результат |
|
||||
|---|---|---|
|
||||
| `TESTING-DEMO.md:4` без пароля стенда | чтение файла + `git grep` по паролю (0 совпадений в дереве) | выполнено |
|
||||
| `STATUS.md:45/49/55` без ключа/PAT/хоста/порта/пути/IP | чтение файла + `git grep` по каждому токену (0 совпадений) | выполнено |
|
||||
| `DEVELOPMENT.md` без разделов «Deployment to the dacha» / «Production objects» | чтение файла — оба раздела отсутствуют, реальные позиции (`:766-772` для второго, а не заявленные в ТЗ `:736-741`) сам автор сверил и назвал расхождение — файл сдвинулся, не ошибка | выполнено |
|
||||
| Ссылки/якоря на другие документы не сломаны | `git grep` по заголовкам удалённых разделов вне `DEVELOPMENT.md` — пусто; `check-docs.mjs` зелёный | выполнено |
|
||||
| Раздел Release не задет | чтение `DEVELOPMENT.md:517-533`, совпадает с regex из `release-gate.test.mjs` | выполнено |
|
||||
| История git не переписывается | коммит только добавляет новый коммит поверх `dev`, `git log` линейный | выполнено |
|
||||
|
||||
Защитных AC (валидация/гард/лимит/отказ/инвариант) в этой задаче нет — это
|
||||
документная чистка, а не код с рантайм-поведением, поэтому таблица
|
||||
«AC · чем доказан · чем краснеет» не требуется.
|
||||
|
||||
## Находки
|
||||
|
||||
### L-1 (Low, принято ревьюером с записью) — раздел «Environment (cowork sessions)» снят сверх заявленного объёма ТЗ
|
||||
|
||||
**Файл:** `docs/DEVELOPMENT.md` (был `:20-40` в родителе коммита)
|
||||
**Что увидел:** ТЗ issue #677 в разделе «Не входит» прямо пишет: «Остальная
|
||||
чистка `STATUS.md`/`DEVELOPMENT.md` — волна 3» (issue #680). Раздел
|
||||
«Environment (cowork sessions)» не значился ни в одном из трёх пунктов
|
||||
объёма ТЗ, но был удалён этим же коммитом. `PROCESS.md` §12 явно запрещает
|
||||
«попутные правки „раз уж я здесь“».
|
||||
**Почему не блокирую:** мера смягчения покрывает риск целиком —
|
||||
1. содержимое раздела само по себе было секретом того же класса, что и
|
||||
цель эпика (имя SSH-ключа и место хранения PAT в исходном тексте, тот же
|
||||
класс, что STATUS.md/TESTING-DEMO.md) — то есть это не постороннее
|
||||
расширение скоупа, а найденный по пути **пропуск в самом ТЗ волны 0**;
|
||||
2. автор явно назвал это в комментарии «Сделано» отдельной строкой со
|
||||
словами «сверх объёма, из волны 3 (#680)»;
|
||||
3. issue #680 (следующая волна того же эпика) уже правлен: пункт
|
||||
«Environment (cowork)» там вычеркнут с явной ссылкой `— снят волной 0
|
||||
(#677, <SHA ветки>)` — дублирования работы не будет, эпик согласован.
|
||||
|
||||
Итог: реальный вред отсутствует, раскрытие полное, смежный issue
|
||||
синхронизирован. Понижаю до Low и снимаю без возврата автору; фиксирую как
|
||||
прецедент для будущих ревью этого эпика — если подобное повторится в
|
||||
следующих волнах без такой же явной сверки, это уже Medium.
|
||||
|
||||
## Что проверено и корректно
|
||||
|
||||
- Все три пункта объёма ТЗ (`TESTING-DEMO.md:4`, `STATUS.md:45/49/55`,
|
||||
`DEVELOPMENT.md` deployment/production-objects) выполнены полностью,
|
||||
секреты в дереве отсутствуют (кроме git-истории, что явно вне скоупа
|
||||
эпика).
|
||||
- Новый раздел «Deployment» в `DEVELOPMENT.md` не противоречит `PROCESS.md`
|
||||
§12 (не описывает ручное копирование) и остаётся информативным
|
||||
(HACS-по-тегу, авто-деплой закрытого стенда).
|
||||
- Формулировка `TESTING-DEMO.md:4` не потеряла смысл строки (закрытый
|
||||
стенд, доступ у владельца, тот же demo/demo дальше) — читатель документа
|
||||
не теряет ориентир, что дев-стенд существует и защищён.
|
||||
- Прозе `STATUS.md` после правок читается связно, без оборванных
|
||||
предложений или висящих ссылок.
|
||||
- Единственный оставшийся в дереве путь `/mnt/data/supervisor/homeassistant`
|
||||
(`demo/stand/install.sh:4`) — стандартный путь конфигурации HAOS в
|
||||
usage-примере скрипта, а не адрес доступа к чьему-то инстансу; не секрет.
|
||||
- Трейлеры коммита корректны: `Issue: #677`, `User-Visible: no` (не
|
||||
продуктовое изменение), класс C.
|
||||
- `git diff origin/dev...HEAD` = ровно этот один коммит, ничего лишнего в
|
||||
диапазоне материала.
|
||||
|
||||
## Чего не проверял
|
||||
|
||||
- Полные `typecheck` / `npm test` / `npm run build` / `bundle:release` +
|
||||
сверку трёх копий бандла — не перегонял, они уже зелёные на этом же SHA
|
||||
(Validate run 36333295924, ссылка в описании раунда); diff их не
|
||||
затрагивает (только `docs/**`).
|
||||
- Браузерные смоки, `golden:verify`, `pytest tests_backend`,
|
||||
`npm run invariants` — не прогонял: diff не касается `src/**`,
|
||||
`custom_components/**/*.py` ни геометрии; ни один из них не назван в AC
|
||||
задачи. `smoke-select.mjs` не запускал по той же причине (нет изменений в
|
||||
поверхностях, которые он матчит).
|
||||
- Смену пароля basic-auth на dev-стенде и подтверждение владельца — это вне
|
||||
код-ревью по определению ТЗ (отдельное подтверждение в issue, статус
|
||||
`blocked` до него); не блокирует зелёный вердикт кода.
|
||||
- Полный текст `docs/reviews/` и `legacy/` на предмет тех же секретов — вне
|
||||
скоупа (git-историю эпик решил не переписывать; `docs/reviews/**` —
|
||||
архив прошлых ревью, туда эта задача не лезет).
|
||||
|
||||
---
|
||||
|
||||
<!-- material-anchors: сгенерировано конвейером (#414) -->
|
||||
|
||||
## Материал раунда
|
||||
|
||||
- Ветка: `issue/677-hygiene-wave0`, коммит `94712afb5524` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
|
||||
- Дерево материала: `3cc1fd568d38e2e4759e13c02ac7be9c02c2ced5`
|
||||
```
|
||||
git log --all --format='%H %T' | grep 3cc1fd568d38
|
||||
```
|
||||
- Тело issue: `dc094a81871219380544d0cd43d49c2458165bc6b9f16bebc265c1751d85d4ba`
|
||||
- Вердикт конвейера: `green` · High 0
|
||||
Reference in New Issue
Block a user