---
name: audit
description: One-command project audit. project-status tool + explore subagent (code-standards) → binary verdict → ask user → create-issue for each problem. Read-only (creates issues, NOT fixes). Also when user says "аудит проекта", "проверь проект", "audit", "проверь архитектуру".
---

# Audit

Линейный flow для аудита существующего проекта. В отличие от
`project-template` check flow (который чинит через FIX subagents напрямую),
audit создаёт **GitHub issues** для рефакторинга — дальше юзер запускает
`/run-pipeline` на каждом issue (pipeline-подход: ISSUE → IMPLEMENT → CI →
REVIEW → MERGE).

Источники находок:
- **`project-status` tool** — детерминированные проблемы (нет `conftest.py`,
  нет `ci.yml`, thin routes, centralized models). Agent парсит текстовый
  отчёт (НЕ JSON — `project-status.py` не трогаем).
- **`explore` subagent + `code-standards` skill** — качественные проблемы
  (`project-status` НЕ ловит): schemas смешаны с models, бизнес-логика в
  роутах, нарушение layering, service-слой пропущен.

## ПРОТОКОЛ (ЖЁСТКО)

1. **`project-status({})`** — оркестратор вызывает tool напрямую (read-only
   oracle, ALLOWED — как `pipeline-status` / `spec-status`). Если вернул
   `⚠️ ...failed` → WARN, продолжай без детерминированных находок (explore
   всё равно работает).
2. **Парсит отчёт** (текст): `Итог:` (OK/WARN counts — issue #275: FAIL убран,
   exit code всегда 0) + `Рекомендации:` (список WARN с путями). Источник
   находок = секция `Рекомендации:` (каждая строка `- <group> / <name>: <detail>`).
3. **`skill({ name: "code-standards" })`** — load skill (НЕ хардкод правил в
   audit skill — `code-standards` источник правды).
4. **Delegate `explore` subagent** (Template EXPLORE) — проверяет структуру
   и код против `code-standards`, возвращает
   `[{category, problem, path, severity}, ...]`.
5. **Комбинирует** находки: WARN из `project-status` + качественные из
   explore. **Дедупликация**: если `project-status` WARN и explore нашли
   одну и ту же проблему → 1 issue (не 2).
