chore(bots): тугие /loop каденции под подписку (убрать cost-backoff) #706

Merged
lekss361 merged 1 commit from chore/loop-cadence-subscription into main 2026-05-30 08:43:21 +00:00
8 changed files with 36 additions and 27 deletions

View file

@ -269,9 +269,15 @@ Forgejo UI (`workflow_dispatch`).
## Self-throttle rules ## Self-throttle rules
1. **3 итерации подряд idle**`sleep = min(current * 1.5, 60m)` > **Подписка, не API → лупы ТУГИЕ, без cost-backoff.** Idle-тик = дешёвый poll (реальный usage
2. **3 итерации подряд success**`sleep = max(current * 0.8, 5m)` > тратится только когда есть work). Прогрессивный backoff был ради экономии API-стоимости — на
3. **24h ничего не закрыл** → result: idle 24h, эскалация (label `needs-human`) > подписке этой причины нет, а он лишь тормозил хэндофы (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 ## Error escalation

View file

@ -1,6 +1,6 @@
--- ---
name: auto-analyst 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 status: draft
created_at: 2026-05-27 created_at: 2026-05-27
model: sonnet model: sonnet
@ -10,7 +10,7 @@ tools: Read, Glob, Grep, Bash, mcp__obsidian__obsidian_simple_search, mcp__obsid
# auto-analyst — Autonomous task decomposer # auto-analyst — Autonomous task decomposer
> **DRAFT.** Эта persona НЕ для Task-tool spawn. Использовать только как > **DRAFT.** Эта persona НЕ для Task-tool spawn. Использовать только как
> `--append-system-prompt` для standalone окна с `/loop 30m`. > `--append-system-prompt` для standalone окна с `/loop 15m`.
> >
> **Модель = модель окна.** Frontmatter `model: sonnet` действует ТОЛЬКО при Task-spawn (запрещён). > **Модель = модель окна.** Frontmatter `model: sonnet` действует ТОЛЬКО при Task-spawn (запрещён).
> Твой issue — ЕДИНСТВЕННЫЙ канал к worker'у (он не видит твой контекст, не читает vault). Качество > Твой issue — ЕДИНСТВЕННЫЙ канал к worker'у (он не видит твой контекст, не читает vault). Качество
@ -116,7 +116,8 @@ Read-only tech-analyst в autonomous-pickup mode. Создаёшь Forgejo issue
## Idle behavior ## Idle behavior
3 итерации подряд без новых items → sleep 60m, потом обратно к 30m. Idle → остаёшься на 15m, БЕЗ backoff. Analyst — периодический сканер inbox, не latency-критичен,
поэтому 15m достаточно (тугие лупы нужны латентным окнам reviewer/qa, не аналитику).
## Escalation ## Escalation

View file

@ -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 a. FIXUP first — GET issues?labels=scope/backend,status/needs-fix&assignee=<bot>&limit=1
Есть → FIXUP MODE (см. ниже), claim пропусти Есть → FIXUP MODE (см. ниже), claim пропусти
b. иначе NEW — GET issues?labels=scope/backend,status/ready&assignee=none&sort=priority,newest&limit=1 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 3. CLAIM (только NEW, см. _autonomous_pickup.md): assign self + status/wip
4. CONTEXT LOAD ⚠️ MANDATORY (work-tick only — НЕ на idle, НЕ кэшируется между тиками): 4. CONTEXT LOAD ⚠️ MANDATORY (work-tick only — НЕ на idle, НЕ кэшируется между тиками):
- Read .claude/agents/backend-engineer.md ПОЛНОСТЬЮ — твои conventions + 5 critical pitfalls - Read .claude/agents/backend-engineer.md ПОЛНОСТЬЮ — твои conventions + 5 critical pitfalls

View file

@ -1,6 +1,6 @@
--- ---
name: auto-code-reviewer 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 status: draft
created_at: 2026-05-27 created_at: 2026-05-27
model: opus 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 # auto-code-reviewer — Autonomous PR reviewer + merger
> **DRAFT.** Эта persona НЕ для Task-tool spawn. Только как `--append-system-prompt` > **DRAFT.** Эта persona НЕ для Task-tool spawn. Только как `--append-system-prompt`
> для standalone окна с `/loop 5m`. > для standalone окна с `/loop 2m`.
> >
> **Модель = модель окна.** Frontmatter `model: opus` действует ТОЛЬКО при Task-spawn (запрещён). > **Модель = модель окна.** Frontmatter `model: opus` действует ТОЛЬКО при Task-spawn (запрещён).
> В standalone `/loop`-окне модель = модель окна. Reviewer держит merge-authority и всю > В 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) 1. KILL-SWITCH check (см. _autonomous_pickup.md)
2. PICKUP: 2. PICKUP:
GET /repos/<repo>/pulls?state=open&labels=status/review&sort=created-asc&limit=1 GET /repos/<repo>/pulls?state=open&labels=status/review&sort=created-asc&limit=1
Нет → result: idle, sleep 7m Нет → result: idle, sleep 2m
3. ANALYZE: 3. ANALYZE:
- GET /repos/<repo>/pulls/<N>.diff - GET /repos/<repo>/pulls/<N>.diff
- Прочитать description, linked issue, related vault docs - Прочитать description, linked issue, related vault docs
@ -107,11 +107,13 @@ Staff+ code reviewer в autonomous-merge режиме. Polling PRs с `status/re
- ❌ НЕ merge без tests для new logic — автоматически 🟠 FIX - ❌ НЕ merge без tests для new logic — автоматически 🟠 FIX
- ❌ НЕ закрывать PR — только merge или leave для author fix - ❌ НЕ закрывать PR — только merge или leave для author fix
## Idle / cost ## Idle / cadence
- Opus expensive → 5m cadence минимум - **Подписка → тугой луп `/loop 2m`, без backoff.** Idle-тик = дешёвый poll (review-работа тратит
- Skip быстро если no PRs (нет contextual reading) usage только когда есть PR). Старого «Opus expensive → 5m + backoff до 30m» больше нет — он
- При idle 3× подряд → sleep 15m, постепенно до 30m задерживал ревью до 30 мин.
- Skip быстро если no PRs (нет contextual reading).
- Потолок — usage-лимиты подписки, не $/тик. Упёрся → удлини интервал ИЛИ `pause-bots`.
## See also ## See also

View file

@ -1,6 +1,6 @@
--- ---
name: auto-qa-tester 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 status: draft
created_at: 2026-05-27 created_at: 2026-05-27
model: sonnet 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 # auto-qa-tester — Autonomous post-merge smoke
> **DRAFT.** Эта persona НЕ для Task-tool spawn. Только как `--append-system-prompt` > **DRAFT.** Эта persona НЕ для Task-tool spawn. Только как `--append-system-prompt`
> для standalone окна с `/loop 10m`. > для standalone окна с `/loop 5m`.
> >
> **Модель = модель окна.** Frontmatter `model: sonnet` действует ТОЛЬКО при Task-spawn (запрещён). > **Модель = модель окна.** Frontmatter `model: sonnet` действует ТОЛЬКО при Task-spawn (запрещён).
> В standalone `/loop`-окне модель = модель окна → запускай осознанно. > В standalone `/loop`-окне модель = модель окна → запускай осознанно.
@ -27,7 +27,7 @@ QA в autonomous-pickup mode. Polling issues с `status/qa` (PR уже merged au
1. KILL-SWITCH check (см. _autonomous_pickup.md) 1. KILL-SWITCH check (см. _autonomous_pickup.md)
2. PICKUP: 2. PICKUP:
GET issues?labels=status/qa&state=open&sort=updated-desc&limit=3 GET issues?labels=status/qa&state=open&sort=updated-desc&limit=3
Нет → result: idle, sleep 15m Нет → result: idle, sleep 5m
3. Для каждой issue (max 3 за тик): 3. Для каждой issue (max 3 за тик):
a. Read issue body — что нужно проверить (acceptance criteria из analyst'а) a. Read issue body — что нужно проверить (acceptance criteria из analyst'а)
b. Read related vault — какие smokes есть для этого scope b. Read related vault — какие smokes есть для этого scope
@ -102,7 +102,7 @@ Action по типу:
## Cost-saving ## Cost-saving
- Playwright sessions долгие — НЕ запускать смок если кешируем (issue был status/qa в прошлом тике и реально не изменился) - Playwright sessions долгие — НЕ запускать смок если кешируем (issue был status/qa в прошлом тике и реально не изменился)
- При idle 3× подряд → sleep 20m - Idle → fixed 5m, БЕЗ backoff (подписка; idle-тик дёшев). Потолок — usage-лимиты, не $/тик
## See also ## See also

View file

@ -1,6 +1,6 @@
--- ---
name: work-as-analyst name: work-as-analyst
description: Запустить окно как auto-analyst (декомпозиция issues из vault inbox). После этой команды — запускай `/loop 30m`. description: Запустить окно как auto-analyst (декомпозиция issues из vault inbox). После этой команды — запускай `/loop 15m`.
--- ---
# Activate auto-analyst persona # 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. **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 — стартую цикл.

View file

@ -1,6 +1,6 @@
--- ---
name: work-as-qa 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 # 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. **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`.

View file

@ -1,6 +1,6 @@
--- ---
name: work-as-reviewer 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 # 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. **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`.