FOLIO: AUD-20260930-002 Secuencia: Informe #002 del día 2026-09-30
📅 2026-09-30 13:08:50 COT 👤 Auditor: Anderson Mares (AMR TECH) ● VIGENTE
DECISIÓN: 2 ADOPT · 2 ADAPT · 2 SKIP 6 repos evaluados · 25.5k★ combinados · 2 licencias MIT adoptables Stack destino: PHP 8.3 + MySQL + Hostinger

Análisis Comparativo de 6 Repositorios IA/CRM — Qué adoptar y cómo implementarlo

Evaluación de stack, arquitectura, features y licencia de 6 repositorios GitHub con IA/CRM/tickets contra el ecosistema actual de StreamingApps (CRM WhatsApp con cascada IA, tienda + Dropshipping Dropi, extensión Chrome GoPlay, portal revendedores). Objetivo: mapear qué capacidades valen la pena adoptar, qué adaptar al stack PHP y qué descartar — con blueprint concreto de implementación para cada recomendación.

Repos evaluados
6
clones shallow 2026-09-30
ADOPT (MIT)
2
AgenticCRM · Comp CRM
ADAPT (ideas)
2
sin licencia · patrones sueltos
SKIP
2
licencia dual + stack incompatible
Recomendaciones
10
blueprints A1–A5 · B1–B3 · C · D

Metodología

1 · Clonado

6 clones git clone --depth 1 al sandbox local, con metadata: estrellas, licencia, última actividad, LOC y manifests.

2 · Análisis

README + estructura + manifests + código fuente de los módulos relevantes (tools, circuit-breaker, ledger, colas).

3 · Mapeo

Cada capacidad comparada contra el ecosistema actual: CRM WhatsApp, tienda/Dropi, cascada IA, extensión Chrome, revendedores.

4 · Decisión

Matriz adopt/adapt/skip con licencia como filtro duro y blueprint de implementación PHP/MySQL para cada adopt.

1 · Inventario y metadata de los 6 repos

Repositorio ★ Stack LOC Licencia Actividad Veredicto
Sapheron/AgenticCRM 21 TypeScript · NestJS · monorepo 256k MIT 2026-05-03 ADOPT
trycompai/crm (Comp AI) 10.976 TypeScript · Bun · Postgres 124k MIT 2026-09-11 (muy activo) ADOPT
kaymen99/AI-Sales-agent 95 Python · LangChain · LiteLLM 962 SIN LICENCIA 2024-12-09 (inactivo) ADAPT
aniket-work/intelligent-support-system 5 Python · YAML config 971 SIN LICENCIA 2025-12-28 ADAPT
nocobase/nocobase 24.414 TypeScript · Node · no-code 96k DUAL / NOASSERTION — SKIP
ManideepMuddagowni/…MCP Ticket 1 Python · Streamlit · MCP 787 SIN LICENCIA 2025-06-05 (inactivo) SKIP

Nota de licencia: sin licencia = código visible pero sin derecho de copia/reutilización — solo se pueden extraer ideas (nunca fragmentos). NocoBase mezcla Apache-2.0 con términos comerciales (NOASSERTION) y exige Node/Postgres — inadmisible para este stack.

2 · Análisis por repo (stack, arquitectura, features)

① AgenticCRM · ADOPT

★21 · MIT · 256k LOC

CRM self-hosted cuyo agente IA vive dentro de WhatsApp. Monorepo NestJS: apps/api (NestJS), apps/worker (agente), apps/whatsapp, apps/dashboard, packages/database.

  • 8 tools registradas en tool-registry.ts: create_lead, update_deal_stage, create_task, search_contacts, send_payment_link, get_conversation_history, add_note, escalate_to_human
  • Circuit breaker + auto-escalación y fallback de 15 proveedores IA (apps/worker/src/circuit-breaker/)
  • Chains de 5 iteraciones tool-call, pipeline Contacts→Leads→Deals→Quotes→Invoices→Payments
  • Tickets con SLA, KB, broadcasts/secuencias, staff control por WhatsApp (el dueño escribe a su propio número para operar el CRM)

② Comp AI CRM (trycompai) · ADOPT

★10.976 · MIT · 124k LOC

«CRM diseñado para agentes IA» — el agente no es una feature del CRM, el CRM es donde el agente anota lo que sabe. Bun + Postgres, agente propio (eve), skills en markdown.

  • Evidence ledger: nada se adivina — cada hecho escrito por el agente queda con fuente y timestamp (agent/lib/research-instructions.ts)
  • Work queue con FOR UPDATE SKIP LOCKED (agent/lib/tasks.ts) — tareas agénticas concurrentes sin pisarse
  • Skills versionadas en markdown (menos código, más prompts auditables) — .agents/skills/
  • Tool read_crm_history / read_company_history: contexto histórico recuperable antes de responder

