# 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 застревает.