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

> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.

**Goal:** Добавить в хук «экономия» новый уровень `экономия 5%` = «уровень 0% без избыточности» (то же качество, вырезаны 6 пунктов дублирующей/бесполезной работы), не меняя уровень 0%.

**Architecture:** Новый якорь `5` в словаре `LEVELS` (`economy-mode.py`); синхронные правки `LEVEL_TOPLINE` в `economy-state-guard.py` и `economy-postcompact.py`; короткое замыкание Stop-верификатора на `level==5` в `settings.json`. `LEVELS[0]` неприкосновенен. Пункты, упирающиеся в Pravila §12, возвращаются к §12.2-полу, а не выключаются.

**Tech Stack:** Python 3 (хуки в `~/.claude/hooks/`), JSON (`~/.claude/settings.json`), Claude Code hook API.

**Спека:** `docs/superpowers/specs/2026-05-16-economy-5pct-level-design.md`

---

## Constraints & расположение файлов

- **Хук-файлы вне git.** `~/.claude/hooks/*.py` и `~/.claude/settings.json` находятся в домашней директории пользователя, **не** под контролем версий проектного репозитория. Per-task `git commit` для них невозможен — вместо этого Task 0 делает `.bak`-копии для отката. В git коммитятся только документы (`docs/superpowers/`) — в Task 6.
- **Permission prompts.** `economy-mode.py`, `economy-state-guard.py`, `economy-postcompact.py`, `settings.json` — в списке `permissions.ask` (`settings.json:272-289`). Каждая правка через Edit вызовет permission-prompt пользователю — это намеренный tamper-protection ratchet. Тест-файлы (`*-test.py`) в `ask` НЕ входят — их правки проходят молча.
- **Файл-карта изменений:**

| Файл | Действие | Ответственность |
|---|---|---|
| `~/.claude/hooks/economy-mode.py` | Modify — `+LEVELS[5]` | Определение уровня 5: label/tail/rules |
| `~/.claude/hooks/economy-mode-test.py` | Modify — `+8` кейсов | Регрессионный тест парсинга/якоря |
| `~/.claude/hooks/economy-state-guard.py` | Modify — `+LEVEL_TOPLINE[5]` | In-turn reminder для уровня 5 |
| `~/.claude/hooks/economy-state-guard-test.py` | Modify — `+1` тест | Тест reminder'а уровня 5 |
| `~/.claude/hooks/economy-postcompact.py` | Modify — `+LEVEL_TOPLINE[5]` | Re-inject после компакции для уровня 5 |
| `~/.claude/settings.json` | Modify — verifier prompt | Короткое замыкание Stop-верификатора на level 5 |

---

## Task 0: Резервные копии хук-файлов

**Files:**

- Create: `~/.claude/hooks/economy-mode.py.bak`
- Create: `~/.claude/hooks/economy-state-guard.py.bak`
- Create: `~/.claude/hooks/economy-postcompact.py.bak`
- Create: `~/.claude/settings.json.bak`

- [ ] **Step 1: Сделать `.bak`-копии (откат, т.к. файлы вне git)**

Run:

```bash
cp "$HOME/.claude/hooks/economy-mode.py" "$HOME/.claude/hooks/economy-mode.py.bak"
cp "$HOME/.claude/hooks/economy-state-guard.py" "$HOME/.claude/hooks/economy-state-guard.py.bak"
cp "$HOME/.claude/hooks/economy-postcompact.py" "$HOME/.claude/hooks/economy-postcompact.py.bak"
cp "$HOME/.claude/settings.json" "$HOME/.claude/settings.json.bak"
ls -la "$HOME/.claude/hooks/"*.bak "$HOME/.claude/settings.json.bak"
```

Expected: 4 файла `.bak` перечислены, размеры > 0.

- [ ] **Step 2: Зафиксировать baseline тестов (до правок)**

Run:

```bash
python "$HOME/.claude/hooks/economy-mode-test.py"; echo "exit=$?"
python "$HOME/.claude/hooks/economy-state-guard-test.py"; echo "exit=$?"
```

