# Уровень «экономия 5%» — Design v1

**Дата:** 2026-05-16
**Статус:** Реализован — базовый уровень (6 вырезанных пунктов) + расширение «блок A/B3» (6 скоростных правил, см. §11). Хуки `~/.claude/` обновлены и верифицированы; спека/план на `origin/main` (`d9ce953`).
**Автор:** Claude (Opus 4.7) под `superpowers:brainstorming`
**Связано:**

- `~/.claude/hooks/economy-mode.py` — словарь `LEVELS` (источник уровней)
- `docs/superpowers/specs/2026-05-10-economy-hook-bypass-closure-design.md` — архитектура хук-системы экономии
- `docs/Pravila_raboty_Claude_v1_1.md` §12.2 — карта «задача → superpowers skill»

---

## 1. Контекст и цель

Хук «экономия» (`economy-mode.py`) распознаёт 5 уровней-якорей: 0 / 25 / 50 / 75 / 100. Шкала: 100% = максимум экономии усилий (быстро, все срезки разрешены), 0% = ноль экономии (медленно, максимум церемонии).

Заказчик при работе использует `экономия 0%` и отмечает: режим работает **очень долго**. Анализ блока правил 0% (`economy-mode.py:186-222`) показал, что часть требований — это **избыточность**: дублирующая или бесполезная работа, либо 0%-надстройки над более узкой картой Pravila §12.2, а не сама строгость.

**Цель:** добавить новый уровень `экономия 5%` = «уровень 0% без избыточности». Качество и строгость 0% сохраняются полностью; вырезается только то, что не добавляет качества, но стоит времени.

## 2. Принцип уровня 5%

```
экономия 5%  =  экономия 0%  −  6 пунктов избыточности  +  6 скоростных правил (блок A/B3, §11)
```

Два жёстких инварианта:

1. **`экономия 0%` НЕ меняется** — словарь `LEVELS[0]` остаётся байт-в-байт как есть. 5% — отдельный новый якорь, а не правка 0%.
2. **5% не опускается ниже §12.2-пола.** Хук экономии в иерархии (CLAUDE.md §1) стоит ниже Pravila §12; `economy-mode.py:291` на каждом уровне фиксирует «§12 hard rule НЕ override-ится — на всех уровнях». Поэтому пункты, упирающиеся в §12, в 5% не «выключаются», а возвращаются к буквальной карте §12.2.

## 3. Состав: 6 вырезаемых пунктов

| # | В `0%` (строка `economy-mode.py`) | Природа | В `5%` |
|---|---|---|---|
| 1 | `re-Read CLAUDE.md и Pravila на начало` (L203) | Чистый дубль: CLAUDE.md уже автоматически в контексте каждой сессии (блок `claudeMd`) | `re-Read Pravila, если задача касается её правил`. CLAUDE.md не перечитывать |
| 2 | `тесты после КАЖДОГО Edit/Write` (L207) | Дублирующая работа: фича на N файлов = N полных прогонов с одним итоговым сигналом | `тесты после каждого логического блока правок`; обязательный полный прогон перед коммитом |
| 3 | `full pre-commit incl. gitleaks-full-history` каждый коммит (L209) | Не на месте: скан всей истории — это pre-push, не per-commit; diff покрыт `protect --staged` | per-commit: `pint + larastan + pest + gitleaks protect --staged`; `gitleaks-full-history + lychee` — перед push |
| 4 | Stop-верификатор Sonnet 4.6 каждый turn (`settings.json:363-374`) | +25-60 с на конец каждого turn'а + ~$7-14/мес | Верификатор делает короткое замыкание на `level==5` |
| 5 | `brainstorming ПЕРВЫМ для любой creative-задачи` (L195) | 0%-надстройка над §12.2: §12.2 (стр. 609) триггерит brainstorming только «по требованию заказчика» | §12.2-пол: brainstorming по требованию заказчика или при реально неоднозначном дизайне; не авто-гейт |
| 6 | `EnterPlanMode/writing-plans + согласование для любой ≥3-шаговой задачи` (L193) | 0%-надстройка над §12.2: §12.2 (стр. 607) триггерит writing-plans на «эпик / большую задачу», не «любую ≥3-шаговую» | §12.2-пол: writing-plans на эпик / крупную задачу; рутинная ≥3-шаговая задача — без обязательного plan-gate |

**Сохраняется один-в-один из 0%:** full file reads ≤5000 строк, Grep без `head_limit`, ≥3 гипотезы на debug (`systematic-debugging`), TDD на любой код, `verification-before-completion` перед claim, full test output, запрет cherry-pick, file:line-пины, re-Read памяти перед использованием, raw subagent output, дисциплина открытых вопросов реестра, атомарные коммиты.

