fix(pipeline-oracle): explicit API failure handling in issue resolution #85
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Контекст
Аудитом после PR #80 найдены два robustness-дефекта в
.opencode/scripts/pipeline-status.py:resolve_number()(~1016-1045): на шагеGET /issues/{N}ЛЮБОЙ non-200 (500, 401, сетевой сбой) классифицируется как «ghost» → пользователь получает вводящее в заблуждение «Не существует ни PR, ни issue с номером N», хотя сбойнул сам API.find_open_prs_for_issue()(~1048-1078): при non-200 на любой странице пагинации цикл молча обрывается (break) → усечённый список кандидатов → возможен ЛОЖНЫЙ bootstrap (NEXT: template=A for issue #Nпри реально существующем PR) → риск дубль-PR, от которого система только что избавилась.Задача
resolve_number(): различать 404 (числа действительно нет ни среди PR, ни среди issues → ghost-поведение сохранить) от прочих non-200/сетевых ошибок →AMBIGUOUS: сбой Forgejo API при проверке issue #N (<код/описание>) — повторите позже. НЕ ghost, НЕ bootstrap.find_open_prs_for_issue(): non-200 на любой странице → результат помечается недостоверным; вызывающая сторона выдаётAMBIGUOUS: не удалось получить список открытых PR (сбой API)вместо bootstrap/детерминированного ответа./issues/{N}→ AMBIGUOUS (не ghost); сбой на 2-й странице пагинации PR → AMBIGUOUS (не bootstrap); сетевое исключение → AMBIGUOUS.Контракты
NEXT: dispatch subagent (subagent_type=general, template=A) for issue #Nи exit-коды существующих веток не меняются.AMBIGUOUS: <причина>+NEXT: уточните статус вручную), чтобы оркестратор трактовал их единообразно (STOP).Инварианты
test_resolve_number_*,test_main_*) зелёные.Граничные случаи
/issues/{N}после 404 от/pulls/{N}— по-прежнему ghost, exit 1 (не AMBIGUOUS).Влияние на связанные компоненты
AMBIGUOUSкак STOP — новые строки совместимы, правок скилла не требуется.Вне scope
Критерии приемки
pytest tests/test_pipeline_status*.pyзелёный, включая 3 новых теста сбоев API.resolve_number404 явно отделён от прочих статусов.find_open_prs_for_issueмолчаливый обрыв пагинации невозможен: либо полный список, либо флаг недостоверности.