Ізоляція скілів між проєктами
Як запустити Project A (Bootstrap + Owl) і Project B (Tailwind + React) без конфліктів контексту.
Проблема
У тебе є два веб-проєкти:
- Project A: сайт на Odoo — Bootstrap 5, фреймворк Owl, шаблони QWeb, Python-бекенд
- Project 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 з кореня проєкту. Це і є «конституція» бота.
Project 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
Project 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/ (експертиза під конкретну технологію)
Кожен проєкт отримує лише ті скіли, які стосуються його стеку.
Набір скілів Project 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
Набір скілів Project 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), але з різними правилами evals для кожного проєкту.
Рівень 3: _registry.json + Context Router (розумний відбір)
Навіть у межах одного проєкту Context Router гарантує, що для кожного повідомлення підкреслюються лише релевантні скіли.
Реєстр Project 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"]
}
]
}
Реєстр Project 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» у Project 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» у Project 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: правила якості під конкретний стек
У кожного проєкту можуть бути різні правила evals навіть для одного й того самого скіла.
Project 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" }
]
}
Project 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: незалежна пам'ять для кожного проєкту
Корекції накопичуються окремо.
Project 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
Project 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-уроки Project A ніколи не забруднюють React-контекст Project B. «Імунна пам'ять» кожного бота на 100% релевантна його власному стеку.
Метрики: для кожного проєкту, для кожного скіла
/quality on Project 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 on Project 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. Створи проєкти
In Master Bot Telegram:
/new_project odoo-site
/new_project saas-app
2. Додай CLAUDE.md для кожного проєкту
Напиши конституцію проєкту, де описано стек, конвенції та обмеження.
3. Скопіюй потрібні скіли з бібліотеки
# Project 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/
# Project B — create new ones for your stack
write /opt/repos/saas-app/skills/library/react-patterns.md
write /opt/repos/saas-app/skills/library/tailwind-expert.md
4. Налаштуй _registry.json під кожен проєкт
Додай triggers і keywords, що стосуються технологій конкретного проєкту.
5. Напиши evals під свій стек
Створи файли .evals.json із правилами, які мають сенс для кожного стеку.
6. Працюй і коригуй
Починай роботу. Тисни Fix It, коли неправильно. Тисни thumbs-down на погані відповіді. Система навчається й адаптується для кожного проєкту окремо.
Чому не один бот із «режимами»?
| Підхід | Проблема |
|---|---|
| Один бот, ручне перемикання контексту | Витоки між проєктами, немає стійкої ізоляції |
| Один бот, префікс у кожному повідомленні | Втомливо, схильно до помилок, немає ізоляції скілів |
| Один бот, кілька CLAUDE.md | Claude Code завантажує один CLAUDE.md на cwd |
| Arc OS: окремі child bots | Повна ізоляція на рівні процесу |
Федеративний підхід — це більше інфраструктури (одна tmux-сесія на проєкт), але він за дизайном повністю усуває змішування контексту.