Andrea: antes y después

Antes = la v3 que responde hoy. Después = la v4 que corre en sombra desde el 17-set. Detalle: bot/MAPA-ANTES-DESPUES.md y bot/PLAN-SOMBRA-2026-09-18.md.

Antes: un cerebro, tags como memoria, nueve relojes

lo que produjo los 31 casos de la bitácora
flowchart TB
  P[Paciente escribe por WhatsApp] --> GHL[GHL recibe y dispara el webhook]
  GHL --> F1

  subgraph F1["✅ Andrea · 1 · Bot (98 nodos)"]
    direction TB
    G[Guardia, debounce 15 s, lock 90 s] --> CTX[Armar contexto: 49k caracteres de regex\nadivina costo dicho, ubicación, viaje, pago, urgencia]
    CTX --> IA[Andrea AI Agent · gpt-4o-mini\nprompt de 6,600 palabras y 45 prohibiciones\nprecios, horarios y reglas como prosa]
    IA --> LD[Leer decisión: 56k caracteres\npoda repetidos, pega CTA, agrega la virtual\nREESCRIBE lo que dijo el modelo]
    LD --> CP[Compuerta: 17k caracteres\nveta el handoff y REEMPLAZA el mensaje]
    CP --> ENV[Enviar WhatsApp]
    ENV --> TG[Poner tags según intención]
    ENV --> HO[Handoff: tarjeta a Caliente + tarea]
  end

  subgraph IG["✅ Instagram · 1 · Bot social (copia del flujo 1, se desincroniza)"]
    IGB[mismo cerebro, versión del 11-ago]
  end

  subgraph CRONS["Nueve crons que mueven tarjetas y mandan toques leyendo GHL de a 100"]
    C3[3 · Rescate 30 min / 3 h / 6 h]
    C8[8 · Enfriar 48 h ↔ reactivar]
    C11[11 · Higiene TTL, sella pausas, 50/día]
    C12[12 · Recontactar 24 h, recordatorio 6 h]
    C14[14 · Cola de Prospección: encola, nadie envía]
    C15[15 · Toques 48 h, día 7, día 30]
    C10[10 · Detectar citas en el chat]
    C16[16 · Foto diaria: guarda 600 de 1,121]
    C9[9 · Reporte diario]
  end

  TG --> TAGS[(Tags de GHL = la memoria del bot\n6 flujos escriben, nadie verifica)]
  TAGS --> CTX
  TAGS --> C3
  TAGS --> C8
  TAGS --> C12
  TAGS --> C14
  TAGS --> C15
  HO --> PIPE[(Tablero de GHL)]
  PIPE --> C8
  PIPE --> C11
  PIPE --> C12
  C3 -. toque por WhatsApp .-> P
  C12 -. recordatorio .-> P

  classDef dolor fill:#FCEBEB,stroke:#A32D2D,color:#501313
  class CTX,LD,CP,TAGS,C14,C16,IGB dolor

Rueda del mouse o dos dedos para acercar; arrastrar para moverse; doble clic para volver a ajustar.

Después: estado como dato, dos decisiones, un Vigía

