fix(pipeline-status): align TS wrapper timeout with CI polling budget #68
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 #45 (коммит
5295ba2, 11 авг 2026) добавил хардкодtimeout: 60000(60с) в TS-обёрткуpipeline-status.ts:15. Таймаут был рассчитан под один Forgejo API-запрос с ретраями (32с worst-case), но не учёл CI-поллинг. Python-оракулpipeline-status.pyимеет собственный цикл поллинга_classify_rollup_with_poll(строки 697-723) с бюджетомCI_WAIT_TIMEOUT=300с(5 мин) и интерваломCI_POLL_INTERVAL=10с, но TS-обёртка убивает Python-процесс на 60-й секунде — поллинг не успевает начаться. В результате агент вынужден вручную поллить CI, что нарушает автономный pipeline.Задача
Поднять TS-обёртку
pipeline-status.tsдо 480000мс (8 мин) и PythonCI_WAIT_TIMEOUTдо 420с (7 мин), чтобы оракул сам поллил CI до 7 минут с интервалом 10с. Запас 60с сверх Python-поллинга — на Forgejo-ретраи и оверхед.Контракты
.opencode/tools/pipeline-status.ts:15:timeout: 60000→timeout: 480000.opencode/scripts/pipeline-status.py:61:CI_WAIT_TIMEOUT = 300→CI_WAIT_TIMEOUT = 420CI_POLL_INTERVAL = 10— НЕ меняем (уже соответствует требованию)tests/test_pipeline_status_tool.py:133: asserttimeout == 60000→timeout == 480000, переписать docstring (нынешний «headroom over 10s×3=32s» некорректен — он про Forgejo-запрос, а не про CI-поллинг).env.example: добавитьOPENCODE_CI_WAIT_TIMEOUT=420иOPENCODE_CI_POLL_INTERVAL=10(env-override в Python уже существует и тестирован, но не задокументирован)Инварианты
spec-status.ts:16иproject-status.ts:23имеют тот же литералtimeout: 60000— НЕ трогать (им 60с достаточно, они не поллят CI)CiPollConfig,_load_ci_config,_classify_rollup_with_poll) живёт ТОЛЬКО вpipeline-status.py— никто другой её не импортирует60000→480000— заденетspec-status.tsиproject-status.tsГраничные случаи
Влияние на связанные компоненты
spec-status.ts,project-status.ts— НЕ затрагиваются (другая семантика, 60с достаточно)test_pipeline_status_ci.py— проверяетCI_WAIT_TIMEOUTчерезps.CI_WAIT_TIMEOUT(L616/L642), может потребовать обновления assert если хардкодит300opencode.json— НЕ затрагивается (там только MCP server timeouts 300000, не tool spawnSync)create-pr.ts— НЕ затрагивается (тамRUFF_TIMEOUT_MS=60000для sub-command, другая семантика)Вне scope
spec-status.tsиproject-status.tstimeout (test coverage gap, отдельная задача)CI_POLL_INTERVAL(уже 10с, соответствует требованию)Критерии приемки
pipeline-status.tsимеетtimeout: 480000pipeline-status.pyимеетCI_WAIT_TIMEOUT = 420test_pipeline_status_tool.pyassertstimeout == 480000, docstring обновлён.env.exampleдокументируетOPENCODE_CI_WAIT_TIMEOUT=420иOPENCODE_CI_POLL_INTERVAL=10spec-status.tsиproject-status.tsНЕ изменены