Expected: `economy-mode-test.py` → `=== 54/54 PASSED, 0 FAILED ===`, `exit=0`; `economy-state-guard-test.py` → `=== 6/6 PASSED ===`, `exit=0`.

Если baseline НЕ зелёный — остановиться и разобраться до начала правок (правки нельзя строить на сломанном фундаменте).

---

## Task 1: `economy-mode.py` — новый уровень `LEVELS[5]` (TDD)

**Files:**

- Modify: `~/.claude/hooks/economy-mode-test.py` (список `TESTS`, перед закрывающей `]` на строке 129)
- Modify: `~/.claude/hooks/economy-mode.py` (словарь `LEVELS`, вставка перед `0: {` на строке 186)

- [ ] **Step 1: Написать падающие тесты — добавить 8 кейсов уровня 5**

В `economy-mode-test.py` найти последние два кейса списка `TESTS` и закрывающую `]`:

```python
    ("экономия 75%, потом экономия 0%", 0, "Last wins (still applies)"),
    ("не экономия 75%, а экономия 0%", 0, "Last is at end after negation"),
]
```

Заменить на (вставка блока перед `]`):

```python
    ("экономия 75%, потом экономия 0%", 0, "Last wins (still applies)"),
    ("не экономия 75%, а экономия 0%", 0, "Last is at end after negation"),

    # === NEW: economy level 5% (якорь между 25 и 0) ===
    ("экономия 5%", 5, "Level 5 — exact anchor"),
    ("задача X. экономия 5%", 5, "Level 5 — end-of-prompt trailer"),
    ("экономия 5%.", 5, "Level 5 — trailing period"),
    ("экономия 10%", 5, "10% -> anchor 5 (раньше было 0)"),
    ("экономия 3%", 5, "3% -> 5 (нижняя кромка полосы)"),
    ("экономия 14%", 5, "14% -> 5 (верхняя кромка полосы)"),
    ("экономия 2%", 0, "2% -> 0 (чуть ниже полосы 5)"),
    ("экономия 15%", 25, "15% -> 25 (tie 5<->25, первый по порядку итерации)"),
]
```

Примечание: кейс `("экономия 0%", 0, "Zero")` уже есть в `TESTS` (строка 70) — он остаётся регрессионным стражем того, что уровень 0 не сломан. Не дублировать.

- [ ] **Step 2: Запустить тест — убедиться, что новые кейсы падают**

Run: `python "$HOME/.claude/hooks/economy-mode-test.py"; echo "exit=$?"`

Expected: `=== 56/62 PASSED, 6 FAILED ===`, `exit=1`. Падают ровно 6 кейсов «Level 5 …» / «-> 5» / «10% -> anchor 5» (got `0` или `25` вместо `5`). Кейсы `2% -> 0` и `15% -> 25` проходят сразу (текущий `closest_level` уже даёт такой результат). Если падают другие кейсы — остановиться и разобраться.

- [ ] **Step 3: Реализовать — вставить `LEVELS[5]` в `economy-mode.py`**

В `economy-mode.py` найти начало блока уровня 0 (строка 186):

```python
    0: {
        "label": "0%",
```

Вставить **перед** ним новый блок (итог: порядок ключей `100, 75, 50, 25, 5, 0` — позиция важна для tie-break `closest_level`):

```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 → один коммит.",
        ],
    },
```

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

- [ ] **Step 4: Запустить тест — убедиться, что всё зелёное**

Run: `python "$HOME/.claude/hooks/economy-mode-test.py"; echo "exit=$?"`

Expected: `=== 62/62 PASSED, 0 FAILED ===`, `exit=0`.

---

## Task 2: `economy-state-guard.py` — `LEVEL_TOPLINE[5]` (TDD)

**Files:**

- Modify: `~/.claude/hooks/economy-state-guard-test.py` (новая тест-функция + блок `__main__`)
- Modify: `~/.claude/hooks/economy-state-guard.py` (словарь `LEVEL_TOPLINE`, строки 32-38)

- [ ] **Step 1: Написать падающий тест**

В `economy-state-guard-test.py` после функции `test_agent_inherits_parent_state` (заканчивается на строке 83) добавить новую функцию:

```python
def test_level_5_edit_emits_reminder():
    out = run_guard({"session_id": "t7", "tool_name": "Edit",
                     "tool_input": {"file_path": "x.php"}},
                    state={"session_id": "t7", "level": 5,
                           "label": "5%", "tail": "качество 0% без избыточности"})
    assert "REMINDER" in out, f"Expected REMINDER, got: {out!r}"
    assert "5%" in out, f"Expected level mention, got: {out!r}"
    print("  PASS: level_5_edit_emits_reminder")
```

В блоке `__main__` (строки 86-93) добавить вызов и обновить счётчик. Заменить:

```python
if __name__ == "__main__":
    test_no_state_silent()
    test_level_100_silent()
    test_level_0_edit_emits_reminder()
    test_level_75_bash_sed_emits_warning()
    test_level_50_bash_safe_no_warning()
    test_agent_inherits_parent_state()
    print("\n=== 6/6 PASSED ===")
```

на:

```python
if __name__ == "__main__":
    test_no_state_silent()
    test_level_100_silent()
    test_level_0_edit_emits_reminder()
    test_level_75_bash_sed_emits_warning()
    test_level_50_bash_safe_no_warning()
    test_agent_inherits_parent_state()
    test_level_5_edit_emits_reminder()
    print("\n=== 7/7 PASSED ===")
```

- [ ] **Step 2: Запустить тест — убедиться, что падает**

Run: `python "$HOME/.claude/hooks/economy-state-guard-test.py"; echo "exit=$?"`

Expected: первые 6 печатают `PASS`, затем `AssertionError: Expected REMINDER, got: ''` на `test_level_5_edit_emits_reminder`, `exit=1`. Причина: `LEVEL_TOPLINE.get(5)` сейчас `None` → reminder не эмитится.

- [ ] **Step 3: Реализовать — добавить `LEVEL_TOPLINE[5]`**

В `economy-state-guard.py` найти словарь `LEVEL_TOPLINE` (строки 32-38):

```python
LEVEL_TOPLINE = {
    100: None,
    75: "Жёсткие/мета OFF: НЕ заявлять passed без запуска, НЕ cherry-pick, НЕ anchor на 1й гипотезе",
    50: "Жёсткие/мета OFF + verify memory + ≥2 гипотезы на debug + full test output",
    25: "verify-before-completion на ≥2-step задачах, full reads ≤5000, Grep limit 500",
    0: "ВСЕ паттерны OFF: full reads, full test output, ≥3 гипотезы на debug, verify perceived 'готово'",
}
```

Заменить на (вставка строки `5:` между `25:` и `0:`):

```python
LEVEL_TOPLINE = {
    100: None,
    75: "Жёсткие/мета OFF: НЕ заявлять passed без запуска, НЕ cherry-pick, НЕ anchor на 1й гипотезе",
    50: "Жёсткие/мета OFF + verify memory + ≥2 гипотезы на debug + full test output",
    25: "verify-before-completion на ≥2-step задачах, full reads ≤5000, Grep limit 500",
    5: "5% (0% без избыточности): full reads / тесты / ≥3 гипотезы / TDD как в 0%; без re-read CLAUDE.md, тест-каденс по логическим блокам, gitleaks-full-history -> pre-push, §12.2-floor для plan/brainstorm гейтов",
    0: "ВСЕ паттерны OFF: full reads, full test output, ≥3 гипотезы на debug, verify perceived 'готово'",
}
```

Правка `economy-state-guard.py` вызовет permission-prompt — подтвердить.

- [ ] **Step 4: Запустить тест — убедиться, что всё зелёное**

Run: `python "$HOME/.claude/hooks/economy-state-guard-test.py"; echo "exit=$?"`

Expected: `=== 7/7 PASSED ===`, `exit=0`.

---

## Task 3: `economy-postcompact.py` — `LEVEL_TOPLINE[5]` (smoke RED→GREEN)

**Files:**

- Modify: `~/.claude/hooks/economy-postcompact.py` (словарь `LEVEL_TOPLINE`, строки 15-21)