lo que cambia de fondo
flowchart TB
  P[Paciente escribe por WhatsApp o Instagram] --> GHL[GHL dispara el webhook]
  GHL --> LEC

  subgraph LEC["Lector (corre en cada turno)"]
    L1[Arma el hilo completo\npaciente, Andrea, Recepción, con hora] --> L2[Modelo lee TODA la conversación\ndevuelve JSON: tratamiento, precio dado, aceptó,\nse despidió, ubicación, fecha en que vuelve, caso, anuncio]
    L2 --> L3[Valida en código\nestado + siguiente paso + tags que no cuadran]
  end
  L3 --> EST[(conversacion_estado\nuna fila por lead: la memoria)]

  EST --> ORQ
  subgraph ORQ["🌘 Andrea v4 · Orquestador (código)"]
    direction TB
    D1[Decisión 1 · atención\ncarril según el estado, nunca por regex] --> H[Hechos del carril\nfila del catálogo, la promo, el horario, lo ya dicho]
    H --> RED[Redactor del carril\nprompt de 200 palabras en positivo]
    RED --> FIL{Filtro\ncifras fuera de tabla, repetidos,\nlargo, Jennifer, ubicación, estética}
    FIL -- pasa --> OK[Mensaje]
    FIL -- no pasa --> REP[Reparar una vez] --> FIL2{Filtro 2} -- no pasa --> TF[Texto fijo del carril]
    FIL2 -- pasa --> OK
    D2[Decisión 2 · movimiento\netapa propuesta, tarea propuesta, pausa hasta]
    D3[Tags del turno\n+ los proactivos del diccionario\n− los operativos que el paciente invalidó]
  end

  OK --> EJ
  D2 --> EJ
  D3 --> EJ
  subgraph EJ["Ejecutor (el único que escribe)"]
    E1[Enviar] --> E2[Escribir estado] --> E3[Tags] --> E4[Tarjeta y tarea] --> E5[Auditoría con carril y lectura]
  end
  E1 -. hoy en sombra: solo registra .-> P

  subgraph VIG["🌘 Andrea v4 · Vigía (un cron por hora, reemplaza a los nueve)"]
    V1[Lee las filas de estado\ny las tarjetas por etapa, paginadas] --> V2[Aplica la tabla de cadencias\n30 min, 3 h, 6 h, 24 h, 48 h, 7 d, 30 d, pausa]
    V2 --> V3[Toques, movimientos y conciliación de tags]
  end
  EST --> V1

  subgraph TAB["Tablas: lo que se cambia sin tocar n8n"]
    T1[(orquestador_carriles\n15 carriles: prompt, hechos, filtro, acciones)]
    T2[(bot_catalogo · bot_datos_operativos · promociones)]
    T3[(bot_tags\ndiccionario con dueño y reglas proactivas)]
    T4[(vigia_cadencias)]
    T5[(bot_modelos\nqué modelo usa el Lector, el Redactor, el Reparador)]
  end
  T1 -.-> D1
  T2 -.-> H
  T3 -.-> D3
  T4 -.-> V2
  T5 -.-> L2
  T5 -.-> RED

  EST --> PAN[Panel · Sombra\nv3 contra v4, etapa, tareas, tags, revisión con nombre]
  EJ --> PAN
  V3 --> PAN

  classDef nuevo fill:#E1F5EE,stroke:#0F6E56,color:#04342C
  class L2,EST,D1,D2,D3,FIL,V2,T3,T5 nuevo

Rueda del mouse o dos dedos para acercar; arrastrar para moverse; doble clic para volver a ajustar.

Qué cambia, punto por punto

Antes (v3)Después (v4)
Memoria del lead40 tags de GHL escritos por 6 flujosuna fila por lead (conversacion_estado) + tags espejo con dueño
Cómo sabe qué quiere el pacienteregex sobre el último mensaje (49k caracteres)un modelo lee toda la conversación y devuelve datos
Precios, horarios, reglasprosa en un prompt de 6,600 palabrastablas (catálogo, datos operativos, promociones)
El mensajeun prompt para todo + poda y CTA pegados después15 carriles con prompt corto; filtro que bloquea y repara una vez
Etapa y tareamezcladas con la respuestadecisión aparte, con regla escrita, visible en el panel
Tagspor intención, al azar de cada flujoproactivos por regla del diccionario, + y − por turno, conciliados
Toques y movimientos9 crons con limit=1001 Vigía sobre la fila de estado, cadencia en tabla, paginado
Instagramcopia del flujo que se desincronizamismo orquestador, canal = instagram
Modelofijo en el nodobot_modelos: por pieza, editable desde el panel
Qué ve la clínicala bitácora de errorescada turno: v3 contra v4, lectura, etapa, tareas, tags, revisión con nombre