# Прун тест-слоя мозга через стену (v5)

> Две фазы. **A (read-only gate'ы):** precondition-проверка копии в claude-brain + превью glob через `ls` + **обязательная пауза на подтверждение владельцем**. **B (деструктив):** Edit package.json + один `git rm` (пол потребует floor_escape владельца — печатает точную строку сам). Финальный `git commit` — отдельно.

**Goal:** Убрать из текущего репозитория `Документация` тест-слой управляющего слоя — `tools/*.test.mjs` + `app/vitest.config.tools.mjs` + скрипт `test:tools` — не читаемый ни одним рабочим процессом (settings.json-хуки + lefthook проверены) и автономно живущий в `claude-brain` (там 3931 passed). Рабочая копия рантайма (`tools/*.mjs`, observer, registry, квинтет) и Лидерра не затрагиваются.

**Architecture:** Read-only gate'ы перед деструктивом. Превью glob делается `ls tools/*.test.mjs` (readonly, floor-safe) вместо `git rm --dry-run` — последний содержит токен `rm` и сам блокировался бы полом, требуя отдельный floor_escape; `ls` даёт тот же перечень захватываемых файлов без escape. Деструктив: Edit (пол пускает запись в обычный файл) + `git rm` обоих путей одной командой (пол блокирует по `rm`-паттерну → владелец даёт floor_escape по точной строке из блок-сообщения; на floor-блоке указатель плана не двигается, повтор с escape проходит). Всё обратимо `git restore`.

## Файлы

- Verify (фаза A, read-only): `claude-brain/vitest.config.tools.mjs` + все `claude-brain/tools/*.test.mjs`; превью `tools/*.test.mjs` в текущем репо
- Modify (фаза B): `package.json` (удалить скрипт `test:tools`)
- Delete (фаза B, git rm): `tools/*.test.mjs`, `app/vitest.config.tools.mjs`

## Цель

Самодостаточный безопасный прун ({#D4} п.2) через стену: подтвердить копию в claude-brain → превью glob → пауза-подтверждение → Edit + git rm с floor_escape. Рабочие входы ({#D4} «не трогаются») не затрагиваются.

## Шаги

```skills-json
[]
```

```steps-json
[
  {"op": "Bash", "object": "ls \"C:/моя/проекты/claude-brain/vitest.config.tools.mjs\" \"C:/моя/проекты/claude-brain/tools/\"*.test.mjs", "ref": "D4"},
  {"op": "Bash", "object": "ls tools/*.test.mjs", "ref": "D4"},
  {"op": "Edit", "object": "package.json", "ref": "D4"},
  {"op": "Bash", "object": "git rm tools/*.test.mjs app/vitest.config.tools.mjs", "ref": "D4"}
]
```

### Фаза A — read-only gate'ы

**Шаг 1 — precondition gate.** `ls` тест-конфига + всех тест-файлов в `claude-brain`. Если чего-то нет — `ls` ошибётся, **прун не продолжать** (цели не сохранены). Уже проверено ранее (3931 passed в claude-brain), шаг повторяет проверку на момент исполнения.

**Шаг 2 — превью glob в текущем репо.** `ls tools/*.test.mjs` печатает перечень файлов, которые захватит `git rm tools/*.test.mjs`. Readonly, floor-safe.

### ⛔ ОБЯЗАТЕЛЬНАЯ ПАУЗА (между фазой A и B)

После шага 2 исполнитель **ОСТАНАВЛИВАЕТ ход**, показывает вывод владельцу и сверяет: список — **только** `*.test.mjs`, ничего лишнего. Фаза B **не начинается** без явного «подтверждаю». Если в списке незапланированный файл — прун прекращается, план переписывается.

### Фаза B — деструктив (только после подтверждения)

**Шаг 3 — Edit `package.json`.** Удалить последний скрипт `test:tools` и запятую после `brain:dashboard`. Было:

```json
    "brain:dashboard": "node tools/brain-dashboard-server.mjs",
    "test:tools": "cd app && npx vitest run --config vitest.config.tools.mjs"
```

Стало:

```json
    "brain:dashboard": "node tools/brain-dashboard-server.mjs"
```

**Шаг 4 — `git rm tools/*.test.mjs app/vitest.config.tools.mjs`.** Стейджит удаление тест-файлов + vitest-конфига одной командой. Пол заблокирует по `rm`-паттерну и напечатает точную строку `FLOOR-ESCAPE: bash:…`; владелец вставляет её → повтор проходит. Обратимо `git restore --staged` + `git checkout`.

## Крайние случаи

- НЕ трогать `tools/*.mjs` (рабочая копия рантайма), `docs/observer`, `docs/registry`, квинтет — {#D4} «не трогаются».
- brain specs/plans + brain-retro notes в этот прун НЕ входят (отдельный заход).
- Финальный `git commit` — отдельно (owner-терминал минует criterion-gate; через стену — approve `git commit` ∈ conditional при наличии router-gate).

## Критерий

- Фаза A: шаг 1 `ls` зелёный (цели в claude-brain); шаг 2 перечисляет только `*.test.mjs`; владелец подтвердил.
- Фаза B: `package.json` без скрипта `test:tools`; `git status` — staged-удаление `tools/*.test.mjs` + `app/vitest.config.tools.mjs`.
- Рабочие входы (`tools/*.mjs`, observer, registry, квинтет) и `app/` (кроме vitest-конфига) без изменений.

```verified-context-json
[
  {"id": "vc-tools-data", "kind": "EXTRACTED", "ref": "tools/cost-pricing.mjs", "anchor": "export const PRICING = Object.freeze("},
  {"id": "vc-test-tools", "kind": "EXTRACTED", "ref": "package.json", "anchor": "\"test:tools\": \"cd app && npx vitest run"},
  {"id": "vc-vitest-config", "kind": "EXTRACTED", "ref": "app/vitest.config.tools.mjs", "anchor": "include: ['../tools/*.test.mjs']"}
]
```
