Master-Arq · sesión de revisión (modo red-team)

Cuatro arquitectos reales contra Agent Squad

No es el comité simulado de cultura framework-first. Esta vez el panel son las personas que construyen los agentes de coding del mundo: Boris Cherny (Claude Code / Anthropic — el motor sobre el que corre Agent Squad), Alexander Embiricos (Codex / OpenAI), Harrison Chase (LangChain / LangGraph) y Charity Majors (Honeycomb). Sus posiciones están investigadas y citadas; las citas marcadas ⚠ son recaps de terceros, las ✓ son verbatim de fuente propia. Cada lente emite un veredicto honesto.

FECHA 2026-06-13 BAJO FUEGO agent-squad-app · as-built en main EJE "¿es n8n + un nodo de vector?" FUENTES código verificado file:line · 849 tests
El cargo que motivó la sesión
"Esto no es más que una plantilla de n8n con un nodo de base de datos vectorial, y ya."
Lo que el crítico veLo que el código muestra
"Un DAG de nodos"Un DAG, sí — pero generado por un LLM (Nova) desde lenguaje natural y validado formalmente: validate.ts:26 contra catálogo, isAcyclic Kahn en nova-compose.ts:670, cap de 10 pasos, gate humano con fallback:'fail'. No dibujado a mano.
"Un nodo de vector DB"text-embedding-3-large (3072d) + índice DiskANN + recall L2 <=> real en claims.ts:103. Memoria semántica viva, no decorativa.
"Y ya"17 operations (11 deterministas + 6 LLM), separación planificar→validar→ejecutar, e inversión identidad↔capacidad: las personas son etiquetas, la capacidad vive en el catálogo.
🟡
Boris Cherny
Claude Code · Anthropic
Minimalismo del harness. "Apostá al modelo, no al andamiaje." The Bitter Lesson, grep > RAG.
🟡
Alexander Embiricos
Codex · OpenAI
Autonomía asíncrona, flotas de agentes. "El humano es el cuello de botella."
🟢
Harrison Chase
LangChain · LangGraph
Orquestación explícita + context engineering. "Controlá qué entra al LLM en cada paso."
🔴
Charity Majors
Honeycomb
Resiliencia y operabilidad. "¿Cómo sabés que no se rompe a las 3am?"
Filtrar
Harrison Chase — el error de categoría
Es quien mejor desarma la acusación, porque n8n ES su terreno: orquestación.
Cuestionanivel del espectro

"El crítico comete un error de categoría y se lo nombro con mi espectro de autonomía. n8n es nivel 1: un flujo hard-coded que un humano dibuja. Tus operations sueltas también son nivel 1. Pero Nova es nivel 4-5: un router/state-machine donde el LLM decide qué pasos existen y en qué orden, con guardrails. Generar la cognitive architecture desde lenguaje natural y validarla no es lo mismo que ejecutarla. Mi pregunta real: validás estructura — ¿controlás el contexto que entra a cada handler?"

Defensa

validatePlanAgainstCatalog valida refs, edges y deprecación — estructura. Decir "es n8n" porque el resultado es un DAG es como decir que un compilador es "un archivo de texto con instrucciones": ignora cómo se generó. El asterisco es justo: el contexto que reciben los 6 handlers text.* no tiene validación de contenido equivalente; se confía en lo que Nova pasó.

verbatim, blog 20-abr-2025: "The hard part of building reliable agentic systems is making sure the LLM has the appropriate context at each step."
🟢 SÓLIDA
Esto demuele la acusación. La separación composición/validación/ejecución es una cognitive architecture deliberada de nivel 5, no una plantilla. El context engineering en los handlers queda como 🟡 aparte, no descalifica el verde.
Boris Cherny — el escéptico del andamiaje
Aprueba lo esencial, pero pincha dos cosas: el motor y el vector.
Cuestionapgvector + el motor