## 4. §12.2-пол — граница ослабления (пункты 5 и 6)

Pravila §12.2 (карта «задача → skill», `docs/Pravila_raboty_Claude_v1_1.md`):

- стр. 607: `Планирование эпика / большой задачи (≥3 этапа) → superpowers:writing-plans`
- стр. 609: `Мозговой штурм / генерация идей по требованию заказчика → superpowers:brainstorming`

Блок 0% формулирует жёстче (L193 «любая ≥3-шаговая» + `EnterPlanMode` hard-gate + «согласовать до выполнения»; L195 «любая creative-задача»). Это **0%-надстройки над §12.2**, а не пересказ §12.2 — поэтому их можно убрать, не трогая Pravila §12.

- ✅ Разрешено: убрать 0%-надстройку, вернув 5% к буквальной карте §12.2.
- ❌ Запрещено: опустить 5% ниже §12.2-пола (например, «brainstorming/writing-plans никогда») — это нарушит иерархию правил.

Оговорка: skill `brainstorming` в собственном описании говорит «before any creative work» — это plugin-уровневая подсказка. В цепочке приоритетов CLAUDE.md §1 проектная карта §12.2 стоит выше plugin-дефолтов; на 5% действует §12.2 буквально.

## 5. Точные правки по файлам

### 5.1. `economy-mode.py` — новый элемент `LEVELS[5]`

Вставить ключ `5` в словарь `LEVELS` между `25` и `0` (порядок вставки определяет tie-break в `closest_level`, см. §6). Содержимое:

```python
5: {
    "label": "5%",
    "tail": "качество 0% без избыточности",
    "rules": [
        "Уровень 0% с вырезанной избыточностью. Качество и строгость 0% "
        "сохраняются полностью — убраны только дублирующая работа и "
        "0%-надстройки над Pravila §12.2.",
        "",
        "ПРОЦЕСС (как в 0%, кроме гейтов §12.2):",
        "- superpowers:writing-plans — на эпик / крупную задачу (Pravila §12.2). "
        "Рутинная ≥3-шаговая задача — без обязательного plan-gate и согласования до выполнения.",
        "- Любой debug / unexpected behavior: superpowers:systematic-debugging "
        "с минимум 3 гипотезами; falsify каждую перед фиксом.",
        "- superpowers:brainstorming — по требованию заказчика (мозговой штурм / "
        "генерация идей) или при реально неоднозначном дизайне (Pravila §12.2). "
        "Не авто-гейт на каждую фичу/компонент/endpoint.",
        "- Перед claim 'готово'/'closed'/'merged'/'passed': обязательно invoke "
        "superpowers:verification-before-completion.",
        "- TDD на любой код: superpowers:test-driven-development; failing test first, GREEN после.",
        "",
        "ЧТЕНИЕ И ИССЛЕДОВАНИЕ (как в 0%):",
        "- Full file reads без offset/limit на файлах до 5000 строк.",
        "- Grep без head_limit (или явно 0 = unlimited) на критичных поисках; default 500.",
        "- Memory facts: всегда re-Read актуального файла ПЕРЕД использованием; не доверять stale memory.",
        "- re-Read Pravila, если задача касается её правил. CLAUDE.md НЕ перечитывать — "
        "он уже в контексте сессии.",
        "- Subagent: запрашивать raw output, не summary; решения принимать самому.",
        "",
        "ВЕРИФИКАЦИЯ (как в 0%, кроме каденса тестов и pre-commit):",
        "- После каждого ЛОГИЧЕСКОГО БЛОКА правок — запуск relevant тестов (Pest/Vitest). "
        "Прогон после каждой атомарной правки не требуется; перед коммитом — обязательный полный прогон.",
        "- После КАЖДОГО изменения миграции/схемы — db tests + smoke check.",
        "- Перед коммитом — pre-commit (pint + larastan + pest + gitleaks protect --staged). "
        "gitleaks-full-history + lychee — только перед push.",
        "- Bash output показывать ВСЕГДА в ответе, не только при ошибке.",
        "- Full test output, не саммари; failure'ы выписывать явно с file:line.",
        "",
        "ФОРМУЛИРОВКИ (как в 0%):",
        "- Никаких 'should work' / 'looks correct' / 'тесты должны пройти' без реального запуска.",
        "- Никакого cherry-picking: 'tests pass' = ровно столько, сколько прошло; "
        "остальное — failed с указанием.",
        "- Каждое утверждение про код — с file:line как pin'ом, не общей фразой.",
        "- Если что-то не проверено — явно 'не верифицировал X' в разделе ограничений.",
        "",
        "ОТКРЫТЫЕ ВОПРОСЫ И ИНТЕГРАЦИЯ (как в 0%):",
        "- Перед закрытием темы из реестра (Б-/CTO-/DO-/Ю-/Диз-/OPEN-) — проверить "
        "наличие явного 'закрываем' от заказчика; иначе вопрос остаётся открытым.",
        "- Атомарные коммиты: один логический change → один коммит.",
        "",
        "СКОРОСТЬ БЕЗ ПОТЕРИ КАЧЕСТВА (5%-specific — убирают простой и дубли, не проверки):",
        "- Независимые tool-вызовы (Read/Grep/Bash) — одним сообщением параллельно, не последовательно.",
        "- Не перечитывать файлы, уже прочитанные в этой сессии и не изменённые с тех пор; "
        "re-Read обязателен только перед Edit и для memory-фактов.",
        "- Механические субагент-задачи (1-2 файла, полная спека) — на дешёвой модели "
        "(Haiku/Sonnet); контроллер и code-review остаются на сильной модели, "
        "двухстадийное review сохраняется.",
        "- Долгие команды (build, full-suite) — run_in_background, если рядом есть "
        "независимая работа; не блокирующий простой.",
        "- Не задавать заказчику вопрос, ответ на который выводится из кодовой базы или "
        "конвенции по умолчанию; AskUserQuestion — только когда ответ реально меняет ход работы.",
        "- Держать задачу в фокусе сессии; компактить длинные сессии, не тащить "
        "несвязанную историю — размер контекста = стоимость каждого turn'а.",
    ],
},
```