Примечание: у `economy-postcompact.py` нет постоянного тест-файла. Создавать его ради одной строки словаря — scope creep (YAGNI): текст topline идентичен протестированному в Task 2 (`economy-state-guard.py` — «две копии словаря синхронны by design», спека §5.3). Здесь — smoke-цикл RED→GREEN через прямой запуск хука.

- [ ] **Step 1: Smoke RED — запустить хук с level-5 state ДО правки**

Run:

```bash
python -c "import json,tempfile,os; p=os.path.join(tempfile.gettempdir(),'claude-economy-pc5smoke.json'); f=open(p,'w',encoding='utf-8'); f.write(json.dumps({'session_id':'pc5smoke','level':5,'label':'5%','tail':'качество 0% без избыточности','set_at':'2026-05-16T00:00:00Z'})); f.close(); print('state written:',p)"
echo '{"session_id":"pc5smoke"}' | python "$HOME/.claude/hooks/economy-postcompact.py"
echo "---exit=$?---"
```

Expected: после строки `state written: ...` — **пустой** вывод хука (`LEVEL_TOPLINE.get(5)` сейчас `None` → `if not topline: return`), затем `---exit=0---`.

- [ ] **Step 2: Реализовать — добавить `LEVEL_TOPLINE[5]`**

В `economy-postcompact.py` найти словарь `LEVEL_TOPLINE` (строки 15-21):

```python
LEVEL_TOPLINE = {
    100: None,
    75: "Жёсткие/мета OFF: НЕ заявлять passed без запуска, НЕ cherry-pick, НЕ anchor на 1й гипотезе",
    50: "Жёсткие/мета OFF + verify memory + ≥2 гипотезы на debug + full test output",
    25: "verify-before-completion на ≥2-step задачах, full reads ≤5000, Grep limit 500",
    0: "ВСЕ паттерны OFF: full reads, full test output, ≥3 гипотезы на debug, verify perceived 'готово'",
}
```

Заменить на (та же строка `5:`, что в Task 2 — две копии синхронны by design):

```python
LEVEL_TOPLINE = {
    100: None,
    75: "Жёсткие/мета OFF: НЕ заявлять passed без запуска, НЕ cherry-pick, НЕ anchor на 1й гипотезе",
    50: "Жёсткие/мета OFF + verify memory + ≥2 гипотезы на debug + full test output",
    25: "verify-before-completion на ≥2-step задачах, full reads ≤5000, Grep limit 500",
    5: "5% (0% без избыточности): full reads / тесты / ≥3 гипотезы / TDD как в 0%; без re-read CLAUDE.md, тест-каденс по логическим блокам, gitleaks-full-history -> pre-push, §12.2-floor для plan/brainstorm гейтов",
    0: "ВСЕ паттерны OFF: full reads, full test output, ≥3 гипотезы на debug, verify perceived 'готово'",
}
```

Правка `economy-postcompact.py` вызовет permission-prompt — подтвердить.

- [ ] **Step 3: Smoke GREEN — запустить хук снова + убрать временный state-файл**

Run:

```bash
echo '{"session_id":"pc5smoke"}' | python "$HOME/.claude/hooks/economy-postcompact.py"
echo "---exit=$?---"
python -c "import tempfile,os; p=os.path.join(tempfile.gettempdir(),'claude-economy-pc5smoke.json'); os.path.exists(p) and os.remove(p); print('state cleaned')"
```

Expected: вывод хука — JSON, содержащий `POST-COMPACTION RE-INJECT`, `5%` и `качество 0% без избыточности`; `---exit=0---`; затем `state cleaned`.

---

## Task 4: `settings.json` — короткое замыкание Stop-верификатора на level 5

**Files:**

- Modify: `~/.claude/settings.json` (строка 369 — `prompt` агентского Stop-хука)

- [ ] **Step 1: Реализовать — вставить short-circuit в промпт верификатора**

В `settings.json` в строке 369 (длинная строка `prompt` Stop-хука) найти подстроку:

```text
recent tool_calls with inputs/results.\n\nVerification rules:\n1. If Claude's
```

Заменить на:

