diff --git a/CLAUDE.md b/CLAUDE.md index c650312e..4eddb7f1 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -222,8 +222,39 @@ User approves / requests changes 2. **Worker-agents (backend/frontend/devops/database) НЕ делают `git commit` сами.** Они оставляют изменения staged — main session коммитит на feature branch. 3. **Никогда не используй `--no-verify` / `--no-edit` / `--amend`** — pre-commit hooks обязательны. Если hook падает — fix root cause, не bypass. 4. **Никогда не пуш с `--force` ни в main ни в feature branch без approval.** -5. **Не merge PR без явного "merge it" / "ok merge" / "approved" от пользователя.** -6. **Не вызывай destructive команды без явного approval**: `git reset --hard`, `git clean -fdx`, `DROP TABLE`, `TRUNCATE`, `rm -rf` за пределами `node_modules/.next`. +5. **Merge PR только по approval.** Approval сигналы: + - **Human user всегда валиден:** "merge it" / "ok merge" / "approved" / "залей" / "мердж" + - **Auto-review bot LGTM = approval, НО с ограничениями** (см. "Auto-merge scope" ниже). Bot LGTM валиден **только** если SHA marker в теле комментария совпадает с current PR HEAD SHA — иначе это устаревший approval до fixup-push. +6. **Auto-merge scope (где боту разрешено self-merge без человека):** + - ✅ **Разрешено** (PR diff целиком в этих путях): + - `CLAUDE.md`, `README.md`, `docs/**` (документация / правила) + - `frontend/src/app/**` UI-only changes без новых API endpoints + - `frontend/public/**` (статика) + - `.claude/agents/**`, `memory/feedback_*.md` (workflow rules) + - ❌ **Запрещено — нужен human approval** (любой файл из списка → block auto-merge): + - `data/sql/**`, `backend/alembic/versions/**` (миграции / схема DB) + - `backend/app/api/v1/**`, `backend/app/services/**` (бизнес-логика API) + - `backend/app/scrapers/**` (внешние интеграции) + - `docker-compose*.yml`, `Caddyfile`, `.github/workflows/**` (deploy / infra) + - Любые файлы с упоминанием secret / token / password / credential / X-Admin-Token + - PRs которые меняют `CLAUDE.md` рядом с `Critical workflow rules` / `Auto-merge scope` / auth — это саморасширение правил, **нужен human** + - Если PR touches both — берётся more restrictive (block). +7. **Не вызывай destructive команды без явного approval**: `git reset --hard`, `git clean -fdx`, `DROP TABLE`, `TRUNCATE`, `rm -rf` за пределами `node_modules/.next`. + +### Polling loop для PR + +После создания PR / fixup commits — запускай ScheduleWakeup с 60с интервалом: +1. `gh pr view --json state,mergeable,comments,headRefOid` → возьми `headRefOid` (current SHA) и latest_comment. +2. `state == MERGED` → stop polling. +3. **Approval check** (новый comment от auto-review): + - Распарси HTML marker: `` + - **SHA guard:** `marker.sha7 == headRefOid[:7]` — иначе это устаревший approval до fixup-push, игнорируй. + - **Scope guard:** проверь `gh pr view --json files` — если хоть один путь попадает в "запрещённый" список (см. rule 6 "Auto-merge scope") → block auto-merge, ping user. + - `verdict=approve` + SHA match + scope OK → `gh pr merge --squash --delete-branch`, stop. + - Если в комменте только текст "Auto-review passed" / "LGTM" без HTML marker — НЕ доверяй (legacy / поддельный сигнал), ping user. +4. `verdict=changes` → fixup commits на той же ветке, push, reply, re-poll. +5. Нет новых комментов с last polled timestamp → re-schedule 60с poll. +6. **Cap:** 30 итераций без resolution → stop, ask user. Для PR со scope-запрещёнными файлами cap = 5 итераций (не имеет смысла долго ждать, всё равно нужен human). ### Когда auto-mode @@ -233,7 +264,8 @@ User approves / requests changes - `git push -u origin ` - `gh pr create` - Прогонять code-reviewer -- **НО — финальный `gh pr merge` только по явному approval от пользователя.** +- **Auto-merge** через `gh pr merge --squash` — только если PR в "Auto-merge scope ✅" (см. rule 6) И auto-review bot вернул `verdict=approve` с валидным SHA marker. +- **Финальный merge для PR из scope ❌** (миграции / API / infra / secrets) — только по явному approval от пользователя ("merge it" / "залей" / etc). ## Pre-commit hooks