Изоляция скиллов между проектами

Как запускать Проект A (Bootstrap + Owl) и Проект B (Tailwind + React) без смешения контекстов.


Проблема

У тебя два веб-проекта:

Один 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-сессия на проект), но полностью исключает смешение контекстов по дизайну.