fix(skills): add --max-time to all forgejo curl commands #43

Closed
opened 2026-08-11 16:08:48 +03:00 by slaid098 · 0 comments
Owner

Контекст

PR#41 (issue #40) пофиксил hang в _shared.ts:callForgejo. Но 20 curl-вызовов к Forgejo API в skills/agents — все без --max-time/--connect-timeout (curl default = infinite). Агенты выполняют эти curl в bash, полностью bypass'я _shared.ts. Тот же класс 5-мин hang'а.

Проблемные call sites (неполный список — полный в аудите):

  • reviewer.md:86,387 — curl -s .../pulls/<N> (PR metadata)
  • memory-syncer.md:42,121 — curl -s .../pulls/<N> (PR body)
  • bug-discovery/SKILL.md:11-12 — curl .../issues?state=open&type=issues (duplicate check, листает ВСЕ issues без пагинации)
  • run-pipeline/SKILL.md:71,117-118 — curl .../pulls/<M> (Template C/E)
  • issue/SKILL.md:171 — curl -sX POST .../labels (label autocreate)
  • project-template/SKILL.md:240,245,254,260 — 4 curl (repo-exists, repo create, settings, branch protection)
  • repo-readme/SKILL.md:31,32 — curl -sX PATCH .../repos/... + curl -sX PUT .../topics
  • release/SKILL.md:76 — curl -sX POST .../releases

Задача

  1. Глобальный grep-replace всех curl команд к $FORGEJO_URL или git.slaid098.dev или /api/v1/ в .opencode/**/*.md — добавить --max-time 30 --connect-timeout 10 после curl -s.
  2. bug-discovery/SKILL.md:11-12 — ДОПОЛНИТЕЛЬНО добавить --limit 50 (или &limit=50) к duplicate-check curl (пагинация вместо листания всех open issues).
  3. Проверить permission rules в opencode.json — если curl allow-rules используют regex/pattern, добавить --max-time НЕ должно сломать match (curl флаги не часть permission pattern).
  4. Тесты: если есть tests/test_permissions.py или类似 — проверить что curl с --max-time проходит permission check.

Контракты

  • curl --max-time 30 --connect-timeout 10 — 30с общий таймаут, 10с на connect. Если Forgejo не ответил за 30с — curl exits с кодом 28 (timeout), агент видит ошибку.
  • Permission rules в opencode.json — pattern matching на команду, флаги --max-time/--connect-timeout не должны влиять на match (они после curl -s).
  • bug-discovery duplicate-check: &limit=50 добавляется к URL query string. Если issues >50 — агент должен понимать что это первая страница (можно добавить &page=1).

Инварианты

  • Существующие curl команды продолжают работать (добавляются только флаги таймаута).
  • Permission rules не ломаются.
  • --max-time 30 — достаточно для нормальных Forgejo-ответов (issue create <1с, issue list <5с).
  • --connect-timeout 10 — если TCP connect не установился за 10с (Forgejo down), curl fails fast.

Граничные случаи

  • curl -sX POST .../releases (release create) — может быть медленным (загрузка assets). 30с может быть tight. Рассмотреть --max-time 60 для POST с upload. Но release create без assets — 30с достаточно.
  • curl .../issues?state=open&type=issues (bug-discovery) — с &limit=50 response меньше, но если репо >50 issues, duplicate-check неполный. Документировать что это first-page check (агент может пагинировать если нужно).
  • Permission rule curl * -X DELETE *FORGEJO_URL* (deny) — --max-time не влияет на match (pattern на curl ... -X DELETE ...).

Влияние на связанные компоненты

  • Все skills/agents с curl к Forgejo — получают 30с timeout.
  • bug-discovery duplicate-check — теперь пагинированный (50 issues за раз).
  • Permission rules — не затронуты (флаги не часть pattern).

Вне scope

  • Python oracles urlopen timeout — issue Волны 1.
  • git spawnSync timeout — issue Волны 3.
  • Server-side Forgejo — issue #19 в forgejo-infra.
  • Замена curl на callForgejo из _shared.ts — слишком инвазивно для skills (skills = markdown инструкции, не код).

Критерии приемки

  • Все curl к Forgejo в .opencode/**/*.md имеют --max-time 30 --connect-timeout 10.
  • bug-discovery/SKILL.md:11-12 duplicate-check имеет &limit=50 (или --limit 50).
  • Permission rules в opencode.json не сломаны (curl с флагами проходит allow).
  • Тест permissions (если есть) — зелёный.
  • Гrep-replace полный — ни одного curl к Forgejo без --max-time не осталось.