"Dos cosas me pican. Una: tu motor es claude -p --max-turns 1 --disallowed-tools '*' — usás mi producto como un endpoint de completion barato, sin agencia, sin tools. Es pragmático y es $0, pero entonces no tenés un sistema agéntico: tenés un catálogo determinista con seis llamadas de texto. Dos: pgvector. En Claude Code descartamos los vector stores; la agentic search con grep nos ganó en benchmarks. ¿Probaste que a tu escala un grep sobre el log de decisiones no hace el mismo trabajo con una décima de la infra?"

Defensa

El recall semántico no es text-matching: busca por significado ("¿qué decidimos sobre precios?" recupera la decisión aunque no diga "precio"). A escala de un workspace es defendible. Pero Boris tiene razón: nadie midió el contrafactual grep. Y el andamiaje que sí importa — catálogo determinista + Nova que solo compone — es exactamente "darle al modelo herramientas y un objetivo": eso sobrevive al próximo modelo.

recap, no transcripción oficial: "You get better results by giving the model tools and a goal… scaffolding gains get wiped out by the next model."
🟡 TRADE-OFF
Pasa su test más duro (el andamiaje esencial sobrevive al modelo). El 🟡 es por pgvector sin contrafactual y por vender como "agentes" lo que corre como completions.
Alexander Embiricos — ¿dónde está la flota?
Va por el lado opuesto a Harrison: demasiado humano en el centro.
Cuestionael human_gate

"Tenés un human_gate.approve obligatorio en cada plan (nova-compose.ts:546, y si falta lo inyectás con fallback:'fail'). Mi tesis es que el humano es el cuello de botella, y acabás de institucionalizarlo en el centro del sistema. ¿Dónde está la flota? ¿Por qué un plan a la vez, síncrono, esperando aprobación?"

Defensa

El usuario de Agent Squad no es un ingeniero — es un founder/manager. Para esa persona, el gate de aprobación no es fricción: es el producto. Y vos mismo decís que revisar el output del agente es el problema sin resolver. Lo resolvieron poniendo al humano dueño en el gate, conscientemente. Lo que no hay: flota, async, auto-validación.

transcript no-oficial: "Reviewing agent written code is a place that today is less fun."
🟡 TRADE-OFF
Para el caso real (no-ingenieros aprobando trabajo de su squad) el gate es 🟢 producto. Como apuesta de escalabilidad de autonomía es 🟡: el techo es la velocidad de aprobación humana — un techo elegido.
Charity Majors — las preguntas de las 3am
El golpe de realidad operacional. Aquí viven los huecos reales.
Cuestionamotor · tenancy · observabilidad

"Tres preguntas. Uno: tu motor de producción es un CLI atado a una sesión OAuth de un plan de suscripción (llm.ts:1). ¿Qué pasa cuando rate-limitee o expire un domingo? ¿El fallback de llm.ts:40 está probado o es teoría? Dos: tu aislamiento entre tenants es un WHERE workspace_id a nivel aplicación, no RLS. Un query mal filtrado y un workspace ve a otro. Tres: Langfuse traza las llamadas LLM y el plan, pero no los 11 steps deterministas. ¿Y un SLO sobre la calidad de los planes que pasan el gate, o solo sobre uptime?"

Defensa

El fallback existe en código pero el runbook Max→API no está probado bajo fuego. El aislamiento app-level funciona pero sin la red de RLS. Lo que sí brilla: 849 tests + un harness de 34 pasos que corre el journey completo en producción con usuario efímero y limpieza quirúrgica — eso es test-in-prod de verdad, justo lo que ella predica.

verificada (su cuenta): "Nines don't matter if users aren't happy."
🔴 ROADMAP
No por mal diseño — por huecos operacionales reales: motor sin failover probado, multi-tenancy sin RLS, observabilidad sin cobertura de steps, sin SLO de calidad. El harness le sube la nota; el CLI-Max se la baja a rojo.

El debate entre ellos

Lo que pediste: que no opinen aislados, que choquen. Cuatro tensiones reales, sin consenso forzado.

