fix(pipeline-oracle): explicit API failure handling in issue resolution #90

Merged
slaid098 merged 2 commits from fix/pipeline-oracle/api-failure-handling into main 2026-08-16 20:42:32 +03:00
Owner

Что сделано

  • resolve_number(): 404 от /issues/{N} теперь единственный путь к ghost; прочие non-200 (500, 401, сетевой сбой) → error с деталью (HTTP <код> / описание ошибки, для 401 — подсказка про FORGEJO_TOKEN).
  • find_open_prs_for_issue(): возвращает (found, reliable); non-200 на любой странице пагинации → reliable=False, молчаливый обрыв невозможен.
  • main(): error → AMBIGUOUS: сбой Forgejo API при проверке issue #N (<деталь>) — повторите позже + NEXT: уточните статус вручную, exit 1; error_pulls → AMBIGUOUS: не удалось получить список открытых PR (сбой API) + тот же NEXT, exit 1. Ни ghost, ни bootstrap.
  • Dashboard: при недостоверном списке PR строка помечается — (API сбой) вместо ложной ссылки на PR.
  • 6 новых тестов: 500 от /issues/{N} → AMBIGUOUS (не ghost), 401 → AMBIGUOUS с подсказкой токена, сетевое исключение → AMBIGUOUS, сбой на 2-й странице пагинации → AMBIGUOUS (не bootstrap), плюс main-уровневые проверки обеих AMBIGUOUS-веток.

Почему

Аудит после PR #80: любой non-200 при проверке issue классифицировался как ghost (вводящий в заблуждение «не существует»), а обрыв пагинации давал усечённый список кандидатов → ложный bootstrap → риск дубль-PR.

Watch out

  • Сигнатура find_open_prs_for_issue изменена на кортеж (found, reliable) — обновлены все вызывающие (resolve_number, dashboard) и тесты.
  • AMBIGUOUS-строки пишутся в stderr с exit 1 — TS-обёртка tool'а вернёт ⚠️ pipeline-status failed (exit 1), что run-pipeline трактует как STOP (совместимо с контрактом скилла).

Pending

—

Closes #85

## Что сделано - `resolve_number()`: 404 от `/issues/{N}` теперь единственный путь к ghost; прочие non-200 (500, 401, сетевой сбой) → `error` с деталью (`HTTP <код>` / описание ошибки, для 401 — подсказка про `FORGEJO_TOKEN`). - `find_open_prs_for_issue()`: возвращает `(found, reliable)`; non-200 на любой странице пагинации → `reliable=False`, молчаливый обрыв невозможен. - `main()`: `error` → `AMBIGUOUS: сбой Forgejo API при проверке issue #N (<деталь>) — повторите позже` + `NEXT: уточните статус вручную`, exit 1; `error_pulls` → `AMBIGUOUS: не удалось получить список открытых PR (сбой API)` + тот же NEXT, exit 1. Ни ghost, ни bootstrap. - Dashboard: при недостоверном списке PR строка помечается `— (API сбой)` вместо ложной ссылки на PR. - 6 новых тестов: 500 от `/issues/{N}` → AMBIGUOUS (не ghost), 401 → AMBIGUOUS с подсказкой токена, сетевое исключение → AMBIGUOUS, сбой на 2-й странице пагинации → AMBIGUOUS (не bootstrap), плюс main-уровневые проверки обеих AMBIGUOUS-веток. ## Почему Аудит после PR #80: любой non-200 при проверке issue классифицировался как ghost (вводящий в заблуждение «не существует»), а обрыв пагинации давал усечённый список кандидатов → ложный bootstrap → риск дубль-PR. ## Watch out - Сигнатура `find_open_prs_for_issue` изменена на кортеж `(found, reliable)` — обновлены все вызывающие (resolve_number, dashboard) и тесты. - AMBIGUOUS-строки пишутся в stderr с exit 1 — TS-обёртка tool'а вернёт `⚠️ pipeline-status failed (exit 1)`, что run-pipeline трактует как STOP (совместимо с контрактом скилла). ## Pending — Closes #85
test(pipeline-oracle): cover API failure branches in issue resolution
All checks were successful
CI (always) / bootstrap (pull_request) Successful in 6s
CI / bootstrap (pull_request) Successful in 9s
CI / complexity (pull_request) Successful in 31s
CI / typecheck (pull_request) Successful in 31s
CI / lint (pull_request) Successful in 32s
CI / test (3.13) (pull_request) Successful in 1m44s
998d316937
Author
Owner

