docs: review document for #730

Issue: #730
User-Visible: no
This commit is contained in:
claude[bot]
2026-10-01 07:48:37 +03:00
committed by Claude
parent 0ab685e380
commit 53bb3bf453
+93
View File
@@ -0,0 +1,93 @@
# CODE-REVIEW #730 · заход r3
**Материал**: `85d7c6fa63c84eb04607f259125479caf8a267ff` (рабочая копия на этом SHA; `git diff origin/dev...HEAD` / `git log --oneline origin/dev..HEAD`).
Трек: `show`. Дешёвые гейты (`tsc --noEmit`, `npm test`, `npm run build` со сверкой бандла) подтверждены зелёным Validate на этом SHA: https://github.com/Matysh/houseplan-card/actions/runs/36808169875 — не перегонялись. Ветка не приводилась к `dev` отдельной командой ревью (трек `show`, #696): `dev` впереди на 1 коммит(ов) (`b3dd9444`, тест daycycle, не пересекается с этой задачей), слияние без конфликта.
## Скоуп
r2 (`3808e6f9`) получил зелёный вердикт — AC1–AC3 выполнены, находка r1 закрыта. Зелёный вердикт бюджет §4 не тратит и цикла не образует (#227): «блокирующих циклов израсходовано 0 из 2» в заходе r3 корректно.
Между r2 и r3 материал не менялся по содержанию: пайплайн не смог опубликовать документ ревью/выполнить слияние, потому что токен конвейера не вправе публиковать правку `.github/workflows/*` (это ровно тот случай `workflow`, который сама задача #730 учит страж ребейза распознавать) — страж ребейза корректно отправил задачу обратно автору с текстом «ребейз и push делает автор» (комментарий автора 2026-10-01T02:13:36Z). Автор сделал ребейз сам и запушил `85d7c6fa` поверх актуального `dev` (`52dc08a0`). Это уже само по себе — живое, непланируемое подтверждение того, что фикс r1/r2 (AC2: сводка стража ребейза для исхода `workflow`) работает верно на практике, а не только в тестах.
Дифф `origin/dev...HEAD` (файлы и число строк) идентичен дифу, который разбирали r1 и r2: `.github/workflows/_beta-derived.yml` (17), `_process.yml` (5), `_ship-review.yml` (36), `PROCESS.md` (8), `scripts/merge-candidate.mjs` (12), `test/publish-push-refusal.test.mjs` (217), `test/rebase-generated.test.mjs` (18), плюс архивные документы `docs/reviews/CODE-REVIEW-730-r1.md` и `-r2.md`. Delta r2→r3 — только перенос тех же коммитов на новую базу `dev`; содержимое патчей не изменилось (см. «Как проверялось», п.2–3).
## Как проверялось
1. Прочитано тело issue #730 и все комментарии, включая отказ пайплайна, самостоятельный ребейз автора и итог («Конфликтов не было. Коммиты r1/r2 и оба документа ревью перенесены без изменений»).
2. Сверен состав коммитов текущей ветки (`git log --oneline origin/dev..HEAD`): `bd99c09f` (содержимое r1), `a5854674` (публикация документа r1), `23db2881` (содержимое r2 — правка `refusalSummary` для исхода `workflow`), `85d7c6fa` (публикация документа r2). `git show bd99c09f`/`23db2881` построчно сверены с текстами, которые разбирали документы r1/r2 — содержимое коммитов не изменилось, изменились только SHA и родитель (следствие ребейза).
3. `git diff origin/dev...HEAD --stat` даёт ровно тот же список файлов и те же числа строк, что документ r1 цитирует как материал (п.14 документа r1) — подтверждает, что ребейз не внёс и не потерял изменений.
4. Прочитан текущий код `refusalSummary` (`scripts/merge-candidate.mjs:534-556`) — ветка `nextStep` для исхода `workflow` отдельно от общего случая на месте, текст совпадает с тем, что проверял r2.
5. Прочитаны новые тестовые ассерты `test/publish-push-refusal.test.mjs:564-571` (`#730 r1: …`) — у теста есть и позитивная, и негативная проверка (`assert.doesNotMatch(workflow, /ребейз не помогут/)` и `assert.doesNotMatch(remote, /ребейз и push делает автор/)`), то есть тест умеет отличить старый текст от нового в обе стороны, не только фиксирует новую фразу.
6. Прогнаны все три связанных тест-файла на материале `85d7c6fa` напрямую (не только со слов автора): `node --test test/publish-push-refusal.test.mjs test/rebase-generated.test.mjs test/merge-candidate.test.mjs` → 76/76 pass, 0 fail — совпадает с заявлением автора о прогоне после ребейза.
7. Проверено отсутствие маркеров конфликта (`<<<<<<<`/`=======`/`>>>>>>>`) по всему дереву — пусто, ребейз прошёл чисто, как и заявлено.
8. `git diff origin/dev...HEAD -- PROCESS.md` прочитан целиком — текст §10.4 согласован с кодом: перечисляет `ship-review`/`beta-derived`/`rebase` рядом с `review-doc`/`release-review` (#723), отдельно называет исход `workflow` как решаемый автором.
9. `node scripts/smoke-select.mjs --base origin/dev --head HEAD` перегнан заново на этом SHA → «Исполняемого frontend-диффа нет», смоки не выбираются — `src/**` по-прежнему не тронут.
10. Трейлеры всех четырёх новых коммитов: `bd99c09f`/`23db2881` — `Issue: #730`, `User-Visible: no`; `a5854674`/`85d7c6fa` (публикация документов ревью, docs-only, трейлеры не обязательны) несут те же трейлеры — лишнее, но не находка.
11. Признаков правки продуктового кода, PDF/geometry, `custom_components/**/*.py`, меток `ci:golden` нет — golden/pytest/invariants/perf вне применимости, как и в r1/r2.
## AC · чем доказан · чем краснеет
AC1–AC3 не менялись контентно с r1/r2 — таблица из r1 (с правкой r2 по AC2) остаётся в силе, перепроверена исполнением на новом SHA в этом раунде, не только унаследована:
| AC | Доказательство | Чем краснеет (проверено исполнением на `85d7c6fa`) |
|---|---|---|
| AC1 (разбор push, ship-review/beta-derived) | `test/publish-push-refusal.test.mjs` | 24/24 зелёных на материале; негативная ветвь («прочий отказ GitHub при workflow — не говорит «ребейз делает автор»») подтверждена тестом `#730 r1` (см. «Как проверялось», п.5) |
| AC2 (сводка стража ребейза, включая исправленный текст для `workflow`) | `test/rebase-generated.test.mjs` | 19/19 зелёных; сам прогон этого раунда — живой пример: страж ребейза в реальном пайплайне выдал ровно документированный текст, и автор им воспользовался |
| AC3 (нет heredoc, тонкие файлы не тронуты) | `git diff origin/dev...HEAD --stat` на тонкие `ship-review.yml`/`beta-derived.yml` — пусто | статическая проверка, как в r1; ребейз этого не касался |
| Находка r1/закрытие r2 (текст для исхода `workflow`) | `test/publish-push-refusal.test.mjs:564-571` | тест разделяет оба случая (`doesNotMatch` в обе стороны) — перепрогнан лично на `85d7c6fa`, зелёный |
## Закрытие раунда r2
r2 — зелёный вердикт, возврата на правки не было (находок нет). Раздел неприменим по существу; ниже — соответствие заявленному материалу r2, а не «закрытие находки».
| Что было заявлено в r2 | Чем подтверждено сейчас |
|---|---|
| Делта r1→r2 — точечная правка `refusalSummary` + тест, не затрагивает AC1/AC3 | Подтверждено: содержимое коммитов `bd99c09f`/`23db2881` после ребейза идентично r1/r2, `git diff origin/dev...HEAD --stat` не изменился |
| 76/76 тестов в трёх связанных файлах | Перепрогнано лично на `85d7c6fa`: 76/76, 0 fail |
## Унаследовано из r1 и r2
Принято без повторной проверки «с нуля» — содержимое не менялось с r1/r2, задета только база коммитов (ребейз):
- Дисциплина «тест должен уметь падать» для AC1 (11/23 падают на `origin/dev`-версии) и AC2 (2/19 падают) — документ r1, пп. 4, 21–24; для находки r1/фикса r2 (1/24 падает на коде r1) — документ r2, п. 4. Контент `scripts/merge-candidate.mjs`, workflow-тел и тестов с тех пор не менялся — откат и повторный прогон не повторял, т.к. делта r2→r3 (ребейз) эти файлы не трогает.
- Скрипт `merge-candidate.mjs` берётся из `dev`, не из тонкого вызывающего репозитория — документ r1, п.9.
- Токен нигде не светится (`noisySecretsGone` во всех тестах) — документ r1, р. «Что проверено и корректно»; состав секретов в тестах не менялся.
- Согласованность нового текста `workflow`-исхода с существующим (немодифицированным) комментарием задачи из #705 — документ r2, п.7.
- Полный `npm test` (3347+/3348, 1 skip) на материале, эквивалентном текущему по содержимому — документ r1, п.5; в этом раунде прогнаны точечно все три затронутых файла (76/76) вместо повторного полного прогона — делта не трогает остальные ~3270 тестов, а Validate на `85d7c6fa` зелёный целиком.
## Что проверено и корректно
- Ребейз чист: нет конфликт-маркеров, дифф к `origin/dev` (файлы и число строк) идентичен тому, что разбирали r1/r2, коммиты перенесены без изменения содержимого (только новый родитель/SHA).
- Сама ситуация, из-за которой понадобился ребейз — отказ push по праву на workflow при публикации документа ревью/слиянии — обработана стражем ребейза именно так, как требует AC2 после фикса r1/r2: сообщение назвало единственно верное действие («ребейз и push делает автор»), автор им воспользовался. Это не лабораторная проверка, а прод-инцидент этого самого раунда, подтверждающий AC2 за пределами теста.
- Тест, фиксирующий находку r1, умеет отличать старый и новый текст в обе стороны (`assert.doesNotMatch` на оба варианта), не только детектирует присутствие новой фразы — риск «тест всегда зелёный» снят.
- PROCESS.md §10.4 после ребейза согласован с кодом текстуально (перечисление стадий, отдельное упоминание исхода `workflow`).
- Трейлеры на месте во всех некоммитах документации; `User-Visible: no` оправдан — видимого пользователю карточки поведения нет.
## Чего не проверял
- `tsc --noEmit`, `npm run build` + сверка трёх копий бандла, полный `npm test` (3348+ тестов целиком) — не перегонял: подтверждены зелёным Validate на этом же SHA (`85d7c6fa`, https://github.com/Matysh/houseplan-card/actions/runs/36808169875). Три связанных тест-файла (76 тестов) перегнал лично, см. выше.
- `actionlint` — делта r2→r3 не меняет содержимое YAML workflow-тел (ребейз без конфликтов, патчи идентичны r1/r2); не применимо.
- Браузерные смоки — `node scripts/smoke-select.mjs --base origin/dev --head HEAD` на `85d7c6fa` вернул «исполняемого frontend-диффа нет»; `src/**` не тронут ни в одном из трёх раундов.
- `npm run golden:verify`, `python -m pytest tests_backend -q`, `npm run invariants -- --config …`, performance-профили — не применимо: нет метки `ci:golden`, не менялся `custom_components/**/*.py`, не менялась геометрия, performance не названа в AC.
- Ручной живой прогон `_ship-review.yml`/`_beta-derived.yml`/`_process.yml` в GitHub Actions с настоящим GitHub-отказом по workflow-праву — не ставил отдельно, но этот сценарий произошёл сам, непреднамеренно, между r2 и r3 (см. «Скоуп»), и повёл себя так, как требует AC2 — это сильнее, чем постановка вручную.
- Мутанты по диффу — не запрашивались (трек show, #696), не прогонял.
## Вердикт
Зелёный. Материал r3 не меняет содержимое кода относительно зелёного r2 — это ребейз на ушедший на 1 коммит вперёд `dev`, выполненный чисто, без конфликтов, тем способом, который предписывает сам фикс этой задачи. Содержимое AC1–AC3 и закрытой находки r1 перепроверено исполнением на новом SHA (76/76 тестов трёх связанных файлов), дополнительно подтверждено тем, что пайплайн в реальности прошёл именно через исход `workflow`, для которого AC2 правился, и повёл себя корректно. Блокирующих находок нет.
---
---
<!-- material-anchors: сгенерировано конвейером (#414) -->
## Материал раунда
- Ветка: `issue/730-derived-push-refusal`, коммит `85d7c6fa63c8` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
- Дерево материала: `979f00675df82f25d3dbe61a54f69b28af8fae75`
```
git log --all --format='%H %T' | grep 979f00675df8
```
- Тело issue: `3d77fb56ed2e308d5df6d329563f8143ebf6d19f6a36b320a92fdb76ee31d8fd`
- Вердикт конвейера: `green` · High 0