# ADR-054: pipeline-status statusCheckRollup ## Статус Accepted (2026-07-29) ## Контекст `check_ci` в `pipeline-status.py` искал CI-ран через `gh api repos/{org}/{repo}/actions/runs` с jq-фильтром `select(.name == "CI")`. Этот подход ломается для docs-only PR: - `ci.yml` имеет `paths-ignore` на `docs/**` — для docs-only PR workflow `CI` НЕ запускается. - Запускается только `always-ci.yml` (workflow name `CI (always)`), который не имеет `paths-ignore`. - jq-фильтр `select(.name == "CI")` не матчит `CI (always)` → возвращал `null` → `_retry_no_runs` перепробовал 3 попытки → AMBIGUOUS ("нет CI run на ветке ..."). - Pipeline застревал на CI-фазе для docs-only PR, хотя CI фактически зелёный. ## Решение Использовать `gh pr view --json statusCheckRollup` вместо `gh api .../actions/runs`. `statusCheckRollup` — GitHub-native API, который агрегирует ВСЕ checks (workflow runs + status checks) по head SHA PR: - Не зависит от имени workflow (CI, CI (always), ADR check — все в одном массиве). - Не требует знания branch name (раньше нужен `gh pr view --json headRefName` + `select(.head_branch == ...)`). - Один вызов `gh` вместо двух (`headRefName` + `actions/runs`). Классификация `_classify_rollup`: все checks `COMPLETED` + `SUCCESS`/`SKIPPED`/`NEUTRAL` → DONE; любой check `COMPLETED` с non-success conclusion → NOT_DONE; любой check `IN_PROGRESS`/`QUEUED`/`PENDING` → AMBIGUOUS (poll до timeout). ## Альтернативы - **(B) Ослабить jq-фильтр** — убрать `select(.name == "CI")`, брать первый run на ветке. Отвергнуто: `actions/runs` возвращает runs ВСЕХ workflows на ветке (включая устаревшие), первый может быть не тем. Также не покрывает status checks (не-workflow) — `statusCheckRollup` единый источник. - **(C) SHA + all workflows** — искать runs по head SHA без фильтра по name. Отвергнуто: та же проблема с выбором "правильного" run из нескольких, плюс `actions/runs` не включает non-workflow status checks. `statusCheckRollup` уже агрегирует всё корректно на стороне GitHub. - **Оставить `actions/runs` + `name=="CI"`** — отвергнуто: баг для docs-only PR не исправляется, pipeline застревает.