mirror of
https://github.com/Matysh/houseplan-card
synced 2026-10-01 20:29:00 +00:00
@@ -0,0 +1,70 @@
|
||||
# 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.
|
||||
|
||||
## Находки
|
||||
|
||||
Нет.
|
||||
|
||||
---
|
||||
|
||||
<!-- material-anchors: сгенерировано конвейером (#414) -->
|
||||
|
||||
## Материал раунда
|
||||
|
||||
- Ветка: `issue/716-register-dispatch-workflows`, коммит `5451542ee2fe` — ребейз его осиротит, и это нормально: ниже якоря, которые ребейз не меняет.
|
||||
- Дерево материала: `b4aeec2e2095f26e478ba745fda84cb4d4964a10`
|
||||
```
|
||||
git log --all --format='%H %T' | grep b4aeec2e2095
|
||||
```
|
||||
- Тело issue: `9eab06f010a28bbbaccf0425202bd998c4f89b0361512585e9a82295f7deec14`
|
||||
- Вердикт конвейера: `green` · High 0
|
||||
Reference in New Issue
Block a user