Files
2026-09-30 21:01:10 +00:00

14 KiB

CODE-REVIEW — issue #716 · заход r1

Итог: High 0 · Medium 0 · Low 0 Вердикт: зелёный

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

  • Диапазон: git log --oneline origin/dev..HEAD, база origin/dev = 84ed38e3.
  • Коммит: 5451542ee2fe78be1b3dca40c22650fdea7814f5 (единственный в диапазоне).
  • Мутация main: 2022e183 — «ci: mirror thin workflow callers in main after #716», уже опубликована в main (проверено git log --oneline -3 origin/main); содержимое ship-review.yml/beta-derived.yml в main побайтово равно версии на 5451542e (diff <(git show origin/main:…) <(git show HEAD:…) — пусто по обоим файлам).
  • Трек show, до 3 AC (AC1 регистрация, AC2 сверка, AC3 документация) — уложились.
  • Validate на 5451542e: success, https://github.com/Matysh/houseplan-card/actions/runs/36771480144 — принят по канону, не перегонялся.

Скоуп

Задача чинит процессный дефект: ship-review.yml и beta-derived.yml существовали только в dev и как workflow_dispatch-only файлы были недоступны для запуска вовсе (GitHub регистрирует и разрешает dispatch только для workflow, чей файл есть в ветке по умолчанию). Решение — устройство #623 (тонкий вызывающий в main, тело _<имя>.yml по @dev), распространённое на эти два файла. Меняются только .github/workflows/*, PROCESS.md, scripts/mutation-registry.mjs, тесты — продукта нет, User-Visible: no в трейлере коммита соответствует диффу (ни одного файла из custom_components/**, src/**, changelog).

Как проверялось

