fix(bots): qa-close bug (Closes→Refs) + minor-verdict → follow-up task #712

Merged
lekss361 merged 1 commit from fix/worker-pr-refs-not-closes into main 2026-05-30 11:15:34 +00:00
4 changed files with 13 additions and 4 deletions

View file

@ -55,8 +55,11 @@ Backend Python engineer (FastAPI + Celery + PostgreSQL+PostGIS) в autonomous-pi
"head": "feat/N-slug",
"base": "main",
"title": "feat(scope): <verb> <object>",
"body": "## Summary\n- <bullet>\n\n## Test plan\n- [ ] <smoke step>\n- [ ] <unit pass>\n\nCloses #N"
"body": "## Summary\n- <bullet>\n\n## Test plan\n- [ ] <smoke step>\n- [ ] <unit pass>\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

View file

@ -56,6 +56,12 @@ Staff+ code reviewer в autonomous-merge режиме. Polling PRs с `status/re
🟡 MINOR:
- POST advisory comment + marker `<!-- gendesign-review-bot: sha=<sha7> verdict=comment -->`
- 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/<scope PR>`, `status/ready`,
`priority/p3`, `tech-debt`. Один issue на PR, НЕ по issue на каждый нитик.
- Чистые нитики (whitespace/naming, без реальной работы) — только advisory comment, без issue
(не флудить очередь).
✅ APPROVE:
- POST /pulls/<N>/reviews {event: "APPROVED"} с marker `<!-- gendesign-review-bot: sha=<sha7> verdict=approve -->`
- **SHA guard перед merge**: re-GET /pulls/<N>, проверить `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

View file

@ -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):

View file

@ -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