# Прун тест-слоя мозга из текущего репозитория (v3)

> Две фазы: (A) read-only gate'ы — precondition-проверка копии в claude-brain + dry-run + **обязательная пауза на подтверждение владельцем**; (B) деструктив — Edit + `git rm` — стартует ТОЛЬКО после подтверждённых условий. Финальный `git commit` — за owner'ом (минует criterion-gate).

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

**Architecture:** Жёсткое разделение фаз. **Фаза A (read-only gate'ы, шаги 1–2):** шаг 1 подтверждает, что ВСЕ цели уже сохранены в `claude-brain` (без зелёного `ls` — стоп); шаг 2 `git rm --dry-run` печатает точный перечень захватываемого glob'а. **Обязательная пауза** между фазами: исполнитель останавливается, показывает вывод dry-run владельцу, сверяет с ожидаемым; фаза B запрещена без явного «подтверждаю». **Фаза B (деструктив, шаги 3–5):** Edit + `git rm`, обратимо `git restore`.

## Файлы

- Verify (precondition, фаза A): `claude-brain/vitest.config.tools.mjs` + все `claude-brain/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'а → пауза-подтверждение владельца → деструктив. Рабочие входы ({#D4} «не трогаются») не затрагиваются. Финальный коммит — owner в терминале.

## Шаги

```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": "git rm --dry-run tools/*.test.mjs", "ref": "D4"},
  {"op": "Edit", "object": "package.json", "ref": "D4"},
  {"op": "Bash", "object": "git rm tools/*.test.mjs", "ref": "D4"},
  {"op": "Bash", "object": "git rm app/vitest.config.tools.mjs", "ref": "D4"}
]
```

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

**Шаг 1 — precondition gate.** `ls` тест-конфига + ВСЕХ тест-файлов в `claude-brain`: `vitest.config.tools.mjs` и `tools/*.test.mjs`. Если конфиг отсутствует ИЛИ glob не находит тест-файлов — `ls` ошибётся; **дальнейшее исполнение запрещено** (цели не сохранены → удаление потеряет файлы). Контекст: owner-прогон `npx vitest run` в `claude-brain` дал 3931 passed → файлы там есть; конфиг авторён в `claude-brain` ранее.

**Шаг 2 — dry-run превью.** `git rm --dry-run tools/*.test.mjs` печатает точный перечень файлов, которые захватит glob, **без удаления**.

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

После шага 2 исполнитель **ОСТАНАВЛИВАЕТ ход**, показывает вывод dry-run владельцу и сверяет: список должен содержать **только** `*.test.mjs` (~160 файлов), ничего лишнего. Фаза B (шаги 3–5) **не начинается** без явного подтверждения владельца «подтверждаю / удаляй». Если в списке незапланированный файл — прун прекращается, план переписывается. (AskUserQuestion как steps-op недоступен — пауза реализуется остановкой хода исполнителем.)

### Фаза 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`.** Стейджит удаление тест-файлов. Обратимо `git restore --staged` + `git checkout`.

**Шаг 5 — `git rm app/vitest.config.tools.mjs`.** Стейджит удаление тест-конфига (в `claude-brain` есть собственная версия с исправленными путями).

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

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

## Критерий

- Фаза A: шаг 1 `ls` зелёный (конфиг + все тест-файлы в claude-brain); шаг 2 dry-run перечисляет только `*.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']"}
]
```
