fix(skills): add --max-time to all forgejo curl commands #46
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/skills/curl-max-time"
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?
Что сделано
Глобальный grep-replace всех
curlкоманд к$FORGEJO_URL/git.slaid098.dev//api/v1/в.opencode/**/*.md— добавлены--max-time 30 --connect-timeout 10(30с общий таймаут, 10с на connect) послеcurl -s(или послеcurl -sX POST/PATCH/PUT).Затронутые файлы:
run-pipeline/SKILL.md,issue/SKILL.md,repo-readme/SKILL.md,release/SKILL.md,project-template/SKILL.md(4 curl: repo-exists, repo create, settings, branch protection + дубль в edge-cases блоке),bug-discovery/SKILL.mdreviewer.md,memory-syncer.md— обновлены и инструкции (4 call site), и allow-rules в frontmatter (см. Watch out)tests/test_permissions.py— 4 новых regression-тестаbug-discovery/SKILL.mdduplicate-check: добавлены&limit=50&page=1к query string (пагинация вместо листания всех open issues). Документировано в комментарии, что это first-page check — агент может пагинировать&page=2если >50 issues.Почему
PR#41 (issue #40) пофиксил hang в
_shared.ts:callForgejoчерезurlopentimeout. Но 20+ curl-вызовов к Forgejo API в skills/agents — все без--max-time/--connect-timeout(curl default = infinite). Агенты выполняют эти curl в bash, полностью bypass'я_shared.ts. Тот же класс 5-мин hang'а при недоступности Forgejo: curl ждет бесконечно, агент молчит, pipeline висит. Timeout заставляет curl fail fast (exit code 28), агент видит ошибку и репортит.Watch out
Spec deviation (зафиксировано, не додумано): issue #43 пункт 3 утверждал, что permission rules не сломаются — "флаги
--max-time/--connect-timeoutне должны влиять на match". Это оказалось неверно для agent frontmatter rules:reviewer.mdиmemory-syncer.mdимели literal allow-rules"curl -s -H ...": allow(БЕЗ wildcard*между-sи-H). Новая командаcurl -s --max-time 30 -H ...НЕ матчит literalcurl -s -H→ попадает в catch-all"*": deny→ agent не может читать PR metadata. Поэтому allow-rules в обоих агентах обновлены синхронно с инструкциями (добавлены--max-time 30 --connect-timeout 10в сам pattern).Глобальный
opencode.json:230"curl *": "allow"— матчит (glob*поглощает флаги), не тронут. Глобальный deny"curl * -X DELETE *FORGEJO_URL*"(safety net) — также продолжает работать (*междуcurlи-X).--max-time 30для POST-запросов с upload (release create с assets) может быть tight, но release create вrelease/SKILL.md:76идёт без assets (assets — отдельный шаг, web UI), 30с достаточно. Если станет узким местом — вынести в отдельный issue.Тест
test_no_forgejo_curl_without_max_time_in_skillsнамеренно исключает строки сgit.slaid098.dev(там где URL упоминается в prose, не в curl-команде) и требует чтобыcurlбыл в части строки ДО$FORGEJO_URL(т.е. реальная команда, не комментарий про curl после URL).Pending
—\n\nCloses #43
Closes #43
Code Review Summary
PR добавляет
--max-time 30 --connect-timeout 10ко всем curl-командам к Forgejo API в skills/agents (issue #43, Волна 2), добавляет пагинацию&limit=50&page=1в bug-discovery duplicate-check, синхронно обновляет agent frontmatter allow-rules и добавляет 4 regression-теста. Изменения полные, консистентные, CI green (23 теста проходят).Что правильно
$FORGEJO_URLв.opencode/**/*.mdобновлены — skills (bug-discovery, run-pipeline ×2, issue, project-template ×4, repo-readme ×2, release) и agents (reviewer ×3, memory-syncer ×3).rg 'curl.*FORGEJO_URL' .opencode/ | rg -v --max-timeвозвращает только строку-описаниеproject-template/SKILL.md:236("Все операции черезcurlк Forgejo API") — это не команда, false positive.curl -s -H ...не поглощает--max-time(нет wildcard междуcurl -sи-H), поэтому без обновления rule новые команды падали бы в catch-all"*": deny. Тестtest_agent_curl_allow_rules_have_max_timeэто проверяет.&limit=50&page=1с комментарием "first page only — paginate with&page=2etc." — корректный подход (ограничение размера ответа + явная инструкция для >50 issues).test_agent_curl_allow_rules_have_max_time— frontmatter rules содержат флаги (writer-side).test_global_curl_allow_matches_timed_commands— globalcurl *glob всё ещё матчит timed-команды черезfnmatch(reader-side, подтверждает что global allow не сломан).test_bug_discovery_skill_has_pagination_and_timeout— skill содержит оба инварианта.test_no_forgejo_curl_without_max_time_in_skills— full-scan regression guard по.opencode/**/*.mdс regexcurl\s+-s(?:X\s+\w+)?\s+(?!.*--max-time).check-permissions.pyвалидирует структуру — новые rules валидны, тестtest_check_permissions_passesпроходит). Связьpipeline-status.py ↔ post-review.tsне затронута (формат### Verdict:не менялся).ruff formatна assertion + trigger fresh CI — гигиена коммитов корректна, стиль соответствует conventional commits (fix(skills),fix(agents),test(permissions),style(tests),chore(ci)).Замечаний нет
Изменения полностью покрывают scope issue #43, тесты green, regression guard на месте. Готов к merge.
Verdict: APPROVE