Aislamiento de skills entre proyectos

Cómo ejecutar el Proyecto A (Bootstrap + Owl) y el Proyecto B (Tailwind + React) sin conflictos de contexto.


El problema

Tienes dos proyectos web:

Un único bot de IA no puede servir a ambos con eficacia. Las instrucciones de Odoo contaminan el contexto de React. Los patrones de React se filtran en el código de Odoo. Los consejos de t-call no tienen sentido en JSX. useEffect no tiene cabida en QWeb.


La solución: 3 niveles de aislamiento

Nivel 1: CLAUDE.md (Constitución del proyecto)

Cada child bot inicia claude -p en su propio directorio de trabajo. Claude Code carga automáticamente CLAUDE.md desde la raíz del proyecto. Esta es la "constitución" del bot.

Proyecto 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

Proyecto 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

Estos archivos nunca se mezclan. Directorios diferentes, procesos diferentes, bots diferentes.


Nivel 2: skills/ (Experiencia específica por tecnología)

Cada proyecto recibe únicamente las skills relevantes para su stack tecnológico.

Conjunto de skills del Proyecto A:

/opt/repos/odoo-site/skills/
├── _registry.json           ← Solo entradas relevantes para Odoo
├── library/
│   ├── odoo-expert.md       ← Desarrollo de módulos Odoo
│   ├── odoo-owl-expert.md   ← Patrones de componentes Owl
│   └── postgres-pro.md      ← Optimización PostgreSQL
├── code-review/
│   ├── skill.md
│   └── code-review.evals.json  ← Reglas específicas de Odoo
└── git-manager/
    └── skill.md

Conjunto de skills del Proyecto B:

/opt/repos/saas-app/skills/
├── _registry.json           ← Solo entradas relevantes para React
├── library/
│   ├── react-patterns.md    ← RSC, hooks, gestión de estado
│   ├── tailwind-expert.md   ← Patrones CSS de utilidades
│   └── nextjs-expert.md     ← App Router, middleware, ISR
├── code-review/
│   ├── skill.md
│   └── code-review.evals.json  ← Reglas específicas de React
└── git-manager/
    └── skill.md

Observa que se usan las mismas skills estructurales (code-review, git-manager) pero con reglas de evaluación diferentes por proyecto.


Nivel 3: _registry.json + Context Router (Selección inteligente)

Incluso dentro de un único proyecto, el Context Router garantiza que solo las skills relevantes se enfaticen por mensaje.

Registro del Proyecto 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"]
    }
  ]
}

Registro del Proyecto 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()"]
    }
  ]
}

Cuando el CEO envía "Fix the t-call in the product template" al Proyecto 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

Cuando el CEO envía "Add dark mode toggle with Tailwind" al Proyecto 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: reglas de calidad específicas del stack

Cada proyecto puede tener reglas de evaluación diferentes incluso para la misma skill.

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

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

Misma skill. Reglas diferentes. Mismo mecanismo de control de calidad.


Learnings: memoria independiente por proyecto

Las correcciones se acumulan por separado.

Proyecto 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

Proyecto 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

Los learnings de Odoo del Proyecto A nunca contaminan el contexto de React del Proyecto B. La "memoria inmune" de cada bot es 100% relevante para su propio stack.


Métricas: por proyecto y por skill

/quality en Proyecto 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 en Proyecto 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

El Karpathy Loop analiza cada proyecto de forma independiente. Si code-review es débil en el proyecto Odoo pero fuerte en el de React, solo el proyecto Odoo recibe una propuesta de mejora.


Pasos de configuración

1. Crea los proyectos

En el Master Bot de Telegram:
/new_project odoo-site
/new_project saas-app

2. Añade CLAUDE.md por proyecto

Escribe la constitución del proyecto describiendo el stack, las convenciones y las restricciones.

3. Copia las skills de biblioteca relevantes

# Proyecto 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/

# Proyecto B — crea nuevas para tu stack
write /opt/repos/saas-app/skills/library/react-patterns.md
write /opt/repos/saas-app/skills/library/tailwind-expert.md

4. Personaliza _registry.json por proyecto

Añade triggers y keywords relevantes para la tecnología de cada proyecto.

5. Escribe evals específicos del stack

Crea archivos .evals.json con reglas que tengan sentido para cada stack.

6. Usa y corrige

Empieza a trabajar. Pulsa Fix It cuando algo esté mal. Pulsa thumbs-down en las respuestas malas. El sistema aprende y se adapta por proyecto.


¿Por qué no un único bot con "modos"?

Enfoque Problema
Un bot, cambiar contexto manualmente Contaminación entre proyectos, sin aislamiento persistente
Un bot, prefijo en cada mensaje Tedioso, propenso a errores, sin aislamiento de skills
Un bot, múltiples CLAUDE.md Claude Code carga un CLAUDE.md por cwd
Arc OS: child bots separados Aislamiento completo a nivel de proceso

El enfoque federado requiere más infraestructura (una sesión tmux por proyecto), pero elimina por diseño toda mezcla de contexto.