Рабочая копия уже на 5451542e; git fetch/checkout на другой коммит не делал.

  1. AC1 (регистрация). GET /actions/workflows (прямой вызов gh api repos/Matysh/houseplan-card/actions/workflows) перечисляет оба workflow: {"name":"Бета: производные артефакты на dev","path":".github/workflows/beta-derived.yml","state":"active"} {"name":"Бета: пакетное ревью ship","path":".github/workflows/ship-review.yml","state":"active"} — это прямое доказательство, что регистрация состоялась (до задачи GET их не перечислял, по телу issue). Структуру тонкий/тело проверил чтением обоих новых файлов (_ship-review.yml, _beta-derived.yml — содержимое побайтово совпадает с прежними монолитными файлами, кроме шапки on: workflow_call вместо workflow_dispatch+run-name+concurrency) и прогоном общего структурного теста (см. ниже) — он разбирает YAML этого репозитория собственным парсером (topBlocks/children) и проверяет для каждой пары тонкий/тело: единственная job, uses: …/_<имя>.yml@dev, secrets: inherit, потолок прав = объединение прав job тела, каждый вход dispatch прокинут во workflow_call, тело не триггерится само по себе. Мой прогон: node --test test/default-branch-workflows.test.mjs → 45/45 green (лог ниже).
  2. AC2 (сверка). validate.yml (workflow_sync) и test/default-branch-workflows.test.mjs теперь держат список из восьми файлов. Проверил, что найденное множество DISPATCH_BEFORE_PROMOTION не подобрано произвольно: тест утверждает, что оба файла существуют и их единственный триггер — workflow_dispatch (иначе они попали бы в список автоматически по событию, как первые шесть). Прогнал оба мутанта, которые автор заявил «перенацелены», ЛИЧНО, не доверяя заявлению:
    • мутант в validate.yml (убрать ship-review.yml beta-derived.yml из цикла сверки) — временно применил patch из scripts/mutation-registry.mjs, перегнал test/default-branch-workflows.test.mjs → 1 из 45 упал (#716: шаги беты по кнопке — тонкие файлы наравне с исполняемыми из main), откатил файл;
    • мутант в _beta-derived.yml (убрать строку echo "Release: $TAG") — применил, перегнал test/beta-derived.test.mjs → 1 из 4 упал (провенанс-тест #697 бот: сообщение коммита проходит провенанс…), откатил файл. Оба теста умеют падать — дисциплина соблюдена. git status --short после отката — пусто. Отдельно прогнал node scripts/mutation-registry-check.mjs (сверяет, что все find-патчи реестра совпадают с текущим содержимым файлов) → exit 0, тихо. Значит переименование пути мутанта (.github/workflows/beta-derived.yml → _beta-derived.yml) не оставило «мёртвого» find.
  3. AC3 (документация). Прочитал PROCESS.md §10.4 (строки 1159–1188 на текущем HEAD): перечислены все восемь файлов с разбивкой «по событию» / «по кнопке, но до промоушена», объяснено, почему workflow_dispatch требует файл в main, и прямо сказано про порядок публикации («сначала main, затем dev; в обратном порядке push в dev найдёт файл, которого нет в main») — это как раз то, что произошло по факту (мутация 2022e183 в main предшествует этому коммиту). §8 (строки ~848–859) и §11.7 (строки ~1533–1539) обновлены с точной командой запуска (gh workflow run … --ref dev -f tag=… или кнопка) и явной отсылкой к тонкому/телу. Неверный комментарий «файл исполняется с ветки прогона, зеркало не нужно» убран из ship-review.yml (было — см. диф, убрано) и заменён корректным объяснением тонкий/тело. grep на «шесть файлов»/«шести файлов» по PROCESS.md/AGENTS.md/docs/process/*.md — ничего не найдено, стал старых упоминаний нет.
  4. Косвенная проверка «ничего не сломано рядом». grep -rn "beta-derived.yml\|ship-review.yml" по *.mjs/*.md — единственное место, использующее имя workflow для реального запуска, scripts/ship-review.mjs:155 (gh workflow run ship-review.yml --ref dev -f tag=…), не требует правки: имя файла тонкого вызывающего не изменилось, --ref dev по-прежнему корректен, поскольку после слияния тонкий файл в dev и main идентичен (это и держит workflow_sync). Полные файлы release-review.yml/docs-screenshots.yml (не входящие в задачу) сверил отдельно — они сейчас побайтово равны в main и dev, то есть задача не переизобретает то, что уже работает как раньше.
  5. node scripts/smoke-select.mjs --base origin/dev --head HEAD → «Исполняемого frontend-диффа нет… Browser-smoke этим диффом не выбираются… Тронуто файлов: 10.» — подтверждает, что браузерные смоки к этому диффу не относятся.
  6. node scripts/action-pins.mjs → «все сторонние Actions закреплены полным SHA» (exit 0) — новых uses: в _ship-review.yml/_beta-derived.yml нет (это те же actions, что были в монолитных файлах, пины не менялись).

Что проверено и корректно

  • AC1: оба workflow видны GET /actions/workflows как active — регистрация состоялась; тонкий/тело структурно идентичны устройству #623 по автоматическому структурному тесту.
  • AC2: восемь файлов сверяются workflow_sync и структурным тестом; оба «перенацеленных» мутанта лично воспроизведены и красят соответствующие тесты; реестр мутаций внутренне непротиворечив (mutation-registry-check.mjs зелёный).
  • AC3: §10.4 называет восемь файлов и объясняет причину/порядок; §8 и §11.7 дают команду запуска; неверный комментарий убран.
  • Коммит несёт Issue: #716 и User-Visible: no; диффу это соответствует (нет пользовательского поведения, changelog не тронут — и не должен быть).
  • Тела _ship-review.yml/_beta-derived.yml — построчная копия прежней логики (checkout ref: dev/кандидат, потолок прав, шаги приёмки/ревью/паблиша) с заменой шапки на workflow_call; неожиданных изменений поведения самих джобов не внесено.
  • Потолок прав вызывающих job равен объединению прав job тела (проверено автоматическим тестом, не только чтением).
  • Порядок публикации (main раньше dev) выполнен на практике, а не только продекларирован: мутация 2022e183 в main уже существует и совпадает с тем, что попадёт в dev при мерже.

Чего не проверял

  • Полный npx tsc --noEmit / npm test / npm run build — не перегонял: Validate уже зелёный на этом самом SHA (ссылка выше, §4 позволяет принять по ссылке для этого раунда); прогнал только целевые тестовые файлы (test/beta-derived.test.mjs, test/ship-review.test.mjs, test/default-branch-workflows.test.mjs — 57/57 green) и утилиты (action-pins.mjs, mutation-registry-check.mjs).
  • Реальный dispatch ship-review.yml/beta-derived.yml (кнопкой или gh workflow run) не запускал — это дорогое и не полностью обратимое действие (запускает настоящего агента ревью / коммитит в dev), и автор сам отложил его до после слияния («сквозной прогон — после слияния»). Косвенное доказательство регистрации (API перечисляет оба как active) получено; само исполнение тела _ship-review.yml/_beta-derived.yml при реальном dispatch не наблюдал.
  • npm run golden:verify и python -m pytest tests_backend — не требуются: нет метки ci:golden, custom_components/**/*.py не тронут.
  • Инварианты модели (npm run invariants) — не требуются, геометрия не тронута.
  • Отдельно не проверял независимое ограничение токена сессий (Actions: write для publish-prerelease.yml), упомянутое автором в комментарии, — оно явно вынесено за рамки этой задачи в теле issue («Отдельно: …») и не входит ни в один AC.

Находки

Нет.


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

  • Ветка: issue/716-register-dispatch-workflows, коммит 5451542ee2fe — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
  • Дерево материала: b4aeec2e2095f26e478ba745fda84cb4d4964a10
    git log --all --format='%H %T' | grep b4aeec2e2095
    
  • Тело issue: 9eab06f010a28bbbaccf0425202bd998c4f89b0361512585e9a82295f7deec14
  • Вердикт конвейера: green · High 0