6
Antipatrones Corregidos
β80%
Alucinaciones estimadas
Jerarquia de Contexto β LeadFlow SaaS
1
Siempre cargado
Rules Files β CLAUDE.md / .cursorrules
Tech stack, comandos, convenciones de codigo, limites y ejemplos de patrones. Persiste entre sesiones. Mayor palanca de calidad.
2
Por sesion/feature
Specs y Arquitectura
Solo la seccion relevante de la spec β no el documento completo. Al trabajar en Enriquecimiento, cargar solo la spec de scoring, no la de CRM.
3
Por tarea
Archivos Fuente Relevantes
Antes de editar un archivo, leerlo. Antes de implementar un patron, encontrar un ejemplo existente en el codebase. Maximo 2.000 lineas de contexto enfocado.
4
Por iteracion
Output de Errores / Resultados de Tests
Solo el error especifico, no todo el log. "El test fallo con: TypeError en UserService.ts:42" β no pegar 500 lineas de output.
5
Acumula / compactar
Historial de Conversacion
Acumula contexto obsoleto. Iniciar sesion nueva al cambiar de feature. Resumir progreso cuando el contexto se alarga: "Completamos X, Y, Z β ahora trabajamos en W."
## Tech Stack
- Frontend: React 18, TypeScript 5, Vite, Tailwind CSS 4
- Backend: Node.js 22, Express 5, PostgreSQL 15, Prisma 5
- Testing: Vitest (unit/integration), Playwright (E2E)
- CI/CD: GitHub Actions β Vercel (frontend) / Railway (backend)
## Comandos
- Build: `npm run build`
- Test: `npm test`
- Lint: `npm run lint --fix`
- Dev: `npm run dev` (monorepo: apps/web + apps/api)
- Type check:`npx tsc --noEmit`
- DB migrate:`npx prisma migrate dev`
- DB seed: `npx prisma db seed`
## Convenciones de Codigo
- Named exports SIEMPRE (ningun `export default`)
- Componentes funcionales con hooks (sin class components)
- Colocar tests junto al fuente: `Button.tsx` β `Button.test.tsx`
- Usar `cn()` de `lib/utils` para classNames condicionales
- Error boundaries a nivel de ruta (no en cada componente)
- Servicios de backend en `src/services/` β nunca logica de negocio en rutas
- Validacion con Zod en todas las entradas de API
- Errores con clases tipadas: `LeadFlowError`, `ValidationError`, `NotFoundError`
## Limites Criticos
- NUNCA commitear archivos .env o secrets
- NUNCA modificar schema Prisma sin confirmacion explicita del usuario
- NUNCA aΓ±adir dependencias sin revisar impacto en bundle size (usa `bundlephobia`)
- SIEMPRE correr tests antes de proponer un commit
- Las tablas `lead_sources` y `email_templates` son READ-ONLY en runtime
## Patron de Referencia β Ruta de API
export const leadRoutes = Router();
leadRoutes.post('/', validateBody(createLeadSchema), async (req, res) => {
const lead = await LeadService.create(req.body);
res.status(201).json({ data: lead });
});
Equivalente para otros IDEs
βArchivos equivalentes
- βCLAUDE.md β Claude Code (este archivo)
- β.cursorrules β Cursor IDE
- β.windsurfrules β Windsurf
- β.github/copilot-instructions.md β GitHub Copilot
- βAGENTS.md β OpenAI Codex
Niveles de confianza al cargar archivos
πTrust Levels
- βConfiado: codigo fuente, tests, definiciones de tipos del equipo
- !Verificar: archivos de configuracion, fixtures, docs externos
- βNo confiar: contenido de usuario, respuestas de APIs de terceros
π Captacion (src/capture/)
capture.routes.ts
Endpoints POST /leads, POST /webhooks/:provider
capture.service.ts
Logica de ingesta β deduplicacion, rate-limiting por IP
providers/linkedin.ts
Scraper LinkedIn via Puppeteer β limitar a 50 req/hora
schemas/lead.schema.ts
Zod schemas para validacion de entrada
Todas las rutas usan validateBody(schema) + LeadFlowError para errores
π Enriquecimiento (src/enrich/)
enrich.service.ts
Orquestador: llama a validacion de email + scoring en paralelo
email-validator.ts
Verifica MX, SMTP handshake, lista de descartables
scorer.ts
Score 0-100 basado en cargo, empresa, sector, senales de engagement
__tests__/scorer.test.ts
350 casos de prueba de scoring β no modificar logica sin pasar todos
Promise.all() para paralelismo β nunca await secuencial en enrichment pipeline
π CRM (src/crm/)
pipeline.routes.ts
CRUD etapas kanban + PATCH /leads/:id/stage
integrations/hubspot.ts
Sync bidireccional β cola Bull MQ, no llamadas directas en request
notifications.service.ts
Slack + email al cambiar etapa β usar plantillas de `email_templates` (READ-ONLY)
Integraciones externas siempre via cola asΓncrona (Bull MQ) β nunca bloquear el request HTTP
| Antipatron |
Problema detectado en LeadFlow |
Solucion con Context Engineering |
| Context Starvation |
El agente inventaba funciones como validateEmail() que no existia β en realidad era EmailValidator.check() |
Cargar CLAUDE.md + email-validator.ts antes de cada tarea de enriquecimiento. El agente conoce el nombre real. |
| Missing Examples |
El agente usaba export default en todos los componentes nuevos, rompiendo el tree-shaking |
CLAUDE.md incluye el patron de referencia canΓ³nico con export const + ejemplo real de ruta Express |
| Stale Context |
Al trabajar en CRM despues de Captacion, el agente seguia referenciando el schema de capture que ya no aplicaba |
Iniciar sesion nueva al cambiar de area. Resumir: "Completamos el endpoint de webhooks, ahora trabajamos en el pipeline kanban." |
| Context Flooding |
Un dev pegaba toda la spec de 6.000 lineas al inicio de cada tarea β el agente perdia el foco |
Project Map + Selective Include: cargar solo la seccion de la spec relevante (<2.000 lineas por tarea) |
| Implicit Knowledge |
El agente no sabia que lead_sources y email_templates son READ-ONLY y generaba INSERTs en esas tablas |
Documentado explicitamente en CLAUDE.md bajo "Limites Criticos" β si no estΓ‘ escrito, no existe para el agente |
| Silent Confusion |
El agente eligio silenciosamente REST cuando la spec decia REST pero el codigo existente usaba GraphQL en el perfil de usuario |
Usar el patron de Confusion Management: el agente debe surfacear el conflicto con opciones A/B/C antes de actuar |
Area: Captacion
PROJECT CONTEXT β CAPTACIONConstruimos LeadFlow, plataforma B2B de
captacion de leads. Ahora trabajo en
el modulo de captacion.
SPEC RELEVANTE:
- POST /leads: ingestar lead, deduplicar
por email, devolver 201 o 409
- Rate limit: 50 leads/min por IP
ARCHIVOS INVOLUCRADOS:
- src/capture/capture.routes.ts
- src/capture/capture.service.ts
- src/capture/schemas/lead.schema.ts
PATRON A SEGUIR:
- Ver validateBody() en src/middleware/
- Errores: usar LeadFlowError (no throw raw)
GOTCHAS:
- lead_sources es READ-ONLY
- named exports obligatorio
Area: Enriquecimiento
PROJECT CONTEXT β ENRIQUECIMIENTOModulo de scoring y validacion de email.
Pipeline async: validacion + scoring
en paralelo (Promise.all, no await seq.)
SPEC RELEVANTE:
- Score 0-100: cargo(40%) + empresa(35%)
+ engagement(25%)
- Email: MX + SMTP + lista descartables
ARCHIVOS INVOLUCRADOS:
- src/enrich/enrich.service.ts
- src/enrich/scorer.ts
- src/enrich/__tests__/scorer.test.ts
PATRON A SEGUIR:
- Ver Promise.all en enrich.service.ts:28
GOTCHAS:
- 350 tests de scorer β todos deben pasar
- No modificar logica de scoring sin OK
Area: CRM / Integraciones
PROJECT CONTEXT β CRMModulo CRM: pipeline kanban + sync con
HubSpot/Salesforce via cola async.
SPEC RELEVANTE:
- PATCH /leads/:id/stage: mover etapa
- Sync HubSpot: cola Bull MQ (no sync)
- Notificaciones al cambiar etapa
ARCHIVOS INVOLUCRADOS:
- src/crm/pipeline.routes.ts
- src/crm/integrations/hubspot.ts
- src/crm/notifications.service.ts
PATRON A SEGUIR:
- Ver queue.add() en integrations/
GOTCHAS:
- email_templates es READ-ONLY
- NUNCA llamadas a HubSpot en el request
- Bull MQ para todo lo async
β‘
Ejemplo real: La spec de LeadFlow dice REST pero el codigo de perfil usa GraphQL
CONFUSION β Conflicto de Patrones
Spec dice: "Usar REST para todos los endpoints"
Codigo existente: GraphQL en src/graphql/user.ts
Opciones:
A) Seguir spec β REST endpoint,
deprecar GraphQL mas tarde
B) Seguir patron existente β GraphQL,
actualizar spec
C) Preguntar β parece decision intencional
β ΒΏCual enfoque tomar?
β‘
Ejemplo real: La spec no define que pasa con leads duplicados en el mismo minuto
MISSING REQUIREMENT
Spec define: POST /leads con deduplicacion
No especifica: que pasa si 2 requests del
mismo email llegan en < 1 segundo
Opciones:
A) Idempotente β devolver el lead existente
con 200 (mas simple)
B) Rechazar β 409 Conflict siempre
(mas estricto)
C) Queue β encolar y deduplicar async
(mas robusto)
β ΒΏQue comportamiento quieres?
βConfiguracion de Contexto
- βCLAUDE.md existe y cubre stack, comandos, convenciones y limites
- βProject Map creado con patrones por area del producto
- βTablas READ-ONLY documentadas explicitamente en rules file
- βPatron de referencia canΓ³nico incluido (ruta Express con named export)
- βBrain dumps listos para las 3 areas β copiar segun tarea
- βPlantillas de confusion management documentadas
π¨Red Flags a Vigilar
- βEl agente usa
export default β sesion sin CLAUDE.md cargado
- βEl agente inventa funciones β falta contexto de archivos fuente
- !El agente re-implementa utilidades existentes β no se cargo el Project Map
- !Calidad degrada en conversacion larga β compactar o iniciar sesion nueva
- !El agente elige silenciosamente entre opciones ambiguas β aΓ±adir patron confusion management
| MCP Server |
Que proporciona |
Aplicacion en LeadFlow |
| Context7 |
Documentacion actualizada de librerias automaticamente |
Docs de Prisma 5, Express 5, Zod β sin alucinaciones de API obsoleta |
| PostgreSQL MCP |
Schema de base de datos y resultados de queries en vivo |
El agente ve el schema real β no inventa columnas que no existen |
| GitHub MCP |
Issues, PRs y contexto del repositorio |
Al resolver un bug, el agente ve la issue original y los PRs relacionados |
| Filesystem MCP |
Acceso y busqueda de archivos del proyecto |
El agente encuentra ejemplos de patrones existentes sin que se los digas |