6. **Бинарный вердикт** (issue #275: парсит WARN, не exit code — exit всегда 0):
   - `≥1 WARN` ИЛИ `≥1 qualitative finding` → `❌ Найдено N проблем`
   - `0 WARN` + `0 qualitative` → `✅ Проект здоров` → STOP
7. **Список проблем** (сгруппированный: Структура / Качество / Тесты / Infra
   / Code-standards) — покажи юзеру.
8. **Вопрос юзеру**:
   ```
   Найдено N проблем. Создать issues для рефакторинга?
   [1] да — для каждой проблемы create-issue (subagent)
   [2] нет — STOP, отчёт у юзера
   ```
9. Если `да` → для **каждой** проблемы (последовательно, НЕ параллельно —
   Linear Execution из AGENTS.md) — delegate `task(general)` с Template
   ISSUE_CREATE. Если `create-issue` валидация упала → subagent сообщает
   ошибку, continue к следующей. Если gh недоступен → STOP + report.
10. **Финальный репорт**:
    ```
    Audit complete. Создано N issues:
    - #M1: <title> — <url>
    Запусти /run-pipeline на каждом issue для рефакторинга.
    ```

### ЗАПРЕЩЕНО

- Чинить код напрямую (audit = read-only, только issues). FIX flow остаётся
  в `project-template` check flow.
- Параллелить create-issue subagents (Linear Execution).
- Хардкодить правила из `code-standards` — загружай через `skill()`.
- Трогать `project-status.py` (агент парсит текст — JSON не нужен).
- Создавать `audit-status` tool (audit — линейный, не фазный loop).
- Группировать проблемы в один issue (1 проблема = 1 issue для `/run-pipeline`).
- Парсить exit code `project-status` для вердикта (issue #275: exit всегда 0,
  парси WARN в `Рекомендации:`).

## Граничные случаи

- **Репо UNKNOWN типа** → explore всё равно проверяет против
  `code-standards`, вердикт по качественным находкам.
- **Репо без `src/<pkg>/`** (flat layout) → `project-status` WARNs, explore
  проверяет по `code-standards` (если применимо).
- **Только WARN** (0 qualitative) → `❌ Найдено N проблем`, вопрос (да/нет —
  на усмотрение юзера).
- **Юзер "нет"** → STOP, отчёт у юзера.
- **create-issue валидация упала** → subagent сообщает, continue к следующей.
- **Дублирующие проблемы** → дедупликация оркестратором (1 issue, не 2).

## Prompt templates

### Template EXPLORE (code-standards qualitative audit)

```
Прочитай .opencode/skills/code-standards/SKILL.md.
Проверь структуру и код проекта в <cwd> против правил из skill.
Найди качественные проблемы, которые project-status НЕ ловит:
- schemas смешаны с models (Pydantic DTO в db/models/)
- бизнес-логика в роутах (Tortoise queries в api/)
- нарушение layering (routes импортируют db/models напрямую, минуя services)
- service-слой пропущен (routes → db/models без services/)
- файлы длиннее 200-300 строк (декомпозиция)
- mixing concerns (бизнес-логика ≠ транспорт ≠ представление)

Для каждой находки верни:
{category: "Code-standards", problem: "<name>: <detail>", path: "<file:line>", severity: "warn"|"fail"}

Верни массив находок. Если находок нет — пустой массив [].
НЕ редактируй код — audit read-only. Только отчёт.
```

### Template ISSUE_CREATE (create-issue для одной проблемы)

```
Создай GitHub issue для проблемы из audit.
Категория: <category>
Проблема: <name>: <detail>
Путь: <path>
Источник: <project-status | code-standards explore>
Severity: <warn|fail>

1. Load `issue` skill via `skill({ name: "issue" })`.
2. Сформируй issue body (8 headings: ## Контекст, ## Задача, ## Контракты,
   ## Инварианты, ## Граничные случаи, ## Влияние на связанные компоненты,
   ## Вне scope, ## Критерии приемки).
   - Контекст: проблема из audit (<repo>) — <name>: <detail>. Путь: <path>.
     Источник: <source>. Severity: <severity>.
   - Задача: что починить (конкретно, с путями к файлам).
   - Контракты: конкретные изменения (что должно стать после фикса).
   - Инварианты: что НЕ ломать при фиксе.
   - Граничные случаи: edge cases при фиксе.
   - Влияние на связанные компоненты: зависящие audit-категории/оракулы/промпты; paired updates; «нет связанных компонентов» для тривиальных фиксов.
   - Вне scope: что НЕ делаем в этом issue.
   - Критерии приемки: чек-лист (включая `project-status` проходит эту
     категорию после фикса).
3. `create-issue({ title: "fix(<scope>): <description>", body, labels: ["tech-debt", "from-audit"] })`
   tool (НЕ raw `gh issue create` — заблокирован deny). tool валидирует
   conventional title + 8 headings + Cyrillic.
4. Верни: issue URL (или ошибку валидации для оркестратора).

Если gh недоступен → верни: "gh unavailable: <reason>". НЕ retry, НЕ fallback.
```

## Rules

- Main agent = оркестратор: `project-status` tool + `explore` subagent +
  вопрос юзеру + `task(general)` для create-issue. Не делает
  edit/read/`gh issue create` сам.
- `project-status` — read-only oracle, ALLOWED для оркестратора.
- Audit — read-only (НЕ редактирует код, только создаёт issues).
- WARN из `project-status` → issues, НЕ FIX напрямую.
- 1 проблема = 1 issue (для отдельного `/run-pipeline`).
- Issue body self-contained (8 headings, `create-issue` валидация).
- `code-standards` — через `skill()` tool, НЕ хардкод.
- Audit — линейный flow (не `audit-status` tool).
- create-issue subagents — последовательно (Linear Execution).
- Subagent error → 1 retry, потом STOP + report.