Files
2026-10-01 07:48:37 +03:00

17 KiB
Raw Permalink Blame History

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 правился, и повёл себя корректно. Блокирующих находок нет.



Материал раунда

  • Ветка: issue/730-derived-push-refusal, коммит 85d7c6fa63c8 — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
  • Дерево материала: 979f00675df82f25d3dbe61a54f69b28af8fae75
    git log --all --format='%H %T' | grep 979f00675df8
    
  • Тело issue: 3d77fb56ed2e308d5df6d329563f8143ebf6d19f6a36b320a92fdb76ee31d8fd
  • Вердикт конвейера: green · High 0