---
name: bloat-audit
description: >-
  Пройтись по ВСЕМУ коду проекта и найти раздутость — дубли, ненужные абстракции,
  мёртвый код, раздутые куски, лишние зависимости — затем безопасно упростить с
  обязательным откатом и сверкой поведения до/после. Это whole-project ревизия
  «не нагораживай» (аналог сторонних /ponytail-audit, но своим кодом и под правила
  CLAUDE.md §2 Simplicity / §3 Surgical). Встроенный /simplify работает только по
  диффу — этот скилл ищет по всему дереву. Брать когда: «пройдись по проекту и найди
  раздутость / дубли / лишнее», «что можно упростить», «сделай ревизию кода»,
  «почисти проект», «избавь от бойлерплейта», «убери мёртвый код», «проверь, нет ли
  раздутости», или перед сдачей клиентского проекта нужен чистый минимальный
  результат. НЕ для поиска багов (→ /code-review), не для проверки одного диффа
  (→ /simplify), не для e2e-прогона ботов (→ *-e2e скиллы).
---

# bloat-audit — ревизия раздутости всего проекта + безопасное упрощение

Находит раздутость по всему дереву и, если пользователь просит чистку, применяет
упрощения так, чтобы **ничего не сломать**: git-откат гарантирован, поведение
сверяется до/после реальным прогоном (CLAUDE.md §7).

## Что считается раздутостью (ищи именно это, НЕ общий стиль)
1. **Дублирование** — скопированные блоки / почти идентичные функции → один хелпер.
2. **Ненужные абстракции** — обёртки/классы/фабрики/слои на один вызов, конфигурируемость, которой никто не пользуется.
3. **Мёртвый код** — неиспользуемые функции, импорты, ветки, параметры.
4. **Раздутые куски** — где N строк сводятся к N/3 без потери логики/безопасности/обработки ошибок.
5. **Лишние зависимости** — объявленные, но не используемые в коде.

**Что НЕ раздутость (не придирайся):** стиль/имена; оправданные слои (repo с tenant-изоляцией
= защита, а не «слой ради слоя»); обёртки над внешними API; разбиение по доменам.
Безопасность, валидацию, обработку ошибок НЕ режем — где упростил, оставляй пометку.

## Процесс

### Шаг 1 — разведка (детерминированно, дёшево)
```
~/.claude/skills/bloat-audit/tools/survey.sh [PROJECT_DIR]
```
Даёт: git-чистоту (⚠ если DIRTY/не-repo — правки НЕ применять), размер по языкам,
топ длинных файлов, кандидатов в мёртвые зависимости. **Кандидаты в deps перепроверь
вручную** — динамические/транзитивные импорты скрипт не видит (напр. `aiohttp-socks`).

### Шаг 2 — аудит (read-only, агентом)
Запусти `Explore`/`general-purpose` агента на самые крупные/подозрительные области
из шага 1 с промптом «найди РОВНО раздутость 1–5 выше, каждая находка проверяема,
укажи файл:строка + сколько строк ужмётся; если находок мало — так и скажи».
Верни ранжированный список (самое явное сверху) + честный вердикт «раздут / нет».

### Шаг 3 — СТОП, спроси
Покажи находки пользователю. Дальше — только если он просит чистить. Правишь
**по одной находке за раз**, не пачкой. На не-git проекте правки не применяй вовсе.

### Шаг 4 — упрощение с откатом (по одной находке)
1. Зафиксируй baseline: `git rev-parse --short HEAD`, состояние CLEAN.
2. Внеси ОДНУ правку (surgical, §3 — только то, что просит находка).
3. **Сверка до/после** — обязательна, не «должно работать»:
   - Есть тесты, покрывающие место → прогони их (до и после должны быть зелёными).
   - Нет тестов → golden-master: `tools/golden_diff.py` грузит старую (git HEAD)
     и новую версию модуля, прогоняет функции на общих входах, сверяет байт-в-байт.
     Пиши `cases.py` (см. `examples/cases_formatters.py`); тяжёлые импорты стабятся,
     venv не нужен. `ALL IDENTICAL: True` = поведение сохранено.
   - Иначе (side-effect'ы, БД, сеть) → соответствующий *-e2e скилл проекта.
4. Разошлось → `git restore <file>`, находка отклонена, объясни почему.
5. Совпало → правка валидна. Спроси, оставлять или откатывать (демо-режим ⇒ откатываем).

### Шаг 5 — итог
Таблица до/после (строк было/стало, что дедуплицировано, поведение identical).
Если правки оставлены — обнови Obsidian `Changelog.md` проекта (CLAUDE.md §5).

## Грабли
- **Не-git или DIRTY проект** → только аудит, никаких правок (нечем гарантировать откат).
- **Кандидаты в мёртвые deps врут** на динамических импортах — всегда перепроверяй грепом сам.
- **Не упрощай ради строк.** −3 строки ценой читаемости — это не улучшение. Дедуп реального копипаста — да; «умное» сжатие понятного кода — нет (это тоже нагораживание, только наоборот).
- **Одна находка = одна сверка.** Пачкой применишь — не поймёшь, что именно сломало поведение.
