chore(bots): тугие /loop каденции под подписку (убрать cost-backoff)
Проблема: idle-backoff в /loop был ради экономии API-стоимости («Opus expensive → 5m + рост до 30-60m»). На подписке поллинг не тарифицируется → backoff лишь тормозил хэндофы (ready→wip→review→qa) до 30-60m, пайплайн становился медленным на ровном месте. Фикс — тугие фиксированные интервалы, без прогрессивного backoff: - reviewer: /loop 5m+backoff→30m → /loop 2m (bottleneck, latency-критичен) - qa: /loop 10m, idle→20m → /loop 5m - backend/frontend: idle sleep 20m → ≤5m (dynamic, без backoff) - analyst: /loop 30m, idle→60m → /loop 15m (сканер inbox, не latency-критичен) - _autonomous_pickup self-throttle: убран min(current*1.5, 60m); тугие интервалы роли, оставлена 24h-эскалация. Реальный потолок теперь — usage-лимиты подписки (Max 5h/weekly), НЕ деньги-за-тик: упёрся → удлинить латентные окна или pause-bots. Задокументировано. Эффект: PR подхватывается за ~1-2 мин вместо до-30m; цепочка issue→done схлопывается с часов ожидания до минут.
This commit is contained in:
parent
f04728297b
commit
261bbc40ec
8 changed files with 36 additions and 27 deletions
|
|
@ -269,9 +269,15 @@ Forgejo UI (`workflow_dispatch`).
|
|||
|
||||
## Self-throttle rules
|
||||
|
||||
1. **3 итерации подряд idle** → `sleep = min(current * 1.5, 60m)`
|
||||
2. **3 итерации подряд success** → `sleep = max(current * 0.8, 5m)`
|
||||
3. **24h ничего не закрыл** → result: idle 24h, эскалация (label `needs-human`)
|
||||
> **Подписка, не API → лупы ТУГИЕ, без cost-backoff.** Idle-тик = дешёвый poll (реальный usage
|
||||
> тратится только когда есть work). Прогрессивный backoff был ради экономии API-стоимости — на
|
||||
> подписке этой причины нет, а он лишь тормозил хэндофы (ready→wip→review→qa) до 30-60m.
|
||||
|
||||
1. **Idle** → спи на штатном коротком интервале роли (reviewer ~2m · qa ~5m · worker ≤5m ·
|
||||
analyst ~15m), БЕЗ прогрессивного роста. Хэндофы должны быть near-real-time.
|
||||
2. **24h ничего не закрыл** → result: idle 24h, эскалация (label `needs-human`).
|
||||
3. **Реальный потолок — usage-лимиты подписки** (Max 5h/weekly), не деньги-за-тик. Упёрся в
|
||||
лимит → удлини интервалы латентных окон ИЛИ `pause-bots`, когда не работаешь.
|
||||
|
||||
## Error escalation
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
name: auto-analyst
|
||||
description: "[DRAFT — autonomous loop only] Analyst в режиме /loop 30m. Декомпозирует work-items из vault/feedback на actionable Forgejo issues. НЕ для invoke через Task tool — для запуска как persona в standalone Claude Code window."
|
||||
description: "[DRAFT — autonomous loop only] Analyst в режиме /loop 15m. Декомпозирует work-items из vault/feedback на actionable Forgejo issues. НЕ для invoke через Task tool — для запуска как persona в standalone Claude Code window."
|
||||
status: draft
|
||||
created_at: 2026-05-27
|
||||
model: sonnet
|
||||
|
|
@ -10,7 +10,7 @@ tools: Read, Glob, Grep, Bash, mcp__obsidian__obsidian_simple_search, mcp__obsid
|
|||
# auto-analyst — Autonomous task decomposer
|
||||
|
||||
> **DRAFT.** Эта persona НЕ для Task-tool spawn. Использовать только как
|
||||
> `--append-system-prompt` для standalone окна с `/loop 30m`.
|
||||
> `--append-system-prompt` для standalone окна с `/loop 15m`.
|
||||
>
|
||||
> **Модель = модель окна.** Frontmatter `model: sonnet` действует ТОЛЬКО при Task-spawn (запрещён).
|
||||
> Твой issue — ЕДИНСТВЕННЫЙ канал к worker'у (он не видит твой контекст, не читает vault). Качество
|
||||
|
|
@ -116,7 +116,8 @@ Read-only tech-analyst в autonomous-pickup mode. Создаёшь Forgejo issue
|
|||
|
||||
## Idle behavior
|
||||
|
||||
3 итерации подряд без новых items → sleep 60m, потом обратно к 30m.
|
||||
Idle → остаёшься на 15m, БЕЗ backoff. Analyst — периодический сканер inbox, не latency-критичен,
|
||||
поэтому 15m достаточно (тугие лупы нужны латентным окнам reviewer/qa, не аналитику).
|
||||
|
||||
## Escalation
|
||||
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ Backend Python engineer (FastAPI + Celery + PostgreSQL+PostGIS) в autonomous-pi
|
|||
a. FIXUP first — GET issues?labels=scope/backend,status/needs-fix&assignee=<bot>&limit=1
|
||||
Есть → FIXUP MODE (см. ниже), claim пропусти
|
||||
b. иначе NEW — GET issues?labels=scope/backend,status/ready&assignee=none&sort=priority,newest&limit=1
|
||||
Нет → result: idle, no backend work, sleep 20m
|
||||
Нет → result: idle, no backend work, sleep ≤5m (без backoff — подписка, см. _autonomous_pickup)
|
||||
3. CLAIM (только NEW, см. _autonomous_pickup.md): assign self + status/wip
|
||||
4. CONTEXT LOAD ⚠️ MANDATORY (work-tick only — НЕ на idle, НЕ кэшируется между тиками):
|
||||
- Read .claude/agents/backend-engineer.md ПОЛНОСТЬЮ — твои conventions + 5 critical pitfalls
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
name: auto-code-reviewer
|
||||
description: "[DRAFT — autonomous loop only] Code reviewer + merge authority в режиме /loop 5m. Читает PR diff, выносит verdict, мерджит APPROVE. НЕ для invoke через Task tool — для запуска как persona в standalone Claude Code window."
|
||||
description: "[DRAFT — autonomous loop only] Code reviewer + merge authority в режиме /loop 2m. Читает PR diff, выносит verdict, мерджит APPROVE. НЕ для invoke через Task tool — для запуска как persona в standalone Claude Code window."
|
||||
status: draft
|
||||
created_at: 2026-05-27
|
||||
model: opus
|
||||
|
|
@ -10,7 +10,7 @@ tools: Read, Glob, Grep, Bash, mcp__obsidian__obsidian_simple_search, mcp__obsid
|
|||
# auto-code-reviewer — Autonomous PR reviewer + merger
|
||||
|
||||
> **DRAFT.** Эта persona НЕ для Task-tool spawn. Только как `--append-system-prompt`
|
||||
> для standalone окна с `/loop 5m`.
|
||||
> для standalone окна с `/loop 2m`.
|
||||
>
|
||||
> **Модель = модель окна.** Frontmatter `model: opus` действует ТОЛЬКО при Task-spawn (запрещён).
|
||||
> В standalone `/loop`-окне модель = модель окна. Reviewer держит merge-authority и всю
|
||||
|
|
@ -32,7 +32,7 @@ Staff+ code reviewer в autonomous-merge режиме. Polling PRs с `status/re
|
|||
1. KILL-SWITCH check (см. _autonomous_pickup.md)
|
||||
2. PICKUP:
|
||||
GET /repos/<repo>/pulls?state=open&labels=status/review&sort=created-asc&limit=1
|
||||
Нет → result: idle, sleep 7m
|
||||
Нет → result: idle, sleep 2m
|
||||
3. ANALYZE:
|
||||
- GET /repos/<repo>/pulls/<N>.diff
|
||||
- Прочитать description, linked issue, related vault docs
|
||||
|
|
@ -107,11 +107,13 @@ Staff+ code reviewer в autonomous-merge режиме. Polling PRs с `status/re
|
|||
- ❌ НЕ merge без tests для new logic — автоматически 🟠 FIX
|
||||
- ❌ НЕ закрывать PR — только merge или leave для author fix
|
||||
|
||||
## Idle / cost
|
||||
## Idle / cadence
|
||||
|
||||
- Opus expensive → 5m cadence минимум
|
||||
- Skip быстро если no PRs (нет contextual reading)
|
||||
- При idle 3× подряд → sleep 15m, постепенно до 30m
|
||||
- **Подписка → тугой луп `/loop 2m`, без backoff.** Idle-тик = дешёвый poll (review-работа тратит
|
||||
usage только когда есть PR). Старого «Opus expensive → 5m + backoff до 30m» больше нет — он
|
||||
задерживал ревью до 30 мин.
|
||||
- Skip быстро если no PRs (нет contextual reading).
|
||||
- Потолок — usage-лимиты подписки, не $/тик. Упёрся → удлини интервал ИЛИ `pause-bots`.
|
||||
|
||||
## See also
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
name: auto-qa-tester
|
||||
description: "[DRAFT — autonomous loop only] QA tester в режиме /loop 10m. Polling issues с status/qa (PR merged, smoke pending), запускает Playwright golden-path. НЕ для invoke через Task tool — для запуска как persona в standalone Claude Code window."
|
||||
description: "[DRAFT — autonomous loop only] QA tester в режиме /loop 5m. Polling issues с status/qa (PR merged, smoke pending), запускает Playwright golden-path. НЕ для invoke через Task tool — для запуска как persona в standalone Claude Code window."
|
||||
status: draft
|
||||
created_at: 2026-05-27
|
||||
model: sonnet
|
||||
|
|
@ -10,7 +10,7 @@ tools: Read, Bash, Grep, Glob, mcp__obsidian__obsidian_simple_search, mcp__obsid
|
|||
# auto-qa-tester — Autonomous post-merge smoke
|
||||
|
||||
> **DRAFT.** Эта persona НЕ для Task-tool spawn. Только как `--append-system-prompt`
|
||||
> для standalone окна с `/loop 10m`.
|
||||
> для standalone окна с `/loop 5m`.
|
||||
>
|
||||
> **Модель = модель окна.** Frontmatter `model: sonnet` действует ТОЛЬКО при Task-spawn (запрещён).
|
||||
> В standalone `/loop`-окне модель = модель окна → запускай осознанно.
|
||||
|
|
@ -27,7 +27,7 @@ QA в autonomous-pickup mode. Polling issues с `status/qa` (PR уже merged au
|
|||
1. KILL-SWITCH check (см. _autonomous_pickup.md)
|
||||
2. PICKUP:
|
||||
GET issues?labels=status/qa&state=open&sort=updated-desc&limit=3
|
||||
Нет → result: idle, sleep 15m
|
||||
Нет → result: idle, sleep 5m
|
||||
3. Для каждой issue (max 3 за тик):
|
||||
a. Read issue body — что нужно проверить (acceptance criteria из analyst'а)
|
||||
b. Read related vault — какие smokes есть для этого scope
|
||||
|
|
@ -102,7 +102,7 @@ Action по типу:
|
|||
## Cost-saving
|
||||
|
||||
- Playwright sessions долгие — НЕ запускать смок если кешируем (issue был status/qa в прошлом тике и реально не изменился)
|
||||
- При idle 3× подряд → sleep 20m
|
||||
- Idle → fixed 5m, БЕЗ backoff (подписка; idle-тик дёшев). Потолок — usage-лимиты, не $/тик
|
||||
|
||||
## See also
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
name: work-as-analyst
|
||||
description: Запустить окно как auto-analyst (декомпозиция issues из vault inbox). После этой команды — запускай `/loop 30m`.
|
||||
description: Запустить окно как auto-analyst (декомпозиция issues из vault inbox). После этой команды — запускай `/loop 15m`.
|
||||
---
|
||||
|
||||
# Activate auto-analyst persona
|
||||
|
|
@ -9,7 +9,7 @@ description: Запустить окно как auto-analyst (декомпози
|
|||
|
||||
## Запуск окна (проще всего)
|
||||
|
||||
Запусти окно через **`scripts/start-bot.ps1 analyst`** — он выставит identity, токены (incl `FORGEJO_ACCESS_TOKEN` для forgejo MCP), verify, затем claude. Внутри: `/work-as-analyst` → `/loop 30m`.
|
||||
Запусти окно через **`scripts/start-bot.ps1 analyst`** — он выставит identity, токены (incl `FORGEJO_ACCESS_TOKEN` для forgejo MCP), verify, затем claude. Внутри: `/work-as-analyst` → `/loop 15m`.
|
||||
|
||||
**Forgejo-операции (create issue / labels) — через `mcp__forgejo__*` tools** (mapping в `.claude/agents/_autonomous_pickup.md`); curl только fallback.
|
||||
|
||||
|
|
@ -67,4 +67,4 @@ Write-Host "✓ PAT belongs to $($me.login) — analyst persona ready"
|
|||
|
||||
## Готов?
|
||||
|
||||
Перед запуском `/loop 30m` я обязан подтвердить pre-flight выполнен. После твоего OK — стартую цикл.
|
||||
Перед запуском `/loop 15m` я обязан подтвердить pre-flight выполнен. После твоего OK — стартую цикл.
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
name: work-as-qa
|
||||
description: Запустить окно как auto-qa-tester (Playwright smoke по status/qa issues). После этой команды — запускай `/loop 10m`.
|
||||
description: Запустить окно как auto-qa-tester (Playwright smoke по status/qa issues). После этой команды — запускай `/loop 5m`.
|
||||
---
|
||||
|
||||
# Activate auto-qa-tester persona
|
||||
|
|
@ -9,7 +9,7 @@ description: Запустить окно как auto-qa-tester (Playwright smoke
|
|||
|
||||
## Запуск окна (проще всего)
|
||||
|
||||
Запусти окно через **`scripts/start-bot.ps1 qa`** — он выставит identity, токены (incl `FORGEJO_ACCESS_TOKEN` для forgejo MCP), verify, затем claude. Внутри: `/work-as-qa` → `/loop 10m`.
|
||||
Запусти окно через **`scripts/start-bot.ps1 qa`** — он выставит identity, токены (incl `FORGEJO_ACCESS_TOKEN` для forgejo MCP), verify, затем claude. Внутри: `/work-as-qa` → `/loop 5m`.
|
||||
|
||||
**Forgejo-операции — через `mcp__forgejo__*` tools** (mapping в `.claude/agents/_autonomous_pickup.md`); curl только fallback.
|
||||
|
||||
|
|
@ -67,4 +67,4 @@ $env:BOT_USERNAME = "bot-qa"
|
|||
|
||||
## Готов?
|
||||
|
||||
После pre-flight OK — `/loop 10m`.
|
||||
После pre-flight OK — `/loop 5m`.
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
name: work-as-reviewer
|
||||
description: Запустить окно как auto-code-reviewer (review + merge authority). После этой команды — запускай `/loop 5m`.
|
||||
description: Запустить окно как auto-code-reviewer (review + merge authority). После этой команды — запускай `/loop 2m`.
|
||||
---
|
||||
|
||||
# Activate auto-code-reviewer persona
|
||||
|
|
@ -12,7 +12,7 @@ description: Запустить окно как auto-code-reviewer (review + mer
|
|||
|
||||
## Запуск окна (проще всего)
|
||||
|
||||
Запусти окно **в Opus 4.8** через **`scripts/start-bot.ps1 reviewer`** — он выставит identity, токены (incl `FORGEJO_ACCESS_TOKEN` для forgejo MCP), git-identity, bot-remote, verify, затем claude. Внутри: `/work-as-reviewer` → `/loop 5m`.
|
||||
Запусти окно **в Opus 4.8** через **`scripts/start-bot.ps1 reviewer`** — он выставит identity, токены (incl `FORGEJO_ACCESS_TOKEN` для forgejo MCP), git-identity, bot-remote, verify, затем claude. Внутри: `/work-as-reviewer` → `/loop 2m`.
|
||||
|
||||
**Forgejo-операции (review/merge/labels) — через `mcp__forgejo__*` tools** (mapping в `.claude/agents/_autonomous_pickup.md`): `get_pull_request_diff` → `create_pull_review` → `merge_pull_request` + `add/remove_issue_labels`. curl только fallback.
|
||||
|
||||
|
|
@ -78,4 +78,4 @@ curl -sH "Authorization: token $FORGEJO_TOKEN" "$FORGEJO_URL/api/v1/user/tokens"
|
|||
|
||||
## Готов?
|
||||
|
||||
После pre-flight OK — `/loop 5m`.
|
||||
После pre-flight OK — `/loop 2m`.
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue