From 261bbc40ec82bd9feee2ec9585168cf374926f76 Mon Sep 17 00:00:00 2001 From: lekss361 Date: Sat, 30 May 2026 11:42:28 +0300 Subject: [PATCH] =?UTF-8?q?chore(bots):=20=D1=82=D1=83=D0=B3=D0=B8=D0=B5?= =?UTF-8?q?=20/loop=20=D0=BA=D0=B0=D0=B4=D0=B5=D0=BD=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=20=D0=BF=D0=BE=D0=B4=D0=BF=D0=B8=D1=81=D0=BA?= =?UTF-8?q?=D1=83=20(=D1=83=D0=B1=D1=80=D0=B0=D1=82=D1=8C=20cost-backoff)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Проблема: 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 схлопывается с часов ожидания до минут. --- .claude/agents/_autonomous_pickup.md | 12 +++++++++--- .claude/agents/auto-analyst.md | 7 ++++--- .claude/agents/auto-backend.md | 2 +- .claude/agents/auto-code-reviewer.md | 16 +++++++++------- .claude/agents/auto-qa-tester.md | 8 ++++---- .claude/commands/work-as-analyst.md | 6 +++--- .claude/commands/work-as-qa.md | 6 +++--- .claude/commands/work-as-reviewer.md | 6 +++--- 8 files changed, 36 insertions(+), 27 deletions(-) diff --git a/.claude/agents/_autonomous_pickup.md b/.claude/agents/_autonomous_pickup.md index 96de5365..2407f3cc 100644 --- a/.claude/agents/_autonomous_pickup.md +++ b/.claude/agents/_autonomous_pickup.md @@ -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 diff --git a/.claude/agents/auto-analyst.md b/.claude/agents/auto-analyst.md index 81ff61ab..dda552e3 100644 --- a/.claude/agents/auto-analyst.md +++ b/.claude/agents/auto-analyst.md @@ -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 diff --git a/.claude/agents/auto-backend.md b/.claude/agents/auto-backend.md index 86da8c5d..ab257b50 100644 --- a/.claude/agents/auto-backend.md +++ b/.claude/agents/auto-backend.md @@ -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=&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 diff --git a/.claude/agents/auto-code-reviewer.md b/.claude/agents/auto-code-reviewer.md index 42444208..861efc89 100644 --- a/.claude/agents/auto-code-reviewer.md +++ b/.claude/agents/auto-code-reviewer.md @@ -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//pulls?state=open&labels=status/review&sort=created-asc&limit=1 - Нет → result: idle, sleep 7m + Нет → result: idle, sleep 2m 3. ANALYZE: - GET /repos//pulls/.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 diff --git a/.claude/agents/auto-qa-tester.md b/.claude/agents/auto-qa-tester.md index 72d24b0b..9aec5f9b 100644 --- a/.claude/agents/auto-qa-tester.md +++ b/.claude/agents/auto-qa-tester.md @@ -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 diff --git a/.claude/commands/work-as-analyst.md b/.claude/commands/work-as-analyst.md index 469acd0e..f89b1ca2 100644 --- a/.claude/commands/work-as-analyst.md +++ b/.claude/commands/work-as-analyst.md @@ -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 — стартую цикл. diff --git a/.claude/commands/work-as-qa.md b/.claude/commands/work-as-qa.md index 0cda6285..bd11b3b2 100644 --- a/.claude/commands/work-as-qa.md +++ b/.claude/commands/work-as-qa.md @@ -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`. diff --git a/.claude/commands/work-as-reviewer.md b/.claude/commands/work-as-reviewer.md index b5b1c18a..163a517c 100644 --- a/.claude/commands/work-as-reviewer.md +++ b/.claude/commands/work-as-reviewer.md @@ -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`.