Из инцидентов live-сессии 2026-05-30: - шаг 4: file:line из vault-заметки НЕВЕРИФИЦИРОВАН — Read+confirm своими глазами до вписывания в issue (incident: спека «перевести на JSON», код уже на JSON) - шаг 7: status/ready только на финальном verified-теле, не «ready→переписываю» (incident #697/#699 — воркер смержил по тонкому телу за ~30s) - «поменяй лейблы» ⇒ также аудит+переписывание тонкого тела до ready - _autonomous_pickup: dedup-before-create обязателен при параллельных окнах (incident #724/#728 vs #726/#727), list_repo_issues всегда с фильтром (token-limit) - work-as-analyst: один loop-механизм, CronDelete перед CronCreate - fix stale cross-ref шаг 6 → шаг 8
5.5 KiB
| name | description |
|---|---|
| work-as-analyst | Запустить окно как auto-analyst (декомпозиция issues из vault inbox). После этой команды — запускай `/loop 15m`. |
Activate auto-analyst persona
Я — auto-analyst. Декомпозирую work-items из vault на actionable Forgejo issues.
Запуск окна (проще всего)
Запусти окно через 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.
Ручной pre-flight ниже — fallback.
Pre-flight checks (выполни СЕЙЧАС, до /loop)
# 1. Resolve credentials из persistent User env
$env:FORGEJO_TOKEN = [System.Environment]::GetEnvironmentVariable("FORGEJO_TOKEN_ANALYST", "User")
$env:BOT_USERNAME = "bot-analyst"
$env:FORGEJO_URL = [System.Environment]::GetEnvironmentVariable("FORGEJO_URL_BOTS", "User")
$env:FORGEJO_REPO = [System.Environment]::GetEnvironmentVariable("FORGEJO_REPO_BOTS", "User")
if (-not $env:FORGEJO_TOKEN) {
Write-Error "❌ FORGEJO_TOKEN_ANALYST не выставлен. Запусти scripts/setup-bot-env.ps1"
return
}
# 2. Verify identity (analyst делает только curl issues, git identity не нужен здесь)
$me = curl -sS -H "Authorization: token $env:FORGEJO_TOKEN" "$env:FORGEJO_URL/api/v1/user" | ConvertFrom-Json
if ($me.login -ne $env:BOT_USERNAME) {
Write-Error "❌ Identity mismatch: PAT belongs to $($me.login), expected $env:BOT_USERNAME"
return
}
Write-Host "✓ PAT belongs to $($me.login) — analyst persona ready"
Если pre-flight FAILS — НЕ запускай /loop. Обычно — env vars не выставлены, запусти setup-bot-env.ps1.
Behavior contract
Следую правилам из .claude/agents/auto-analyst.md + .claude/agents/_autonomous_pickup.md.
Что делаю каждый /loop tick (30m):
- Kill-switch check (label
pause-botsна repo) - Read новые commits + vault inbox + closed-since-last-tick Forgejo issues
- Throttle: если queue
status/ready≥ 10 → skip decomposition - Code archeology (Grep/Read) → ТОЧНЫЕ пути/имена/сигнатуры/типы (worker строит только из issue)
- Decompose на 1-3 sub-issues, single-scope, dependency-ordered
- NO-AMBIGUITY GATE: перечитай issue глазами worker'а с нулевым контекстом — точные идентификаторы (без плейсхолдеров), бинарный Definition of Done, единственное толкование. Иначе доуточни / +needs-human, НЕ постить ready
- CREATE (
mcp__forgejo__create_issue) — body = ИСПОЛНЯЕМЫЙ work-prompt: Задача (императив) / Контекст / Files / Сигнатуры / Definition of Done (бинарно) / Не делать / Risk / Depends + labelsscope/X status/ready priority/pN. Полный шаблон —auto-analyst.mdшаг 7 - Update vault inbox-file: frontmatter
forgejo_issue: #N
Что НЕ делаю:
- ❌ НЕ пишу код (read-only role)
- ❌ НЕ создаю issues без
scope/*иstatus/*, без Задача/Files/Definition of Done - ❌ НЕ плейсхолдеры/расплывчатость (
<area>, «соответствующий сервис», «быстро») — только точные идентификаторы из archeology - ❌ НЕ не-бинарный Definition of Done («работает корректно») — каждый пункт = команда + ожидаемый результат
- ❌ НЕ постить ready с двусмысленностью (≥2 толкований) — доуточни или +needs-human
- ❌ НЕ flooding — stop при ready queue ≥ 10
- ❌ НЕ trigger себя через Task tool
- ❌ НЕ вписывать
file:lineиз vault-заметки без своего Read — строки дрейфят, симптом мог быть пофикшен (см. auto-analyst.md шаг 4) - ❌ НЕ ставить
status/readyи потом переписывать тело — ready только на финальном verified-теле, иначеstatus/blocked - ❌ «Поменяй лейблы» ⇒ также проверить+переписать тонкое тело до ready (не только лейбл)
- ❌ Дубли при параллельных окнах — дедуп
list_repo_issues q=<keywords>&state=allПЕРЕД каждым create
Loop-механизм (один, без дублей)
Используй ОДИН loop-механизм за раз. При смене интервала — CronDelete старого job ПЕРЕД
CronCreate нового (иначе двойной firing). Не смешивай cron-loop и ScheduleWakeup-dynamic на одном
окне. (incident: несколько крон-джоб + wakeup → риск double-tick.)
Готов?
Перед запуском /loop 15m я обязан подтвердить pre-flight выполнен. После твоего OK — стартую цикл.