## Контекст PR#41 (issue #40) пофиксил hang в `_shared.ts:callForgejo`. Но 20 curl-вызовов к Forgejo API в skills/agents — все без `--max-time`/`--connect-timeout` (curl default = infinite). Агенты выполняют эти curl в bash, полностью bypass'я `_shared.ts`. Тот же класс 5-мин hang'а. Проблемные call sites (неполный список — полный в аудите): - `reviewer.md:86,387` — `curl -s .../pulls/<N>` (PR metadata) - `memory-syncer.md:42,121` — `curl -s .../pulls/<N>` (PR body) - `bug-discovery/SKILL.md:11-12` — `curl .../issues?state=open&type=issues` (duplicate check, листает ВСЕ issues без пагинации) - `run-pipeline/SKILL.md:71,117-118` — `curl .../pulls/<M>` (Template C/E) - `issue/SKILL.md:171` — `curl -sX POST .../labels` (label autocreate) - `project-template/SKILL.md:240,245,254,260` — 4 curl (repo-exists, repo create, settings, branch protection) - `repo-readme/SKILL.md:31,32` — `curl -sX PATCH .../repos/...` + `curl -sX PUT .../topics` - `release/SKILL.md:76` — `curl -sX POST .../releases` ## Задача 1. Глобальный grep-replace всех `curl` команд к `$FORGEJO_URL` или `git.slaid098.dev` или `/api/v1/` в `.opencode/**/*.md` — добавить `--max-time 30 --connect-timeout 10` после `curl -s`. 2. `bug-discovery/SKILL.md:11-12` — ДОПОЛНИТЕЛЬНО добавить `--limit 50` (или `&limit=50`) к duplicate-check curl (пагинация вместо листания всех open issues). 3. Проверить permission rules в `opencode.json` — если curl allow-rules используют regex/pattern, добавить `--max-time` НЕ должно сломать match (curl флаги не часть permission pattern). 4. Тесты: если есть `tests/test_permissions.py` или类似 — проверить что curl с `--max-time` проходит permission check. ## Контракты - `curl --max-time 30 --connect-timeout 10` — 30с общий таймаут, 10с на connect. Если Forgejo не ответил за 30с — curl exits с кодом 28 (timeout), агент видит ошибку. - Permission rules в `opencode.json` — pattern matching на команду, флаги `--max-time`/`--connect-timeout` не должны влиять на match (они после `curl -s`). - `bug-discovery` duplicate-check: `&limit=50` добавляется к URL query string. Если issues >50 — агент должен понимать что это первая страница (можно добавить `&page=1`). ## Инварианты - Существующие curl команды продолжают работать (добавляются только флаги таймаута). - Permission rules не ломаются. - `--max-time 30` — достаточно для нормальных Forgejo-ответов (issue create <1с, issue list <5с). - `--connect-timeout 10` — если TCP connect не установился за 10с (Forgejo down), curl fails fast. ## Граничные случаи - `curl -sX POST .../releases` (release create) — может быть медленным (загрузка assets). 30с может быть tight. Рассмотреть `--max-time 60` для POST с upload. Но release create без assets — 30с достаточно. - `curl .../issues?state=open&type=issues` (bug-discovery) — с `&limit=50` response меньше, но если репо >50 issues, duplicate-check неполный. Документировать что это first-page check (агент может пагинировать если нужно). - Permission rule `curl * -X DELETE *FORGEJO_URL*` (deny) — `--max-time` не влияет на match (pattern на `curl ... -X DELETE ...`). ## Влияние на связанные компоненты - Все skills/agents с curl к Forgejo — получают 30с timeout. - `bug-discovery` duplicate-check — теперь пагинированный (50 issues за раз). - Permission rules — не затронуты (флаги не часть pattern). ## Вне scope - Python oracles `urlopen` timeout — issue Волны 1. - git spawnSync timeout — issue Волны 3. - Server-side Forgejo — issue #19 в forgejo-infra. - Замена curl на `callForgejo` из `_shared.ts` — слишком инвазивно для skills (skills = markdown инструкции, не код). ## Критерии приемки - [ ] Все curl к Forgejo в `.opencode/**/*.md` имеют `--max-time 30 --connect-timeout 10`. - [ ] `bug-discovery/SKILL.md:11-12` duplicate-check имеет `&limit=50` (или `--limit 50`). - [ ] Permission rules в `opencode.json` не сломаны (curl с флагами проходит allow). - [ ] Тест permissions (если есть) — зелёный. - [ ] Гrep-replace полный — ни одного curl к Forgejo без `--max-time` не осталось.
Sign in to join this conversation.
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#43
No description provided.