Striker
La mayoría de las herramientas de «SDR con IA» se detienen en la puerta. Encontrar leads, correr una secuencia, agendar una reunión, entregársela a un humano. Esa es la mitad fácil.
La mitad difícil empieza después de la reunión: el seguimiento, las cotizaciones, las objeciones, y el vendedor que juró que devolvía la llamada el martes. Striker está hecho para esa mitad. La prospección es una puerta, no el producto.
La capa
Toma el funnel que un gerente de ventas ya conoce, de la prospección al cierre, y ponle una capa encima:
- quién actúa en cada etapa, agente o humano
- qué pasa cuando el humano no ejecuta
- acuerdos de la reunión, calidad de la reunión, evaluación de los ejecutivos, sentimiento
Quita esa capa y tienes un CRM. La capa es el producto.
Tres planos, una regla
server — Bun + Elysia + Better Auth. HTTP multi-tenant, webhooks, orquestación, envíos, jobs. Es lo único que toca la base de datos.
agents — Mastra. Solo borradores: conversación, primer contacto, persona. Sin auth, sin base de datos, sin envío. Importado en el mismo proceso por defecto, con la opción de correr como proceso aparte cuando un despliegue lo necesita.
core — motores puros. Scoring, send gates, playbooks, precios. Sin IO, así que es la parte que de verdad se puede testear.
La regla es que solo el servidor escribe. Suena trivial hasta que un framework de inferencia pide un repositorio, y le dices que no, y el radio de daño de un mal prompt se queda en «un borrador que nadie envió».
El resto del stack: workspaces de Bun con Moon, no Turborepo ni Nx. Postgres como verdad, Redis para caché y colas, Drizzle para el esquema y los repositorios, contratos de Zod compartidos de punta a punta. El dashboard es una SPA con Vite que habla Eden Treaty directo al servidor. Sin BFF, así que no hay un segundo backend que mantener en sincronía con el primero.
El acento
El agente vende en Chile, así que habla español chileno. La voz iba bien hasta que alguien la interrumpió. Después de una interrupción volvía neutra, y a media llamada eso se lee como otra persona tomando el teléfono.
El arreglo no fue un mejor prompt. El acento estaba viviendo en tres lugares a la vez: el repositorio del producto, el de la plataforma y el runtime. Así que le dimos una sola casa. Ahora un Profile fija qué habla la voz y qué espera el transcriptor, y toda superficie que reproduce esa voz lee el mismo contrato. Las interrupciones dejaron de cambiar quién hablaba.
La mayoría de los bugs interesantes acá se ven así. No «el modelo está mal», sino «dos componentes creen cada uno que es dueño del mismo dato».
El silencio es un paso
Una campaña que sigue enviando mientras el prospecto va a la mitad de una respuesta es peor que una que no envía nunca.
Así que esperar no es un hueco entre pasos. Es un paso definido a propósito, con su propio estado. Un correo entrante detiene el reloj. Una tarea humana bloquea el siguiente movimiento hasta que alguien la cierra. El runtime lleva un registro de turnos en vez de una lista de frases que disparar.
Las herramientas funcionan igual: el agente ata packs con nombre en vez de siete flags sueltas, con tope de doce, y un bit que los desata todos.
Con lo que me quedo
Contratos antes que prompts. Cada bug de «el modelo se está portando raro» resultó, hasta ahora, ser un dato con dos dueños.
Un solo escritor a la base de datos. Todo lo demás solo redacta.
Las reglas de dominio se quedan puras y bien lejos de cualquier cosa que hable con un LLM.
Está en vivo en striker.tyrell.so