`LEVELS[0]` — **не трогать**. Функция `closest_level` (`economy-mode.py:227-228`) — без изменений (новый якорь подхватывается автоматически).

### 5.2. `economy-state-guard.py` — `LEVEL_TOPLINE[5]`

Добавить ключ `5` в словарь `LEVEL_TOPLINE` (`economy-state-guard.py:32-38`):

```python
5: "5% (0% без избыточности): full reads / тесты / ≥3 гипотезы / TDD как в 0%; без re-read CLAUDE.md, тест-каденс по логическим блокам, gitleaks-full-history -> pre-push, §12.2-floor для plan/brainstorm гейтов; скорость: параллельные tool-вызовы, без re-read неизменённого, дешёвая модель на механику, run_in_background, без лишних вопросов, фокус/компакт сессии",
```

### 5.3. `economy-postcompact.py` — `LEVEL_TOPLINE[5]`

Тот же ключ `5` в `LEVEL_TOPLINE` (`economy-postcompact.py:15-21`) — текст идентичен §5.2 (две копии словаря синхронны by design).

### 5.4. `settings.json` — короткое замыкание Stop-верификатора

В промпте Stop-хука (`settings.json:369`, `type: agent`) добавить — сразу после инструкции прочитать уровень из state-файла, перед блоком verification rules:

> `If the active economy level is 5, output {"compliant":true} immediately and perform no further analysis — level 5 disables the Stop verifier by design.`

Правка `settings.json` и hook-файлов потребует подтверждения permission-prompt (см. §10).

## 6. Поведение `closest_level` с новым якорем

`closest_level` притягивает произвольное `N%` к ближайшему якорю. После вставки `5`:

| Введено пользователем | Якорь | Комментарий |
|---|---|---|
| `экономия 5%` | 5 | Точное попадание |
| `экономия 0%`..`2%` | 0 | Ближе к 0 |
| `экономия 3%`..`14%` | 5 | Новая полоса притяжения уровня 5 |
| `экономия 15%` | 25 | Tie 5↔25 (по 10) → `min` берёт первый по порядку итерации = 25 |
| `экономия 16%`+ | 25 | Как раньше |

**Side-effect (намеренный, желательный):** до этой правки `экономия 10%` → 0% (самый медленный). После — `экономия 10%` → 5%. «10%» интуитивно = лёгкая экономия, и теперь шкала ведёт себя ближе к интуиции.

## 7. Тесты (TDD)

Реализация идёт по `superpowers:test-driven-development` — failing test первым.

1. **`economy-mode.py`** — у хука есть набор тестов (упомянут `economy-mode-test.py` в spec 2026-05-10 §7.1). **План должен начаться с проверки факта существования и формата этого файла** (не верифицировано на момент написания спеки). Кейсы для уровня 5:
   - `parse_level("задача. экономия 5%")` → 5 (end-of-prompt);
   - `closest_level` полосы из таблицы §6 (0/2/3/5/10/14/15/16);
   - `LEVELS[5]` содержит ключи `label`/`tail`/`rules`; `label == "5%"`;
   - `LEVELS[0]` не изменился (regression-guard на инвариант §2.1).
