Изоляция скиллов между проектами
Как запускать Проект A (Bootstrap + Owl) и Проект B (Tailwind + React) без смешения контекстов.
Проблема
У тебя два веб-проекта:
- Проект A: сайт на Odoo — Bootstrap 5, фреймворк Owl, QWeb-шаблоны, Python-бэкенд
- Проект B: SaaS-приложение — Tailwind CSS, React 19, Next.js 15, TypeScript
Один AI-бот не может эффективно обслуживать оба. Инструкции Odoo загрязняют контекст React. Паттерны React просачиваются в код Odoo. Советы по t-call бессмысленны в JSX. useEffect не имеет смысла в QWeb.
Решение: 3 уровня изоляции
Уровень 1: CLAUDE.md (Конституция проекта)
Каждый child bot запускает claude -p в своей рабочей директории. Claude Code автоматически загружает CLAUDE.md из корня проекта. Это «конституция» бота.
Проект A (/opt/repos/odoo-site/CLAUDE.md):
# Odoo Website Project
## Tech Stack
- Odoo 17 Community
- Python 3.11
- Bootstrap 5.3
- Owl (Odoo Web Library) framework
- QWeb templating engine
- PostgreSQL 16
## Conventions
- All templates use t-call for i18n
- No inline JavaScript in QWeb templates
- CSS follows BEM naming
- Python follows Odoo coding guidelines
Проект B (/opt/repos/saas-app/CLAUDE.md):
# SaaS Application
## Tech Stack
- Next.js 15 (App Router)
- React 19
- TypeScript 5.4 (strict mode)
- Tailwind CSS 4.0
- Prisma ORM
- PostgreSQL 16
## Conventions
- Server Components by default, 'use client' only when needed
- Tailwind utility classes via cn() helper (no @apply in components)
- All API routes in app/api/ with Zod validation
Эти файлы никогда не смешиваются. Разные директории, разные процессы, разные боты.
Уровень 2: skills/ (Экспертиза под конкретный стек)
Каждый проект получает только скиллы, актуальные для его стека.
Набор скиллов Проекта A:
/opt/repos/odoo-site/skills/
├── _registry.json ← только Odoo-релевантные записи
├── library/
│ ├── odoo-expert.md ← разработка модулей Odoo
│ ├── odoo-owl-expert.md ← паттерны Owl-компонентов
│ └── postgres-pro.md ← оптимизация PostgreSQL
├── code-review/
│ ├── skill.md
│ └── code-review.evals.json ← правила для Odoo
└── git-manager/
└── skill.md
Набор скиллов Проекта B:
/opt/repos/saas-app/skills/
├── _registry.json ← только React-релевантные записи
├── library/
│ ├── react-patterns.md ← RSC, хуки, управление состоянием
│ ├── tailwind-expert.md ← utility-first CSS паттерны
│ └── nextjs-expert.md ← App Router, middleware, ISR
├── code-review/
│ ├── skill.md
│ └── code-review.evals.json ← правила для React
└── git-manager/
└── skill.md
Обрати внимание: одинаковые структурные скиллы (code-review, git-manager), но с разными правилами eval на каждый проект.
Уровень 3: _registry.json + Context Router (умный выбор)
Даже в рамках одного проекта Context Router гарантирует, что только релевантные скиллы акцентируются для каждого сообщения.
Реестр Проекта A (odoo-site/skills/_registry.json):
{
"skills": [
{
"name": "odoo-expert",
"triggers": ["odoo", "module", "QWeb", "t-call", "res.partner"],
"keywords": ["template", "view", "action", "ORM", "XML", "controller"]
},
{
"name": "odoo-owl-expert",
"triggers": ["owl", "component", "t-on", "t-set"],
"keywords": ["lifecycle", "hook", "state", "props", "template"]
}
]
}
Реестр Проекта B (saas-app/skills/_registry.json):
{
"skills": [
{
"name": "react-patterns",
"triggers": ["component", "hook", "useState", "useEffect", "RSC"],
"keywords": ["render", "props", "state", "context", "suspense"]
},
{
"name": "tailwind-expert",
"triggers": ["tailwind", "className", "dark mode", "responsive"],
"keywords": ["utility", "variant", "breakpoint", "theme", "cn()"]
}
]
}
Когда CEO отправляет «Fix the t-call in the product template» в Проект A:
Context Router:
odoo-expert: trigger "t-call" (2) + keyword "template" (1) = 3 pts
odoo-owl-expert: keyword "template" (1) = 1 pt
git-manager: 0 pts
→ SKILLS_HINT: odoo-expert, odoo-owl-expert
Когда CEO отправляет «Add dark mode toggle with Tailwind» в Проект B:
Context Router:
tailwind-expert: trigger "tailwind" (2) + trigger "dark mode" (2) = 4 pts
react-patterns: keyword "component" (1) = 1 pt
→ SKILLS_HINT: tailwind-expert, react-patterns
Evals: правила качества под конкретный стек
Каждый проект может иметь разные правила eval даже для одного и того же скилла.
Проект A (odoo-site/skills/code-review/code-review.evals.json):
{
"rules": [
{ "id": "cr-odoo-001", "name": "Must use t-call for i18n", "type": "regex_match", "pattern": "t-call|t-esc|_t\\(", "severity": "warning" },
{ "id": "cr-odoo-002", "name": "No inline JS in QWeb", "type": "string_not_contains", "value": "<script>", "severity": "warning" },
{ "id": "cr-odoo-003", "name": "No direct SQL queries", "type": "string_not_contains", "value": "cr.execute", "severity": "warning" }
]
}
Проект B (saas-app/skills/code-review/code-review.evals.json):
{
"rules": [
{ "id": "cr-react-001", "name": "No direct DOM manipulation", "type": "string_not_contains", "value": "document.getElementById", "severity": "warning" },
{ "id": "cr-react-002", "name": "No any types", "type": "string_not_contains", "value": ": any", "severity": "warning" },
{ "id": "cr-react-003", "name": "Prefer server components", "type": "string_not_contains", "value": "'use client'", "severity": "info" }
]
}
Один скилл. Разные правила. Один механизм контроля качества.
Learnings: независимая память каждого проекта
Накопленные исправления хранятся отдельно.
Проект A (odoo-site/learnings.md):
- [2026-03-20] [fixit] Always use t-call for translations in QWeb
- [2026-03-22] [negative] Don't override base Odoo CSS — use custom class
- [2026-04-01] [fixit] Use sudo() only when security context requires it
Проект B (saas-app/learnings.md):
- [2026-03-21] [fixit] Use server components by default in Next.js 15
- [2026-03-25] [negative] Don't use useEffect for data fetching — use RSC
- [2026-04-02] [fixit] Always validate API input with Zod schema
Odoo-исправления Проекта A никогда не загрязняют React-контекст Проекта B. «Иммунная память» каждого бота на 100% релевантна его собственному стеку.
Метрики: по проекту, по скиллу
/quality в Проекте A:
odoo-expert: 47x, 93% ok, thumbs-up 15/thumbs-down 1, avg 9.2s
code-review: 12x, 83% ok, thumbs-up 4/thumbs-down 2, avg 5.1s
/quality в Проекте B:
react-patterns: 31x, 87% ok, thumbs-up 8/thumbs-down 3, avg 6.7s
tailwind-expert: 18x, 94% ok, thumbs-up 7/thumbs-down 0, avg 3.4s
Karpathy Loop анализирует каждый проект независимо. Если code-review слаб в Odoo-проекте, но силён в React-проекте — предложение об улучшении получит только Odoo-проект.
Шаги настройки
1. Создай проекты
В Telegram Master Bot:
/new_project odoo-site
/new_project saas-app
2. Добавь CLAUDE.md на каждый проект
Напиши конституцию проекта: стек, соглашения, ограничения.
3. Скопируй нужные скиллы из библиотеки
# Проект A
cp citadel-v2/skills/library/odoo-expert.md /opt/repos/odoo-site/skills/library/
cp citadel-v2/skills/library/odoo-owl-expert.md /opt/repos/odoo-site/skills/library/
# Проект B — создай новые под свой стек
write /opt/repos/saas-app/skills/library/react-patterns.md
write /opt/repos/saas-app/skills/library/tailwind-expert.md
4. Настрой _registry.json для каждого проекта
Добавь триггеры и ключевые слова, актуальные для технологий проекта.
5. Напиши стек-специфичные evals
Создай .evals.json-файлы с правилами, которые имеют смысл для каждого стека.
6. Используй и корректируй
Начни работу. Нажимай Fix It, когда что-то не так. Нажимай thumbs-down на плохие ответы. Система учится и адаптируется отдельно для каждого проекта.
Почему не один бот с «режимами»?
| Подход | Проблема |
|---|---|
| Один бот, ручное переключение контекста | Утечка между проектами, нет стабильной изоляции |
| Один бот, префикс в каждом сообщении | Утомительно, error-prone, нет изоляции скиллов |
| Один бот, несколько CLAUDE.md | Claude Code загружает один CLAUDE.md из текущей директории |
| Arc OS: отдельные child bot-ы | Полная изоляция на уровне процесса |
Федеративный подход требует больше инфраструктуры (одна tmux-сессия на проект), но полностью исключает смешение контекстов по дизайну.