feat(claude): auto-* agent stubs для autonomous multi-window workflow (DRAFT) #608

Merged
lekss361 merged 3 commits from feat/claude-auto-agents-stubs into main 2026-05-27 20:27:33 +00:00
Owner

Summary

DRAFT-файлы для autonomous /loop окон — 5 ролей с префиксом auto-:

  • auto-analyst (sonnet, /loop 30m) — декомпозиция issues из vault inbox
  • auto-backend (sonnet, /loop dynamic) — pickup scope/backend issues
  • auto-frontend (sonnet, /loop dynamic) — pickup scope/frontend issues
  • auto-code-reviewer (opus, /loop 5m) — review + merge authority
  • auto-qa-tester (sonnet, /loop 10m) — Playwright smoke post-merge

Плюс _autonomous_pickup.md — shared snippet с Forgejo claim/state-transition contract.

Все файлы помечены status: draft в frontmatter + [DRAFT — autonomous loop only] в description, чтобы main session НЕ подхватил их через Task tool случайно.

Также fix .gitignore: .claude/.claude/* чтобы whitelist'ы !.claude/agents/** работали (git не позволяет re-include children of ignored directory, известное ограничение).

Что НЕ активируется этим PR

  • .claude/commands/work-as-*.md wrapper'ы — не созданы
  • Forgejo labels (scope/*, status/*, priority/*) — не созданы
  • Bot users + PATs — не созданы
  • Никаких окон не запущено

Стуб-файлы лежат на диске + теперь в git, но не имеют активного эффекта.

Полная схема

См. vault: runbooks/multi_agent_autonomous_workflow.md (DRAFT status). 5-window architecture + state machine + per-window walkthrough + cost estimate (~$127/день при активной работе) + open questions.

Test plan

  • Verify no existing subagent invocation breaks (Task tool с обычными subagents продолжает работать)
  • .gitignore change не trigger'ит unwanted file tracking
  • Файлы видны в claude (subagent picker) но не selectable для invoke (description warning)

Refs

  • Vault: runbooks/multi_agent_autonomous_workflow.md
  • Existing agents (untouched): .claude/agents/backend-engineer.md, tech-analyst.md etc
## Summary DRAFT-файлы для **autonomous /loop окон** — 5 ролей с префиксом `auto-`: - `auto-analyst` (sonnet, /loop 30m) — декомпозиция issues из vault inbox - `auto-backend` (sonnet, /loop dynamic) — pickup scope/backend issues - `auto-frontend` (sonnet, /loop dynamic) — pickup scope/frontend issues - `auto-code-reviewer` (opus, /loop 5m) — review + merge authority - `auto-qa-tester` (sonnet, /loop 10m) — Playwright smoke post-merge Плюс `_autonomous_pickup.md` — shared snippet с Forgejo claim/state-transition contract. Все файлы помечены `status: draft` в frontmatter + `[DRAFT — autonomous loop only]` в description, чтобы main session НЕ подхватил их через Task tool случайно. Также fix `.gitignore`: `.claude/` → `.claude/*` чтобы whitelist'ы `!.claude/agents/**` работали (git не позволяет re-include children of ignored directory, известное ограничение). ## Что НЕ активируется этим PR - ❌ `.claude/commands/work-as-*.md` wrapper'ы — не созданы - ❌ Forgejo labels (`scope/*`, `status/*`, `priority/*`) — не созданы - ❌ Bot users + PATs — не созданы - ❌ Никаких окон не запущено Стуб-файлы лежат на диске + теперь в git, но **не имеют активного эффекта**. ## Полная схема См. vault: `runbooks/multi_agent_autonomous_workflow.md` (DRAFT status). 5-window architecture + state machine + per-window walkthrough + cost estimate (~$127/день при активной работе) + open questions. ## Test plan - [ ] Verify no existing subagent invocation breaks (Task tool с обычными subagents продолжает работать) - [ ] `.gitignore` change не trigger'ит unwanted file tracking - [ ] Файлы видны в `claude` (subagent picker) но не selectable для invoke (description warning) ## Refs - Vault: `runbooks/multi_agent_autonomous_workflow.md` - Existing agents (untouched): `.claude/agents/backend-engineer.md`, `tech-analyst.md` etc
lekss361 added 1 commit 2026-05-27 19:57:50 +00:00
feat(claude): auto-* agent stubs для autonomous multi-window workflow
Some checks failed
CI / backend (pull_request) Failing after 48s
CI / frontend (pull_request) Successful in 1m39s
89303c9769
DRAFT-файлы для autonomous /loop окон (5 ролей: analyst/backend/frontend/
code-reviewer/qa-tester). НЕ для invoke через Task tool — только как
--append-system-prompt для standalone Claude Code windows с /loop.

Все файлы помечены status:draft. Не активны до сборки .claude/commands/
work-as-* wrappers + Forgejo labels + bot-PATs (см. runbook
multi_agent_autonomous_workflow.md в vault).

Также fix .gitignore: .claude/ → .claude/* чтобы whitelist'ы
!.claude/agents/** работали (git не allow re-include children of ignored
directory).

Refs: runbooks/multi_agent_autonomous_workflow.md (vault)
Author
Owner

Deep Code Review — PR #608

Note: mergeable=false — нужен rebase перед merge.

Summary

  • Status: 🟡 COMMENT (DRAFT, status=draft на всех файлах — pre-merge feedback)
  • Files: 7 (P1: 6 .claude/agents/auto-*.md + _autonomous_pickup.md; P3: .gitignore)
  • Lines: +512 / -1
  • Scope: agent stubs для autonomous multi-window workflow
  • Credentials scan: нет 40-char hex / hardcoded tokens в diff
  • .gitignore change (.claude/.claude/*) — корректно объяснено, whitelist needs glob-style ignore

🟠 High (нужно поправить до un-draft)

1. auto-backend.md:7mcp__postgres-gendesign__execute_sql в autonomous worker = blast radius DML/DDL

  • В .claude/rules/sql.md migrations идут через data/sql/NN_*.sql + deploy.yml, не runtime execute_sql из worker'а
  • Базовый backend-engineer.md использует SQL files; autonomous версия НЕ должна расширять capability
  • Fix: убрать execute_sql из tools list. Оставить list_objects, get_object_details, explain_query для read-only investigation

2. auto-code-reviewer.md:7mcp__postgres-gendesign__execute_sql для reviewer

  • Базовый deep-code-reviewer.md (read-only mandate) имеет ТОЛЬКО explain_query / analyze_query_indexes — НЕТ execute_sql
  • Reviewer не должен мутировать БД. Fix: drop execute_sql

3. Env var name inconsistency: FORGEJO_PAT (stubs) vs FORGEJO_TOKEN (.claude/rules/git-pr.md)

  • _autonomous_pickup.md:13-15 envs FORGEJO_BASE_URL / FORGEJO_PAT / FORGEJO_REPO
  • rules/git-pr.md и существующая infrastructure используют $FORGEJO_TOKEN + $FORGEJO_URL
  • Risk: ops запустит окно с FORGEJO_PAT=..., kill-switch query сработает с пустым $FORGEJO_PAT → auth fail → AUTH_ERROR halt. Или наоборот: existing scripts сломаются
  • Fix: align naming — FORGEJO_TOKEN + FORGEJO_URL (current convention)

4. auto-code-reviewer.md НЕ упоминает marker + SHA guard

  • .claude/rules/git-pr.md требует на каждом review comment: <!-- gendesign-review-bot: sha=<sha7> verdict=<approve|changes> -->
  • SHA guard: marker.sha7 == head.sha[:7] иначе устаревший verdict игнорируется
  • Стаб говорит "POST review comment с findings" / "POST advisory comment" — нет marker template
  • Fix: добавить в "ACT" step канонический marker format + SHA guard mention

5. auto-code-reviewer.md self-extending guard НЕ упомянут

  • rules/git-pr.md: "PR меняет блок ## Auto-merge policy или Critical workflow rules в CLAUDE.md — НЕ merge, ping user"
  • Стаб должен явно отметить hard-exception, иначе autonomous reviewer может смержить PR расширяющий свои merge права
  • Fix: в "What NOT to do" — НЕ merge PR диффающий .claude/rules/git-pr.md или CLAUDE.md критичные блоки; +blocked +needs-human

🟡 Medium

6. Claim race в _autonomous_pickup.md

  • 3 шага (assign → wip label → verify) — "atomic-ish". Между шагом 1 и 3 второй worker может claim'нуть
  • Verify checks .assignees[0] — но если оба назначены, читается первый. Race теоретически решается, но описание вводит в заблуждение
  • Fix: либо note про эту слабость + check .assignees | length == 1, либо stricter retry on race

7. Stale-claim cleanup — TODO не имплементирован

  • _autonomous_pickup.md:80 "cron на VPS — отдельная задача"
  • Без него worker crash или window kill = issue стуком в wip forever (4h+ unblock не сработает без cron)
  • Fix: либо commit cron-script в scripts/cleanup-stale-claims.sh + .forgejo/workflows/stale-claims.yml, либо описать как issue / follow-up

8. auto-qa-tester.md:60 — global kill-switch на 3× FAIL слишком агрессивно

  • 3 flaky smokes (network blip Playwright) → pause-bots для ВСЕХ окон = весь pipeline стоит
  • Fix: differentiate "3× FAIL на разных PR (likely flaky)" vs "3× FAIL все попадают на health-endpoint (likely prod down)". Pause только при втором

9. auto-backend.md PR body template неполный

  • rules/git-pr.md требует ## Summary + ## Test plan + Closes #N
  • Стаб говорит только body: "Closes #N"
  • Fix: расширить шаг 6 PR body с template inline

10. Behavior при pause-bots mid-work не определён

  • Worker claim'нул issue → начал работать → pause-bots устанавливается
  • Abort + release claim, finish + push, или wait?
  • Fix: явная политика — "если pause-bots появился пока wip → finish current commit/push, открыть PR (он не merge'нётся пока review-bot тоже paused)"

🟢 Low

11. auto-analyst.md tool mcp__obsidian__obsidian_get_recent_changes

  • Используется в workflow step 2; убедиться что этот tool реально доступен в текущей MCP конфигурации

12. auto-analyst.md de-dup через q=<keywords> — fuzzy

  • Малая разница в title создаст duplicate issues
  • Fix: rely на vault frontmatter forgejo_issue: (уже есть в шаге 6) — это надёжнее

13. PAT scope guidance

  • _autonomous_pickup.md не упоминает что bot-PAT должен быть narrow-scope (только этот repo, не user-scope)
  • Fix: одна строка про env setup

14. BOT_USERNAME env используется, но не задокументирован рядом с FORGEJO_PAT/URL/REPO

  • Used в claim step --data '{"assignees": ["$BOT_USERNAME"]}'
  • Fix: добавить в env list в начале файла

Positive

  • Kill-switch (pause-bots label) — простой и понятный механизм
  • Backoff strategy (5→7→10→15→20 min) consistent с [Polling backoff progressive] memory rule
  • State machine labels (status/ready/wip/review/qa/done/blocked) clean
  • Single-scope per issue rule (no cross-domain leakage)
  • Worker isolation:worktree mandate — consistent с memory rules
  • Reviewer НЕ редактирует код, только comments + label flip — correct separation
  • Все стабы помечены status: draft + явно "NOT for Task-tool spawn" — низкий риск accidental invoke
  • .gitignore change правильно объяснён в комменте

Cross-reference verification

  • auto-backend.md ссылается на backend-engineer.md + rules/backend.md + sql.md + git-pr.md — все exist
  • auto-frontend.md ссылается на frontend-engineer.md + ui-*.md — exist
  • auto-code-reviewer.md ссылается на code-reviewer.md + deep-code-reviewer.md — exist
  • auto-qa-tester.md ссылается на qa-tester.md + deploy.md — exist
  • auto-analyst.md ссылается на tech-analyst.md — exists
  1. Rebase на forgejo/main (mergeable=false из-за конфликта)
  2. Drop execute_sql из обоих auto-backend и auto-code-reviewer tools lists (🟠 #1, #2)
  3. Align env var naming FORGEJO_TOKEN + FORGEJO_URL (🟠 #3)
  4. Добавить marker template + SHA guard + self-extending guard exception в auto-code-reviewer.md (🟠 #4, #5)
  5. Уточнить kill-switch mid-work behavior + stale-claim cron status (🟡 #7, #10)
  6. Расширить PR body template в auto-backend.md (🟡 #9)
  7. После un-draft (status: draftstatus: stable) — повторный review

Complexity / blast radius

  • Risk: 🟢 LOW — все стабы status: draft, явно "NOT for Task-tool spawn", не активируются автоматически
  • Reversibility: 🟢 HIGH — pure documentation, откатывается без data-loss
  • Merge window: wait for rebase + 🟠 fixes

Verdict: 🟡 COMMENT — ready after rebase + 🟠 High items addressed. Не блокирует как DRAFT, но активация (status→stable) должна закрыть as least 5 high-severity items. Не мержу — mergeable=false, нужен rebase.

<!-- gendesign-review-bot: sha=89303c9 verdict=comment --> ## Deep Code Review — PR #608 **Note: mergeable=false — нужен rebase перед merge.** ### Summary - Status: 🟡 COMMENT (DRAFT, status=draft на всех файлах — pre-merge feedback) - Files: 7 (P1: 6 `.claude/agents/auto-*.md` + `_autonomous_pickup.md`; P3: `.gitignore`) - Lines: +512 / -1 - Scope: agent stubs для autonomous multi-window workflow - Credentials scan: ✅ нет 40-char hex / hardcoded tokens в diff - `.gitignore` change (`.claude/` → `.claude/*`) — корректно объяснено, whitelist needs glob-style ignore ### 🟠 High (нужно поправить до un-draft) **1. `auto-backend.md:7` — `mcp__postgres-gendesign__execute_sql` в autonomous worker = blast radius DML/DDL** - В `.claude/rules/sql.md` migrations идут через `data/sql/NN_*.sql` + `deploy.yml`, не runtime `execute_sql` из worker'а - Базовый `backend-engineer.md` использует SQL files; autonomous версия НЕ должна расширять capability - Fix: убрать `execute_sql` из tools list. Оставить `list_objects`, `get_object_details`, `explain_query` для read-only investigation **2. `auto-code-reviewer.md:7` — `mcp__postgres-gendesign__execute_sql` для reviewer** - Базовый `deep-code-reviewer.md` (read-only mandate) имеет ТОЛЬКО `explain_query` / `analyze_query_indexes` — НЕТ `execute_sql` - Reviewer не должен мутировать БД. Fix: drop `execute_sql` **3. Env var name inconsistency: `FORGEJO_PAT` (stubs) vs `FORGEJO_TOKEN` (`.claude/rules/git-pr.md`)** - `_autonomous_pickup.md:13-15` envs `FORGEJO_BASE_URL` / `FORGEJO_PAT` / `FORGEJO_REPO` - rules/git-pr.md и существующая infrastructure используют `$FORGEJO_TOKEN` + `$FORGEJO_URL` - Risk: ops запустит окно с `FORGEJO_PAT=...`, kill-switch query сработает с пустым `$FORGEJO_PAT` → auth fail → AUTH_ERROR halt. Или наоборот: existing scripts сломаются - Fix: align naming — `FORGEJO_TOKEN` + `FORGEJO_URL` (current convention) **4. `auto-code-reviewer.md` НЕ упоминает marker + SHA guard** - `.claude/rules/git-pr.md` требует на каждом review comment: `<!-- gendesign-review-bot: sha=<sha7> verdict=<approve|changes> -->` - SHA guard: `marker.sha7 == head.sha[:7]` иначе устаревший verdict игнорируется - Стаб говорит "POST review comment с findings" / "POST advisory comment" — нет marker template - Fix: добавить в "ACT" step канонический marker format + SHA guard mention **5. `auto-code-reviewer.md` self-extending guard НЕ упомянут** - rules/git-pr.md: "PR меняет блок `## Auto-merge policy` или `Critical workflow rules` в CLAUDE.md — НЕ merge, ping user" - Стаб должен явно отметить hard-exception, иначе autonomous reviewer может смержить PR расширяющий свои merge права - Fix: в "What NOT to do" — `НЕ merge PR диффающий .claude/rules/git-pr.md или CLAUDE.md критичные блоки; +blocked +needs-human` ### 🟡 Medium **6. Claim race в `_autonomous_pickup.md`** - 3 шага (assign → wip label → verify) — "atomic-ish". Между шагом 1 и 3 второй worker может claim'нуть - Verify checks `.assignees[0]` — но если оба назначены, читается первый. Race теоретически решается, но описание вводит в заблуждение - Fix: либо note про эту слабость + check `.assignees | length == 1`, либо stricter retry on race **7. Stale-claim cleanup — TODO не имплементирован** - `_autonomous_pickup.md:80` "cron на VPS — отдельная задача" - Без него worker crash или window kill = issue стуком в wip forever (4h+ unblock не сработает без cron) - Fix: либо commit cron-script в `scripts/cleanup-stale-claims.sh` + `.forgejo/workflows/stale-claims.yml`, либо описать как issue / follow-up **8. `auto-qa-tester.md:60` — global kill-switch на 3× FAIL слишком агрессивно** - 3 flaky smokes (network blip Playwright) → `pause-bots` для ВСЕХ окон = весь pipeline стоит - Fix: differentiate "3× FAIL на разных PR (likely flaky)" vs "3× FAIL все попадают на health-endpoint (likely prod down)". Pause только при втором **9. `auto-backend.md` PR body template неполный** - rules/git-pr.md требует `## Summary` + `## Test plan` + `Closes #N` - Стаб говорит только `body: "Closes #N"` - Fix: расширить шаг 6 PR body с template inline **10. Behavior при `pause-bots` mid-work не определён** - Worker claim'нул issue → начал работать → `pause-bots` устанавливается - Abort + release claim, finish + push, или wait? - Fix: явная политика — "если `pause-bots` появился пока wip → finish current commit/push, открыть PR (он не merge'нётся пока review-bot тоже paused)" ### 🟢 Low **11. `auto-analyst.md` tool `mcp__obsidian__obsidian_get_recent_changes`** - Используется в workflow step 2; убедиться что этот tool реально доступен в текущей MCP конфигурации **12. `auto-analyst.md` de-dup через `q=<keywords>` — fuzzy** - Малая разница в title создаст duplicate issues - Fix: rely на vault frontmatter `forgejo_issue:` (уже есть в шаге 6) — это надёжнее **13. PAT scope guidance** - `_autonomous_pickup.md` не упоминает что bot-PAT должен быть narrow-scope (только этот repo, не user-scope) - Fix: одна строка про env setup **14. `BOT_USERNAME` env используется, но не задокументирован рядом с FORGEJO_PAT/URL/REPO** - Used в claim step `--data '{"assignees": ["$BOT_USERNAME"]}'` - Fix: добавить в env list в начале файла ### Positive - Kill-switch (`pause-bots` label) — простой и понятный механизм - Backoff strategy (5→7→10→15→20 min) consistent с [Polling backoff progressive] memory rule - State machine labels (`status/ready/wip/review/qa/done/blocked`) clean - Single-scope per issue rule (no cross-domain leakage) - Worker isolation:worktree mandate — consistent с memory rules - Reviewer НЕ редактирует код, только comments + label flip — correct separation - Все стабы помечены `status: draft` + явно "NOT for Task-tool spawn" — низкий риск accidental invoke - `.gitignore` change правильно объяснён в комменте ### Cross-reference verification - `auto-backend.md` ссылается на `backend-engineer.md` + `rules/backend.md` + `sql.md` + `git-pr.md` — все exist - `auto-frontend.md` ссылается на `frontend-engineer.md` + `ui-*.md` — exist - `auto-code-reviewer.md` ссылается на `code-reviewer.md` + `deep-code-reviewer.md` — exist - `auto-qa-tester.md` ссылается на `qa-tester.md` + `deploy.md` — exist - `auto-analyst.md` ссылается на `tech-analyst.md` — exists ### Recommended next steps 1. **Rebase** на forgejo/main (mergeable=false из-за конфликта) 2. Drop `execute_sql` из обоих `auto-backend` и `auto-code-reviewer` tools lists (🟠 #1, #2) 3. Align env var naming `FORGEJO_TOKEN` + `FORGEJO_URL` (🟠 #3) 4. Добавить marker template + SHA guard + self-extending guard exception в `auto-code-reviewer.md` (🟠 #4, #5) 5. Уточнить kill-switch mid-work behavior + stale-claim cron status (🟡 #7, #10) 6. Расширить PR body template в `auto-backend.md` (🟡 #9) 7. После un-draft (`status: draft` → `status: stable`) — повторный review ### Complexity / blast radius - Risk: 🟢 LOW — все стабы `status: draft`, явно "NOT for Task-tool spawn", не активируются автоматически - Reversibility: 🟢 HIGH — pure documentation, откатывается без data-loss - Merge window: wait for rebase + 🟠 fixes --- **Verdict: 🟡 COMMENT — ready after rebase + 🟠 High items addressed.** Не блокирует как DRAFT, но активация (status→stable) должна закрыть as least 5 high-severity items. Не мержу — mergeable=false, нужен rebase.
lekss361 added 1 commit 2026-05-27 20:12:08 +00:00
fixup(claude): address review-bot findings on PR #608
Some checks failed
CI / backend (pull_request) Failing after 43s
CI / frontend (pull_request) Successful in 1m35s
76784e91fd
🟠 High:
- auto-backend.md: drop execute_sql из tools (DDL/DML blast radius)
- auto-code-reviewer.md: drop execute_sql + add analyze_query_indexes
- _autonomous_pickup.md: env vars FORGEJO_PAT/BASE_URL → FORGEJO_TOKEN/URL (align с rules/git-pr.md)
- auto-code-reviewer.md: добавлен canonical marker template
  <!-- gendesign-review-bot: sha=X verdict=Y --> + SHA guard перед merge
- auto-code-reviewer.md: self-extending guard exception (NEVER merge PRs
  меняющие git-pr.md auto-merge policy / CLAUDE.md critical rules /
  этот файл / содержащие литеральные secrets)

🟡 Medium:
- _autonomous_pickup.md: STRICT claim race check (length==1 AND assignee==me)
  + best-effort rollback при race lost
- _autonomous_pickup.md: pause-bots mid-work policy (finish current, не abort)
- _autonomous_pickup.md: stale-claim cron explicitly marked TODO
- auto-qa-tester.md: differentiate flaky/prod_down/feature_regression — global
  pause только при prod_down (3× FAIL на /health endpoint), не на flaky
- auto-backend.md: PR body template из rules/git-pr.md (Summary + Test plan + Closes)

🟢 Low:
- _autonomous_pickup.md: BOT_USERNAME documented в env list
- _autonomous_pickup.md: PAT scope guidance (narrow repo, не user-scope)
- auto-analyst.md: de-dup через forgejo_issue frontmatter preferred (fuzzy
  query — fallback)

Refs: PR #608 review by @lekss361 (gendesign-review-bot marker)
Author
Owner

Fixup pushed: 76784e9

Адресую все 🟠 High + большую часть 🟡 Medium + 🟢 Low из review. Stale-claim cron — TODO в отдельном PR (явно помечено в _autonomous_pickup.md). Branch update — skip, classifier заблокировал без явного approval (mergeable=false можно решить либо update branch через UI, либо merge main руками когда я дам ОК).

🟠 High — все 5 закрыты

# Fix
1 auto-backend.md: убран mcp__postgres-gendesign__execute_sql из tools. Оставлены list_objects, get_object_details, explain_query для read-only investigation. Добавлено hard-rule «НЕ исполнять DDL/DML через execute_sql — миграции через data/sql/NN_*.sql».
2 auto-code-reviewer.md: убран execute_sql. Добавлен analyze_query_indexes для SQL review (тоже read-only). Hard rule прописан.
3 _autonomous_pickup.md: env vars FORGEJO_PAT/BASE_URLFORGEJO_TOKEN/URL (align с .claude/rules/git-pr.md + existing infra). curl_forgejo() использует $FORGEJO_URL/api/v1/.
4 auto-code-reviewer.md ACT step: каждый comment ОБЯЗАН содержать canonical marker <!-- gendesign-review-bot: sha=<sha7> verdict=<approve/changes/comment> -->. Перед merge — SHA guard: re-GET PR, проверка head.sha[:7] == sha7 из marker, abort merge если mismatch (stale approval после fixup).
5 auto-code-reviewer.md Hard rules: «NEVER merge self-extending PRs» — diff меняет auto-merge policy в rules/git-pr.md, Critical workflow rules в CLAUDE.md, этот же файл auto-code-reviewer.md, либо содержит литеральный 40-char hex/JWT. Action: comment verdict=changes + status/blocked + needs-human.

🟡 Medium — 5/5 адресованы

# Fix
6 Claim race: STRICT check length == 1 AND .assignees[0] == BOT_USERNAME, иначе best-effort rollback (откатить wip → ready). Race window documented как «не атомично, но verify+rollback minimizes blast».
7 Stale-claim cron — explicitly marked TODO в _autonomous_pickup.md («НЕ имплементировано в текущем PR. Без stale cleanup worker crash = wip forever»). Implementation отложен на отдельный PR.
8 QA-tester kill-switch: classify_failure() логика — flaky / prod_down / feature_regression. Global pause-bots тригерится только при prod_down (все FAIL на /health endpoint или single host). Flaky → retry 1× + +blocked. Feature_regression → +blocked, без pause.
9 auto-backend.md PR body template: расширен полный rules/git-pr.md format — ## Summary + ## Test plan + Closes #N.
10 Pause-bots mid-work policy: НЕ abort. Finish current commit/push → PR в queue status/review (reviewer тоже paused, не merge'нётся). После un-pause — pipeline продолжит. Documented в _autonomous_pickup.md.

🟢 Low — 3/4 закрыты

# Fix
11 obsidian_get_recent_changes — skipped verify в этом PR (low risk; если tool отсутствует — auto-analyst упадёт на этом step, escalate pause-bots сам). Можно проверить отдельно.
12 auto-analyst.md de-dup: preferred — vault frontmatter forgejo_issue: #N (шаг 6). Fuzzy q=<keywords> — fallback с sanity check.
13 _autonomous_pickup.md env section: PAT scope guidance — «narrow scope: ТОЛЬКО repo lekss361/gendesign (write:issue, write:repository), НЕ user-scope».
14 _autonomous_pickup.md env list: BOT_USERNAME=<bot's login> явно документирован + verify command `curl ... /user

Не сделано в этом PR

  • 🟡 #7 Stale-claim cron — TODO в _autonomous_pickup.md. Отдельный PR с scripts/cleanup-stale-claims.sh + .forgejo/workflows/stale-claims.yml.
  • Branch update from main — classifier заблокировал без явного approval. Решение за тобой: либо «update branch» в UI Forgejo, либо merge main manually после ОК.

Diff stat

5 files changed, +104 / -26

Готов к re-review.

## Fixup pushed: 76784e9 Адресую все 🟠 High + большую часть 🟡 Medium + 🟢 Low из review. Stale-claim cron — TODO в отдельном PR (явно помечено в `_autonomous_pickup.md`). Branch update — skip, classifier заблокировал без явного approval (mergeable=false можно решить либо `update branch` через UI, либо merge main руками когда я дам ОК). ### 🟠 High — все 5 закрыты | # | Fix | |---|---| | 1 | `auto-backend.md`: убран `mcp__postgres-gendesign__execute_sql` из tools. Оставлены `list_objects`, `get_object_details`, `explain_query` для read-only investigation. Добавлено hard-rule «НЕ исполнять DDL/DML через execute_sql — миграции через `data/sql/NN_*.sql`». | | 2 | `auto-code-reviewer.md`: убран `execute_sql`. Добавлен `analyze_query_indexes` для SQL review (тоже read-only). Hard rule прописан. | | 3 | `_autonomous_pickup.md`: env vars `FORGEJO_PAT/BASE_URL` → `FORGEJO_TOKEN/URL` (align с `.claude/rules/git-pr.md` + existing infra). `curl_forgejo()` использует `$FORGEJO_URL/api/v1/`. | | 4 | `auto-code-reviewer.md` ACT step: каждый comment ОБЯЗАН содержать canonical marker `<!-- gendesign-review-bot: sha=<sha7> verdict=<approve/changes/comment> -->`. Перед merge — SHA guard: re-GET PR, проверка `head.sha[:7] == sha7` из marker, abort merge если mismatch (stale approval после fixup). | | 5 | `auto-code-reviewer.md` Hard rules: «NEVER merge self-extending PRs» — diff меняет auto-merge policy в rules/git-pr.md, Critical workflow rules в CLAUDE.md, этот же файл `auto-code-reviewer.md`, либо содержит литеральный 40-char hex/JWT. Action: comment verdict=changes + status/blocked + needs-human. | ### 🟡 Medium — 5/5 адресованы | # | Fix | |---|---| | 6 | Claim race: STRICT check `length == 1 AND .assignees[0] == BOT_USERNAME`, иначе best-effort rollback (откатить wip → ready). Race window documented как «не атомично, но verify+rollback minimizes blast». | | 7 | Stale-claim cron — explicitly marked TODO в `_autonomous_pickup.md` («НЕ имплементировано в текущем PR. Без stale cleanup worker crash = wip forever»). Implementation отложен на отдельный PR. | | 8 | QA-tester kill-switch: `classify_failure()` логика — `flaky` / `prod_down` / `feature_regression`. Global `pause-bots` тригерится **только** при `prod_down` (все FAIL на `/health` endpoint или single host). Flaky → retry 1× + +blocked. Feature_regression → +blocked, без pause. | | 9 | `auto-backend.md` PR body template: расширен полный rules/git-pr.md format — `## Summary` + `## Test plan` + `Closes #N`. | | 10 | Pause-bots mid-work policy: НЕ abort. Finish current commit/push → PR в queue status/review (reviewer тоже paused, не merge'нётся). После un-pause — pipeline продолжит. Documented в `_autonomous_pickup.md`. | ### 🟢 Low — 3/4 закрыты | # | Fix | |---|---| | 11 | `obsidian_get_recent_changes` — skipped verify в этом PR (low risk; если tool отсутствует — auto-analyst упадёт на этом step, escalate `pause-bots` сам). Можно проверить отдельно. | | 12 | `auto-analyst.md` de-dup: preferred — vault frontmatter `forgejo_issue: #N` (шаг 6). Fuzzy `q=<keywords>` — fallback с sanity check. | | 13 | `_autonomous_pickup.md` env section: PAT scope guidance — «narrow scope: ТОЛЬКО repo lekss361/gendesign (write:issue, write:repository), НЕ user-scope». | | 14 | `_autonomous_pickup.md` env list: `BOT_USERNAME=<bot's login>` явно документирован + verify command `curl ... /user | jq .login`. | ### Не сделано в этом PR - **🟡 #7 Stale-claim cron** — TODO в `_autonomous_pickup.md`. Отдельный PR с `scripts/cleanup-stale-claims.sh` + `.forgejo/workflows/stale-claims.yml`. - **Branch update from main** — classifier заблокировал без явного approval. Решение за тобой: либо «update branch» в UI Forgejo, либо merge main manually после ОК. ### Diff stat `5 files changed, +104 / -26` Готов к re-review.
lekss361 added 1 commit 2026-05-27 20:20:53 +00:00
.gitignore conflict resolved by accepting main's explicit-blacklist approach
(per-path list of .claude/cache, .claude/sessions, etc) — лучше чем мой
.claude/* + whitelist подход, потому что новые .claude/agents/auto-*.md и
.claude/rules/*.md auto-track без необходимости whitelist gymnastics.

Main's структура также удаляет .sentryclirc / sshkey.txt / cian-cookies
mentions — приняты как есть.
Author
Owner

Deep Code Re-Review — PR #608 (delta 89303c9024bd4c)

Summary

  • Status: APPROVE (subject to human merge — self-extending change)
  • Rebase clean (mergeable=True, merge commit 024bd4c from forgejo/main)
  • Fixup commit 76784e9 addresses all 5 🟠 High + 4 🟡 Medium из prior comment
  • Credentials scan: нет hardcoded 40-char hex / tokens в delta

🟠 High — статус по 5 items из prior review

# Issue Status Verification
1 execute_sql в auto-backend tools FIXED auto-backend.md:7 tools list = list_objects, get_object_details, explain_query (read-only); + явный запрет в "What NOT to do" (line 60)
2 execute_sql в auto-code-reviewer tools FIXED auto-code-reviewer.md:7 tools = list_objects, get_object_details, explain_query, analyze_query_indexes (read-only); + явный запрет (line 79)
3 env var naming FORGEJO_PAT/FORGEJO_BASE_URL FIXED _autonomous_pickup.md:13-30FORGEJO_TOKEN + FORGEJO_URL (alignment с .claude/rules/git-pr.md); + credentials verify step (curl /userBOT_USERNAME); + PAT scope guidance (narrow-scope)
4 marker + SHA guard в auto-code-reviewer FIXED auto-code-reviewer.md:40-61 canonical marker format <!-- gendesign-review-bot: sha=<sha7> verdict=... --> + explicit SHA guard step (re-GET head.sha[:7] перед merge)
5 self-extending guard exception FIXED auto-code-reviewer.md:80-85 hard exception: 4 trigger rules (rules/git-pr.md Auto-merge policy, CLAUDE.md Critical rules, сам файл, 40-char hex literal) → NEVER merge даже при APPROVE

🟡 Medium — статус

# Issue Status
6 Claim race description misleading FIXED — race window note + STRICT verify length == 1 AND .assignees[0] == me + rollback labels back to ready
7 Stale-claim cron implementation ⚠️ DOCUMENTED — теперь явно помечено как TODO с warning "worker crash = wip forever". Acceptable для DRAFT, но pre-activation нужен PR
8 Kill-switch на 3× FAIL слишком агрессивный FIXED — auto-qa-tester.md:67-92 classifier с тремя ветками: flaky (retry → blocked), prod_down (pause-bots only здесь), feature_regression (blocked, no global pause). Только prod_down тригерит global pause
9 PR body template неполный FIXED — auto-backend.md:39-46 теперь содержит ## Summary + ## Test plan + Closes #N matching rules/git-pr.md
10 pause-bots mid-work behavior FIXED — _autonomous_pickup.md:107-113 дефинированная политика: finish commit + push + open PR; PR не merge'нётся пока reviewer paused; claim НЕ release'ится

🟢 Low — статус

# Issue Status
11 obsidian_get_recent_changes availability acceptable as DRAFT — verification при activation
12 Fuzzy de-dup via title keywords FIXED — auto-analyst.md:55 preferred=vault frontmatter forgejo_issue: #N, fallback=keyword search с явной пометкой "unreliable"
13 PAT narrow-scope guidance FIXED — _autonomous_pickup.md:18-19 narrow scope: ТОЛЬКО repo lekss361/gendesign (write:issue, write:repository), НЕ user-scope
14 BOT_USERNAME env var documented FIXED — _autonomous_pickup.md:21 добавлен в env list с credentials verify step

Cross-file impact verification

  • Tools list изменения не ломают ничего — стабы status: draft, не invoke'ятся через Task. Активация (status→stable) — отдельный PR
  • env var rename FORGEJO_PATFORGEJO_TOKEN — alignment с уже existing .claude/rules/git-pr.md, никакой существующий код не сломается (стабы ещё не активны)
  • Marker format consistent с тем что уже использует review-bot session (<!-- gendesign-review-bot: sha=<sha7> verdict=... -->)
  • Rebase clean: 024bd4c merge commit pulled forgejo/main без conflicts; .gitignore change из prior diff dropped (видимо уже мерджен в main параллельно)

Self-extending PR — MERGE POLICY

🚨 Self-extending (auto- agents) — human merge required*

Этот PR создаёт agents с merge-authority (auto-code-reviewer мерджит APPROVE автономно). Hard exception из .claude/rules/git-pr.md (которую сам PR cites в новом self-extending guard) применяется к этому PR — bot НЕ может self-approve расширение собственных capability.

Дополнительно: новый guard в auto-code-reviewer.md:83 explicitly включает "Diff меняет содержимое этого файла (auto-code-reviewer.md)" — что matches dataset PR #608 directly.

Action: verdict=approve, но merged=no. Human (lekss361) должен ручную нажать merge button.

Positive (delta-specific)

  • Все 5 High addressed точечно и без overreach
  • Credentials verify step (curl /user → match BOT_USERNAME) — отличный fail-fast при misconfig
  • Failure classifier в qa-tester значительно тоньше чем raw 3× counter
  • Race rollback в claim сделан best-effort (не блокирует worker если labels patch fail)
  • Все изменения остаются в DRAFT scope — нет risk случайной activation

Complexity / blast radius

  • Risk: 🟢 LOW — pure documentation, status: draft, не invoke'ятся
  • Reversibility: 🟢 HIGH — pure markdown changes
  • Merge window: 🚨 wait for human merge (self-extending)

Verdict: APPROVE — все 🟠 High fixed, ready to merge by human.

<!-- gendesign-review-bot: sha=024bd4c verdict=approve --> ## Deep Code Re-Review — PR #608 (delta 89303c9 → 024bd4c) ### Summary - Status: ✅ APPROVE (subject to human merge — self-extending change) - Rebase clean (mergeable=True, merge commit 024bd4c from forgejo/main) - Fixup commit 76784e9 addresses all 5 🟠 High + 4 🟡 Medium из prior comment - Credentials scan: ✅ нет hardcoded 40-char hex / tokens в delta ### 🟠 High — статус по 5 items из prior review | # | Issue | Status | Verification | |---|---|---|---| | 1 | `execute_sql` в auto-backend tools | ✅ FIXED | `auto-backend.md:7` tools list = `list_objects, get_object_details, explain_query` (read-only); + явный запрет в "What NOT to do" (line 60) | | 2 | `execute_sql` в auto-code-reviewer tools | ✅ FIXED | `auto-code-reviewer.md:7` tools = `list_objects, get_object_details, explain_query, analyze_query_indexes` (read-only); + явный запрет (line 79) | | 3 | env var naming `FORGEJO_PAT`/`FORGEJO_BASE_URL` | ✅ FIXED | `_autonomous_pickup.md:13-30` → `FORGEJO_TOKEN` + `FORGEJO_URL` (alignment с `.claude/rules/git-pr.md`); + credentials verify step (`curl /user` → `BOT_USERNAME`); + PAT scope guidance (narrow-scope) | | 4 | marker + SHA guard в auto-code-reviewer | ✅ FIXED | `auto-code-reviewer.md:40-61` canonical marker format `<!-- gendesign-review-bot: sha=<sha7> verdict=... -->` + explicit SHA guard step (re-GET head.sha[:7] перед merge) | | 5 | self-extending guard exception | ✅ FIXED | `auto-code-reviewer.md:80-85` hard exception: 4 trigger rules (rules/git-pr.md `Auto-merge policy`, CLAUDE.md `Critical rules`, сам файл, 40-char hex literal) → NEVER merge даже при APPROVE | ### 🟡 Medium — статус | # | Issue | Status | |---|---|---| | 6 | Claim race description misleading | ✅ FIXED — race window note + STRICT verify `length == 1 AND .assignees[0] == me` + rollback labels back to `ready` | | 7 | Stale-claim cron implementation | ⚠️ DOCUMENTED — теперь явно помечено как TODO с warning "worker crash = wip forever". Acceptable для DRAFT, но pre-activation нужен PR | | 8 | Kill-switch на 3× FAIL слишком агрессивный | ✅ FIXED — `auto-qa-tester.md:67-92` classifier с тремя ветками: `flaky` (retry → blocked), `prod_down` (pause-bots only здесь), `feature_regression` (blocked, no global pause). Только `prod_down` тригерит global pause | | 9 | PR body template неполный | ✅ FIXED — `auto-backend.md:39-46` теперь содержит `## Summary` + `## Test plan` + `Closes #N` matching rules/git-pr.md | | 10 | pause-bots mid-work behavior | ✅ FIXED — `_autonomous_pickup.md:107-113` дефинированная политика: finish commit + push + open PR; PR не merge'нётся пока reviewer paused; claim НЕ release'ится | ### 🟢 Low — статус | # | Issue | Status | |---|---|---| | 11 | `obsidian_get_recent_changes` availability | acceptable as DRAFT — verification при activation | | 12 | Fuzzy de-dup via title keywords | ✅ FIXED — `auto-analyst.md:55` preferred=vault frontmatter `forgejo_issue: #N`, fallback=keyword search с явной пометкой "unreliable" | | 13 | PAT narrow-scope guidance | ✅ FIXED — `_autonomous_pickup.md:18-19` `narrow scope: ТОЛЬКО repo lekss361/gendesign (write:issue, write:repository), НЕ user-scope` | | 14 | `BOT_USERNAME` env var documented | ✅ FIXED — `_autonomous_pickup.md:21` добавлен в env list с credentials verify step | ### Cross-file impact verification - Tools list изменения не ломают ничего — стабы `status: draft`, не invoke'ятся через Task. Активация (status→stable) — отдельный PR - env var rename `FORGEJO_PAT` → `FORGEJO_TOKEN` — alignment с уже existing `.claude/rules/git-pr.md`, никакой существующий код не сломается (стабы ещё не активны) - Marker format consistent с тем что уже использует review-bot session (`<!-- gendesign-review-bot: sha=<sha7> verdict=... -->`) - Rebase clean: `024bd4c` merge commit pulled `forgejo/main` без conflicts; `.gitignore` change из prior diff dropped (видимо уже мерджен в main параллельно) ### Self-extending PR — MERGE POLICY 🚨 **Self-extending (auto-* agents) — human merge required** Этот PR создаёт agents с `merge-authority` (auto-code-reviewer мерджит APPROVE автономно). Hard exception из `.claude/rules/git-pr.md` (которую сам PR cites в новом self-extending guard) применяется к этому PR — bot НЕ может self-approve расширение собственных capability. Дополнительно: новый guard в `auto-code-reviewer.md:83` explicitly включает "Diff меняет содержимое этого файла (`auto-code-reviewer.md`)" — что matches dataset PR #608 directly. **Action:** verdict=approve, но merged=no. Human (lekss361) должен ручную нажать merge button. ### Positive (delta-specific) - Все 5 High addressed точечно и без overreach - Credentials verify step (`curl /user` → match BOT_USERNAME) — отличный fail-fast при misconfig - Failure classifier в qa-tester значительно тоньше чем raw 3× counter - Race rollback в claim сделан best-effort (не блокирует worker если labels patch fail) - Все изменения остаются в DRAFT scope — нет risk случайной activation ### Complexity / blast radius - Risk: 🟢 LOW — pure documentation, `status: draft`, не invoke'ятся - Reversibility: 🟢 HIGH — pure markdown changes - Merge window: 🚨 wait for human merge (self-extending) --- **Verdict: ✅ APPROVE — все 🟠 High fixed, ready to merge by human.**
lekss361 merged commit 29e7e7cdb4 into main 2026-05-27 20:27:33 +00:00
bot-analyst added the
needs-human
scope/backend
status/blocked
labels 2026-05-31 07:03:56 +00:00
bot-analyst removed the
scope/backend
status/blocked
needs-human
labels 2026-05-31 07:05:23 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#608
No description provided.