Code Review Summary

PR корректно закрывает issue #85: non-404 API-сбои при резолве номера больше не классифицируются как ghost, сбой пагинации открытых PR → error_pulls (не ложный bootstrap), dashboard помечает недостоверный список PR. Логика resolve_number теперь детерминирована: ghost только при 404 на обоих запросах, 401 даёт подсказку про FORGEJO_TOKEN. Все вызывающие обновлены в этом же PR, TS-обёртка и run-pipeline skill совместимы (exit 1 → ⚠️ failed → STOP, AMBIGUOUS в stderr → STOP). CI green, 6 новых тестов с assert'ами.

Positives

  • Чёткое разделение ghost (оба 404) vs error (non-404) — устраняет вводящий в заблуждение «не существует» при сбоях API
  • reliable-флаг в find_open_prs_for_issue защищает от ложного bootstrap при усечённой пагинации — риск дубль-PR закрыт
  • Dashboard честно помечает — (API сбой) вместо ложной ссылки на PR
  • 6 новых тестов покрывают 500/401/сеть/пагинацию + main-уровневые AMBIGUOUS-ветки; все существующие тесты обновлены под новую сигнатуру
  • _failure_detail — аккуратная централизация человекочитаемых деталей ошибки

Suggestions (info, not blocking)

  • .opencode/scripts/pipeline-status.py:1186 [style] Формулировка «сбой Forgejo API при проверке issue #N» неточна, когда сбой произошёл на первом запросе /pulls/{N} (это проверка PR, а не issue). Номер тот же и суть сообщения верна, но можно уточнить: «при проверке номера #N» — покрывает оба случая.

Verdict: APPROVE

## Code Review Summary PR корректно закрывает issue #85: non-404 API-сбои при резолве номера больше не классифицируются как ghost, сбой пагинации открытых PR → `error_pulls` (не ложный bootstrap), dashboard помечает недостоверный список PR. Логика `resolve_number` теперь детерминирована: ghost только при 404 на обоих запросах, 401 даёт подсказку про FORGEJO_TOKEN. Все вызывающие обновлены в этом же PR, TS-обёртка и run-pipeline skill совместимы (exit 1 → `⚠️ failed` → STOP, AMBIGUOUS в stderr → STOP). CI green, 6 новых тестов с assert'ами. ### Positives - Чёткое разделение ghost (оба 404) vs error (non-404) — устраняет вводящий в заблуждение «не существует» при сбоях API - `reliable`-флаг в `find_open_prs_for_issue` защищает от ложного bootstrap при усечённой пагинации — риск дубль-PR закрыт - Dashboard честно помечает `— (API сбой)` вместо ложной ссылки на PR - 6 новых тестов покрывают 500/401/сеть/пагинацию + main-уровневые AMBIGUOUS-ветки; все существующие тесты обновлены под новую сигнатуру - `_failure_detail` — аккуратная централизация человекочитаемых деталей ошибки ### Suggestions (info, not blocking) - **.opencode/scripts/pipeline-status.py:1186** [style] Формулировка «сбой Forgejo API при проверке issue #N» неточна, когда сбой произошёл на первом запросе `/pulls/{N}` (это проверка PR, а не issue). Номер тот же и суть сообщения верна, но можно уточнить: «при проверке номера #N» — покрывает оба случая. ### Verdict: APPROVE
slaid098 deleted branch fix/pipeline-oracle/api-failure-handling 2026-08-16 20:42:32 +03:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
slaid098/opencode-config!90
No description provided.