③ AI-Sales-agent · ADAPT (ideas)

★95 · sin licencia · 962 LOC

Agente de ventas Python para ecommerce de cómputo: LangChain + LiteLLM (Groq/Langfuse). Obsoleto (2024) y sin licencia → solo patrones.

  • get_product_recommendation: agente «experto» que recomienda productos según requisitos → mapea 1:1 a nuestra tabla products (77 filas)
  • get_store_info: RAG simple sobre Docs.txt → FAQ de streaming/planes
  • Payment links + Calendly como tools → encaja con checkout WhatsApp y agendamiento

④ intelligent-support-system · ADAPT (ideas)

★5 · sin licencia · 971 LOC

PoC multi-agente de 4 agentes encadenados para tickets. Config de prompts en YAML reutilizable.

  • Pipeline 4 pasos: Classifier (categoría+prioridad+sentimiento) → Router (depto) → Response → Escalation (¿humano?)
  • Separación de prompts en YAML/md por rol → aplicable a nuestros whatsapp-crm/prompts/*.md
  • Criterios explícitos de escalamiento → template del flag «requiere humano» en el buyer bot

⑤ NocoBase · SKIP    ⑥ MCP Ticket Automation · SKIP

★24.414 / ★1
  • NocoBase: licencia dual con términos comerciales (NOASSERTION en ojos de GitHub; Apache-2.0 + cláusulas propias), plataforma no-code sobre Node/Postgres — no encaja con PHP 8.3/MySQL/Hostinger y reutilizarlo arrastraría una plataforma entera. 357MB clonados, descartado por licencia + stack.
  • MCP Ticket Automation: sin licencia (sin derecho de copia), 1★, Streamlit + Google Sheets + MCP Inspector, inactivo desde 2025-06 — el flujo clasifica→responde→logra en Sheets ya está cubierto por nuestra cola y CRM; aporta menos que el repo ④ con el mismo riesgo legal.

3 · Matriz comparativa: capacidades vs ecosistema actual

Capacidad Origen (repo) StreamingApps hoy Brecha Acción
Circuit breaker + fallback multi-proveedor IAAgenticCRMCascada 5 proveedores en AIService.php — sin cortacircuitos ni métricas de falloMediaADOPT
Control admin por WhatsApp (self-chat allowlist)AgenticCRMAdmin solo vía panel webMediaADOPT
Tickets con SLA (1ª respuesta)AgenticCRMNo existe — conversaciones sin estado de soporteAltaADOPT
Secuencias/follow-ups con dueAtAgenticCRMTemplates manuales, sin scheduling automáticoAltaADOPT
Evidence ledger (hechos con fuente, «nada se adivina»)Comp AI CRMCampos IA de contactos sin procedenciaMediaADOPT
Cola de tareas dueAt (work queue)Comp AI CRMapi-extension-queue existe solo para la extensión ChromeMediaADOPT
Prompts versionados en markdownComp AI + SupportPrompts inline en PHPBajaADOPT
Máquina de estados de sesión WhatsApp + watchdogAgenticCRMSesión WAHA sin monitoreo proactivoAltaADOPT
Recomendación de productos (RAG/IA)AI-Sales-agentBuyer bot responde catálogo sin recomendación guiadaMediaADAPT
Pipeline clasificador→respuesta→escalamientoSupport SystemEscalamiento manualMediaADAPT
Plataforma no-code / builder de appsNocoBaseNo aplica — producto propio a medida—SKIP
Tickets→Google Sheets+email (MCP)MCP TicketCubierto mejor por CRM + cola propios—SKIP

4 · Recomendaciones: qué y cómo se implementa

Blueprints concretos, todos viables en PHP 8.3 + MySQL + Hostinger (sin Node/Postgres). Esfuerzo: S ≤½ día · M 1–2 días · L 3–5 días.

A1

Control admin por WhatsApp (self-chat allowlist)

ADOPT · AgenticCRM M · 1 día

Qué: que Anderson pueda operar el CRM escribiendo a su propio número de WhatsApp (buscar contacto, ver ventas, ejecutar comandos) sin abrir el panel.

Cómo: ① tabla nueva wa_admin_allowlist(jid PK, alias, activo, created_at); ② en whatsapp-crm/src/WebhookHandler.php, antes del flujo público, si from_jid ∈ allowlist → ruta corta a un AdminCommandHandler con tools mínimas (buscar_contacto, ventas_hoy, enviar_template, agregar_nota); ③ comandos parseados tipo /ventas hoy; ④ audit log en audit_logs por cada acción; ⑤ no exponer secrets ni datos de otros clientes en las respuestas (allowlist + sanitización de salida).

A2

Circuit breaker + salud de proveedores IA

ADOPT · AgenticCRM M · 1–2 días

Qué: que la cascada IA (Groq→OpenRouter→…) no reintente un proveedor caído y degrade con visibilidad, en vez de fallar en silencio o latir lento.

Cómo: ① en whatsapp-crm/src/AIService.php añadir estado por proveedor en una tabla ai_provider_health(provider PK, state ENUM(closed,open,half), failures, next_retry_at, updated_at); ② al fallar N veces seguidas (N=3) → half-open durante T=60s (un solo intento de sondeo); ③ éxito → open, fallo → closed+backoff; ④ endpoint ai_status extiende su JSON con estado por proveedor (ya existe el endpoint, se enriquece); ⑤ métricas en la cola de eventos existente.

A3

Tickets con SLA de primera respuesta

ADOPT · AgenticCRM M · 2 días

Qué: convertir conversaciones de soporte en tickets con estado y medir tiempo de 1ª respuesta (hoy no se mide nada).

Cómo: ① tabla support_tickets(id, contact_jid, status ENUM(open,pending,resolved,closed), priority, first_response_at, resolved_at, sla_minutes INT DEFAULT 60, assigned_to); ② trigger de creación: mensaje entrante con intención de soporte (o etiqueta manual del panel) → INSERT ticket si no hay abierto para ese JID; ③ primera salida humana/bot → UPDATE first_response_at; ④ cron PHP (cpanel, cada 15 min) marca breached cuando now-first_response_at > sla_minutes y no resuelto; ⑤ panel de tickets en whatsapp-crm/public/ (lista + badge de SLA vencido).

A4

Máquina de estados de sesión WhatsApp + watchdog

ADOPT · AgenticCRM S–M · 1 día

Qué: detectar y auto-recuperar sesiones WAHA caídas/not-qreadys antes de que lleguen mensajes perdidos.

Cómo: ① tabla wa_session_log(id, state, detail, created_at) + estado actual en settings; ② cron PHP cada 5 min: GET /api/sessions de WAHA → si estado ∉ {WORKING, scanQr} por >2 ciclos → log down + POST /api/sessions/start (hasta 3 reintentos) + alerta a la cola de notificación (patrón fail-closed ya usado en M2); ③ en el panel, badge de estado de sesión en tiempo casi real (poll 30s).

A5

Secuencias de follow-up con dueAt

ADOPT · AgenticCRM M · 2 días

Qué: seguimiento automático a leads fríos: «3 días sin respuesta → mensaje 2 → 7 días → mensaje 3 → escalar».

Cómo: ① tabla sequences(id, name), sequence_steps(seq_id, step_no, delay_days, template_id), sequence_enrollments(contact_jid, seq_id, current_step, next_due_at, status); ② enroll manual/por regla desde el panel; ③ cron PHP cada 15 min: seleccionar next_due_at ≤ now AND status=active (patrón FOR UPDATE SKIP LOCKED se traduce a SELECT … FOR UPDATE SKIP LOCKED — MySQL 8.0+ lo soporta), enviar template por WAHA, incrementar step, reprogramar; ④ si el contacto responde → status=paused; ⑤ reutiliza la cola existente api-extension-queue como brazo de envío.

B1

Evidence ledger en campos IA de contactos

ADOPT · Comp AI S · ½ día

Qué: que todo dato que la IA «aprendió» sobre un contacto (interés, presupuesto, motivo) guarde fuente + timestamp — nada se adivina sin rastro.

Cómo: ① tabla contact_evidence(id, contact_jid, field, value, source ENUM(webhook,ai,message,manual), message_id NULL, confidence DECIMAL NULL, created_at); ② en el path donde hoy se hace UPDATE de is_learned/campos IA, insertar también la fila de evidencia; ③ el panel muestra cada campo IA con ícono de procedencia y hover con la evidencia; ④ regla: si dos evidencias de field difieren → gana la más reciente y se conserva la anterior (auditoría).

B2

Cola de tareas dueAt generalizada

ADOPT · Comp AI S–M · 1 día

Qué: una sola tabla de trabajo para todo lo diferido (follow-ups, reportes, limpiezas), consumida por cron — hoy api-extension-queue sirve solo a la extensión Chrome.

Cómo: ① crear tasks(id, type, payload JSON, due_at, status ENUM(pending,running,done,failed), attempts, last_error, locked_at NULL); ② consumidor único en PHP cada 5 min con SELECT … WHERE status='pending' AND due_at<=NOW() ORDER BY due_at LIMIT 5 FOR UPDATE SKIP LOCKED; ③ handlers registrados por type (mapa PHP); ④ reintentos con backoff y failed tras 3 intentos + alerta fail-closed (patrón ya probado en M2).

B3

Prompts en markdown versionados

ADOPT · Comp AI + Support S · ½ día

Qué: sacar los prompts inline de PHP a archivos *.md auditables en git (diffs de prompts = diffs de comportamiento).

Cómo: ① crear whatsapp-crm/prompts/{buyer,admin,ticket,classifier}.md con frontmatter YAML (versión, modelo objetivo, temperature); ② helper PromptLoader::get('buyer') con cache por mtime; ③ migrar los prompts de AIService.php/buyer bot a loaders (mismo texto, cero cambio de comportamiento); ④ validación en la suite: archivo presente + placeholders {{var}} declarados.

C

Pipeline clasificador → auto-respuesta → flag de escalamiento

ADAPT · Support System (ideas) M · 2 días

Qué: dar estructura de pipeline al flujo entrante: clasificar (categoría+sentimiento+urgencia) → intentar auto-responder → si criterios de escalamiento → marcar «requiere humano».

Cómo: ① primer paso en WebhookHandler.php: llamada barata a la cascada IA con prompt clasificador (solo JSON: {category, priority, sentiment, escalate:bool}, max_tokens bajo); ② criterios de escalamiento explícitos (furor, mención de cancelación/pago, 2+ mensajes sin resolver, escalate=true) → crea ticket A3 con prioridad; ③ si no escala → auto-respuesta con el buyer bot existente; ④ log de la decisión en evidence ledger B1. Sin copiar código (sin licencia): solo el diseño del pipeline.

D

Tool de recomendación de productos en el buyer bot

ADAPT · AI-Sales-agent (ideas) M · 1–2 días

Qué: que el buyer bot recomiende 2–3 productos del catálogo real según lo que el cliente pide, en vez de solo listar.

Cómo: ① en run_buyer_turn añadir tool recommend_products(query, budget, category); ② implementación: SELECT … FROM products WHERE active=1 AND (name/category LIKE …) ORDER BY margin DESC LIMIT 3 con filtro de presupuesto si llega (77 filas → sin embeddings, LIKE basta; si crece → nomic-embed-text local); ③ el modelo recibe los 3 candidatos y elige/redacta; ④ guardar la recomendación como evidencia B1 (source=ai); ⑤ respetar la fuga de márgenes: la tool devuelve solo precios de venta (nunca buyPrice — ya endurecido en B2).

5 · Roadmap sugerido de adopción

Sprint 1 (quick wins · ~3 días)
  • 1. B1 Evidence ledger (½ d)
  • 2. B3 Prompts en md (½ d)
  • 3. A2 Circuit breaker (1–2 d)
  • 4. D recommend_products (1 d)
Sprint 2 (soporte · ~4 días)
  • 5. A3 Tickets + SLA (2 d)
  • 6. C Pipeline clasificador (2 d)
  • 7. B2 Cola de tareas (1 d)
Sprint 3 (operación · ~3 días)
  • 8. A4 Watchdog sesión WA (1 d)
  • 9. A5 Secuencias dueAt (2 d)
  • 10. A1 Admin por WhatsApp (1 d)

Prerrequisitos ya cerrados: bloqueadores B1–B4 remediados (informe 42) · Fase 1 M1–M4 (crypto settings, cola fail-closed, HMAC, CSP) · REGLA DE ORO actualizada a Tailwind self-hosted — todo esto en el mismo día 2026-09-30.

Bitácora del informe

  1. 13:01 — Clonado de los 6 repos (shallow) al sandbox /tmp/…/repos-eval/ + extracción de metadata (stars, licencia, actividad, LOC, manifests).
  2. 13:05 — Análisis de stack/arquitectura por repo: README, estructura de directorios, manifests y código fuente de tool-registry.ts, circuit-breaker/, agent/lib/{tasks,research-instructions}.ts, LICENSE de NocoBase.
  3. 13:07 — Mapeo de capacidades vs ecosistema actual (CRM WhatsApp, tienda/Dropi, cascada IA, extensión, revendedores) y matriz adopt/adapt/skip — licencia como filtro duro (solo MIT copiable; «sin licencia» = solo ideas).
  4. 13:08 — Blueprint de implementación de las 10 recomendaciones (A1–A5, B1–B3, C, D) con tablas/queries/rutas PHP concretas, esfuerzo y roadmap en 3 sprints.
  5. 13:09 — Publicación en auditorias/43-analisis-comparativo-repositorios-ia-20260930.html + fila e incremento de contador en auditorias/index.html.