chore(bots): тугие /loop каденции под подписку (убрать cost-backoff) #706
8 changed files with 36 additions and 27 deletions
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 — стартую цикл.
|
||||||
|
|
|
||||||
|
|
@ -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`.
|
||||||
|
|
|
||||||
|
|
@ -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`.
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue