---
name: output-review
description: Независимый аудит результата любого скилла по его чек-листу. Используй после завершения скилла для проверки качества output. Не используй для аудита самих SKILL.md — для этого /skill-audit.
allowed-tools: "Read Write Edit Glob Grep Bash(./gradlew*) Bash(wc*)"
agent: agents/auditor.md
context: fork
---

# /output-review — Независимый аудит результата скилла

Проверяет OUTPUT скилла по чек-листам из SKILL.md целевого скилла. Независимая оценка — не тот же AI-контекст, который генерировал результат.

## Перед началом

Прочитай `.claude/qa_agent.md` и `.claude/agents/auditor.md`.

---

## Когда использовать

- Сразу после завершения любого скилла (`SKILL COMPLETE`)
- Когда Score в SKILL COMPLETE кажется завышенным
- Для независимой валидации перед мержем/релизом

## Входные данные

| Параметр | Обязательность | Описание |
|----------|:--------------:|----------|
| skill-name | Опционально | Имя скилла (`/output-review api-tests`). Если не указано — ищет `SKILL COMPLETE` в чате |

---

## Алгоритм (7 фаз)

## Verbosity Protocol

**Structured Output Priority:** Весь analysis идёт в артефакт (MD/HTML), не в чат.

**Chat output (ограничения):**
- Brief Summary: max 5 строк (что нашли, сколько, итог)
- Findings table: max 15 строк (топ по severity)
- Полный отчёт: `📊 Полный отчёт: {path}` + открыть файл

**Iterative steps:** Не выводить прогресс по каждому файлу. Checkpoint только при:
- Phase transition (Фаза N → Фаза N+1)
- Blocker обнаружен
- Завершение (SKILL COMPLETE)

**Tools first:**
- Grep → table → report, без "Now I will grep..."
- Read → analyze → report, без "The file shows..."

**Post-Check:** Inline перед SKILL COMPLETE (5-7 строк checklist), не отдельный файл.

**Фазы 1-6:** Silent. **Фаза 7:** Сохранить полный отчёт в файл + краткая сводка в чат (max 5 строк).

### Фаза 1 — Target Identification

**Цель:** Определить какой скилл аудитировать.

1. Если указан параметр `/output-review {skill-name}` → использовать его
2. Иначе — искать последний `SKILL COMPLETE: /{skill-name}` в контексте чата
3. Fallback — спросить пользователя: "Какой скилл аудитировать?"
4. Валидация: Glob `.claude/skills/{skill-name}/SKILL.md` — файл должен существовать

**Если скилл не найден → STOP:**
```
❌ Скилл /{skill-name} не найден в .claude/skills/
Доступные: [список из Glob]
```

---

### Фаза 2 — Checklist Extraction

**Цель:** Извлечь все проверки из SKILL.md целевого скилла.

1. Прочитать `.claude/skills/{skill-name}/SKILL.md`
2. Найти секции (regex по заголовкам `##` / `###`):
   - `Self-Check` / `Definition of Done`
   - `Quality Gates`
   - `Post-*Check` (Post-Check, Post-Compilation Check, Post-Audit Check)
   - `BANNED` / `ЗАПРЕЩЕНО`
   - `Compilation Gate`
3. Если существует `references/` → Glob `references/*.md` → читать, искать чек-листы
4. Извлечь каждый пункт `- [ ]` и каждый нумерованный пункт из BANNED

**Вывод перед продолжением:** таблица `| # | Группа | Пункт |` + строка `Всего: N проверок.`

---

### Фаза 3 — Artifact Discovery

**Цель:** Найти артефакты (файлы), созданные скиллом.

**Приоритет поиска:**

1. **SKILL COMPLETE блок** → строка `Артефакты:` → парсить пути файлов
2. **SKILL.md output-секция** → прочитать секции "Формат вывода", "Выходные данные", "Артефакты" → Glob по ожидаемым путям
3. **Chat-only скиллы** (spec-audit, skill-audit, doc-lint, screenshot-analyze) → артефакт = контекст чата + HTML/MD отчёт если есть

**Для каждого найденного файла — проверить существование через Glob.**

**Если артефакты не найдены:**
```
⚠️ Артефакты не обнаружены. Оценка будет проведена по контексту чата.
```

---

### Фаза 4 — Evaluation

**Цель:** Независимо проверить каждый пункт чек-листа.

Для каждого пункта из Фазы 2:

1. **Прочитать** релевантный артефакт (файл или контекст чата)
2. **Оценить** соответствие пункту
3. **Присвоить вердикт:**

| Вердикт | Значение |
|---------|----------|
| ✅ PASS | Полностью соответствует |
| ❌ FAIL | Не соответствует — с доказательством |
| ⚠️ PARTIAL | Частично соответствует — описать что не так |
| ⏭️ SKIP | Неприменимо к данному контексту |

**Правила:**

- Каждый ❌ FAIL — обязательно с **конкретным доказательством**: файл, строка, фрагмент кода
- BANNED-пункты: Grep по артефактам на сигнатуры (например `Thread.sleep`, `shouldBe`, `Map<String, Any>`)
- Compilation Gate: запуск команды из SKILL.md (1 попытка). Если уже была запущена — использовать результат из чата

**Пример FAIL:** `❌ FAIL: assertEquals без message — файл:строка — Найдено: X / Ожидалось: Y`

---

### Фаза 5 — Anti-Pattern Scan

**Цель:** Проверить артефакты на анти-паттерны из agents/sdet.md.

1. `ls .claude/qa-antipatterns/` — получить список anti-patterns
2. Grep по артефактам на ключевые сигнатуры из имён файлов (например `Thread.sleep`, `Map<String, Any>`, PII)
3. При обнаружении — прочитать соответствующий reference файл для контекста

**Если скилл отсутствует в таблице Anti-Patterns → пропустить фазу.**

| Вердикт | Значение |
|---------|----------|
| ✅ CLEAN | Сигнатура не найдена |
| ❌ FOUND | Сигнатура найдена — файл:строка |

---

### Фаза 6 — Universal Checks

**Цель:** Проверки, общие для всех скиллов.

1. **SKILL COMPLETE блок** — присутствует в чате?
2. **Формат** — содержит 5 обязательных полей:
   - `Артефакты`
   - `Compilation`
   - `Upstream`
   - `Coverage`
   - Имя скилла в заголовке
3. **Score < 70%** — если Coverage указан как X/Y и X/Y < 0.7 → предупреждение

---

### Фаза 7 — Report

**Цель:** Сформировать итоговый отчёт и сохранить в файл `audit/output-review_{skill-name}_{YYYY-MM-DD}.md`.

**Если файл с таким именем уже существует — добавить суффикс `_2`, `_3` и т.д.**

#### Таблица результатов (по группам)

```markdown
## Output Review Report: /{skill-name}

### Self-Check / Definition of Done

| # | Пункт | Вердикт | Комментарий |
|---|-------|---------|-------------|
| 1 | Архитектура | ✅ PASS | config/, requests/, helpers/ (main) + tests (test) — присутствуют |
| 2 | assertions с message | ❌ FAIL | assertEquals без message в RegistrationApiTests.kt:45 |

### BANNED

| # | Правило | Вердикт | Комментарий |
|---|---------|---------|-------------|
| 1 | Thread.sleep() | ✅ PASS | Не найдено |

### Anti-Patterns (agents/sdet.md)

| # | Паттерн | Вердикт | Комментарий |
|---|---------|---------|-------------|
| 1 | PII в коде | ✅ CLEAN | @gmail.com не найден |

### Universal Checks

| # | Проверка | Вердикт | Комментарий |
|---|----------|---------|-------------|
| 1 | SKILL COMPLETE блок | ✅ PASS | Присутствует |
| 2 | 5 полей формата | ⚠️ PARTIAL | Отсутствует Coverage |
```

