From 627189a3e35d4fd98eece7e0f2ad33a4e77257fb Mon Sep 17 00:00:00 2001 From: lekss361 Date: Sat, 30 May 2026 14:11:05 +0300 Subject: [PATCH] =?UTF-8?q?fix(bots):=20qa-close=20bug=20(Closes=E2=86=92R?= =?UTF-8?q?efs)=20+=20minor-verdict=20creates=20follow-up=20task?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Найдено живым тестом (reviewer смержил #710 → linked issue #696 закрылся ДО qa). 1. Closes→Refs: worker PR-body писал `Closes #N` → merge авто-закрывал issue → qa-pickup (status/qa & state=open) закрытый не видел → smoke не запускался. FSM: issue закрывает QA на status/done, не merge. Фикс: worker пишет `Refs #N`. - auto-backend.md PR-template + git-pr.md note. 2. MINOR → follow-up task (по запросу): reviewer на 🟡 MINOR теперь, кроме merge, заводит ОДИН consolidated follow-up issue для actionable-minor'ов (scope/X status/ready priority/p3 tech-debt; body = work-prompt + "Follow-up из PR #N"). Косметику (whitespace/naming) не заводит — не флудить очередь. - auto-code-reviewer.md ACT+severity + work-as-reviewer.md. - Заведены labels priority/p3 (id63) + tech-debt. --- .claude/agents/auto-backend.md | 5 ++++- .claude/agents/auto-code-reviewer.md | 8 +++++++- .claude/commands/work-as-reviewer.md | 2 +- .claude/rules/git-pr.md | 2 +- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/.claude/agents/auto-backend.md b/.claude/agents/auto-backend.md index ab257b50..1875805f 100644 --- a/.claude/agents/auto-backend.md +++ b/.claude/agents/auto-backend.md @@ -55,8 +55,11 @@ Backend Python engineer (FastAPI + Celery + PostgreSQL+PostGIS) в autonomous-pi "head": "feat/N-slug", "base": "main", "title": "feat(scope): ", - "body": "## Summary\n- \n\n## Test plan\n- [ ] \n- [ ] \n\nCloses #N" + "body": "## Summary\n- \n\n## Test plan\n- [ ] \n- [ ] \n\nRefs #N" } + ⚠️ В body — `Refs #N`, НЕ `Closes/Fixes/Resolves`: closing-keyword авто-закроет issue на merge → + qa не увидит open `status/qa` (pickup фильтрует state=open) → smoke не запустится. Issue закрывает + qa на status/done (см. _autonomous_pickup FSM). Update issue: +status/review -status/wip Snapshot diff size + lint pass status в первом comment под PR (для reviewer context) 8. NO POLLING нового issue — но fixup своих PR имеет приоритет (step 2a) → обратно к step 1 diff --git a/.claude/agents/auto-code-reviewer.md b/.claude/agents/auto-code-reviewer.md index 861efc89..f4550e80 100644 --- a/.claude/agents/auto-code-reviewer.md +++ b/.claude/agents/auto-code-reviewer.md @@ -56,6 +56,12 @@ Staff+ code reviewer в autonomous-merge режиме. Polling PRs с `status/re 🟡 MINOR: - POST advisory comment + marker `` - APPROVE + squash-merge (ниже) + - **Follow-up для ACTIONABLE minor'ов** (не чистая косметика): создай ОДИН consolidated issue + `mcp__forgejo__create_issue` — body = work-prompt (Задача / Files / Definition of Done из + найденных minor'ов) + "Follow-up из PR #N (merged)"; labels: `scope/`, `status/ready`, + `priority/p3`, `tech-debt`. Один issue на PR, НЕ по issue на каждый нитик. + - Чистые нитики (whitespace/naming, без реальной работы) — только advisory comment, без issue + (не флудить очередь). ✅ APPROVE: - POST /pulls//reviews {event: "APPROVED"} с marker `` - **SHA guard перед merge**: re-GET /pulls/, проверить `head.sha[:7] == sha7` из marker — иначе устаревший verdict до fixup-push, abort merge @@ -81,7 +87,7 @@ Staff+ code reviewer в autonomous-merge режиме. Polling PRs с `status/re |---|---|---| | 🔴 BLOCK | SQL injection, secret leak, data loss, breaking API, untested critical path, ИЛИ 3× fix-fail | NEVER merge, +blocked +needs-human | | 🟠 FIX | Wrong logic, missed error path, regression, no tests для new logic | NO merge, +needs-fix (worker чинит сам), comment с fix-list | -| 🟡 MINOR | Style, naming, log verbosity, dead code | Comment, MERGE anyway | +| 🟡 MINOR | Style, naming, log verbosity, dead code | Comment + MERGE; actionable minor'ы → 1 follow-up issue (`scope/X status/ready priority/p3 tech-debt`); косметику не заводить | | ✅ APPROVE | Clean, conventions match, tests cover, no surprises | Merge | ## Hard rules diff --git a/.claude/commands/work-as-reviewer.md b/.claude/commands/work-as-reviewer.md index 163a517c..7429e3d4 100644 --- a/.claude/commands/work-as-reviewer.md +++ b/.claude/commands/work-as-reviewer.md @@ -51,7 +51,7 @@ curl -sH "Authorization: token $FORGEJO_TOKEN" "$FORGEJO_URL/api/v1/user/tokens" Fix-attempt cap: 3× FIX по одному PR (по своим прошлым marker'ам) → эскалируй в BLOCK. - 🔴 BLOCK (security/data-loss/breaking ИЛИ 3× fix-fail) → comment + marker `verdict=changes` + `+status/blocked +needs-human -status/review` - - 🟡 MINOR → advisory comment с marker + APPROVE + merge + - 🟡 MINOR → advisory comment + APPROVE + merge; для ACTIONABLE minor'ов — ОДИН follow-up issue (`mcp__forgejo__create_issue`: `scope/X status/ready priority/p3 tech-debt`; body = work-prompt + "Follow-up из PR #N"). Чистую косметику в очередь не таскать. - ✅ APPROVE → review с marker `verdict=approve` + **SHA guard** (re-GET PR, check head.sha[:7] == sha7) → squash-merge + delete branch + status/qa на linked issue **Canonical marker format** (обязательно в каждом comment): diff --git a/.claude/rules/git-pr.md b/.claude/rules/git-pr.md index 6e409e6e..eb1b0219 100644 --- a/.claude/rules/git-pr.md +++ b/.claude/rules/git-pr.md @@ -60,7 +60,7 @@ paths: Closes #N ``` -Всегда `Closes #N` если есть issue. Комментарий на issue при PR create: "Working on this in PR #M". +Человеческий PR: `Closes #N` (авто-закрывает issue на merge). **Автономный bot-pipeline: `Refs #N` (НЕ Closes/Fixes/Resolves)** — иначе merge закроет issue до qa, а qa-pickup ищет open `status/qa` → smoke не запустится; в боте issue закрывает **qa** на status/done. Комментарий на issue при PR create: "Working on this in PR #M". ## Polling loop -- 2.45.3