diff --git a/.claude/agents/_autonomous_pickup.md b/.claude/agents/_autonomous_pickup.md index 201fa6bf..c6a22fff 100644 --- a/.claude/agents/_autonomous_pickup.md +++ b/.claude/agents/_autonomous_pickup.md @@ -351,7 +351,7 @@ Claude имеет ДВА лимита: 5h-rolling (сам сбрасываетс - Пустая очередь + нет fixup-PR → выходить из loop, а не крутиться вхолостую. - Тяжёлые batch-прогоны — вне пиковых часов (≈5–11 PT) при возможности. - Перед длинной автономной сессией глянуть Settings → Usage (оба счётчика + дата weekly-reset). -- **Окна — на Sonnet, не Opus** (`start-bot.ps1` уже запускает с `--model sonnet`). Opus — только main-оркестратору. Sonnet-пул отдельный, недельный All-models (Opus) пул так не горит. +- **Окна — на Sonnet, не Opus** (`start-bot.ps1` уже запускает с `--model sonnet`; reviewer — opus). Opus — только main-оркестратору. Sonnet-пул отдельный, недельный All-models (Opus) пул так не горит. - **Context-hygiene (forgejo-MCP результаты = ~47% расхода, остаются в контексте):** `/compact` после всплеска forgejo-вызовов (много PR/issue/label за тик); `/clear` между независимыми issue в loop — флашит накопившиеся MCP-результаты, иначе каждый тик дороже при контексте >150k. ## Error escalation diff --git a/.claude/agents/auto-analyst.md b/.claude/agents/auto-analyst.md index ca44de98..b0c6cf10 100644 --- a/.claude/agents/auto-analyst.md +++ b/.claude/agents/auto-analyst.md @@ -12,7 +12,7 @@ tools: Task, Read, Glob, Grep, Bash, mcp__obsidian__obsidian_simple_search, mcp_ > **DRAFT.** Эта persona НЕ для Task-tool spawn. Использовать только как > `--append-system-prompt` для standalone окна с `/loop 15m`. > -> **Модель = модель окна.** Frontmatter `model: sonnet` действует ТОЛЬКО при Task-spawn (запрещён). +> **Модель = модель окна.** Frontmatter `model` действует ТОЛЬКО при Task-spawn (запрещён). > Твой issue — ЕДИНСТВЕННЫЙ канал к worker'у (он не видит твой контекст, не читает vault). Качество > всего pipeline упирается в качество твоей декомпозиции → запускай окно в сильной модели осознанно. @@ -43,7 +43,7 @@ actionable-спек (+ `scope/*` + `status/ready`), либо расщепляе **Inbound (A) всегда вперёд proactive (B) и capture (C)** — человек ждёт ответа на свой тикет. -## Per-tick workflow (every 30 minutes) +## Per-tick workflow (every 15 minutes) ``` 1. KILL-SWITCH check (см. _autonomous_pickup.md) diff --git a/.claude/agents/auto-backend.md b/.claude/agents/auto-backend.md index f04c47ae..cb585ab5 100644 --- a/.claude/agents/auto-backend.md +++ b/.claude/agents/auto-backend.md @@ -12,7 +12,7 @@ tools: Read, Write, Edit, Glob, Grep, Bash, mcp__obsidian__obsidian_simple_searc > **DRAFT.** Эта persona НЕ для Task-tool spawn. Только как `--append-system-prompt` > для standalone окна с `/loop dynamic`. > -> **Модель = модель окна.** Frontmatter `model: sonnet` действует ТОЛЬКО при Task-spawn +> **Модель = модель окна.** Frontmatter `model` действует ТОЛЬКО при Task-spawn > (который запрещён). В standalone `/loop`-окне модель = модель, в которой запущено окно > (frontmatter игнорируется). Worker несёт всю judgment-нагрузку сам (интерпретация issue, > интеграция, self-check), без Opus-оркестратора → запускай окно в достаточно сильной модели осознанно. diff --git a/.claude/agents/auto-code-reviewer.md b/.claude/agents/auto-code-reviewer.md index dbe91e44..68a32232 100644 --- a/.claude/agents/auto-code-reviewer.md +++ b/.claude/agents/auto-code-reviewer.md @@ -19,7 +19,7 @@ tools: Read, Glob, Grep, Bash, mcp__obsidian__obsidian_simple_search, mcp__obsid > **Forgejo API → ТОЛЬКО `mcp__forgejo__*` tools.** ❌ НЕ дёргай curl / python3 / `/tmp/*.json` руками — > на Windows это даёт `http=404` + `FileNotFoundError /tmp/...` (incident 2026-05-31, PR #893). MCP-тул > возвращает распарсенный объект — никаких temp-файлов и ручного JSON. Полный mapping в -> [[_autonomous_pickup]] § «Forgejo операции». Запуск окна: `scripts/start-bot.ps1 reviewer` (Sonnet). +> [[_autonomous_pickup]] § «Forgejo операции». Запуск окна: `scripts/start-bot.ps1 reviewer`. > > ⚠️ **forgejo MCP = deferred** (схемы не грузятся upfront — экономия контекста). В НАЧАЛЕ work-тика, > если forgejo-тулзы ещё не загружены, выполни ОДИН раз: diff --git a/.claude/agents/auto-frontend.md b/.claude/agents/auto-frontend.md index e4216975..4a1c2042 100644 --- a/.claude/agents/auto-frontend.md +++ b/.claude/agents/auto-frontend.md @@ -12,7 +12,7 @@ tools: Read, Write, Edit, Glob, Grep, Bash, mcp__obsidian__obsidian_simple_searc > **DRAFT.** Эта persona НЕ для Task-tool spawn. Только как `--append-system-prompt` > для standalone окна с `/loop dynamic`. > -> **Модель = модель окна.** Frontmatter `model: sonnet` действует ТОЛЬКО при Task-spawn (запрещён). +> **Модель = модель окна.** Frontmatter `model` действует ТОЛЬКО при Task-spawn (запрещён). > В standalone `/loop`-окне модель = модель окна. Worker несёт всю judgment-нагрузку сам → запускай > окно в достаточно сильной модели осознанно. diff --git a/.claude/agents/auto-qa-tester.md b/.claude/agents/auto-qa-tester.md index bdd104c8..87a1506c 100644 --- a/.claude/agents/auto-qa-tester.md +++ b/.claude/agents/auto-qa-tester.md @@ -12,7 +12,7 @@ tools: Read, Bash, Grep, Glob, mcp__obsidian__obsidian_simple_search, mcp__obsid > **DRAFT.** Эта persona НЕ для Task-tool spawn. Только как `--append-system-prompt` > для standalone окна с `/loop 5m`. > -> **Модель = модель окна.** Frontmatter `model: sonnet` действует ТОЛЬКО при Task-spawn (запрещён). +> **Модель = модель окна.** Frontmatter `model` действует ТОЛЬКО при Task-spawn (запрещён). > В standalone `/loop`-окне модель = модель окна → запускай осознанно. > **Forgejo API → `mcp__forgejo__*` tools** (primary; полный mapping в [[_autonomous_pickup]] § «Forgejo операции»). curl — только fallback. Запуск окна: `scripts/start-bot.ps1 qa`. @@ -21,7 +21,7 @@ tools: Read, Bash, Grep, Glob, mcp__obsidian__obsidian_simple_search, mcp__obsid QA в autonomous-pickup mode. Polling issues с `status/qa` (PR уже merged auto-code-reviewer'ом), запускаешь Playwright smoke по golden-path. OK → close issue + status/done. FAIL (feature_regression) → reopen + `status/needs-fix` + assignee=PR author (worker сам чинит). FAIL (prod_down) → `pause-bots` + needs-human. -## Per-tick workflow (every 10 minutes) +## Per-tick workflow (every 5 minutes) ``` 1. KILL-SWITCH check (см. _autonomous_pickup.md) diff --git a/.claude/agents/backend-engineer.md b/.claude/agents/backend-engineer.md index 5c41cf90..dc9c346e 100644 --- a/.claude/agents/backend-engineer.md +++ b/.claude/agents/backend-engineer.md @@ -70,7 +70,7 @@ Pre-loaded context: смотри vault через `mcp__obsidian__*` перед ## Запреты -- ❌ Не коммить (пользователь коммитит сам); пиши commit message в чат +- ❌ Не коммить сам — оставь staged; коммитит main-сессия (agent-first pipeline) - ❌ Не использовать `--no-verify` для обхода pre-commit - ❌ Не запускать миграции SQL — это работа database-expert (можешь делегировать через Agent tool если задача требует) - ❌ Не редактировать docker-compose / Caddyfile / .github/workflows/ — это работа devops-engineer diff --git a/.claude/agents/code-reviewer.md b/.claude/agents/code-reviewer.md index 837cde89..174cd7d7 100644 --- a/.claude/agents/code-reviewer.md +++ b/.claude/agents/code-reviewer.md @@ -146,7 +146,7 @@ mcp__obsidian__obsidian_simple_search "" - Удаление prod данных без явного approval - `--no-verify` / `--force` / `--amend` в push - **Прямой push в main** — нарушение PR workflow (см. CLAUDE.md). Должен быть feature branch + PR. -- **Merge PR без user approval** — нарушение PR workflow. +- **Merge вне policy**: красный CI, литеральный secret в diff, или PR меняет правила пайплайна (self-extending guard). Self-merge при зелёном CI разрешён с 2026-06-27 (git-pr.md § Auto-merge policy) — сам по себе НЕ блокер. ### Pre-flight check для PR workflow @@ -161,4 +161,4 @@ git rev-parse --abbrev-ref HEAD 1. `git stash` или backup commit'ов 2. Создать ветку `git checkout -b feat/foo` 3. Перенести коммиты -4. `git push -u origin feat/foo` + `gh pr create` +4. `git push -u forgejo feat/foo` + `mcp__forgejo__create_pull_request` (gh CLI bypassed 2026-05-16) diff --git a/.claude/agents/database-expert.md b/.claude/agents/database-expert.md index 7793a734..e5d2d617 100644 --- a/.claude/agents/database-expert.md +++ b/.claude/agents/database-expert.md @@ -26,7 +26,7 @@ Pre-loaded context: смотри vault через `mcp__obsidian__*` перед - PostgreSQL 16 + PostGIS 3.4 - Партиционирование: `rosreestr_deals` (9 partitions, 2024Q1—2026Q1, ~7M rows) - GIST индексы на geom-полях -- Alembic для prod schema changes (`backend/alembic/versions/`) +- Фактический канал prod-миграций = `data/sql/NN_*.sql` + deploy (auto-apply на проде); Alembic (`backend/alembic/versions/`) — legacy/локально - Raw SQL artifacts в `data/sql/NN_xxx.sql` для больших миграций / views / bootstrap - psycopg v3 на стороне backend (НЕ psycopg2) @@ -70,7 +70,7 @@ Pre-loaded context: смотри vault через `mcp__obsidian__*` перед 5. **Verify locally**: - Syntax-check: `psql --dry-run` не существует, но можно через временную dev-БД - Альтернативно — копируй SQL в комментарий и mentally parse -6. **Apply** через `mcp__postgres-gendesign__execute_sql` (требуется SSH tunnel up + user approval для drops/alters на проде) +6. **Apply**: prod schema changes ТОЛЬКО через `data/sql/NN_*.sql` + deploy (auto-apply на проде); `mcp__postgres-gendesign__execute_sql` — только read-only verify (или явно одобренная user'ом ручная операция) 7. **Verify post-apply**: - `information_schema.columns` для column changes - `pg_indexes` / `pg_views` для indexes/views (если разрешено читать pg_*) @@ -92,5 +92,5 @@ Pre-loaded context: смотри vault через `mcp__obsidian__*` перед - ❌ Изменять Alembic version files задним числом — только новые revisions - ❌ Запускать миграцию на проде без backup confirmation (если она destructive) - ❌ Использовать `psycopg2` в коде (только v3) -- ❌ Commit'ить сам — пиши commit message в чат +- ❌ Commit'ить сам — оставь staged; коммитит main-сессия (agent-first pipeline) - ❌ Писать knowledge в `memory/memory-gendesign.jsonl` (deprecated) — только Obsidian vault diff --git a/.claude/agents/deep-code-reviewer.md b/.claude/agents/deep-code-reviewer.md index a27427f6..b398aed2 100644 --- a/.claude/agents/deep-code-reviewer.md +++ b/.claude/agents/deep-code-reviewer.md @@ -118,7 +118,7 @@ Short skeleton: ## Forgejo API conventions -- `$FORGEJO_URL` = `https://git.gendsgn.ru`, `$FORGEJO_TOKEN` = в env (из `~/.claude/settings.json`) +- `$FORGEJO_URL` = `https://git.gendsgn.ru`, токен — `FORGEJO_ACCESS_TOKEN` / `FORGEJO_TOKEN_` из Windows User-scope env vars (выставляются ДО запуска claude; см. `_autonomous_pickup.md`) - Owner/repo по умолчанию: `lekss361/gendesign` - Auth header: `-H "Authorization: token $FORGEJO_TOKEN"` - Pagination: `?page=1&limit=50` (max 50 на странице) diff --git a/.claude/agents/deep-review-phases/phase-5-verdict.md b/.claude/agents/deep-review-phases/phase-5-verdict.md index 75f15be2..df256196 100644 --- a/.claude/agents/deep-review-phases/phase-5-verdict.md +++ b/.claude/agents/deep-review-phases/phase-5-verdict.md @@ -89,7 +89,7 @@ ## Auto-merge policy (PR review mode) При review открытых Forgejo PR — если verdict **✅ APPROVE** (нет 🔴/🟠/🟡): -**мержи сам, любой scope** (user override 2026-05-16: «после аппрув в ревью можешь мерджить все что угодно»). +**мержи сам, любой scope** (политика 2026-06-27, git-pr.md § Auto-merge policy). ### Pre-merge checks (все обязательны) @@ -123,3 +123,4 @@ Forgejo API возвращает пустой body при успехе merge → - CI failing → comment "approved but CI red — wait for green" - Draft PR → comment "approved, ready when undrafted" - Head SHA changed после твоего scan'а → НЕ мержь stale verdict, re-review нужен +- Diff меняет правила пайплайна: git-pr.md § Auto-merge policy, CLAUDE.md Critical rules, `_autonomous_pickup.md`, `auto-code-reviewer.md`, любой `work-as-*.md` → НЕ merge, label `needs-human` (self-extending guard) diff --git a/.claude/agents/devops-engineer.md b/.claude/agents/devops-engineer.md index e9df772c..7ec3757e 100644 --- a/.claude/agents/devops-engineer.md +++ b/.claude/agents/devops-engineer.md @@ -1,6 +1,6 @@ --- name: devops-engineer -description: DevOps engineer for GenDesign — Docker, docker-compose, Caddyfile, GitHub Actions workflows, SSH deploy, CouchDB stack, Obsidian LiveSync infra. Use proactively for any work in `docker-compose*.yml`, `Caddyfile`, `.github/workflows/`, `scripts/setup-*.sh`, `ops/`, or SSH-deploy issues. NOT for backend logic (use backend-engineer) or DB migrations (use database-expert). +description: DevOps engineer for GenDesign — Docker, docker-compose, Caddyfile, Forgejo Actions / GitHub Actions workflows, SSH deploy, CouchDB stack, Obsidian LiveSync infra. Use proactively for any work in `docker-compose*.yml`, `Caddyfile`, `.forgejo/workflows/**`, `.github/workflows/**`, `scripts/setup-*.sh`, `ops/`, or SSH-deploy issues. NOT for backend logic (use backend-engineer) or DB migrations (use database-expert). tools: Read, Write, Edit, Glob, Grep, Bash, mcp__obsidian__obsidian_simple_search, mcp__obsidian__obsidian_complex_search, mcp__obsidian__obsidian_get_file_contents, mcp__obsidian__obsidian_batch_get_file_contents, mcp__obsidian__obsidian_list_files_in_dir, mcp__obsidian__obsidian_append_content, mcp__obsidian__obsidian_patch_content model: opus color: orange @@ -24,7 +24,7 @@ Pre-loaded context: смотри vault через `mcp__obsidian__*` перед - Beget VPS, Москва, 2 vCPU / 4 GB / 40 GB NVMe - Docker + docker-compose (два стека: main + obsidian) - Caddy 2 (auto-TLS Let's Encrypt) -- GitHub Actions (build → GHCR → SSH → compose up) +- Forgejo Actions — фактический CI/deploy (`.forgejo/workflows/**`; build → GHCR → SSH → compose up); legacy GitHub Actions в `.github/workflows/**` - Docker images: backend (lean), worker (with-chromium), frontend, couchdb (вешний) - Shared external network `gendesign_shared` для связи main↔obsidian стеков @@ -60,7 +60,7 @@ Pre-loaded context: смотри vault через `mcp__obsidian__*` перед ## Запреты -- ❌ Не коммить сам — пиши commit message в чат +- ❌ Не коммить сам — оставь staged; коммитит main-сессия (agent-first pipeline) - ❌ Не push в main с `--force` (никогда) - ❌ Не редактировать `backend/`/`frontend/` исходники (только infra-конфиги) - ❌ Не выполнять prod SSH без явного approval пользователя (читать prod-логи — отдельно safety guard, нужен approval) diff --git a/.claude/agents/frontend-engineer.md b/.claude/agents/frontend-engineer.md index 22aa3219..e7ed299e 100644 --- a/.claude/agents/frontend-engineer.md +++ b/.claude/agents/frontend-engineer.md @@ -62,7 +62,7 @@ Pre-loaded context: смотри vault через `mcp__obsidian__*` перед ## Запреты -- ❌ Не коммить сам — пиши commit message в чат +- ❌ Не коммить сам — оставь staged; коммитит main-сессия (agent-first pipeline) - ❌ Не редактировать `backend/` — это работа backend-engineer - ❌ Не использовать `any` - ❌ Не использовать pages router (`src/pages/`) — только app router (`src/app/`) diff --git a/.claude/agents/qa-tester.md b/.claude/agents/qa-tester.md index 13a2786e..9a25732e 100644 --- a/.claude/agents/qa-tester.md +++ b/.claude/agents/qa-tester.md @@ -50,7 +50,7 @@ POST-комменты — `--data-binary @file` (не inline `-d`: Windows ср → определи changed paths: - `backend/app/api/v1/.py` → curl endpoint этого роутера -- `frontend/src/app/**` → chrome-devtools navigate + snapshot +- `frontend/src/app/**` → playwright browser_navigate + browser_snapshot - `data/sql/NN_*.sql` → postgres MCP проверь schema (column exists, index there, view OK) - `backend/app/scrapers/**` или `backend/app/workers/**` → запусти scraper, polling DB до terminal status - `docker-compose*.yml` / `Caddyfile` → smoke production URLs + проверь containers running diff --git a/.claude/rules/delegation.md b/.claude/rules/delegation.md new file mode 100644 index 00000000..51a4b223 --- /dev/null +++ b/.claude/rules/delegation.md @@ -0,0 +1,27 @@ +# Delegation & task sizing + +> Без `paths:` — загружается в каждой сессии. Канон лимитов делегирования (портировано из memory-фидбека 2026-06-27). + +## Бюджет одного сабагента (hard limits) + +- **1 сабагент = 1 узкий deliverable.** Ориентиры: ~≤10 мин работы, ~≤20 tool-calls, ~≤150k токенов. + Эмпирика 2026-06-27: агент-аудитор на 186k tok / 33 calls упал на StructuredOutput; 5 мелких параллельных прошли. +- Поверхность больше бюджета → **дели на N узких сабагентов** (parallel при непересекающихся файлах, sequential при зависимостях). НЕ один большой. +- Read-only разведка (найти файлы/понять структуру) → лёгкий Explore-agent, не general-purpose worker. +- Промпт сабагенту: конкретный deliverable + формат ответа + границы («что НЕ делать»). Расплывчатый scope = дубли и мусор. + +## Эскалация oversized-задачи (worker) + +Issue/задача выглядит больше одного захода (эвристика: >5 файлов, ИЛИ >500 строк diff, ИЛИ >2ч) → **НЕ исполнять целиком**: +- bot-pipeline: комментарий с планом сплита + label `status/needs-analysis`, снять claim +- interactive: вернуть main-сессии план сплита вместо результата + +## Единые пороги дробления (analyst / main) + +- Estimate S(<2h) / M(2-8h) / **L(>8h) → обязан дробиться дальше** (до S/M) +- Issue ≥1.5 дня → 3-4 sub-PR (Foundation → Schema → Workers → Integration), каждый ~200-500 строк — см. git-pr.md § Split big issues +- 1 sub-issue ≈ 1-2 worker-захода, single-scope (не смешивать backend+frontend в одном issue) + +## Параллелизм + +Default = parallel на непересекающихся файлах (per-task worktree). Sequential — только overlap / hot-files / зависимый стек (git-pr.md § Parallel vs sequential PRs). diff --git a/.claude/rules/git-pr.md b/.claude/rules/git-pr.md index fddbd6dd..12428406 100644 --- a/.claude/rules/git-pr.md +++ b/.claude/rules/git-pr.md @@ -16,11 +16,11 @@ paths: ``` 1. claude --bg --name "feat-" "task description" → supervisor создаёт worktree от forgejo/main автоматически - (settings worktree.baseRef=default, bgIsolation=git) + (settings worktree.baseRef=fresh, bgIsolation=worktree) 2. Session работает: код → commit → push → mcp__forgejo__create_pull_request 3. PR URL появляется в agent view как row с зелёной/жёлтой/красной ● status dot 4. User делает review через external Claude window (post-push) -5. После merge — `Ctrl+X dwa раза` в agent view = удаление session + worktree +5. После merge — `Ctrl+X два раза` в agent view = удаление session + worktree ``` **Foreground workflow** (когда нужен интерактив, ad-hoc fixes): @@ -76,7 +76,7 @@ Closes #N 1. `mcp__forgejo__get_pull_request` (или `curl -sH "$H" "$REPO/pulls/"`) → читай `state`, `mergeable`, `head.sha` 2. `state == merged` → stop polling -3. Новый review/comment: `mcp__forgejo__list_pr_reviews` / `list_issue_comments`. Парсь marker `` +3. Новый review/comment: `mcp__forgejo__list_pull_reviews` / `list_issue_comments`. Парсь marker `` - **SHA guard**: `marker.sha7 == head.sha[:7]` — иначе устаревший approval до fixup-push, игнорируй - `verdict=approve` + SHA match → `mcp__forgejo__merge_pull_request` (squash + delete branch) - `verdict=changes` → fixup commits + push в `forgejo feat/` + re-poll @@ -91,16 +91,20 @@ Closes #N - Diff содержит литеральный secret/token/password/credential (40-char hex, API keys, JWT, и т.д.) — security tripwire. - PR меняет правила самого пайплайна: блок `## Auto-merge policy` здесь, `Critical rules` в CLAUDE.md, `_autonomous_pickup.md` (claim/kill-switch/merge-FSM), `auto-code-reviewer.md` или любой `work-as-*.md` — **self-extending guard** (расширение/снятие собственных merge-прав всегда через human, предотвращает bot-loop). -## Sequential PRs +## Parallel vs sequential PRs -**Одна задача → один PR → merge → следующая.** Параллельно ТОЛЬКО если scope'ы строго orthogonal (разные файлы). +**Default = параллельно**, если scope'ы НЕ пересекаются по файлам: каждая задача в своём worktree (`git worktree add` / isolation:"worktree"), своя ветка, свой PR. -Опасные файлы для конфликтов: `backend/app/api/v1/parcels.py`, `frontend/src/types/site-finder.ts`, OverviewTab/LandTab/MarketTab. +**Sequential обязателен когда:** +- Пересечение файлов / hot-files: `backend/app/api/v1/parcels.py`, `frontend/src/types/site-finder.ts`, OverviewTab/LandTab/MarketTab +- Зависимый стек sub-PR'ов (Foundation → Schema → Workers → Integration): PR N+1 только после merge PR N ## Split big issues Issues ≥ 1.5 day → 3-4 sub-PRs: **Foundation → Schema → Workers → Integration**. Каждый ~200-500 lines. PR N+1 только после merge PR N. +Бюджет одного subagent-захода и правила эскалации oversized-задач: `.claude/rules/delegation.md`. + ## Review workflow (no conflict) - **Pre-push** (локально): spawn `code-reviewer` subagent на staged changes → lint pass (security, correctness, conventions). Блокирует push при 🔴 критикал. @@ -112,12 +116,12 @@ Issues ≥ 1.5 day → 3-4 sub-PRs: **Foundation → Schema → Workers → Inte - **Параллелизм**: 3-5 sessions одновременно (>5 = bottleneck на review, не на Claude per Anthropic метрика) - **Pin (`Ctrl+T`)** для long-running sessions (scraper monitors, deploy watchers) — supervisor не убьёт через 1h idle -- **Cleanup**: `Ctrl+X dwa раза` после merge → session + worktree удалены атомарно -- **NEVER** parallel sessions на one file — каждая ест в own worktree, last-merge wins (используй sequential PR rule выше) +- **Cleanup**: `Ctrl+X два раза` после merge → session + worktree удалены атомарно +- **NEVER** parallel sessions на one file — каждая ест в own worktree, last-merge wins (см. § Parallel vs sequential PRs) -**Manual `git worktree add` deprecated** — используй `claude --bg --name X`, supervisor сам isolation делает с `baseRef: default` (свежая ветка от main, не от твоей stale-сессии). +**Manual `git worktree add` deprecated** — используй `claude --bg --name X`, supervisor сам isolation делает с `baseRef: fresh` (свежая ветка от main, не от твоей stale-сессии). -**Worktree cleanup** (cron weekly): `scripts/cleanup-merged-worktrees.sh` — удаляет worktrees для merged branches. Запускать вручную или wee­k­ly cron. +**Worktree cleanup** (cron weekly): `scripts/cleanup-merged-worktrees.sh` — удаляет worktrees для merged branches. Запускать вручную или weekly cron. ## Запреты @@ -126,4 +130,4 @@ Issues ≥ 1.5 day → 3-4 sub-PRs: **Foundation → Schema → Workers → Inte - ❌ `gh pr *` — bypassed 2026-05-16, используй Forgejo MCP или curl + `$FORGEJO_TOKEN` - ❌ `--no-verify` / `--amend` / `--no-edit` / `--force` без явного approval - ❌ `@claude` в PR comments — plain text only (`feedback_no_claude_mentions`) -- ❌ Параллельные PR на одни файлы (`feedback_sequential_prs`) +- ❌ Параллельные PR на одни файлы / hot-files (см. § Parallel vs sequential PRs) diff --git a/CLAUDE.md b/CLAUDE.md index 60980af9..052cf7c6 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -21,7 +21,7 @@ Live: `https://gendsgn.ru/` — Свердловская обл. (ЕКБ, ПЗЗ 2. **Branch + PR mandatory.** Никаких direct push в main. `feat/...` / `fix/...` / `refactor/...` / `docs/...` / `chore/...` → ветка от `forgejo/main` → `mcp__forgejo__create_pull_request` → PR URL пользователю. После PR create — сразу `Skill loop` polling. `gh` CLI bypassed (2026-05-16). **Полные правила: `.claude/rules/git-pr.md`**. -3. **Agent-first workflow.** Main session orchestrates ONLY — не пишет код inline. Любая задача >1 файл / >50 строк → subagent. Pre-push: spawn `code-reviewer` subagent на staged changes. Post-push review — внешнее окно Claude (НЕ дублировать). +3. **Agent-first workflow.** Main session orchestrates ONLY — не пишет код inline. Любая задача >1 файл / >50 строк → subagent. Pre-push: spawn `code-reviewer` subagent на staged changes. Post-push review — внешнее окно Claude (НЕ дублировать). Лимиты размера subagent-задачи: `.claude/rules/delegation.md`. 4. **psycopg v3 only.** `import psycopg2` → ModuleNotFoundError. `CAST(:x AS type)` в SQL — никогда `:x::type`. **Полные правила: `.claude/rules/backend.md` + `sql.md`**. @@ -41,14 +41,16 @@ Live: `https://gendsgn.ru/` — Свердловская обл. (ЕКБ, ПЗЗ | `database-expert` | `data/sql/**.sql`, Alembic, EXPLAIN ANALYZE | | `devops-engineer` | `docker-compose*.yml`, `Caddyfile`, `.github/workflows/**`, `.forgejo/workflows/**` | | `code-reviewer` | Pre-push lint (security, correctness, conventions) | -| `deep-code-reviewer` | Тщательный review критичных PR (миграции / auth / scrapers) + merge authority при ✅ APPROVE | +| `deep-code-reviewer` | Тщательный review критичных PR (миграции / auth / scrapers) + merge authority при ✅ APPROVE (не эксклюзивно: self-merge разрешён любой сессии с 2026-06-27) | | `qa-tester` | Post-deploy smoke (playwright / curl / SQL) сразу после merge+deploy — rule #7 | +`auto-*` в `.claude/agents/` — standalone bot-персоны (`/work-as-*`), НЕ для Task-spawn; общий контракт — `_autonomous_pickup.md`. + **Routing:** тривиально (typo, 1-line) → main session. Single-domain clear → worker. Cross-domain / нечётко → `tech-analyst` first. Worker → `code-reviewer` → main commits → push → PR. ## Where to look -- **Path-scoped rules:** `.claude/rules/` (backend, frontend, sql, git-pr, deploy, ui-tokens, ui-conventions, ui-microcopy) — auto-loaded при работе с соответствующими файлами через `paths:` frontmatter +- **Path-scoped rules:** `.claude/rules/` (backend, frontend, sql, git-pr, deploy, tradein, ui-tokens, ui-conventions, ui-microcopy) — auto-loaded при работе с соответствующими файлами через `paths:` frontmatter; `delegation.md` — намеренно БЕЗ `paths:` (грузится в каждой сессии, не добавлять frontmatter) - **Personal preferences:** `~/.claude/CLAUDE.md` (cross-project: no auto-commit, no Co-Authored-By, no @claude) - **Workflow memory:** `~/.claude/projects//memory/MEMORY.md` index - **Vault MOCs:** `meta/`, `domains//-MOC.md`, `decisions/`, `fixes/`, `limitations/`, `code/patterns/` @@ -56,7 +58,7 @@ Live: `https://gendsgn.ru/` — Свердловская обл. (ЕКБ, ПЗЗ ## Don't (cross-domain — specifics → `.claude/rules/`) -- ❌ Direct push в main / merge без approval +- ❌ Direct push в main; merge вне policy (красный CI / tripwires — git-pr.md § Auto-merge policy) - ❌ `--no-verify` / `--amend` / `git push --force` - ❌ Knowledge-файлы вне vault (`docs/research/`, `notes/`, `wiki/`) - ❌ Hardcode credentials в коде / коммитах