83 lines
10 KiB
Markdown
83 lines
10 KiB
Markdown
# Дизайн: выделение «мозга» в отдельный проект `claude-brain`
|
||
|
||
**Дата:** 2026-06-14
|
||
**Статус:** согласован заказчиком (дизайн), ожидает spec-review → writing-plans
|
||
**Кодовая фраза среды:** «роутер-наставник» (работа идёт под стеной supreme-gate)
|
||
|
||
## Цель
|
||
|
||
Разделить текущий смешанный репозиторий `c:\моя\проекты\портал crm\Документация` на два:
|
||
|
||
1. **`claude-brain`** (новый, `C:\моя\проекты\claude-brain`) — дом дальнейшей разработки «мозга» (Claude-governance / router-mentor / observer / registry / enforcement-машинерия M1–M7).
|
||
2. **`Документация` (здесь)** — продукт **Лидерра** (Laravel+Vue CRM) + **замороженный работающий рантайм мозга**, который продолжает гейтить работу. Дальнейшая работа здесь — только над Лидеррой.
|
||
|
||
Мозг **копируется** в claude-brain (не вырезается). Здесь он остаётся как замороженный рантайм. Цель — ювелирная полнота: claude-brain работает автономно, рантайм здесь не сломан.
|
||
|
||
## Решения (locked) {#D1}
|
||
|
||
- **Модель связи — снимок-рантайм.** Здесь — замороженный рантайм мозга + Лидерра. claude-brain — дом разработки. Будущие улучшения мозга вносятся в claude-brain и при желании вручную ре-синкаются сюда по команде владельца.
|
||
- **git claude-brain — чистый старт.** Новый репозиторий, первый коммит = текущее состояние мозга. История остаётся в исходном репо (мозг и Лидерра переплетены в общих коммитах — чистое разделение истории невозможно). origin позже (GitHub-аккаунт `CoralMinister` suspended → push обоих репо сейчас невозможен; claude-brain пока локальный).
|
||
- **Нормативный квартет — копия-снимок.** claude-brain получает копию `CLAUDE.md` / `Pravila` / `PSR_v1` / `Tooling` / `CHANGELOG_claude_md` как есть. Здесь квартет остаётся как есть (рантайм стены его читает — ломать нельзя). Контент-split «governance-only vs product-only» — отдельный будущий рефактор, НЕ эта задача.
|
||
- **Тест-харнесс мозга — только в claude-brain.** 3931 vitest-тест + `vitest.config.tools.mjs` (сейчас физически в `app/`) + brain-scripts (`test:tools`/`eval:llm`/`brain:dashboard`) переезжают в claude-brain. Здесь — рантайм без своих brain-тестов: `test:tools` убирается из корневого `package.json`, `vitest.config.tools.mjs` выносится из `app/`.
|
||
|
||
## Инвентарь — три корзины {#D2}
|
||
|
||
Источник: триангуляция 5 углов (graphify-граф — второстепенный, слеп к M1–M7; import-closure `tools/`; конфиг-классификация; doc/memory cross-refs; hook-closure из settings.json — owner-зависимость) + critic-проход.
|
||
|
||
### A. Копируется в claude-brain (мозг развивается там)
|
||
|
||
- `tools/*.mjs` (~180–190 production) + `tools/*.test.mjs` (~160–170) + tools-data (`observer-chain-map.json`, `router-test-prompts.json`, `subagent-output-schema.json`, `.node-dormancy.json`, `enforce-override-vocab.json`, `observer-known-nodes.txt`). **Кроме** `tools/liderra-monitoring/`.
|
||
- `vitest.config.tools.mjs` (выносится из `app/` → корень claude-brain) + brain-scripts.
|
||
- `docs/observer/`, `docs/registry/`, `docs/router-procedure.md`, `docs/routing-off-phase.md`, `docs/discovery/`, `docs/superpowers/router-mentor-wall-GUIDE.md`.
|
||
- brain-specs/plans (keyword-правило ниже), governance-ADR (011/016 + off-phase-tooling ADR 003-010/012-015/017/019).
|
||
- нормативный квартет (**копия**).
|
||
- brain-память + brain-агенты (`normative-sync`, `reviewer-agent`).
|
||
- shared-конфиги — brain-подмножество (lefthook 9 brain-jobs, .mcp.json 4 brain-сервера redis/perplexity/exa/firecrawl, package.json brain-часть, копии cspell/.gitignore).
|
||
|
||
### B. Остаётся здесь (Лидерра + замороженный рантайм)
|
||
|
||
- `app/`, `db/`, `web/`, `лендинг/`, `liderra_v8_handoff/`, `.github/workflows/`.
|
||
- Лидерра-доки: `docs/CRM_*`, `docs/Открытые_вопросы_*`, `docs/Analiz_*`, `docs/security/`, `docs/deploy/`, `docs/api/`, `docs/architecture/`, `docs/audit/`, `docs/ml/`, `docs/process/`, `docs/backend/`, `docs/projects/`, `docs/support/`.
|
||
- Лидерра-specs/plans (billing/supplier/lead-region/slepok/audit/project/admin), Лидерра-ADR (001/002/018).
|
||
- Лидерра-агенты (`pest-parallel-debugger`, `rls-reviewer`, `prod-deploy-validator`), `tools/liderra-monitoring/`.
|
||
- **Замороженный рантайм мозга**: `tools/*.mjs` (полностью — runtime стены), `docs/observer/` + `docs/registry/` (writable/readable рантаймом — подтвердить hook-closure), квартет (как есть). brain `*.test.mjs` здесь **не нужны** (рантайм их не читает).
|
||
- Лидерра-память.
|
||
|
||
### C. Shared — расщепляется по факту
|
||
|
||
- `lefthook.yml` / `.mcp.json` / `package.json` / `.gitignore` — каждому репо своё подмножество; 3 shared-jobs (gitleaks/markdownlint/cspell) + 2 shared-MCP (github/semgrep) — в обоих.
|
||
- `cspell-words.txt` — неразделим → копия в обоих.
|
||
- **user-level скилы** (`~/.claude/skills/`, `~/.claude/plugins/`) — общая инфраструктура, **не трогаем** (вне git-дерева обоих репо). `.claude/skills/` в репо — пусто (`.gitkeep`).
|
||
|
||
### keyword-правило для specs/plans {#D3}
|
||
|
||
- → claude-brain: `router-mentor`, `router-gate`, `router-discipline`, `judge`, `floor`, `escape`, `machine`, `observer`, `brain-governance`, `brain-factor`, `automation-graph`, `print-sanity`, `sealed-plan`, `safe-baseline`, `llm-first-router`, off-phase-tooling-design (адр-номерные).
|
||
- → остаётся здесь: `billing`, `supplier`, `lead-region`, `slepok`, `audit`, `project`, `admin`, `deals`, `csv-reconcile`, `webhook`, `migrate`, `delete`, `parallel-sessions`, `controller-offload`.
|
||
- Спорные (`enforce-hard-rules`, `controller-offload-agents`, off-phase-tooling) — в critic-список, ручная классификация.
|
||
|
||
## Критическая последовательность {#D4}
|
||
|
||
1. **Сначала** собрать claude-brain (полная копия мозга) + **верифицировать автономно**: 3931 vitest tools GREEN в claude-brain, стена-смок (хуки исполняются), gitleaks 0, 0 Лидерра-секретов/данных. Эта фаза **НЕ требует settings.json**.
|
||
2. **Только после** автономной верификации claude-brain — прун здесь. Прун **минимальный**: убрать лишь brain DEV-артефакты, которые не читает ни один активный хук (brain `*.test.mjs`, brain design-specs/plans, brain-retro-заметки, `vitest.config.tools.mjs` из `app/`, `test:tools` из корня). Рантайм-входы (`tools/*.mjs`, `docs/observer/`, `docs/registry/`, квартет) — **не трогаются**.
|
||
3. **Перед пруном** — owner присылает блок `"hooks"` из `.claude/settings.json` (мне Read-denied по `READ_DENY_PATTERNS`) → доказываем hook-closure (что именно рантайм читает) → решаем, что безопасно удалить. До этого прун не начинаем.
|
||
|
||
## Крайние случаи / риски {#D5}
|
||
|
||
- **`vitest.config.tools.mjs` в `app/`** — тест-харнесс мозга вплетён в Лидерра-каталог; вынос трогает `app/`, но чисто (конфиг 100% brain).
|
||
- **Runtime-зависимости claude-brain**: `~/.claude/runtime` (session-scoped, не код), node_modules (`js-yaml`, `ajv`, `@xenova/transformers`, `undici`, `keytar`, `shell-quote`, `proper-lockfile`, `glob`, `natural`), ProxyAPI/keychain/git/powershell. claude-brain нужен свой `npm install` (свой package.json + lockfile).
|
||
- **Hook-closure неизвестен мне** (settings.json Read-denied) → owner-gate перед пруном (см. D4 п.3). Фаза копирования им не блокируется (claude-brain получает всё).
|
||
- **Откат**: прун здесь — отдельная git-ветка/worktree, до мержа всё восстановимо `git restore`. claude-brain — новый каталог, на исходный репо не влияет.
|
||
- **Под стеной**: реальные правки кода/конфигов — только опечатанными шагами плана; правки квартета/памяти — owner FLOOR-ESCAPE per write.
|
||
|
||
## Критерий готовности {#D6}
|
||
|
||
- claude-brain: `npm install` ок, `npx vitest run --config vitest.config.tools.mjs` = 3931 passed (база), хуки исполняются автономно, gitleaks 0, 0 Лидерра-данных.
|
||
- Здесь после пруна: стена по-прежнему гейтит (live-смок), Лидерра-регрессия зелёная (Pest/Vitest/build), `git status` чист.
|
||
- Независимый review: claude-brain полон (ничего load-bearing не забыто) И здесь рантайм не сломан.
|
||
|
||
```verified-context-json
|
||
[
|
||
{"id": "vc-tools-data", "kind": "EXTRACTED", "ref": "tools/cost-pricing.mjs", "anchor": "export const PRICING = Object.freeze("}
|
||
]
|
||
```
|