From 6ebba84394fdcc0f214ede6685b1fb6c690e89e2 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Sun, 31 May 2026 15:46:58 +0300 Subject: [PATCH] =?UTF-8?q?docs(agents):=20=D0=BA=D0=BE=D0=BD=D1=81=D0=B5?= =?UTF-8?q?=D1=80=D0=B2=D0=B0=D1=82=D0=B8=D0=B2=D0=BD=D1=8B=D0=B9=20=D1=80?= =?UTF-8?q?=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=BC=D1=82=D0=BE=D0=B2=20=E2=80=94=20analyst=20verify-before-?= =?UTF-8?q?act,=20qa=20anti-idle,=20=D0=B3=D0=B8=D0=B3=D0=B8=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - auto-analyst: явное правило «читать ПОЛНОЕ тело issue через get_issue ПЕРЕД любым действием» (коммент/лейбл/решение); verify кода в main если про код. Правило в заголовке и в Hard rules. Инцидент-ref: mis-read #884 по title → взаимоисключающие комменты 2026-05-31. - auto-qa-tester: anti-idle guard в step 2 — перед объявлением idle перепроверить status/qa&state=open без limit, чтобы не пропустить застрявшие items. - auto-resolver: убрать «(Opus) осознанно» — resolver теперь тоже Sonnet через start-bot.ps1. - auto-backend, auto-frontend, auto-code-reviewer, _autonomous_pickup: не тронуты (ок). --- .claude/agents/auto-analyst.md | 11 ++++++++++- .claude/agents/auto-qa-tester.md | 6 +++++- .claude/agents/auto-resolver.md | 2 +- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/.claude/agents/auto-analyst.md b/.claude/agents/auto-analyst.md index f2703c2d..37b66b1e 100644 --- a/.claude/agents/auto-analyst.md +++ b/.claude/agents/auto-analyst.md @@ -14,7 +14,13 @@ tools: Task, Read, Glob, Grep, Bash, mcp__obsidian__obsidian_simple_search, mcp_ > > **Модель = модель окна.** Frontmatter `model: sonnet` действует ТОЛЬКО при Task-spawn (запрещён). > Твой issue — ЕДИНСТВЕННЫЙ канал к worker'у (он не видит твой контекст, не читает vault). Качество -> всего pipeline упирается в качество твоей декомпозиции → запускай окно в сильной модели осознанно. +> всего pipeline упирается в качество твоей декомпозиции. +> +> **⚠️ ЧИТАТЬ ПОЛНОЕ ТЕЛО ISSUE ПЕРЕД ЛЮБЫМ ДЕЙСТВИЕМ.** Прежде чем оставить коммент, сменить +> лейбл или принять решение по issue — получи актуальное тело через `mcp__forgejo__get_issue` +> (не полагайся на title / память / предыдущий тик). Если issue касается кода — verify актуальный +> код в main (`git show forgejo/main:` или Grep). Один выверенный коммент лучше «коммент → +> опровержение». (Инцидент 2026-05-31: mis-read #884 по title → два взаимоисключающих коммента.) > **Forgejo API → `mcp__forgejo__*` tools** (primary; полный mapping в [[_autonomous_pickup]] § «Forgejo операции»). curl — только fallback. Запуск окна: `scripts/start-bot.ps1 analyst`. @@ -181,6 +187,9 @@ Files/сигнатур/бинарного DoD, ≥2 толкования) — ** - ❌ **`status/ready` → потом переписываю тело** — ready только на финальном verified-теле; иначе держи `status/blocked` (воркер берёт ready за ~30s) - ❌ **Label-изменение без аудита тела** — «поменяй лейблы» ⇒ проверь+перепиши тонкое тело до ready +- ❌ **Действие по issue без чтения ПОЛНОГО тела** — ВСЕГДА `mcp__forgejo__get_issue` ПЕРЕД + комментом/лейблом/решением. Не полагаться на title, память, предыдущий тик. Если про код — + verify актуальный код в main. (Anti-pattern: «написал коммент → опроверг себя вторым комментом») - ✅ **Метрики из issue верифицируй на live-БД** перед ready: `mcp__postgres-tradein__execute_sql` для tradein (NULL %, coverage, anchor n, stale-counts), `mcp__postgres-gendesign__execute_sql` для основной. Не переписывай цифру из старой vault-заметки без своего SELECT — данные дрейфуют. **postgres-tradein** = отдельная trade-in БД (scraped avito/cian/yandex, estimator), **postgres-gendesign** = основная. - ✅ Один issue = единственное толкование. Перечитай глазами worker'а с нулевым контекстом перед CREATE diff --git a/.claude/agents/auto-qa-tester.md b/.claude/agents/auto-qa-tester.md index 50f50de6..bc688357 100644 --- a/.claude/agents/auto-qa-tester.md +++ b/.claude/agents/auto-qa-tester.md @@ -27,7 +27,11 @@ 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 5m + Нет → ПЕРЕД тем как объявить idle: перепроверь без limit (или limit:1) что + status/qa&state=open реально пуст. Причина: limit:3 может вернуть 0 при + ошибке запроса, а застрявшие items копятся. Если после перепроверки пусто + → result: idle, sleep 5m. Если есть — обрабатывай по terminal-правилу + (Non-UI-testable) или обычному smoke, не объявляй idle. 3. Для каждой issue (max 3 за тик): a. Read issue body — что нужно проверить (acceptance criteria из analyst'а) b. Read related vault — какие smokes есть для этого scope diff --git a/.claude/agents/auto-resolver.md b/.claude/agents/auto-resolver.md index d524f07a..f218b280 100644 --- a/.claude/agents/auto-resolver.md +++ b/.claude/agents/auto-resolver.md @@ -14,7 +14,7 @@ tools: Read, Write, Edit, Glob, Grep, Bash, mcp__obsidian__obsidian_simple_searc > > **Модель = модель окна.** Frontmatter `model` действует только при Task-spawn (запрещён). > Резолвер несёт высокую judgment-нагрузку (классификация блокера, прод-операции, решение -> «задача vs решение-человека») → запускай окно в сильной модели (Opus) осознанно. +> «задача vs решение-человека»). Окно запускается через `start-bot.ps1 resolver` (Sonnet). > **Forgejo API → `mcp__forgejo__*` tools** (mapping в [[_autonomous_pickup]] § «Forgejo операции»). curl — fallback.