Ejecutamos una tarea compleja: un análisis del repo de LangChain con cinco modelos Claude
Anthropic acaba de lanzar Claude Fable. Queríamos una respuesta real a una pregunta práctica:
Si ejecutas la misma tarea de ingeniería compleja en Opus, Fable, Sonnet y Haiku, ¿qué obtienes realmente?
No un puntaje de benchmark. No una impresión superficial. Una auditoría completa de nivel principal engineer de un monorepo de código abierto en producción, con evidencia, etiquetas de severidad y un plan de ejecución.
Ejecutamos ese experimento dentro de CTRL NODE: un prompt, cinco agentes, cinco modelos, un repositorio clonado.
1. El objetivo: una tarea difícil, cinco modelos
Qué probamos
Dimos a cada modelo el mismo prompt de auditoría de cuatro fases y el mismo objetivo: el monorepo de Python de LangChain (un ecosistema de librería grande y maduro, no un repo de juguete).
El prompt pide:
- Mapa del repositorio — explorar primero, juzgar después
- Informe de auditoría — arquitectura, seguridad, tests, rendimiento, dependencias, DX, documentación (con citas
file:line) - Estrategia de mejora — temas, trade-offs, criterios medibles de "hecho"
- Plan de tareas — hitos M0–M3, quick wins, esfuerzo/riesgo/dependencias en cada ítem
Todo hallazgo debe estar basado en evidencia. Adivinar está explícitamente prohibido.
Esa es una tarea genuinamente pesada: miles de archivos, configuraciones de CI reales, rutas de deserialización sensibles a la seguridad y módulos god-class en rutas de código críticas. Es el tipo de trabajo que normalmente se reparte entre varios ingenieros senior.
Por qué Fable frente al resto
Fable se posiciona como un modelo de razonamiento sólido para trabajo largo y estructurado. Lo incluimos junto a:
| Modelo | Rol en el experimento |
|---|---|
| Claude Opus 4.8 | Nivel premium — línea base de threat modeling |
| Claude Fable 5 | Nivel nuevo — estrategia y planificación de ejecución |
| Claude Sonnet 5 | Sonnet actual — pase de auditoría principal |
| Claude Sonnet 4.6 | Sonnet anterior — lente de ops / CI |
| Claude Haiku 4.5 | Nivel rápido — exploración y mapa |
La hipótesis no era "Fable gana en todo". Era: cada nivel ve cosas distintas, y Fable podría ser el mejor convirtiendo hallazgos en un backlog listo para entregar.
El prompt
El prompt completo vive en nuestro catálogo como langchain-prompt.md. Instrucción central (abreviada):
You are a world-class, principal-engineer-level software engineer and technical audit expert.
Perform an in-depth analysis of this code repository, provide an honest audit report,
and offer a prioritized, actionable improvement plan.
Follow four phases in order: Discovery → Audit → Strategy → Task Plan.
All judgments must cite real file paths and line numbers. Do not guess.
Entregables solicitados por ejecución:
audit-report-<model>.md— informe completo en Markdownaudit-report-<model>.html— dashboard interactivo con tema oscuro (pestañas: Overview, Map, Audit, Strategy, Tasks)
Resumen del prompt: resumen-langchain-prompt.md.
2. Cómo lo configuramos en CTRL NODE
No pegamos el prompt en cinco pestañas del navegador. Lo ejecutamos como lo haría un equipo: Bridge en una máquina real, un directorio de trabajo del proyecto apuntando al clon, un agente por nivel de modelo.
Requisitos previos
Bridge (
ctrlnode) instalado y emparejado — ver Bridge setup.Clave de API del SDK de Claude configurada en
~/.ctrlnode/.env(los proveedores se cargan automáticamente, no se necesita el flagPROVIDERS):ANTHROPIC_API_KEY=sk-ant-... BASE_PATH=/home/you/workspaceLangChain clonado en el host de Bridge bajo
BASE_PATH(CTRL NODE no clona el repo por ti; el directorio de trabajo apunta a una carpeta existente).
Proyecto
En la web app: + NEW PROJECT
| Campo | Valor |
|---|---|
| NAME | langchain-audit-experiment |
| AGENT TYPE | Claude |
| WORK DIRECTORY | Browse → seleccionar el clon de LangChain → USE THIS DIRECTORY |
| DESCRIPTION | Benchmark de auditoría con cinco modelos |
El directorio de trabajo es lo que permite a los agentes leer el árbol completo en modo tarea WORK DIRECTORY — el mismo alcance que necesitaría un staff engineer.
Agentes (uno por modelo)
Team → + ADD AGENT — creamos cinco agentes en el mismo proyecto:
| Nombre del agente | Campo MODEL | Propósito |
|---|---|---|
audit-opus |
claude-opus-4-8 |
Revisión de amenazas y diseño |
audit-fable |
claude-fable-5 |
Estrategia y plan de tareas |
audit-sonnet-5 |
claude-sonnet-5 |
Auditoría principal |
audit-sonnet-46 |
claude-sonnet-4-6 |
Pase de CI / ops |
audit-haiku |
claude-haiku-4-5 |
Mapa rápido |
Los modelos se seleccionan en el combobox MODEL (sincronizado desde Bridge cuando está online) o se escriben manualmente. Fable aparece como claude-fable-5 en el manifiesto de modelos de Bridge (v2026.2.4+).
Las AGENT SYSTEM INSTRUCTIONS opcionales se dejaron mínimas — queríamos que el prompt de la tarea llevara la especificación, no que hubiera deriva de persona por agente.
3. Cómo ejecutamos el prompt
Para cada agente, el mismo procedimiento:
- + NEW TASK en el proyecto
- TITLE:
LangChain principal audit — <model> - INSTRUCTIONS: pegar el contenido completo de
langchain-prompt.md - ASSIGN TO AGENT: elegir el chip del agente correspondiente
- OUTPUT MODE: WORK DIRECTORY (alcance completo del repo; rutas de foco opcionales dejadas vacías)
- NEW TASK → la tarea aterriza en Backlog
- RUN → se despacha a Bridge → el agente pasa a In progress
Bridge entrega la tarea con repositoryPaths y contexto de despacho de repo, de modo que el SDK de Claude se ejecuta contra el árbol de LangChain en disco. Los outputs (audit-report-*.md / .html) se recolectaron del directorio de trabajo del agente y se copiaron a nuestra carpeta de catálogo de marketing.
Consejo para reproducibilidad: usa el mismo commit SHA en cada ejecución. Nuestros informes referencian master de LangChain en 2b47357 donde se indica.
4. Qué devolvió Fable
Fable calificó el repo con A− — la misma calibración que Opus, más honesta que la A que Haiku se autoadjudicó.
Resumen ejecutivo (Fable)
Top 3 riesgos
- Concentración de complejidad — cinco archivos superan las 1.800 líneas;
runnables/base.pytiene 6.574 LOC. Alto radio de impacto en cada ruta de invoke/stream. - Deserialización insegura por defecto —
langchain_core.loadusa por defectoallowed_objects='core', documentado como inseguro para manifiestos no confiables. Existen opciones seguras, pero son opt-in. - Escapes de type-safety — 208 comentarios
type: ignoresolo enlangchain-core;disallow_any_generics=falsedebilita el contrato de la API pública.
Top 3 oportunidades
- Cambiar el valor por defecto de deserialización a una lista permitida segura (
'messages') en la próxima versión mayor. - Resolver los TODOs de lint pendientes (
BLE,ANN401,ERA) — la infraestructura de enforcement ya existe. - Descomponer los principales archivos god-file detrás de fachadas públicas sin cambios (cero ruptura de API).
Qué destacó
El diferenciador de Fable no fue una toma más candente sobre titulares de seguridad. Fue la Fase 3 y la Fase 4:
- Cuatro temas estratégicos (complejidad, guardrails desactivados, límites de confianza seguros por defecto, higiene del workspace)
- No-objetivos explícitos (p. ej., no reescribir el
mustache.pyvendorizado en este ciclo — añadir tests de propiedades en su lugar) - Hitos M0–M3 con etiquetas de carga de trabajo (S/M/L/XL), riesgo, dependencias y criterios de aceptación
- Quick wins que podrías entregar en una tarde (
.gitignorepara artefactos de auditoría,logger.debugen elAttributeErrorsilenciado encallbacks/usage.py, ratchet de CI sobre el conteo detype: ignore)
Hallazgos casi exclusivos de Fable:
- Motor Mustache vendorizado de 704 líneas (
mustache.py) con su propia superficie de seguridad - Lint de complejidad McCabe C90 explícitamente deshabilitado — sin contrapresión automatizada sobre el crecimiento de god-files
- Cobertura de tests delgada frente a la complejidad de
langchain_v1/agents/factory.py(56 archivos de test frente a una factory de 1.891 líneas)
Qué no enfatizó Fable
Fable no sacó a la luz varios problemas que otros modelos sí detectaron:
- TOCTOU / DNS rebinding en rutas SSRF (Opus)
- Ejecución de host por defecto en ShellToolMiddleware (Opus)
- Transporte SSRF adoptado en solo dos call sites + fetch desprotegido en
graph_mermaid.py(Sonnet 5) - Chequeo de lockfile comentado en el CI
_lint.yml(Sonnet 4.6) - Ejemplo de modelo roto en el README / falta de
SECURITY.md(Sonnet 4.6)
Esa brecha es el punto: Fable no es un reemplazo de un pipeline multi-modelo.
Informe completo: audit-report-fable.md · Dashboard interactivo: audit-report-fable.html
5. Cómo se comparan los cinco modelos
| Modelo | Nota | Mejor en | Débil en |
|---|---|---|---|
| Opus 4.8 | A− | Threat modeling (TOCTOU, defaults de shell del agente, bypass de env) | Lockfile de CI, load() por defecto, faltantes del README |
| Fable 5 | A− | Estrategia, hitos, quick wins, deuda de ingeniería | Amenazas específicas del agente, mapa de adopción SSRF |
| Sonnet 5 | B+ | Infraestructura SSRF vs adopción, except silencioso, higiene del repo |
CI de lockfile, README, SECURITY.md |
| Sonnet 4.6 | B+ | Ops: CI de lockfile, valor por defecto de load(), documentación de onboarding |
Análisis de adopción SSRF más reciente |
| Haiku 4.5 | A* | Mapa rápido de LOC, ciclos de callback, traductores duplicados | *Nota inflada; error factual sobre lockfile en CI |
*La A de Haiku luce segura en el papel. Verificarla contra Sonnet 4.6 mostró una afirmación incorrecta sobre la validación de lockfile en CI.
Matriz de hallazgos exclusivos (selección)
| Hallazgo | Op | Fb | S5 | S4.6 | Hk |
|---|---|---|---|---|---|
| TOCTOU / DNS rebinding | ✓ | — | — | — | — |
| Shell host por defecto | ✓ | — | — | — | — |
| Transporte SSRF ~2 call sites | — | — | ✓ | — | — |
graph_mermaid.py sin SSRF |
— | — | ✓ | — | — |
load() por defecto inseguro |
— | ✓ | — | ✓ | — |
| Plan M0–M3 + no-objetivos | — | ✓ | — | — | — |
mustache.py / C90 desactivado |
— | ✓ | — | — | — |
| Lockfile CI comentado | — | — | — | ✓ | ✗ incorrecto |
| Ciclos de callback/tracer | — | — | — | — | ✓ |
El pipeline que realmente usaríamos
Haiku → fast map & architecture hotspots
Sonnet 5 → primary audit + security adoption gaps
Sonnet 4.6 → CI, docs, onboarding landmines
Opus → threat review for agent-facing surfaces
Fable → merge into one prioritized backlog
Human → verify _lint.yml, load.py, README in your checkout
Ningún modelo por sí solo reemplaza esta cadena. Pagar solo por Opus, o solo por Fable, deja puntos ciegos.
Análisis en profundidad: comparison-models-report.md
Presentación de diapositivas para la historia
También construimos una presentación de 14 diapositivas para videos explicativos: model-comparison-presentation.html (←/→ para navegar, F pantalla completa).
6. Qué significa esto para los usuarios de CTRL NODE
- La elección de modelo es una decisión de flujo de trabajo, no un capricho de nivel premium. Usa Haiku para explorar, Sonnet para auditar, Opus para amenazas, Fable para planificar — en el mismo proyecto y directorio de trabajo.
- El modo WORK DIRECTORY importa para tareas como esta. Un sandbox de solo salida no habría producido citas file:line a través de CI, core y paquetes de terceros.
- Fable se gana un lugar después del descubrimiento, no en lugar de Sonnet u Opus. Su nota A− igualó a Opus; la forma de su entregable (hitos, ratchets, no-objetivos) fue la más accionable.
- Repite el experimento en tu propio repo — clona bajo el
BASE_PATHde Bridge, apunta un proyecto de Claude a él, duplica la tarea cinco veces con distintos valores deMODEL.
7. Referencias — todos los artefactos
El experimento completo — cada prompt, cada informe por modelo y el deck de comparación — se publica a continuación como material de apoyo para este artículo.
Prompt
| Archivo | Descripción |
|---|---|
langchain-prompt.md |
Prompt completo de auditoría de cuatro fases (inglés) |
resumen-langchain-prompt.md |
Resumen del prompt (español) |
Informes por modelo
| Modelo | Markdown | Dashboard HTML |
|---|---|---|
| Claude Fable 5 | audit-report-fable.md |
audit-report-fable.html |
| Claude Opus 4.8 | audit-report-opus.md |
audit-report-opus.html |
| Claude Sonnet 5 | audit-report-sonnet-5.md |
audit-report-sonnet-5.html |
| Claude Sonnet 4.6 | audit-report-sonnet-4-6.md |
audit-report-sonnet-4-6.html |
| Claude Haiku 4.5 | audit-report-haiku.md |
audit-report-haiku.html |
El prompt pide a cada modelo outputs emparejados en
.md+.html. Todos los modelos de este lote produjeron ambos formatos.
Comparación y medios
| Archivo | Descripción |
|---|---|
comparison-models-report.md |
Comparación escrita completa de los cinco modelos |
model-comparison-presentation.html |
Presentación animada de 14 diapositivas (Op · Fb · S5 · S4.6 · Hk) |
Pruébalo tú mismo
- Empieza gratis — crea un proyecto de Claude y empareja Bridge.
- Clona el repo que te interese en la máquina de Bridge; configura WORK DIRECTORY.
- Registra agentes con distintos valores de MODEL (
claude-fable-5,claude-opus-4-8, …). - Pega el prompt de auditoría en INSTRUCTIONS, asigna, RUN, compara los resultados.
¿Preguntas o quieres que ejecutemos esto en tu stack? info@ctrlnode.ai
Fecha del experimento: 17 de junio de 2026 · CTRL NODE — orquesta Claude, Copilot, Gemini, Cursor y más desde un único panel de control.