How this skill is triggered — by the user, by Claude, or both
Slash command
/polisade:continueThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Найти готовые к работе артефакты и выполнять их автономно.
Найти готовые к работе артефакты и выполнять их автономно.
┌─────────────────────────────────────────────────────────────┐
│ ⛔ ЗАПРЕЩЕНО ставить status: done если: │
│ │
│ ✗ Regression tests НЕ прогнаны │
│ ✗ PR НЕ создан │
│ ✗ Review НЕ пройден │
│ ✗ Merge НЕ выполнен │
│ │
│ После написания кода статус: in_progress │
│ После создания PR статус: review │
│ После merge PR статус: done │
└─────────────────────────────────────────────────────────────┘
Каждая TASK проходит ПОЛНЫЙ ЦИКЛ:
1. IMPLEMENT → код + unit tests + commit → статус: in_progress
2. REGRESSION → запуск ВСЕХ тестов проекта → исправить если упали
3. CREATE PR → push + pr-create (polisade_vcs.py) → статус: review
4. REVIEW LOOP → ждать/исправлять → повторять до approve
5. MERGE → pr-merge + delete-branch → статус: done
НЕ ПЕРЕХОДИ к следующей TASK пока текущая не завершена полностью!
/polisade:continue # Начать автономную работу
.state/PROJECT_STATE.json.state/knowledge.json для контекста проектаwaitingForPM:
readyToWork:
workspaceMode: "worktree":
git worktree list --porcelain┌─────────────────────────────────────────────────────────────┐
│ АВТОНОМНЫЙ ЦИКЛ TASK │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. IMPLEMENT │
│ ├─ Создать ветку (gitBranching: true) │
│ ├─ Реализовать код через субагент │
│ ├─ Написать unit тесты │
│ └─ Коммит │
│ │ │
│ ▼ │
│ 2. REGRESSION TEST │
│ ├─ Запустить ВСЕ тесты проекта │
│ ├─ Если упали → исправить → коммит → повторить │
│ └─ Если прошли → продолжить │
│ │ │
│ ▼ │
│ 3. CREATE PR │
│ ├─ Push ветки │
│ ├─ Создать Pull Request │
│ └─ TASK → status: review │
│ │ │
│ ▼ │
│ 3.5. PRE-CHECK: REVIEWER CLI │
│ ├─ python3 scripts/polisade_cli_caps.py detect │
│ │ → reviewer.mode = codex | self | blocked │
│ └─ mode=blocked → STOP с диагностикой │
│ │ │
│ ▼ │
│ 4. QUALITY REVIEW (Independent) │
│ ├─ /polisade:review-pr [self] для независимого ревью │
│ ├─ Ревьюер оценивает diff vs TASK │
│ ├─ Если score < 8 → improve → re-review (макс 2 итер.) │
│ └─ Если PASS → merge → delete branch → TASK: done │
│ │ │
│ ▼ │
│ 5. NEXT TASK │
│ └─ Вернуться к шагу 1 алгоритма │
│ │
├─────────────────────────────────────────────────────────────┤
│ ПРЕРЫВАНИЕ ЦИКЛА (только при): │
│ • waiting_pm — нужно решение PM │
│ • blocked — неразрешимая техническая проблема │
│ • Все задачи завершены │
├─────────────────────────────────────────────────────────────┤
│ НЕ ПРЕРЫВАЙСЯ для: │
│ • Падающих тестов — исправь автоматически │
│ • Review замечаний — исправь автоматически │
│ • Merge конфликтов — разреши автоматически │
└─────────────────────────────────────────────────────────────┘
1. IMPLEMENT
[TASK-XXX] description2. REGRESSION TEST
while tests_failing:
run_all_project_tests()
if failed:
analyze_failures()
fix_code()
commit("[TASK-XXX] Fix test failures")
else:
break
3. CREATE PR
polisade_vcs.py pr-create (провайдер выбирается автоматически из settings.vcsProvider)review
lastUpdated в PROJECT_STATE.json — поле зарезервировано,
всегда null (OPS-010 / issue #58).4. QUALITY REVIEW И MERGE (автоматически, без вопросов!)
⚠️ ВАЖНО:
- PM не делает code review — это автоматизированный процесс
- НЕ СПРАШИВАЙ "Продолжить?" — делай автоматически!
- Ревью делает Codex CLI (default) или текущий агент (`self`) — независимое мнение!
- GitHub не позволяет approve свой PR — merge напрямую после PASS
Алгоритм: 0. Pre-check: определить reviewer CLI через единый helper (OPS-011):
caps=$(python3 {plugin_root}/scripts/polisade_cli_caps.py detect) → JSON с reviewer.modereview_mode = caps.reviewer.mode → "codex" | "self" | "blocked" | "off" (OPS-017)reason = caps.reviewer.reason (может быть пустым)warning = caps.reviewer.warning — OPS-007 / issue #55: непустое значение означает, что в PATH нашёлся чужой codex и был отбит identity-проверкой. Напечатать ⚠ {warning} перед ветвлением по review_mode, чтобы самозванец не оставался silent в логе.
0a. Если review_mode == "off" → STOP: reviewer отключён в settings.reviewer.mode. TASK остаётся в review с созданным PR; PM делает ревью руками и выполняет merge через /polisade:pr merge <id> (или закрывает PR).
0b. Если review_mode == "blocked" → STOP. Прочитать reason и подсказать соответственно:reason упоминает «settings …» → проблема в настройках:
═══════════════════════════════════════════
REVIEWER BLOCKED
═══════════════════════════════════════════
Reason: {reason}
Проверьте settings.reviewer.mode и settings.reviewer.cli
в .state/PROJECT_STATE.json — текущее значение конфликтует
с доступными CLI в окружении.
TASK остаётся в статусе: review
═══════════════════════════════════════════
═══════════════════════════════════════════
REVIEWER CLI НЕ НАЙДЕН
═══════════════════════════════════════════
Reason: {reason or "no reviewer CLI available"}
Quality review требует CLI ревьюера.
Варианты:
• Codex CLI: npm install -g @openai/codex
• Claude Code: https://docs.anthropic.com/claude-code
• Qwen CLI: документация Qwen
TASK остаётся в статусе: review
═══════════════════════════════════════════
/polisade:review-pr (или /polisade:review-pr self если review_mode == self) — независимый quality review:
python3 {plugin_root}/scripts/polisade_vcs.py pr-merge N --squash --delete-branch --project-root "${POLISADE_WORK_DIR:-.}"iterations = 0
while iterations < 2:
review = run_review(pr_number, review_mode) # Codex CLI or self
iterations += 1
if review.score >= 8: # PASS
run('python3 {plugin_root}/scripts/polisade_vcs.py pr-merge N --squash --delete-branch --project-root "${POLISADE_WORK_DIR:-.}"')
task.status = "done"
# OPS-010: post-merge `status=done` — терминальная правка frontmatter
# TASK.md + PROJECT_STATE.json. Если семантического коммита больше нет
# (переход к следующей ready TASK в шаге 5 запускает новый цикл), это
# единственный `finalize` commit `[TASK-ID] Finalize status: done (PR #N)`.
# diff: только TASK.md frontmatter + PROJECT_STATE.json. НЕ пиши lastUpdated.
break
else: # IMPROVE
run_improvement(review.recommendations)
run_all_tests()
# OPS-028: commit_and_push() =
# git commit ... && python3 {plugin_root}/scripts/polisade_vcs.py git-push \
# --branch <expected_branch> --project-root "$WORK_DIR"
# На exit=2 (push verification failed) → task.status = "waiting_pm",
# в waitingForPM процитировать remote_lines + reason из JSON. break.
commit_and_push()
else:
# Max iterations — STOP, ждём PM
task.status = "waiting_pm"
update_project_state(task_id, "waitingForPM",
reason=f"Review ({review_mode}): score {review.score}/10 after 2 iterations")
# OPS-010: терминальный waiting_pm без следующего коммита. Бандли
# task.status + update_project_state в единственный `finalize` commit
# `[TASK-ID] Finalize status: waiting_pm (PR #N)`. diff: только TASK.md
# frontmatter + PROJECT_STATE.json. НЕ пиши lastUpdated.
STOP # НЕ переходить к следующей задаче!
5. NEXT TASK
⚠️ НЕ НАЧИНАЙ новую TASK пока есть незавершённые!
review — resume-процедура (OPS-008):
Phase A — Resolve workspace (не полагаемся на env предыдущей сессии):
expected = compute_expected_branch(TASK) — детерминировано из TASK
frontmatter (parent + slug), правила именования — в implement §1.7workspaceMode == "worktree":
git worktree list --porcelain → найти branch refs/heads/{expected}WORK_DIR = путь worktree (всё уже настроено)git worktree add .worktrees/<dir> <expected> (ATTACH без -b).state/ (кроме counters.json!):
⚠️ Каждую команду выполнять ОТДЕЛЬНЫМ Bash-вызовом
(НЕ цепочкой через && — ломает matching permissions в settings.json):
mkdir -p {wt}/.state
cp .state/PROJECT_STATE.json {wt}/.state/
cp .state/knowledge.json {wt}/.state/.claude/ уже в worktree (tracked) — НЕ симлинк.venv, node_modules, vendor
(если есть в project_root → ln -s)WORK_DIR = путь нового worktree
Иначе (inplace):git checkout <expected> → WORK_DIR = project_rootcd "$WORK_DIR" && test "$(git rev-parse --abbrev-ref HEAD)" = "<expected>"
Если упало → STOP, blocked reason=OPS-001cd "$WORK_DIR" && git status --porcelain
Если не чисто → waiting_pm reason="uncommitted changes in resume workspace"POLISADE_GIT_BRANCHING, POLISADE_EXPECTED_BRANCH, POLISADE_WORK_DIRPhase B — Auto-discover PR:
pr_url из TASK frontmatter (source of truth;
НЕ из PROJECT_STATE.artifacts — его schema не расширяем)pr_url заполнен → перейти к Phase Dpython3 {plugin_root}/scripts/polisade_vcs.py pr-list --head <expected_branch> --state OPEN --format json --project-root "${POLISADE_WORK_DIR:-.}"
(провайдер выбирается автоматически из settings.vcsProvider; GitHub — через gh, Bitbucket — через REST API)pr_url в TASK frontmatter → Phase DPhase C — Create PR (если Phase B не нашла):
python3 {plugin_root}/scripts/polisade_vcs.py git-push --branch <expected_branch> --set-upstream --project-root "$WORK_DIR"
— OPS-028: verified push (не bare git push). Хелпер сверяет
local SHA с remote SHA через git ls-remote и сканирует вывод на
remote: fatal / remote: ERROR / pre-receive hook declined /
value too long for type / duplicate key value / ! [rejected] /
non-fast-forward / failed to push.
waiting_pm, в
waitingForPM процитировать remote_lines и reason из JSON-вывода.
STOP. НЕ git merge, НЕ git push origin main,
НЕ branch -D.python3 {plugin_root}/scripts/polisade_vcs.py pr-create --title "[TASK-XXX] ..." --body-file <PR_BODY_FILE> --head <expected_branch> --project-root "${POLISADE_WORK_DIR:-.}"pr_url в TASK frontmatter → Phase D.env для Bitbucket / токен невалиден / VCS CLI недоступен):
status → waiting_pm (НЕ blocked — иначе зацикливается)
Добавить в waitingForPM вопрос:
"TASK-XXX: автоматическое создание PR не удалось. Ветка: <expected_branch>. Создайте PR вручную через web UI и запустите /polisade:unblock чтобы указать URL. Для диагностики VCS: /polisade:doctor --vcs."
⛔ НЕ git merge, НЕ git push origin main, НЕ branch -D.
STOPPhase D — Quality review (существующая логика без изменений): запусти Independent Quality Review, merge после PASS
changes_requested — исправить замечания code review
in_progress — доделай начатое
Если текущая TASK из PLAN, следующая = первая ready TASK из того же PLAN.
Не прыгай на другие PLAN пока текущий не завершён или не заблокирован.
ready TASK из текущего PLAN (по roadmap_item order)ready TASK от BUG — исправь баги (P0 > P1 > P2)ready TASK — реализуй задачиready TASK от CHORE — выполни простые задачиready TASK от DEBT (P0-P1) — security/performanceready SPIKE — исследуй (следи за timebox)ready PLAN → создай задачи (/polisade:tasks)ready SPEC → создай задачи (/polisade:tasks)ready FEAT → создай задачи (/polisade:tasks) или spec если сложноready PRD → создай спецификацию (/polisade:spec)ready TASK от DEBT (P2+) — обычный техдолгЕсли несколько артефактов одного типа:
Останавливайся и сообщай PM когда:
→ Поставь waiting_pm, добавь вопрос, продолжи с другими задачами
→ Поставь blocked, продолжи с другими задачами
ready задачwaiting_pm или blocked→ Выведи итоги и останови работу
═══════════════════════════════════════════
АВТОНОМНАЯ РАБОТА
═══════════════════════════════════════════
Найдено ready: 5 артефактов
• 1 TASK от BUG (P1)
• 3 TASK
• 1 SPIKE
Начинаю полный цикл: TASK-001 (от BUG-001, приоритет P1)
───────────────────────────────────────────
───────────────────────────────────────────
[1/5] IMPLEMENT: TASK-001
───────────────────────────────────────────
Ветка: fix/BUG-001-login-error
Worktree: .worktrees/fix__BUG-001-login-error/
Реализация через субагент...
✓ Код написан
✓ Unit тесты добавлены
Коммит: abc123
───────────────────────────────────────────
[2/5] REGRESSION TEST
───────────────────────────────────────────
Запуск всех тестов...
✓ 142/142 тестов прошло (8.5s)
───────────────────────────────────────────
[3/5] CREATE PR
───────────────────────────────────────────
Push: fix/BUG-001-login-error → origin
PR #45 создан: [TASK-001] Fix login error handling
URL: https://github.com/org/repo/pull/45
Статус: review
───────────────────────────────────────────
[4/5] QUALITY REVIEW
───────────────────────────────────────────
Score: 8.4/10 → PASS
✓ Acceptance criteria: 9/10
✓ Полнота: 8/10
✓ Качество: 8/10
✓ Тесты: 9/10
✓ Безопасность: 8/10
Merge: squash and merge
Ветка fix/BUG-001-login-error удалена
───────────────────────────────────────────
[5/5] COMPLETE
───────────────────────────────────────────
✓ TASK-001 → done
✓ BUG-001 → done
Worktree: .worktrees/fix__BUG-001-login-error/ (сохранён)
Cleanup: git worktree remove .worktrees/fix__BUG-001-login-error --force
═══════════════════════════════════════════
Переход к следующей задаче: TASK-002
═══════════════════════════════════════════
───────────────────────────────────────────
[2/5] REGRESSION TEST
───────────────────────────────────────────
Запуск всех тестов...
✗ 140/142 тестов прошло
Упавшие тесты:
• test_auth_middleware — TypeError
• test_session_handling — AssertionError
Анализ и исправление...
Коммит: def456 "[TASK-001] Fix regression"
Повторный запуск...
✓ 142/142 тестов прошло (9.1s)
───────────────────────────────────────────
[4/5] QUALITY REVIEW
───────────────────────────────────────────
Iteration 1: Score 6.8/10 → IMPROVE
• Acceptance criteria: 7/10
• Полнота: 6/10 — пропущен null check в auth.ts
• Тесты: 6/10 — нет edge case тестов
Improvement субагент исправляет...
• src/auth.ts:45 — добавлен null check
• tests/auth.test.ts — добавлены edge case тесты
Коммит: ghi789 "[TASK-001] Address quality review feedback"
Тесты: ✓ passed
Push...
Iteration 2: Score 8.4/10 → PASS
Merge: squash and merge
───────────────────────────────────────────
⏸️ TASK-003 требует решения PM
───────────────────────────────────────────
Вопрос: "Какой лимит для rate limiting?"
Статус: waiting_pm
Ветка: plan/PLAN-001-TASK-003-rate-limit (сохранена)
Переход к следующей доступной задаче...
═══════════════════════════════════════════
ИТОГИ АВТОНОМНОЙ СЕССИИ
═══════════════════════════════════════════
Полных циклов завершено: 4
✓ TASK-001 → PR #45 merged
✓ TASK-002 → PR #46 merged
✓ TASK-004 → PR #47 merged
✓ TASK-005 → PR #48 merged
В review: 1
⏳ TASK-006 → PR #49 (ожидает review)
Ждут PM: 1
⏸️ TASK-003: "Какой лимит для rate limiting?"
Заблокировано: 0
Осталось ready: 2
═══════════════════════════════════════════
ПРИЧИНА ОСТАНОВКИ: waiting_pm
→ /polisade:unblock — ответить на вопрос
→ /polisade:continue — продолжить (пропустит blocked)
Сверка стейта (после merge всех PR):
/polisade:sync --apply
Cleanup worktrees:
git worktree list → git worktree remove <path> --force
git worktree prune
═══════════════════════════════════════════
Проверь settings.gitBranching и settings.workspaceMode в PROJECT_STATE.json.
При gitBranching: true:
Для TASK от FEAT/BUG/DEBT/CHORE (стандартный режим):
feat/FEAT-XXX-slug, fix/BUG-XXX-slug, debt/DEBT-XXX-slug, chore/CHORE-XXX-slugДля TASK от PLAN (режим плана):
plan/PLAN-XXX-TASK-YYY-slugОпределение режима: проверь parent в TASK файле:
parent: PLAN-XXX → режим планаparent: FEAT-XXX / BUG-XXX / etc. → стандартный режимКаждая задача получает изолированный git worktree:
1. branch = feat/FEAT-001-slug
2. dir = feat__FEAT-001-slug (нормализация / → __)
3. path = .worktrees/feat__FEAT-001-slug/
4. git worktree add {path} -b {branch}
5. Копировать .state/ (кроме counters.json!)
6. Симлинк .claude/ (fallback: cp -r)
7. Все операции — в {worktree_path}
Пропуск занятых задач: перед выбором следующей задачи проверь git worktree list --porcelain — если для TASK уже есть активный worktree (сопоставление по имени ветки → TASK-ID), пропусти задачу.
Graceful fallback: если git worktree add не проходит → откат на git checkout -b с предупреждением.
git checkout -b {branch_name} (прежнее поведение)⚠️ При КАЖДОМ изменении статуса TASK — обновляй ОБА источника:
.state/PROJECT_STATE.json (локальная копия в worktree).md файл frontmatter (committed, source of truth для /polisade:sync)code_complete → Edit task .md: status: in_progress + Update PROJECT_STATE
create PR → Edit task .md: status: review + Update PROJECT_STATE
merge → Edit task .md: status: done + Update PROJECT_STATE
create worktree → full cycle (implement → test → PR → review → merge)
→ вывести cleanup инструкцию (worktree НЕ удаляется автоматически)
→ перейти к следующей задаче (новый worktree)
Итоговое сообщение для каждой задачи:
Worktree: {worktree_path} (сохранён для правок по ревью)
Cleanup: git worktree remove {worktree_path} --force && git worktree prune
Сверка: /polisade:sync --apply (из основного репо после merge всех PR)
При gitBranching: false:
/polisade:implement работает только с TASKНЕ ПИШИ:
"Продолжить с TASK-039?"
"Хочешь чтобы я продолжил?"
"Начать следующую задачу?"
ВМЕСТО ЭТОГО — просто продолжай автоматически!
Автономный режим означает:
Останавливайся ТОЛЬКО при:
waiting_pm — бизнес-вопрос к PMblocked — техническая проблема которую не можешь решитьGitHub не позволяет approve свой собственный PR:
Error: Review Can not approve your own pull request
Решение: После успешного Independent Quality Review (score >= 8) делай merge напрямую:
python3 {plugin_root}/scripts/polisade_vcs.py pr-merge N --squash --delete-branch --project-root "${POLISADE_WORK_DIR:-.}"
Не approve собственного PR (ни через VCS CLI, ни через REST API) — это не сработает.
npx claudepluginhub cryndoc/polisade-orchestrator --plugin polisadeProvides behavioral guidelines to reduce common LLM coding mistakes, focusing on simplicity, surgical changes, assumption surfacing, and verifiable success criteria.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.