```text
recent tool_calls with inputs/results.\n\nLEVEL 5 SHORT-CIRCUIT: If the active economy level recorded in the state file $TEMP/claude-economy-<session_id>.json is 5, output {\"compliant\":true} immediately and perform no further analysis — economy level 5 disables this Stop verifier by design.\n\nVerification rules:\n1. If Claude's
```

Примечание: `\n` и `\"` здесь — литеральные двух-символьные последовательности внутри JSON-строки (так они хранятся в файле). Edit-инструмент матчит сырой текст файла. Правка `settings.json` вызовет permission-prompt — подтвердить.

- [ ] **Step 2: Проверить, что JSON не сломан**

Run:

```bash
python -c "import json; json.load(open(r'C:/Users/Administrator/.claude/settings.json', encoding='utf-8')); print('settings.json: valid JSON')"
echo "exit=$?"
```

Expected: `settings.json: valid JSON`, `exit=0`. Если `JSONDecodeError` — откатить из `settings.json.bak` (Task 0) и повторить Step 1 аккуратнее.

- [ ] **Step 3: Прогнать self-check инфраструктуры**

Run: `echo '{}' | python "$HOME/.claude/hooks/economy-self-check.py"; echo "exit=$?"`

Expected: пустой вывод (всё OK) ИЛИ `systemMessage` без `ERROR`/`CRITICAL`. `exit=0`. Self-check (`economy-self-check.py:48-65`) валидирует, что `settings.json` — корректный JSON и `economy-mode.py` зарегистрирован — это подтверждает целостность после правки.

- [ ] **Step 4: Зафиксировать ограничение проверки**

Stop-верификатор — живой агент Sonnet 4.6; автотестом не покрывается. Полная проверка — наблюдательная: в следующей сессии под `экономия 5%` сделать turn с code-edit без теста и убедиться, что верификатор НЕ блокирует ответ. Отметить это как deferred manual check в отчёте.

---

## Task 5: Сквозная проверка хука уровня 5

**Files:** нет правок — только проверки.

- [ ] **Step 1: Полный прогон всех тест-сьютов хуков**

Run:

```bash
python "$HOME/.claude/hooks/economy-mode-test.py"; echo "mode exit=$?"
python "$HOME/.claude/hooks/economy-state-guard-test.py"; echo "guard exit=$?"
python "$HOME/.claude/hooks/economy-self-check-test.py"; echo "selfcheck exit=$?"
```

Expected: `economy-mode-test.py` → `62/62 PASSED`, `mode exit=0`; `economy-state-guard-test.py` → `7/7 PASSED`, `guard exit=0`; `economy-self-check-test.py` → все PASS, `selfcheck exit=0` (этот файл не менялся — регрессионный контроль).

- [ ] **Step 2: E2E — прямой вызов `economy-mode.py` с `экономия 5%`**

Run:

```bash
echo '{"prompt":"тестовая задача. экономия 5%","session_id":"e2e5pct"}' | python "$HOME/.claude/hooks/economy-mode.py"
echo "---exit=$?---"
python -c "import json,tempfile,os; p=os.path.join(tempfile.gettempdir(),'claude-economy-e2e5pct.json'); print('STATE:', json.load(open(p,encoding='utf-8'))); os.remove(p); print('state cleaned')"
```

Expected: вывод хука — JSON, в `additionalContext` присутствуют `ECONOMY MODE: 5%`, строка `экономия: 5% — качество 0% без избыточности` и блок правил с `re-Read Pravila` (без `re-Read CLAUDE.md`) и `после каждого ЛОГИЧЕСКОГО БЛОКА`. `STATE:` показывает `{'level': 5, 'label': '5%', ...}`. `state cleaned`.

- [ ] **Step 3: Регрессия уровня 0 — убедиться, что 0% не задет**

Run:

```bash
echo '{"prompt":"задача. экономия 0%","session_id":"e2e0reg"}' | python "$HOME/.claude/hooks/economy-mode.py"
echo "---exit=$?---"
python -c "import tempfile,os; p=os.path.join(tempfile.gettempdir(),'claude-economy-e2e0reg.json'); os.path.exists(p) and os.remove(p); print('cleaned')"
```

