fix(bots): qa-close bug (Closes→Refs) + minor-verdict creates follow-up task
Найдено живым тестом (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.
This commit is contained in:
parent
466774dbd8
commit
627189a3e3
4 changed files with 13 additions and 4 deletions
|
|
@ -55,8 +55,11 @@ Backend Python engineer (FastAPI + Celery + PostgreSQL+PostGIS) в autonomous-pi
|
||||||
"head": "feat/N-slug",
|
"head": "feat/N-slug",
|
||||||
"base": "main",
|
"base": "main",
|
||||||
"title": "feat(scope): <verb> <object>",
|
"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
|
Update issue: +status/review -status/wip
|
||||||
Snapshot diff size + lint pass status в первом comment под PR (для reviewer context)
|
Snapshot diff size + lint pass status в первом comment под PR (для reviewer context)
|
||||||
8. NO POLLING нового issue — но fixup своих PR имеет приоритет (step 2a) → обратно к step 1
|
8. NO POLLING нового issue — но fixup своих PR имеет приоритет (step 2a) → обратно к step 1
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,12 @@ Staff+ code reviewer в autonomous-merge режиме. Polling PRs с `status/re
|
||||||
🟡 MINOR:
|
🟡 MINOR:
|
||||||
- POST advisory comment + marker `<!-- gendesign-review-bot: sha=<sha7> verdict=comment -->`
|
- POST advisory comment + marker `<!-- gendesign-review-bot: sha=<sha7> verdict=comment -->`
|
||||||
- APPROVE + squash-merge (ниже)
|
- 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:
|
✅ APPROVE:
|
||||||
- POST /pulls/<N>/reviews {event: "APPROVED"} с marker `<!-- gendesign-review-bot: sha=<sha7> verdict=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
|
- **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 |
|
| 🔴 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 |
|
| 🟠 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 |
|
| ✅ APPROVE | Clean, conventions match, tests cover, no surprises | Merge |
|
||||||
|
|
||||||
## Hard rules
|
## Hard rules
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ curl -sH "Authorization: token $FORGEJO_TOKEN" "$FORGEJO_URL/api/v1/user/tokens"
|
||||||
Fix-attempt cap: 3× FIX по одному PR (по своим прошлым marker'ам) → эскалируй в BLOCK.
|
Fix-attempt cap: 3× FIX по одному PR (по своим прошлым marker'ам) → эскалируй в BLOCK.
|
||||||
- 🔴 BLOCK (security/data-loss/breaking ИЛИ 3× fix-fail) → comment + marker `verdict=changes` +
|
- 🔴 BLOCK (security/data-loss/breaking ИЛИ 3× fix-fail) → comment + marker `verdict=changes` +
|
||||||
`+status/blocked +needs-human -status/review`
|
`+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
|
- ✅ 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):
|
**Canonical marker format** (обязательно в каждом comment):
|
||||||
|
|
|
||||||
|
|
@ -60,7 +60,7 @@ paths:
|
||||||
Closes #N
|
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
|
## Polling loop
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue