17 KiB
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).
Как проверялось
- Прочитано тело issue #730 и все комментарии, включая отказ пайплайна, самостоятельный ребейз автора и итог («Конфликтов не было. Коммиты r1/r2 и оба документа ревью перенесены без изменений»).
- Сверен состав коммитов текущей ветки (
git log --oneline origin/dev..HEAD):bd99c09f(содержимое r1),a5854674(публикация документа r1),23db2881(содержимое r2 — правкаrefusalSummaryдля исходаworkflow),85d7c6fa(публикация документа r2).git show bd99c09f/23db2881построчно сверены с текстами, которые разбирали документы r1/r2 — содержимое коммитов не изменилось, изменились только SHA и родитель (следствие ребейза). git diff origin/dev...HEAD --statдаёт ровно тот же список файлов и те же числа строк, что документ r1 цитирует как материал (п.14 документа r1) — подтверждает, что ребейз не внёс и не потерял изменений.- Прочитан текущий код
refusalSummary(scripts/merge-candidate.mjs:534-556) — веткаnextStepдля исходаworkflowотдельно от общего случая на месте, текст совпадает с тем, что проверял r2. - Прочитаны новые тестовые ассерты
test/publish-push-refusal.test.mjs:564-571(#730 r1: …) — у теста есть и позитивная, и негативная проверка (assert.doesNotMatch(workflow, /ребейз не помогут/)иassert.doesNotMatch(remote, /ребейз и push делает автор/)), то есть тест умеет отличить старый текст от нового в обе стороны, не только фиксирует новую фразу. - Прогнаны все три связанных тест-файла на материале
85d7c6faнапрямую (не только со слов автора):node --test test/publish-push-refusal.test.mjs test/rebase-generated.test.mjs test/merge-candidate.test.mjs→ 76/76 pass, 0 fail — совпадает с заявлением автора о прогоне после ребейза. - Проверено отсутствие маркеров конфликта (
<<<<<<</=======/>>>>>>>) по всему дереву — пусто, ребейз прошёл чисто, как и заявлено. git diff origin/dev...HEAD -- PROCESS.mdпрочитан целиком — текст §10.4 согласован с кодом: перечисляетship-review/beta-derived/rebaseрядом сreview-doc/release-review(#723), отдельно называет исходworkflowкак решаемый автором.node scripts/smoke-select.mjs --base origin/dev --head HEADперегнан заново на этом SHA → «Исполняемого frontend-диффа нет», смоки не выбираются —src/**по-прежнему не тронут.- Трейлеры всех четырёх новых коммитов:
bd99c09f/23db2881—Issue: #730,User-Visible: no;a5854674/85d7c6fa(публикация документов ревью, docs-only, трейлеры не обязательны) несут те же трейлеры — лишнее, но не находка. - Признаков правки продуктового кода, 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 правился, и повёл себя корректно. Блокирующих находок нет.
Материал раунда
- Ветка:
issue/730-derived-push-refusal, коммит85d7c6fa63c8— ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет. - Дерево материала:
979f00675df82f25d3dbe61a54f69b28af8fae75git log --all --format='%H %T' | grep 979f00675df8 - Тело issue:
3d77fb56ed2e308d5df6d329563f8143ebf6d19f6a36b320a92fdb76ee31d8fd - Вердикт конвейера:
green· High 0