Expected: `additionalContext` содержит `ECONOMY MODE: 0%`, строку `экономия: 0% — максимальное всеобъемлющее качество, без любых скипов` и правило `re-Read CLAUDE.md и Pravila на начало` (т.е. уровень 0 не изменён). `cleaned`.

- [ ] **Step 4: Убрать `.bak`-файлы после успеха**

Только если Steps 1-3 зелёные:

```bash
rm "$HOME/.claude/hooks/economy-mode.py.bak" "$HOME/.claude/hooks/economy-state-guard.py.bak" "$HOME/.claude/hooks/economy-postcompact.py.bak" "$HOME/.claude/settings.json.bak"
echo "backups removed, exit=$?"
```

Expected: `backups removed, exit=0`. (Примечание: `Bash(rm */.claude/hooks/*)` в `permissions.deny` — `rm` `.bak`-файлов может потребовать ручного подтверждения или ручного удаления пользователем; если denied — оставить `.bak`, удалит пользователь.)

---

## Task 6: Коммит документов в проектный репозиторий

**Files:**

- Commit: `docs/superpowers/specs/2026-05-16-economy-5pct-level-design.md`
- Commit: `docs/superpowers/plans/2026-05-16-economy-5pct-level.md`

- [ ] **Step 1: Застейджить только два doc-файла**

Run:

```bash
cd "c:/моя/проекты/портал crm/Документация"
git add docs/superpowers/specs/2026-05-16-economy-5pct-level-design.md docs/superpowers/plans/2026-05-16-economy-5pct-level.md
git status --short
```

Expected: в выводе — только два файла со статусом `A`; прочие изменения рабочего дерева (ветка `feat/rls-tooling-boundary`) не затронуты.

- [ ] **Step 2: Коммит (атомарный — один логический change: дизайн-пакет уровня 5%)**

Run:

```bash
git commit -m "docs(economy): спецификация и план уровня «экономия 5%»

Уровень «экономия 5%» = «0% без избыточности»: то же качество, что 0%,
вырезаны 6 пунктов дублирующей/бесполезной работы (re-read CLAUDE.md,
тесты-после-каждой-правки, gitleaks-full-history per-commit, Stop-верификатор,
авто-гейты brainstorming/plan-mode -> §12.2-floor). Уровень 0% не меняется.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"
```

Expected: коммит создан. Pre-commit хуки lefthook (markdownlint / cspell / lychee / gitleaks на staged `.md`) запускаются автоматически — показать их вывод. Если markdownlint/cspell/lychee падают на новых `.md` — исправить замечания и повторить коммит (не использовать `--no-verify`).

- [ ] **Step 3: Финальный отчёт**

Зафиксировать: результаты Task 5 Steps 1-3 (полные числа тестов), что уровень 0% не изменён (Task 5 Step 3), deferred manual check верификатора (Task 4 Step 4), хеш коммита.

---

## Self-Review (выполнен при написании плана)

**1. Покрытие спеки:** §5.1 `LEVELS[5]` → Task 1; §5.2 `state-guard LEVEL_TOPLINE[5]` → Task 2; §5.3 `postcompact LEVEL_TOPLINE[5]` → Task 3; §5.4 verifier short-circuit → Task 4; §6 полосы `closest_level` → тест-кейсы Task 1 Step 1 (3/5/10/14/15/2); §7 тесты → Tasks 1-3, 5; §2.1 инвариант «0% не меняется» → Task 1 Step 3 (явный запрет) + Task 5 Step 3 (регресс-проверка); §10 permission prompts → Constraints + пометки в Tasks 1-4. Пробелов нет.

**2. Плейсхолдеры:** TBD/TODO/«add error handling» отсутствуют — весь код и команды приведены целиком.

**3. Согласованность типов/имён:** ключ якоря `5` (int) единообразно во всех файлах; `LEVEL_TOPLINE[5]` — байт-в-байт идентичная строка в Task 2 и Task 3; `label "5%"` / `tail "качество 0% без избыточности"` совпадают между `LEVELS[5]` (Task 1), тест-state (Task 2 Step 1), e2e (Task 5 Step 2).