2. **`economy-state-guard.py` / `economy-postcompact.py`** — `LEVEL_TOPLINE[5]` не `None`; reminder для level 5 эмитится.
3. **`settings.json` верификатор** — ручная проверка: сессия на `экономия 5%`, turn с code-edit без теста → верификатор НЕ блокирует (короткое замыкание сработало).

## 8. Tradeoffs и ограничения

- **Верификатор не нулевой латентности.** Stop-хук типа `agent` стартует всегда; короткое замыкание убирает 25-60 с анализа транскрипта, но не сам спавн агента (несколько секунд остаётся). Полный hard-skip требует harness-поддержки условных хуков, которой нет.
- **На 5% нет внешнего автоконтроля честности.** Верификатор ловил cherry-pick / ложное «готово». На 5% его нет — остаётся только следование правилам честности в контексте (они в 5% сохранены: full test output, запрет cherry-pick, file:line). Заказчик принял этот tradeoff осознанно.
- **`re-Read CLAUDE.md` убран** в расчёте на то, что среда всегда инжектит блок `claudeMd`. Если в каком-то рантайме инъекции нет — на 5% CLAUDE.md не будет перечитан. Для текущей среды (Claude Code) инъекция стабильна.

## 9. Out of scope

- Правка Pravila §12 — не требуется и не выполняется (пункты 5/6 решаются в рамках §12.2-пола).
- Изменение уровней 0 / 25 / 50 / 75 / 100 — не трогаем.
- Перевод шкалы из числовой в именованную, прочие улучшения UX хука — отдельная тема.

## 10. Permission prompts при реализации

Файлы `economy-mode.py`, `economy-state-guard.py`, `economy-postcompact.py`, `settings.json` — в списке `permissions.ask` (`settings.json:272-289`). Каждая правка через Edit/Write вызовет permission-prompt — это намеренный tamper-protection ratchet из spec 2026-05-10 §2.5. План реализации учитывает ~4 подтверждения.

## 11. Расширение: блок A/B3 — скоростные правила (2026-05-16)

После реализации базового уровня заказчик попросил добавить в команду `экономия 5%` дополнительные ускорения, **не снижающие качество** — устраняющие простой и дублирующие round-trip'ы, а не проверки. Внесены 6 правил (блок A — 5 пунктов, блок B п.3 — 1 пункт) отдельной секцией `СКОРОСТЬ БЕЗ ПОТЕРИ КАЧЕСТВА` в `LEVELS[5]['rules']` (см. §5.1):

| # | Правило | Природа |
|---|---|---|
| A1 | Независимые tool-вызовы — одним сообщением параллельно | убирает последовательные round-trip'ы |
| A2 | Не перечитывать неизменённые файлы, уже прочитанные в сессии | убирает дублирующие Read |
| A3 | Механические субагент-задачи — на дешёвой модели; контроллер/review — на сильной | дешевле и быстрее, review-гейты сохранены |
| A4 | Долгие команды — `run_in_background` при наличии независимой работы | убирает блокирующий простой |
| A5 | Не задавать вопрос, выводимый из кодовой базы/конвенции | убирает лишний human round-trip |
| B3 | Держать задачу в фокусе; компактить длинные сессии | размер контекста = стоимость turn'а |

Все 6 — «убранная избыточность/простой», та же логика, что и базовые 6 вырезанных пунктов §3. Качество не затрагивается: финальный полный прогон тестов, TDD, двухстадийное review, проверка diff субагента — сохранены.

Синхронно расширён `LEVEL_TOPLINE[5]` в `economy-state-guard.py` и `economy-postcompact.py` суффиксом `скорость: …` (см. §5.2; обе копии словаря байт-в-байт идентичны).

**Блок B п.4** (замер latency хуков) — выполнен как одноразовый bench, не как правило: латентность однородна (~34 мс median на хук — чистый старт интерпретатора), ~13–23 с суммарно на крупную задачу, горячей точки нет. В команду `5%` вносить нечего — пункт закрыт.

Верификация расширения: `economy-mode-test.py` 62/62, `economy-state-guard-test.py` 7/7, content-check трёх хук-файлов — `LEVELS[0]` инвариант не затронут (32 правила, ключи `label`/`rules`/`tail`), `LEVEL_TOPLINE[5]` синхронен в двух копиях.