⚔ Boris vs Harrison — el catálogo fijo
Boris: "Tu catálogo de 17 ops es andamiaje. El próximo modelo compone libre sin que le des una lista cerrada. Lo construís porque el modelo de hoy no llega."
Harrison: "Al revés. El catálogo acotado es lo que te da fiabilidad. Autonomía total no es más sofisticada — es menos confiable. La sofisticación vive en los guardrails, no en quitarlos."
Sin consenso. La tensión es real y es la correcta para un sistema que mueve trabajo con aprobaciones.
⚔ Embiricos vs Charity — el gate humano
Embiricos: "Sacá al humano del gate, es el cuello de botella."
Charity: "Ni se te ocurra. El gate es tu única red de seguridad mientras no tengas un eval offline que juzgue la calidad de los planes. Primero el eval, después hablamos."
Charity gana el round en lo empírico: no se quita la red antes de tejer la otra.
🤝 Boris + Charity — coinciden sobre pgvector (raro)
Boris desde simplicidad ("¿lo necesitás o es cargo-cult?").
Charity desde operación ("no operes en prod lo que no medís que aporta").
Los dos piden el mismo experimento: medir recall semántico vs grep antes de quedarse con la infra vectorial.
🔁 Los cuatro — sobre "son agentes"
El hecho: las personas son ACTOR_DISPLAY strings; Nova asigna actores desde COMPOSABLE_OPS, nunca lee el squad. Es inverso a lo que un crítico espera de un "sistema multi-agente".
Doble filo: es la sofisticación real (las personas siguen al catálogo) y es munición para el crítico ("entonces tus agentes son etiquetas"). El panel coincide: decisión correcta, pero mal contada invita la crítica de n8n.

Peer review ciego

Los argumentos juzgados sin saber de quién son. Es lo que separa un panel de un coro.

A"Es n8n + vector": se apoya en mirar el artefacto de runtime (un DAG con un nodo vectorial). Gap: ignora la capa de composición-y-validación, donde vive la diferencia. Mira la capa equivocada.
B"El catálogo fijo es andamiaje temporal": elegante, pero asume que el próximo modelo elimina la necesidad de garantías de fiabilidad. En dominios con dinero y aprobaciones, las garantías no son andamiaje que el modelo borre. No demostrado.
C"Sacá el humano del gate": asume una auto-validación del agente que hoy no existe en el sistema (no hay eval offline). Gap lógico: quita la red antes de tejer la otra.
D"Hueco operacional: motor CLI-Max, sin RLS, sin SLO de calidad": se apoya en evidencia concreta de archivos. Es la crítica con mejor base empírica de la sesión.

🎯 Veredicto del moderador

¿Es "una plantilla de n8n con un nodo de vector y ya"? No — y la razón es precisa, no defensiva. n8n es un flujo dibujado a mano (nivel 1). Agent Squad genera el flujo desde lenguaje natural y lo valida formalmente contra un catálogo, con separación composición/validación/ejecución, gate con fallback:'fail' e inversión identidad↔capacidad. Es categóricamente otra cosa. El crítico está mirando la capa de ejecución y sacando conclusiones sobre la de diseño.

Pero el panel es honesto en dónde la crítica pica: (1) si solo mirás el runtime, sí se parece a correr un workflow — la distancia con n8n vive en composición y gobernanza, no en ejecución; por eso la defensa nunca es enseñar el DAG, es enseñar cómo se generó. (2) La sofisticación está donde NO la critican (composición-validada, inversión catálogo↔personas, derivación del squad desde el trabajo) y no donde sí (que exista un DAG, que exista un vector). (3) Los huecos de Charity son reales y preceden esta sesión.

La acusación es técnicamente ignorante del proceso, pero es un regalo: te dice exactamente qué historia no estás contando y qué flancos operacionales siguen abiertos.

El marcador honesto

1
Sólida
Harrison: desmonta la acusación
2
Trade-offs
Boris y Embiricos: defendibles
1
Roadmap
Charity: huecos operacionales
8
Compromisos
que salen de la sesión

Acta — los 8 compromisos

"No es n8n — es un compositor-validador de planes sobre un catálogo determinista, que es una categoría más difícil y más interesante. Lo construido aguanta el cuestionamiento de diseño. Lo que no aguanta todavía es el de operación. Y lo que invita a la crítica es cómo se cuenta: el DAG al frente, en vez de la composición."

— Cierre del moderador · Master-Arq