Isolamento de Skills em Múltiplos Projetos

Como rodar o Projeto A (Bootstrap + Owl) e o Projeto B (Tailwind + React) sem conflitos de contexto.


O Problema

Você tem dois projetos web:

Um único bot de IA não consegue atender ambos com eficiência. Instruções do Odoo poluem o contexto do React. Padrões React vazam para o código Odoo. Dicas de t-call não fazem sentido em JSX. useEffect não tem lugar em QWeb.


A Solução: 3 Níveis de Isolamento

Nível 1: CLAUDE.md (Constituição do Projeto)

Cada Child Bot inicia claude -p no seu próprio diretório de trabalho. Claude Code carrega automaticamente o CLAUDE.md da raiz do projeto. Esse é a "constituição" do bot.

Projeto 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

Projeto 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

Esses arquivos nunca se misturam. Diretórios diferentes, processos diferentes, bots diferentes.


Nível 2: skills/ (Expertise Específica de Tecnologia)

Cada projeto recebe apenas as skills relevantes para sua stack.

Conjunto de skills do Projeto A:

/opt/repos/odoo-site/skills/
├── _registry.json           ← Only Odoo-relevant entries
├── library/
│   ├── odoo-expert.md       ← Odoo module development
│   ├── odoo-owl-expert.md   ← Owl component patterns
│   └── postgres-pro.md      ← PostgreSQL optimization
├── code-review/
│   ├── skill.md
│   └── code-review.evals.json  ← Odoo-specific rules
└── git-manager/
    └── skill.md

Conjunto de skills do Projeto B:

/opt/repos/saas-app/skills/
├── _registry.json           ← Only React-relevant entries
├── library/
│   ├── react-patterns.md    ← RSC, hooks, state management
│   ├── tailwind-expert.md   ← Utility-first CSS patterns
│   └── nextjs-expert.md     ← App Router, middleware, ISR
├── code-review/
│   ├── skill.md
│   └── code-review.evals.json  ← React-specific rules
└── git-manager/
    └── skill.md

Repare: mesmas skills estruturais (code-review, git-manager), mas com regras de eval diferentes por projeto.


Nível 3: _registry.json + Context Router (Seleção Inteligente)

Mesmo dentro de um único projeto, o Context Router garante que apenas as skills relevantes sejam enfatizadas por mensagem.

Registry do Projeto 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"]
    }
  ]
}

Registry do Projeto 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()"]
    }
  ]
}

Quando o CEO envia "Fix the t-call in the product template" para o Projeto 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

Quando o CEO envia "Add dark mode toggle with Tailwind" para o Projeto 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: Regras de Qualidade Específicas da Stack

Cada projeto pode ter regras de eval diferentes, mesmo para a mesma skill.

Projeto 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" }
  ]
}

Projeto 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" }
  ]
}

Mesma skill. Regras diferentes. Mesmo mecanismo de garantia de qualidade.


Learnings: Memória Independente por Projeto

As correções se acumulam separadamente.

Projeto 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

Projeto 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

Os learnings do Odoo do Projeto A nunca contaminam o contexto React do Projeto B. A "memória imune" de cada bot é 100% relevante para sua própria stack.


Métricas: Por Projeto, Por Skill

/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

O Karpathy Loop analisa cada projeto de forma independente. Se code-review está fraco no projeto Odoo mas forte no projeto React, apenas o projeto Odoo recebe uma proposta de melhoria.


Passos de Configuração

1. Crie os projetos

In Master Bot Telegram:
/new_project odoo-site
/new_project saas-app

2. Adicione o CLAUDE.md por projeto

Escreva a constituição do projeto descrevendo a stack, convenções e restrições.

3. Copie as skills de biblioteca relevantes

# 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. Personalize o _registry.json por projeto

Adicione triggers e palavras-chave relevantes para a tecnologia de cada projeto.

5. Escreva evals específicos da stack

Crie arquivos .evals.json com regras que façam sentido para cada stack.

6. Use e corrija

Comece a trabalhar. Pressione Fix It quando algo estiver errado. Pressione thumbs-down em respostas ruins. O sistema aprende e se adapta por projeto.


Por Que Não Um Único Bot com "Modos"?

Abordagem Problema
Um bot, troca de contexto manual Vazamento entre projetos, sem isolamento persistente
Um bot, prefixo em cada mensagem Tedioso, sujeito a erros, sem isolamento de skills
Um bot, múltiplos CLAUDE.md Claude Code carrega um CLAUDE.md por cwd
Arc OS: Child Bots separados Isolamento completo a nível de processo

A abordagem federada exige mais infraestrutura (uma sessão tmux por projeto), mas elimina toda mistura de contexto por design.