14 KiB
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 явно запрещает
«попутные правки „раз уж я здесь“».
Почему не блокирую: мера смягчения покрывает риск целиком —
- содержимое раздела само по себе было секретом того же класса, что и цель эпика (имя SSH-ключа и место хранения PAT в исходном тексте, тот же класс, что STATUS.md/TESTING-DEMO.md) — то есть это не постороннее расширение скоупа, а найденный по пути пропуск в самом ТЗ волны 0;
- автор явно назвал это в комментарии «Сделано» отдельной строкой со словами «сверх объёма, из волны 3 (#680)»;
- issue #680 (следующая волна того же эпика) уже правлен: пункт
«Environment (cowork)» там вычеркнут с явной ссылкой
— снят волной 0 (#677, <SHA ветки>)— дублирования работы не будет, эпик согласован.
Итог: реальный вред отсутствует, раскрытие полное, смежный issue синхронизирован. Понижаю до Low и снимаю без возврата автору; фиксирую как прецедент для будущих ревью этого эпика — если подобное повторится в следующих волнах без такой же явной сверки, это уже Medium.
Что проверено и корректно
- Все три пункта объёма ТЗ (
TESTING-DEMO.md:4,STATUS.md:45/49/55,DEVELOPMENT.mddeployment/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/**— архив прошлых ревью, туда эта задача не лезет).
Материал раунда
- Ветка:
issue/677-hygiene-wave0, коммит94712afb5524— ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. - Дерево материала:
3cc1fd568d38e2e4759e13c02ac7be9c02c2ced5git log --all --format='%H %T' | grep 3cc1fd568d38 - Тело issue:
dc094a81871219380544d0cd43d49c2458165bc6b9f16bebc265c1751d85d4ba - Вердикт конвейера:
green· High 0