Ізоляція скілів між проєктами

Як запустити Project A (Bootstrap + Owl) і Project 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 з кореня проєкту. Це і є «конституція» бота.

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