feat(pipeline-oracle): issue-number input, bootstrap NEXT, issues dashboard #74
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?
Контекст
Оракул
.opencode/scripts/pipeline-status.pyстрого PR-центричен: принимает только номер PR. На номере issue он падаетPR #N не существует(exit 1) — это ломает bootstrap пайплайна: пайплайн стартует с номера issue, а PR ещё не создан. Маппинга issue→PR нет ни в одном компоненте системы.Сопутствующие дефекты оракула (зафиксированы аудитом):
NEXT_ACTIONSиспользуют плейсхолдерN= номер PR, тогда как в run-pipeline SKILL.mdN= номер issue — агенты путают номера._forgejo_run_view()(агент не может её вызвать) и не указываетsubagent_type+template, в отличие от NEXT остальных фаз.template=A(флоу «с нуля») — риск создания дубль-PR.call merge_pr tool,pipeline_status проверит CI), тогда как инструменты kebab-case (рецидив после ADR-034).CI_WAIT_TIMEOUT=420с (7 мин), TS-обёртка480000мс (8 мин) с текстом ошибки «timed out (60s)».pr_numberобязателен в схеме TS-обёртки).Задача
GET /pulls/{N}→ 200: текущее поведение без изменений (PR-путь).GET /issues/{N}:Closes|Fixes|Resolves #N:issue #N → PR #M;NEXT: dispatch subagent (subagent_type=general, template=A) for issue #N, exit 0 (bootstrap, НЕ ошибка);AMBIGUOUS: <список кандидатов-PR>;Не существует ни PR, ни issue с номером N, exit 1.NEXT_ACTIONSс явными плейсхолдерами типа номера:issue #Nдля bootstrap ISSUE/IMPLEMENT (когда PR нет),PR #Nдля всех остальных фаз.Closes: NEXT = инструкция дописатьCloses #<issue>в body существующего PR (не template=A). Если вход был PR-номером и issue неизвестен — текст без конкретного issue-номера.subagent_type=general, template=D; инструкция получать логи через curl к Forgejo API (/actions/runs/{id}/jobs+/actions/jobs/{id}/logs); убрать упоминание_forgejo_run_view().merge-pr,pipeline-statusи т.д. Обновить тесты, закрепляющие snake-строки..opencode/tools/pipeline-status.ts: сделатьpr_numberопциональным; вызов без аргумента → дашборд открытых ISSUES репо (номер, title, номер связанного открытого PR или «—»). Существующая таблица открытых PR заменяется этим дашбордом.Контракты
NEXT: dispatch subagent (subagent_type=general, template=A) for issue #N.#N <title> — PR #M | —).Инварианты
FORGEJO_URL/FORGEJO_TOKENс явной ошибкой без env — как сейчас.Граничные случаи
Closesна несколько issues → резолюция идёт от входного номера, конфликта нет.Влияние на связанные компоненты
.opencode/tools/pipeline-status.ts— сигнатура и description.tests/test_pipeline_status*.py— новые тесты + правка snake-case фикстур.Вне scope
Критерии приемки
pytest tests/test_pipeline_status*.pyзелёный, включая новые тесты всех веток резолюции: PR-вход; issue→1 PR; issue→0 PR (bootstrap, exit 0); issue→2+ PR (AMBIGUOUS); номер-призрак (exit 1, явный текст); issue с только закрытым PR (bootstrap).merge_pr,pipeline_statusотсутствуют в эмитимом выводе).pr_numberвозвращает дашборд открытых issues.