#### Scorecard

```
Score = PASS / (PASS + FAIL) × 100

Формула: {N_pass} + {N_partial}×0.5 / ({N_pass} + {N_partial}×0.5 + {N_fail}) × 100
SKIP не учитываются.
```

**Пример:**
```
Scorecard: 12 PASS + 1 PARTIAL×0.5 / (12 + 0.5 + 2) × 100 = 86%
```

#### Расхождения с Post-Check скилла

Если скилл уже выполнил Post-Check в чате — сравнить:
- Где self-review не согласен с оценкой скилла
- Формат: `Пункт X: скилл → ✅, self-review → ❌ (причина)`

#### Рекомендации по артефакту

Конкретные действия для устранения каждого FAIL в артефакте:

```markdown
### Рекомендации по артефакту

1. **[FAIL]** assertEquals без message в RegistrationApiTests.kt:45
   → Добавить message: `assertEquals(200, response.code, "Registration should return 200")`

2. **[PARTIAL]** Coverage не указан в SKILL COMPLETE
   → Добавить строку `├─ Coverage: X/Y тестов`
```

#### Рекомендации по улучшению скилла

**Цель:** На основе найденных FAIL и PARTIAL — предложить конкретные правки в `.claude/skills/{skill-name}/SKILL.md`, чтобы следующий запуск скилла не воспроизводил те же ошибки.

Логика: каждый FAIL/PARTIAL — симптом недостающего или нечёткого правила в скилле.

```markdown
### Рекомендации по улучшению /{skill-name}

| # | Проблема в артефакте | Причина (правило отсутствует) | Рекомендуемое правило в SKILL.md |
|---|---------------------|-------------------------------|----------------------------------|
| 1 | Два HTTP-кода в одном Expected Result (`201 ИЛИ 400`) | Нет явного требования атомарности | Добавить в Protocol: "Каждый сценарий содержит ровно 1 Expected Result. Запрещено `X ИЛИ Y` в одной строке." |
| 2 | L10N сценарии отсутствуют | Нет явного Coverage Matrix для L10N | Добавить в Coverage Matrix: `L10N: {EMOJI_STRING}, {SPECIAL_CHARS}` как обязательные типы, если спека не запрещает явно. |
```

**Правила генерации рекомендаций:**
- Только для FAIL и PARTIAL (PASS и SKIP игнорировать)
- Рекомендация должна быть конкретной: что именно добавить/изменить в SKILL.md и в какую секцию
- Формулировать как правило/запрет, а не пожелание
- Если найдено >5 FAIL — сгруппировать по теме, не перечислять каждый отдельно
```

---

## Ограничения

- Полный отчёт сохранять в `audit/output-review_{skill-name}_{YYYY-MM-DD}.md`, краткая сводка (5 строк) — в чат
- Compilation Gate: максимум 1 попытка (не исправлять код, только зафиксировать результат)
- Не исправлять артефакты — только документировать findings
- Если артефакт слишком большой (>500 строк) — проверять по ключевым паттернам, не читать целиком

---

## Post-Review Check (inline перед SKILL COMPLETE)

- [ ] Все извлечённые пункты чек-листа проверены?
- [ ] Каждый FAIL содержит конкретное доказательство (файл:строка)?
- [ ] BANNED-пункты проверены через Grep, а не визуально?
- [ ] Scorecard рассчитан с показом формулы (числитель/знаменатель)?
- [ ] Нет ложных FAIL (контекст каждого finding перепроверен)?
- [ ] Полный отчёт сохранён в `audit/output-review_{skill-name}_{YYYY-MM-DD}.md`?

**Если нашёл ошибку в аудите → исправь.**

---

### Завершение

После Post-Review Check — напечатай блок `SKILL COMPLETE` (формат в qa_agent.md § Skill Completion Protocol).
