Sector: IP propia
Produccióncortex-ai — un motor de enrutamiento agéntico, dos productos en producción
El mismo motor que responde en el chat de este sitio decide presupuestos de campaña en un producto comercial.
Pruébalo en el chatcortex-ai nació para el sistema jurídico de Luna Azul. Cuando hizo falta un motor de decisión para un producto de optimización de campañas —un dominio sin relación con el anterior— el problema era llevarlo sin acoplar los dos productos. Copiar diverge; compartir sin control rompe.
Escribí cortex-ai en Go: recibe la conversación y la despacha al agente correcto por su nombre, sin ejecutar él mismo el modelo. Hoy sostiene dos productos en producción: es el motor que responde en el chat de este sitio. El segundo despliegue no es una copia sino una propagación de un solo sentido, con lista de permitidos verificada contra los imports reales del código.
Sobre él construí el producto comercial completo: la arquitectura de datos (Bronze → Silver → Gold) y un backend de microservicios en Go desplegados como Lambdas de AWS (go-api, api-read, api-command), con un motor de reglas que ya corre en producción y una frontera de confianza explícita entre lo que decide una regla determinista y lo que puede sugerir un LLM.
Métricas clave
- productos en producción sobre el mismo motor, en dominios sin relación entre sí — uno verificable en vivo en este sitio
- 2productos en producción sobre el mismo motor, en dominios sin relación entre sí — uno verificable en vivo en este sitio
- reglas de negocio en el motor de decisión · 28 tests verdes, precedencia explícita
- 27reglas de negocio en el motor de decisión · 28 tests verdes, precedencia explícita
- fragmentos de conocimiento indexados para el RAG · retrieval validado
- 489fragmentos de conocimiento indexados para el RAG · retrieval validado
- de la inversión publicitaria hoy medida · 3 de 6 canales — brecha documentada, no oculta
- 63%de la inversión publicitaria hoy medida · 3 de 6 canales — brecha documentada, no oculta
Stack
- Go
- AWS Lambda
- Function URL
- pgvector
- RAG
- CQRS
Decisiones y trade-offs
Adoptar cortex-ai, no bifurcarlo
cortex-ai nació para Luna Azul, en un repositorio distinto (agent-platform), como fuente de verdad privada. En vez de copiar y divergir, diseñé un mecanismo de propagación de un solo sentido: un script de curación con lista de permitidos granular (verificada contra los imports reales del código, no una carpeta entera) genera una copia autocontenida y versionada dentro de travel-marketing, que nunca sabe que agent-platform existe. El costo: cualquier cambio al motor nace siempre en el repo privado y se propaga después — nunca al revés — y eso exige disciplina de proceso (un guardrail anti-deriva que compara antes de sobrescribir), no solo buena intención.
Nada de fallbacks: si falta el dato, se ve que falta
El motor de reglas no rellena huecos con un valor por defecto: si un umbral de rentabilidad no resuelve para un mercado, el resultado es null y la regla degrada de forma visible, con el motivo escrito en el propio registro de la decisión. La razón no es abstracta: antes de esta regla, un mercado sin umbral propio caía al valor vertical genérico —y España terminó siendo juzgada con la economía de Perú sin que nadie lo viera, porque el sistema rellenaba en silencio. Es la misma clase de error que el JOIN roto del caso financiero: un sistema que devuelve una respuesta en vez de admitir que no la tiene — aquí, corregido en el principio de diseño antes de que produjera su propio incidente.
El LLM sugiere, nunca decide solo
El agente conversacional (brain, en inglés, estructura de DecisionEnvelope; gala, en español, explica la decisión al usuario) puede leer el estado del motor y proponer una acción, pero hay una frontera de confianza server-side: los bloques deterministas del motor de reglas no son alterables por el LLM, y cualquier divergencia entre lo que el LLM sugiere y lo que el motor decide queda registrada, no oculta. La consecuencia explícita: los números de una decisión salen siempre de las reglas, nunca del RAG — la búsqueda semántica confunde 1.3 con 1.25, y esa clase de error no es aceptable en una decisión de presupuesto.
Ola 1 antes que Ola 2, y se dice cuál es cuál
El sistema se construyó como walking skeleton primero: lecturas reales, motor de reglas real, decisiones que se registran y se pueden aprobar o posponer — pero la ejecución real contra las plataformas de publicidad (mover presupuesto de verdad en Meta/Google/TikTok) es la siguiente ola, todavía no construida. api-command valida y encola cada acción, no la ejecuta. Y el gateway go-api —la pieza que en producción validaría el login y enrutaría al resto— sigue siendo un esqueleto sin lógica real. Se declara así en el propio código (el módulo de despliegue lo marca literalmente como "STUB — esqueleto, sin lógica real"), y se declara igual aquí: no es una omisión, es el orden correcto de construir un sistema que puede mover dinero real.