<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ricardo Lara</title>
    <description>The latest articles on DEV Community by Ricardo Lara (@riclara).</description>
    <link>https://dev.to/riclara</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3837342%2F103f0f59-1623-47ec-b28b-ad7ee3abffa3.jpg</url>
      <title>DEV Community: Ricardo Lara</title>
      <link>https://dev.to/riclara</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/riclara"/>
    <language>en</language>
    <item>
      <title>FinancialClaw: making OpenClaw useful for personal finance</title>
      <dc:creator>Ricardo Lara</dc:creator>
      <pubDate>Fri, 03 Apr 2026 21:50:37 +0000</pubDate>
      <link>https://dev.to/riclara/financialclaw-making-openclaw-useful-for-personal-finance-6i6</link>
      <guid>https://dev.to/riclara/financialclaw-making-openclaw-useful-for-personal-finance-6i6</guid>
      <description>&lt;p&gt;We often talk about AI agents as if their greatest value lies in understanding natural language. But understanding isn't enough. An agent starts becoming truly useful when it can help with concrete tasks, reduce friction, and do so consistently.&lt;/p&gt;

&lt;p&gt;FinancialClaw was born from exactly that idea. I wanted OpenClaw to do more than just chat about personal finance — I wanted it to help me manage it: log expenses, record income, handle recurring payments, and query summaries without relying on memory, scattered notes, or repetitive manual steps. From the start, the project took a clear direction: a personal tool with local persistence, designed for daily use, and with multi-currency support.&lt;/p&gt;

&lt;p&gt;What's interesting is that this usefulness didn't come simply from adding more features. It emerged from combining natural language with clear rules, predictable operations, and local storage. In other words: let the agent interpret the intent, but don't improvise the logic that actually matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real problem
&lt;/h2&gt;

&lt;p&gt;Managing personal finances doesn't usually fail because it's hard to understand. It fails because of friction.&lt;/p&gt;

&lt;p&gt;Logging expenses feels tedious. Recording income gets postponed. Recurring payments are forgotten. And when you want to know how much you've spent this month or what income you've received, you end up piecing it together from different places.&lt;/p&gt;

&lt;p&gt;That was exactly what I wanted to avoid with FinancialClaw. I wasn't interested in building another tool that just talked about finances or answered generic questions. I wanted something capable of turning a conversation into a useful action: log an expense, record income, mark a payment, or query a summary — without breaking the flow.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes FinancialClaw useful
&lt;/h2&gt;

&lt;p&gt;FinancialClaw's usefulness isn't about sounding smart. It's about making everyday tasks easier to execute.&lt;/p&gt;

&lt;p&gt;Logging an expense should be quick. That's why FinancialClaw lets you do it manually or by scanning receipts. The idea wasn't just to capture data, but to bring the recording closer to the moment things actually happen.&lt;/p&gt;

&lt;p&gt;The same applies to income. I didn't want income entries to end up as loose notes, but as part of a history that could later be queried in useful ways. Separating the definition of an income source from its actual receipt made it possible to model that flow better: expecting an income is one thing; recording when it arrived, how much, and on what date is another.&lt;/p&gt;

&lt;p&gt;Then there was the problem of repetition. Subscriptions, services, installments, and periodic payments are part of real life. If a financial tool doesn't help with that, it falls short very quickly. That's why support for recurring expenses was an important part of the project from early on.&lt;/p&gt;

&lt;p&gt;And of course, storing data isn't enough. Real usefulness appears when you can later ask how much you spent this month, what pending transactions you have, or what income you've received — and get answers based on persisted data, calculated consistently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where an agent alone falls short
&lt;/h2&gt;

&lt;p&gt;This is where an idea emerged that I find increasingly important in agentic systems: an agent can interpret intentions, but it shouldn't improvise critical logic.&lt;/p&gt;

&lt;p&gt;In FinancialClaw, that means the agent can recognize that the user wants to log an expense or request a summary. But it shouldn't ambiguously decide how to validate a date, how to calculate a period, or how to format a result. That part needs to be predictable.&lt;/p&gt;

&lt;p&gt;This was one of the clearest lessons from the project. If models are variable by nature, then the way to make them useful for sensitive tasks isn't to ask them to improvise better, but to support them with explicit rules, validations, and well-defined operations. In this case, that translated into data validation, parameterized queries, clear calculations, and consistent results.&lt;/p&gt;

&lt;p&gt;And this matters even more in personal finance. Here, usefulness depends on trust. If the same question produces inconsistent results, or if an invalid date gets saved without an error, the tool loses value very quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it took to make it truly usable
&lt;/h2&gt;

&lt;p&gt;One of the biggest takeaways from this project is that building something useful on top of an agent isn't just about programming the core logic.&lt;/p&gt;

&lt;p&gt;You also have to solve everything else: how it gets installed, how it persists data, how it's configured, how it integrates well with the agent's actual flow, and how to prevent the experience from becoming fragile. There were important decisions early on, like multi-currency support and using &lt;code&gt;XXX&lt;/code&gt; as a placeholder for a currency not yet configured. That helped avoid unnecessary assumptions and made the initial setup process clearer.&lt;/p&gt;

&lt;p&gt;During development, quieter but very important problems also surfaced: validations that existed in types but not at runtime, dates that looked correct but weren't, installation steps that could break the experience, and configuration details that directly affected the tool's real usefulness. Fixing those was key because a financial tool stops being useful the moment it starts accepting ambiguous or incorrect data, or when using it requires more effort than it saves.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;FinancialClaw left me with a fairly simple idea: an agent's usefulness isn't just about what it understands, but about what it lets you do with less friction and more confidence.&lt;/p&gt;

&lt;p&gt;It also left me with something else. In domains with state, clear rules, and real consequences, the agent shouldn't improvise everything. It works better when it interprets the intent but relies on a more predictable layer to validate, persist, calculate, and return consistent results.&lt;/p&gt;

&lt;p&gt;That's why, rather than seeing FinancialClaw just as an OpenClaw extension, I prefer to see it as proof of something more interesting: that an agentic system starts becoming truly useful when conversation stops being the destination and becomes a practical way to operate software.&lt;/p&gt;




&lt;h2&gt;
  
  
  External resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/riclara/financialclaw" rel="noopener noreferrer"&gt;https://github.com/riclara/financialclaw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/financialclaw" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/financialclaw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://clawhub.ai/plugins/financialclaw" rel="noopener noreferrer"&gt;https://clawhub.ai/plugins/financialclaw&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>openclaw</category>
      <category>plugin</category>
      <category>personafinance</category>
      <category>agenticsystems</category>
    </item>
    <item>
      <title>FinancialClaw: haciendo útil a OpenClaw para finanzas personales</title>
      <dc:creator>Ricardo Lara</dc:creator>
      <pubDate>Fri, 03 Apr 2026 21:46:38 +0000</pubDate>
      <link>https://dev.to/riclara/financialclaw-haciendo-util-a-openclaw-para-finanzas-personales-1j1b</link>
      <guid>https://dev.to/riclara/financialclaw-haciendo-util-a-openclaw-para-finanzas-personales-1j1b</guid>
      <description>&lt;p&gt;Muchas veces hablamos de agentes de IA como si su mayor valor estuviera en entender lenguaje natural. Pero entender no basta. Un agente empieza a ser realmente útil cuando puede ayudar con tareas concretas, reducir fricción y hacerlo de forma consistente.&lt;/p&gt;

&lt;p&gt;FinancialClaw nació justo de esa idea. Quería que OpenClaw no solo pudiera conversar sobre finanzas personales, sino ayudarme a gestionarlas: registrar gastos, guardar ingresos, manejar pagos recurrentes y consultar resúmenes sin depender de memoria, notas sueltas o pasos manuales repetitivos. Desde el principio, el proyecto tomó una dirección clara: una herramienta personal, con persistencia local, pensada para el uso diario y con soporte multi-moneda.&lt;/p&gt;

&lt;p&gt;Lo interesante es que esa utilidad no apareció simplemente por añadir nuevas funciones. Apareció al combinar lenguaje natural con reglas claras, operaciones predecibles y almacenamiento local. En otras palabras: dejar que el agente interprete la intención, pero no improvisar la lógica que realmente importa.&lt;/p&gt;

&lt;h2&gt;
  
  
  El verdadero problema
&lt;/h2&gt;

&lt;p&gt;Llevar finanzas personales no suele fallar porque sea difícil de entender. Falla por fricción.&lt;/p&gt;

&lt;p&gt;Registrar gastos da pereza. Anotar ingresos se posterga. Los pagos recurrentes se olvidan. Y cuando uno quiere saber cuánto ha gastado en el mes o qué ingresos ha recibido, termina reconstruyendo todo desde distintos lugares.&lt;/p&gt;

&lt;p&gt;Eso era justamente lo que quería evitar con FinancialClaw. No me interesaba crear otra herramienta que solo hablara de finanzas o respondiera preguntas genéricas. Quería algo capaz de convertir una conversación en una acción útil: registrar un gasto, guardar un ingreso, marcar un pago o consultar un resumen sin romper el flujo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué hace útil a FinancialClaw
&lt;/h2&gt;

&lt;p&gt;La utilidad de FinancialClaw no está en sonar inteligente, sino en hacer que tareas cotidianas se vuelvan más fáciles de ejecutar.&lt;/p&gt;

&lt;p&gt;Registrar un gasto debería ser rápido. Por eso FinancialClaw permite hacerlo manualmente y también apoyarse en recibos. La idea no era solo capturar datos, sino acercar el registro al momento real en que las cosas ocurren.&lt;/p&gt;

&lt;p&gt;Lo mismo pasa con los ingresos. No quería que quedaran como anotaciones sueltas, sino como parte de un historial que luego pudiera consultarse de forma útil. Separar la definición de un ingreso de su recepción real permitió modelar mejor ese flujo: una cosa es esperar un ingreso y otra distinta es registrar cuándo llegó, cuánto llegó y en qué fecha.&lt;/p&gt;

&lt;p&gt;También estaba el problema de lo repetitivo. Suscripciones, servicios, cuotas y pagos periódicos forman parte de la vida real. Si una herramienta financiera no ayuda con eso, termina quedándose corta muy rápido. Por eso el soporte para gastos recurrentes fue parte importante del proyecto desde temprano.&lt;/p&gt;

&lt;p&gt;Y, por supuesto, guardar no basta. La utilidad aparece de verdad cuando luego puedes preguntar cuánto gastaste este mes, qué movimientos tienes pendientes o qué ingresos has recibido, y obtener respuestas sobre datos persistidos y calculados de forma consistente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Donde un agente por sí solo no alcanza
&lt;/h2&gt;

&lt;p&gt;Aquí apareció una idea que me parece cada vez más importante en sistemas agentic: un agente puede interpretar intenciones, pero no debería improvisar lógica crítica.&lt;/p&gt;

&lt;p&gt;En FinancialClaw, eso significa que el agente puede reconocer que el usuario quiere registrar un gasto o pedir un resumen. Pero no debería decidir de forma ambigua cómo validar una fecha, cómo calcular un período o cómo formatear un resultado. Esa parte necesita ser predecible.&lt;/p&gt;

&lt;p&gt;Esa fue una de las lecciones más claras del proyecto. Si los modelos son variables por naturaleza, entonces la forma de volverlos útiles en tareas sensibles no es pedirles que improvisen mejor, sino apoyarlos en reglas explícitas, validaciones y operaciones bien definidas. En este caso, eso se tradujo en validación de datos, consultas parametrizadas, cálculos claros y resultados consistentes.&lt;/p&gt;

&lt;p&gt;Y eso importa todavía más en finanzas personales. Aquí la utilidad depende de la confianza. Si la misma pregunta produce resultados inconsistentes, o si una fecha inválida se guarda sin error, la herramienta pierde valor muy rápido.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lo que costó volverlo realmente usable
&lt;/h2&gt;

&lt;p&gt;Una de las cosas que más me dejó este proyecto es que construir algo útil sobre un agente no consiste solo en programar la lógica principal.&lt;/p&gt;

&lt;p&gt;También hay que resolver todo lo demás: cómo se instala, cómo persiste los datos, cómo se configura, cómo se integra bien con el flujo real del agente y cómo evitar que la experiencia se vuelva frágil. Hubo decisiones importantes desde temprano, como el soporte multi-moneda y el uso de &lt;code&gt;XXX&lt;/code&gt; como placeholder para una moneda aún no configurada. Eso ayudó a evitar supuestos innecesarios y a hacer más claro el proceso inicial de uso.&lt;/p&gt;

&lt;p&gt;Durante el desarrollo también aparecieron problemas más silenciosos, pero muy importantes: validaciones que existían en tipos pero no en ejecución, fechas que parecían correctas pero no lo eran, pasos de instalación que podían romper la experiencia y detalles de configuración que afectaban directamente la utilidad real de la herramienta. Corregir eso fue clave porque una herramienta financiera deja de ser útil en el momento en que empieza a aceptar datos ambiguos o incorrectos, o cuando usarla requiere más esfuerzo del que ahorra.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lo que aprendí
&lt;/h2&gt;

&lt;p&gt;FinancialClaw me dejó una idea bastante simple: la utilidad de un agente no está solo en lo que entiende, sino en lo que permite hacer con menos fricción y más confianza.&lt;/p&gt;

&lt;p&gt;También me dejó algo más. En dominios con estado, reglas claras y consecuencias reales, el agente no debería improvisar todo. Funciona mejor cuando interpreta la intención, pero se apoya en una capa más predecible para validar, persistir, calcular y devolver resultados consistentes.&lt;/p&gt;

&lt;p&gt;Por eso, más que ver FinancialClaw solo como una extensión de OpenClaw, prefiero verlo como una prueba de algo más interesante: que un sistema agentic empieza a volverse realmente útil cuando la conversación deja de ser el destino y se convierte en una forma práctica de operar software.&lt;/p&gt;




&lt;h2&gt;
  
  
  Recursos externos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/riclara/financialclaw" rel="noopener noreferrer"&gt;https://github.com/riclara/financialclaw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/financialclaw" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/financialclaw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://clawhub.ai/plugins/financialclaw" rel="noopener noreferrer"&gt;https://clawhub.ai/plugins/financialclaw&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>openclaw</category>
      <category>finanzaspersonales</category>
      <category>sistemasagentic</category>
      <category>plugin</category>
    </item>
    <item>
      <title>Parte 2: lo que cambió cuando dejé de pensar mi sistema multiagente como idea y empecé a ejecutarlo de verdad</title>
      <dc:creator>Ricardo Lara</dc:creator>
      <pubDate>Sat, 28 Mar 2026 03:04:16 +0000</pubDate>
      <link>https://dev.to/riclara/parte-2-lo-que-cambio-cuando-deje-de-pensar-mi-sistema-multiagente-como-idea-y-empece-a-ejecutarlo-77p</link>
      <guid>https://dev.to/riclara/parte-2-lo-que-cambio-cuando-deje-de-pensar-mi-sistema-multiagente-como-idea-y-empece-a-ejecutarlo-77p</guid>
      <description>&lt;p&gt;En la primera parte conté por qué terminé construyendo un flujo multiagente en vez de seguir empujando todo dentro de una sola conversación. La idea seguía teniendo sentido: separar responsabilidades, usar modelos distintos según la fase y mantener aprobación humana antes de implementar me daba más orden, mejor coste y menos ruido.&lt;/p&gt;

&lt;p&gt;Pero ahí todavía estaba resolviendo el problema conceptual.&lt;/p&gt;

&lt;p&gt;Esta segunda etapa fue distinta. Ya no se trataba de defender la idea, sino de ejecutarla de verdad. Y fue ahí donde aparecieron los problemas que no se ven en un diagrama ni en una buena narrativa: permisos, sistemas de IA que no se comportan igual, procesos que necesitan una terminal interactiva real, configuración que envejece mal y decisiones de orquestación que en papel suenan bien, pero en la práctica no alcanzan.&lt;/p&gt;

&lt;h2&gt;
  
  
  El cambio más importante: dejé de pensar en un pipeline y empecé a pensar en un runtime
&lt;/h2&gt;

&lt;p&gt;Creo que la mejor forma de explicar esta evolución es esta: &lt;code&gt;agentflow&lt;/code&gt; dejó de ser solo una forma de organizar prompts, archivos y pasos, y empezó a convertirse en un runtime explícito.&lt;/p&gt;

&lt;p&gt;Eso cambió bastante mi forma de verlo.&lt;/p&gt;

&lt;p&gt;Antes la configuración describía más qué había que generar. Ahora describe cómo corre cada rol: qué proveedor usa, qué modelo, qué nivel de esfuerzo, qué sandbox y qué prompt lo gobierna. Ya no es solo una herramienta para “montar un flujo”, sino una base para ejecutar roles de verdad con más control.&lt;/p&gt;

&lt;p&gt;Ese cambio es importante porque me hizo ver algo que antes no estaba tan claro: separar bien los roles no basta. También necesitas el runtime que haga viable esa separación.&lt;/p&gt;

&lt;h2&gt;
  
  
  La ejecución real fue la que mostró dónde estaba el hueco
&lt;/h2&gt;

&lt;p&gt;El hallazgo más claro de esta etapa fue bastante simple y bastante brutal: los agentes no podían escribir archivos de forma autónoma.&lt;/p&gt;

&lt;p&gt;No porque faltara diseño. El campo &lt;code&gt;sandbox&lt;/code&gt; ya existía y la intención estaba bien planteada. El problema era más incómodo: el adaptador de Claude no estaba traduciendo esa intención a los flags reales del CLI. Entonces el sistema corría, pero se bloqueaba pidiendo permisos para cada escritura.&lt;/p&gt;

&lt;p&gt;Ese fue uno de esos momentos que te obligan a aterrizar. Porque ahí entiendes que “el sistema corre” y “el sistema funciona” no son la misma cosa.&lt;/p&gt;

&lt;p&gt;El fix fue directo, pero la lección fue más importante que el fix. Para Claude Code hubo que traducir &lt;code&gt;workspace-write&lt;/code&gt; a &lt;code&gt;--dangerously-skip-permissions&lt;/code&gt; y &lt;code&gt;read-only&lt;/code&gt; a &lt;code&gt;--permission-mode plan&lt;/code&gt;. Codex ya resolvía mejor ese lado con &lt;code&gt;--sandbox workspace-write&lt;/code&gt;. OpenCode, en cambio, sigue teniendo una limitación más estructural porque su CLI no expone un flag equivalente.&lt;/p&gt;

&lt;p&gt;Ese problema no lo descubres afinando prompts. Lo descubres ejecutando.&lt;/p&gt;

&lt;h2&gt;
  
  
  También me quedó claro que orquestar no es lo mismo que delegar
&lt;/h2&gt;

&lt;p&gt;Otra cosa que esta etapa dejó muy clara fue que el orquestador que yo tenía en mente todavía no estaba cerrando bien la última milla.&lt;/p&gt;

&lt;p&gt;En teoría, &lt;code&gt;agentflow run&lt;/code&gt; ya existía y ya tenía una lógica de secuenciación. Pero en la práctica, cuando Claude Code, Codex u OpenCode participaban en una sesión real, ese comando no bastaba. Los bootstrap skills eran demasiado superficiales. Básicamente delegaban y ya. No daban contexto suficiente para decidir cuándo parar, qué pasos correr, cómo manejar el review loop o cuándo pedir aprobación humana.&lt;/p&gt;

&lt;p&gt;Ahí fue cuando se me hizo evidente algo que ahora ya me parece obvio: no hay un solo modo correcto de orquestación.&lt;/p&gt;

&lt;p&gt;El modo CLI tiene sentido para automatización, CI y ejecución determinista. Pero una sesión interactiva necesita otra cosa. Necesita que el agente tenga criterio para clasificar la tarea, presentar un plan, esperar aprobación antes de implementar y decidir cómo avanzar según el contexto. Intentar que un mismo mecanismo sirviera tanto para automatización y CI como para una sesión interactiva con criterio y aprobación humana generaba más fricción de la que resolvía.&lt;/p&gt;

&lt;h2&gt;
  
  
  No toda tarea merece el pipeline completo
&lt;/h2&gt;

&lt;p&gt;Otra mejora que me parece realmente importante en esta etapa fue aterrizar por fin el &lt;code&gt;classifier&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;En la parte 1 ya estaba la intuición de que no todas las tareas deberían costar lo mismo. Pero todavía era más una tesis que una capacidad real del sistema.&lt;/p&gt;

&lt;p&gt;Ahora sí hay un rol que clasifica la complejidad como &lt;code&gt;small&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt; o &lt;code&gt;large&lt;/code&gt;, y eso cambia el flujo. Un cambio pequeño no tiene por qué pasar por toda la ceremonia. Una tarea mayor sí justifica pipeline completo, review loop y posibles ajustes de modelo. Además, si el proyecto viene de una configuración vieja y no tiene todavía ese rol, el sistema no se rompe: cae en un fallback heurístico y sigue funcionando.&lt;/p&gt;

&lt;p&gt;Esto me gusta porque mueve la optimización al lugar correcto. No después de gastar tiempo y tokens, sino antes.&lt;/p&gt;

&lt;p&gt;Y dicho más simple: no tiene sentido tratar un bug pequeño como si fuera una migración compleja.&lt;/p&gt;

&lt;h2&gt;
  
  
  Los proveedores no son intercambiables
&lt;/h2&gt;

&lt;p&gt;También me ayudó mucho esta etapa para bajarme de una simplificación que en abstracto es tentadora: pensar que todos los proveedores de IA son más o menos lo mismo.&lt;/p&gt;

&lt;p&gt;No lo son.&lt;/p&gt;

&lt;p&gt;Cuando hablo de un proveedor de IA, me refiero al sistema externo que ejecuta una tarea concreta dentro del flujo. Puede ser Claude, Codex u otro. Es, básicamente, el servicio al que le delego trabajo en una fase del proceso.&lt;/p&gt;

&lt;p&gt;Y cuando llevé esto a ejecución real, quedó claro que esos proveedores no se comportan todos igual. Cambian los permisos, la forma en que se integran, cómo manejan los procesos e incluso cómo esperan ejecutarse.&lt;/p&gt;

&lt;p&gt;En algunos casos, además, no basta con lanzar un comando y esperar una respuesta. Hay herramientas que necesitan correr dentro de una terminal interactiva real, como si estuvieran abiertas directamente en consola. A eso normalmente se le llama TTY, pero dicho en lenguaje simple significa esto: la herramienta necesita una consola “de verdad” para funcionar bien.&lt;/p&gt;

&lt;p&gt;Eso fue lo que me llevó a usar estrategias distintas según el proveedor. Para algunos casos funcionaba bien una ejecución basada en pipes. Para Codex, en cambio, terminé necesitando PTY real con &lt;code&gt;node-pty&lt;/code&gt;, porque su interfaz puede fallar o quedarse colgada si no corre en una terminal interactiva de verdad.&lt;/p&gt;

&lt;p&gt;Parece un detalle menor, pero no lo es. Porque trabajar con agentes no es solo trabajar con texto: también es trabajar con procesos, permisos, terminales y errores reales. Y si eso no se diseña bien, el sistema se siente frágil aunque la idea sea buena.&lt;/p&gt;

&lt;h2&gt;
  
  
  Varias mejoras útiles no fueron vistosas, pero sí necesarias
&lt;/h2&gt;

&lt;p&gt;También hubo mejoras menos llamativas, pero bastante más importantes de lo que parecen.&lt;/p&gt;

&lt;p&gt;Una fue dejar de depender de un &lt;code&gt;testRunner&lt;/code&gt; rígido en el config. Ese tipo de campo envejece mal. Cambias el proyecto, cambias el runner o cambias el stack, y terminas cargando una instrucción vieja. Me pareció mucho mejor permitir que el tester lo detecte desde el propio proyecto cuando no está definido.&lt;/p&gt;

&lt;p&gt;No son cambios vistosos, pero sí son de esos que hacen que una herramienta deje de sentirse rígida.&lt;/p&gt;

&lt;h2&gt;
  
  
  Todavía no todo está cerrado, pero ya estamos en el tipo correcto de problemas
&lt;/h2&gt;

&lt;p&gt;No quiero contar esta etapa como si todo hubiera quedado perfecto, porque no sería verdad.&lt;/p&gt;

&lt;p&gt;Todavía hay pendientes. La suite de tests ya pasa, pero todavía no cubre de forma profunda todo el contrato runtime-first, sobre todo la ejecución real de adapters, &lt;code&gt;agent run&lt;/code&gt; y el classifier. La documentación ya está bastante más alineada con el runtime actual, pero OpenCode sigue teniendo una limitación real con el sandbox que no depende solo de &lt;code&gt;agentflow&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Pero, sinceramente, esos ya me parecen problemas sanos.&lt;/p&gt;

&lt;p&gt;Porque ya no estoy discutiendo si la idea tiene sentido. Ya no estoy en la etapa de justificar la tesis. Ahora estoy en la etapa de cerrar gaps concretos: compatibilidad, documentación, robustez y consistencia de ejecución.&lt;/p&gt;

&lt;p&gt;Y prefiero mucho más estar ahí.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lo que realmente me dejó esta parte 2
&lt;/h2&gt;

&lt;p&gt;Si la parte 1 era sobre por qué un sistema multiagente tenía más sentido que una sola conversación gigante, esta parte 2 es sobre otra cosa: qué pasa cuando esa idea sale del papel y se encuentra con la realidad.&lt;/p&gt;

&lt;p&gt;Ahí fue donde aparecieron los huecos de verdad: permisos, orquestación efectiva, complejidad, proveedores que no se comportan igual, procesos, defaults frágiles y trazas.&lt;/p&gt;

&lt;p&gt;La idea original no se cayó. De hecho, para mí salió fortalecida.&lt;/p&gt;

&lt;p&gt;Pero ahora la veo de forma más completa: una arquitectura multiagente no está lista solo porque se vea bien en el diseño. Está lista cuando puede ejecutar de verdad sin romperse en cosas básicas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cierre
&lt;/h2&gt;

&lt;p&gt;La primera versión me enseñó a separar responsabilidades.&lt;/p&gt;

&lt;p&gt;Esta segunda etapa me obligó a construir el runtime que hace viable esa separación.&lt;/p&gt;

&lt;p&gt;Y la ejecución real me terminó enseñando lo más importante: entre “esto corre” y “esto funciona como debería” hay una distancia grande. Esa distancia no se cierra con más teoría. Se cierra ejecutando, observando dónde falla y corrigiendo con cambios concretos.&lt;/p&gt;

&lt;p&gt;Eso, para mí, es lo que realmente cuenta de esta segunda parte.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recursos externos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/riclara/agentflow" rel="noopener noreferrer"&gt;https://github.com/riclara/agentflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/@riclara/agentflow" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@riclara/agentflow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>architecture</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>Part 2: what changed when I stopped treating my multi-agent system as an idea and started running it for real</title>
      <dc:creator>Ricardo Lara</dc:creator>
      <pubDate>Sat, 28 Mar 2026 03:02:00 +0000</pubDate>
      <link>https://dev.to/riclara/part-2-what-changed-when-i-stopped-treating-my-multi-agent-system-as-an-idea-and-started-running-m3a</link>
      <guid>https://dev.to/riclara/part-2-what-changed-when-i-stopped-treating-my-multi-agent-system-as-an-idea-and-started-running-m3a</guid>
      <description>&lt;p&gt;In the first part, I explained why I ended up building a multi-agent flow instead of continuing to push everything into a single conversation. The idea still made sense: separating responsibilities, using different models depending on the phase, and keeping human approval before implementation gave me more order, better cost control, and less noise.&lt;/p&gt;

&lt;p&gt;But at that stage I was still solving the conceptual problem.&lt;/p&gt;

&lt;p&gt;This second stage was different. It was no longer about defending the idea, but about actually running it. And that was where the problems appeared that do not show up in a diagram or in a strong narrative: permissions, AI systems that do not behave the same way, processes that need a real interactive terminal, configuration that ages badly, and orchestration decisions that sound good on paper but do not hold up in practice.&lt;/p&gt;

&lt;h2&gt;
  
  
  The biggest change: I stopped thinking in terms of a pipeline and started thinking in terms of a runtime
&lt;/h2&gt;

&lt;p&gt;I think the best way to explain this evolution is this: &lt;code&gt;agentflow&lt;/code&gt; stopped being just a way to organize prompts, files, and steps, and started becoming an explicit runtime.&lt;/p&gt;

&lt;p&gt;That changed the way I saw it.&lt;/p&gt;

&lt;p&gt;Before, the configuration described more of what had to be generated. Now it describes how each role runs: which provider it uses, which model, which effort level, which sandbox, and which prompt governs it. It is no longer just a tool to assemble a flow, but a base for running real roles with more control.&lt;/p&gt;

&lt;p&gt;That shift matters because it made me see something that was not fully clear before: separating roles well is not enough. You also need the runtime that makes that separation viable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real execution was what showed where the gap actually was
&lt;/h2&gt;

&lt;p&gt;The clearest finding of this stage was simple and brutal: the agents could not write files autonomously.&lt;/p&gt;

&lt;p&gt;Not because the design was missing. The &lt;code&gt;sandbox&lt;/code&gt; field already existed and the intent was correct. The problem was more uncomfortable: the Claude adapter was not translating that intent into the real CLI flags. So the system ran, but it kept getting blocked asking for permission on every write.&lt;/p&gt;

&lt;p&gt;That was one of those moments that forces you to land the idea in reality. Because that is when you understand that a system running and a system working are not the same thing.&lt;/p&gt;

&lt;p&gt;The fix was direct, but the lesson mattered more than the fix. For Claude Code I had to translate &lt;code&gt;workspace-write&lt;/code&gt; into &lt;code&gt;--dangerously-skip-permissions&lt;/code&gt; and &lt;code&gt;read-only&lt;/code&gt; into &lt;code&gt;--permission-mode plan&lt;/code&gt;. Codex already handled that side more cleanly with &lt;code&gt;--sandbox workspace-write&lt;/code&gt;. OpenCode, on the other hand, still has a more structural limitation because its CLI does not expose an equivalent flag.&lt;/p&gt;

&lt;p&gt;You do not discover that problem by refining prompts. You discover it by running the system.&lt;/p&gt;

&lt;h2&gt;
  
  
  It also became clear that orchestration is not the same as delegation
&lt;/h2&gt;

&lt;p&gt;Another thing this stage made very clear was that the orchestrator I had in mind was still not closing the last mile well enough.&lt;/p&gt;

&lt;p&gt;In theory, &lt;code&gt;agentflow run&lt;/code&gt; already existed and already had sequencing logic. But in practice, when Claude Code, Codex, or OpenCode were participating in a real session, that command was not enough. The bootstrap skills were too shallow. They mostly delegated and stopped there. They did not provide enough context to decide when to stop, which steps to run, how to handle the review loop, or when to ask for human approval.&lt;/p&gt;

&lt;p&gt;That was when something became obvious that now feels self-evident: there is no single correct mode of orchestration.&lt;/p&gt;

&lt;p&gt;CLI mode makes sense for automation, CI, and deterministic execution. But an interactive session needs something else. It needs the agent to have judgment to classify the task, present a plan, wait for approval before implementing, and decide how to move forward based on context. Trying to force the same mechanism to work both for automation and CI and for an interactive session with judgment and human approval created more friction than it removed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Not every task deserves the full pipeline
&lt;/h2&gt;

&lt;p&gt;Another improvement that feels genuinely important in this stage was finally grounding the &lt;code&gt;classifier&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In part 1, the intuition was already there: not every task should cost the same. But it was still more of a thesis than a real system capability.&lt;/p&gt;

&lt;p&gt;Now there is a role that classifies complexity as &lt;code&gt;small&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt;, or &lt;code&gt;large&lt;/code&gt;, and that changes the flow. A small change does not need to go through the full ceremony. A larger task does justify the complete pipeline, a review loop, and possible model adjustments. And if a project comes from an older configuration and does not yet have that role, the system does not break: it falls back to a heuristic path and keeps running.&lt;/p&gt;

&lt;p&gt;I like this because it moves optimization to the right place. Not after spending time and tokens, but before.&lt;/p&gt;

&lt;p&gt;Put more simply: it makes no sense to treat a small bug like a complex migration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Providers are not interchangeable
&lt;/h2&gt;

&lt;p&gt;This stage also helped me let go of a simplification that is tempting in the abstract: thinking that all AI providers are more or less the same.&lt;/p&gt;

&lt;p&gt;They are not.&lt;/p&gt;

&lt;p&gt;When I talk about an AI provider, I mean the external system that executes a specific task inside the flow. It can be Claude, Codex, or something else. It is basically the service I delegate work to in one phase of the process.&lt;/p&gt;

&lt;p&gt;And once I pushed this into real execution, it became clear that these providers do not behave in the same way. Permissions change, integration styles change, process handling changes, and even the way they expect to be run changes.&lt;/p&gt;

&lt;p&gt;In some cases, it is also not enough to launch a command and wait for a response. Some tools need to run inside a real interactive terminal, as if they were opened directly in the console. That is usually called a TTY, but in plain language it means this: the tool needs a real terminal to work properly.&lt;/p&gt;

&lt;p&gt;That is what pushed me toward different execution strategies depending on the provider. For some cases, a pipe-based execution worked fine. For Codex, I ended up needing a real PTY with &lt;code&gt;node-pty&lt;/code&gt;, because its interface can fail or hang if it does not run in a genuinely interactive terminal.&lt;/p&gt;

&lt;p&gt;It sounds like a minor detail, but it is not. Because working with agents is not only about working with text. It is also about processes, permissions, terminals, and real errors. And if that is not designed well, the whole system feels fragile even if the core idea is strong.&lt;/p&gt;

&lt;h2&gt;
  
  
  Several useful improvements were not flashy, but they were necessary
&lt;/h2&gt;

&lt;p&gt;There were also less visible improvements that mattered more than they seem.&lt;/p&gt;

&lt;p&gt;One was stopping the dependency on a rigid &lt;code&gt;testRunner&lt;/code&gt; field in the config. That kind of field ages badly. You change the project, change the runner, or change the stack, and you end up carrying stale instructions. It felt much better to let the tester detect that from the project itself when the field is not defined.&lt;/p&gt;

&lt;p&gt;These are not flashy changes, but they are the kind that make a tool stop feeling rigid.&lt;/p&gt;

&lt;h2&gt;
  
  
  Not everything is closed yet, but these are the right problems to have
&lt;/h2&gt;

&lt;p&gt;I do not want to describe this stage as if everything were already perfect, because that would not be true.&lt;/p&gt;

&lt;p&gt;There are still open gaps. The test suite passes, but it still does not cover the runtime-first contract deeply enough, especially around real adapter execution, &lt;code&gt;agent run&lt;/code&gt;, and the classifier. The documentation is already much more aligned with the current runtime, but OpenCode still has a real sandbox limitation that does not depend only on &lt;code&gt;agentflow&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But honestly, those already feel like healthy problems.&lt;/p&gt;

&lt;p&gt;Because I am no longer debating whether the idea makes sense. I am no longer in the phase of defending the thesis. I am now in the phase of closing concrete gaps: compatibility, documentation, robustness, and execution consistency.&lt;/p&gt;

&lt;p&gt;And I strongly prefer being there.&lt;/p&gt;

&lt;h2&gt;
  
  
  What part 2 really left me with
&lt;/h2&gt;

&lt;p&gt;If part 1 was about why a multi-agent system made more sense than one giant conversation, part 2 is about something else: what happens when that idea leaves the page and meets reality.&lt;/p&gt;

&lt;p&gt;That was where the real gaps showed up: permissions, effective orchestration, complexity management, providers that do not behave the same, processes, fragile defaults, and traces.&lt;/p&gt;

&lt;p&gt;The original idea did not collapse. If anything, it came out stronger.&lt;/p&gt;

&lt;p&gt;But now I see it more completely: a multi-agent architecture is not ready just because it looks good in the design. It is ready when it can actually run without breaking on basic things.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;The first version taught me how to separate responsibilities.&lt;/p&gt;

&lt;p&gt;This second stage forced me to build the runtime that makes that separation viable.&lt;/p&gt;

&lt;p&gt;And real execution ended up teaching me the most important thing: between this runs and this works the way it should, there is a large distance. That distance is not closed with more theory. It is closed by running the system, observing where it fails, and correcting it with concrete changes.&lt;/p&gt;

&lt;p&gt;That, for me, is what this second part is really about.&lt;/p&gt;

&lt;h2&gt;
  
  
  External resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/riclara/agentflow" rel="noopener noreferrer"&gt;https://github.com/riclara/agentflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/riclara/agentflow" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@riclara/agentflow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>architecture</category>
      <category>llm</category>
    </item>
    <item>
      <title>Why I Started Splitting Planning, Implementation, Testing, and Documentation in AI Workflows</title>
      <dc:creator>Ricardo Lara</dc:creator>
      <pubDate>Sat, 21 Mar 2026 16:49:32 +0000</pubDate>
      <link>https://dev.to/riclara/why-i-started-splitting-planning-implementation-testing-and-documentation-in-ai-workflows-1a65</link>
      <guid>https://dev.to/riclara/why-i-started-splitting-planning-implementation-testing-and-documentation-in-ai-workflows-1a65</guid>
      <description>&lt;p&gt;While testing different AI coding tools, I kept running into two recurring problems.&lt;/p&gt;

&lt;p&gt;The first one was cost. Using the same model to plan, implement, review, test, and document does not make much sense. Not every stage requires the same level of reasoning.&lt;/p&gt;

&lt;p&gt;The second problem was more important: when a single agent does everything inside one long conversation, context starts to get polluted. It begins to mix decisions, forget constraints, and lose precision as it moves from one phase to the next.&lt;/p&gt;

&lt;p&gt;To address that, I built agentflow, a CLI for setting up a multi-agent workflow where each stage has a clear responsibility:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;planning&lt;/li&gt;
&lt;li&gt;approval&lt;/li&gt;
&lt;li&gt;implementation&lt;/li&gt;
&lt;li&gt;review&lt;/li&gt;
&lt;li&gt;testing&lt;/li&gt;
&lt;li&gt;documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not just to split tasks. It is also to give each phase a cleaner context window and use the right model for the right kind of work.&lt;/p&gt;

&lt;p&gt;What stood out to me during testing was that the real value was not only the potential cost savings, but the consistency of the process. As the workflow matured, test coverage improved, manual intervention dropped, and some issues started getting caught earlier in the pipeline.&lt;/p&gt;

&lt;p&gt;What interests me most about this approach is not “making AI code on its own.” It is designing a better process around it.&lt;/p&gt;

&lt;p&gt;If you want the full write-up, you can read the original post here:&lt;/p&gt;

&lt;p&gt;Full post:&lt;br&gt;
&lt;a href="https://ricardolara.dev/es/blog/inteligencia-artificial-multiagente/" rel="noopener noreferrer"&gt;https://ricardolara.dev/es/blog/inteligencia-artificial-multiagente/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;npm package:&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/@riclara/agentflow" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@riclara/agentflow&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you work with Claude Code, Codex, or similar tooling, I would love to hear your feedback.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tooling</category>
      <category>productivity</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Cómo estoy usando un pipeline multiagente para hacer más consistente el desarrollo con IA</title>
      <dc:creator>Ricardo Lara</dc:creator>
      <pubDate>Sat, 21 Mar 2026 16:43:33 +0000</pubDate>
      <link>https://dev.to/riclara/como-estoy-usando-un-pipeline-multiagente-para-hacer-mas-consistente-el-desarrollo-con-ia-57bf</link>
      <guid>https://dev.to/riclara/como-estoy-usando-un-pipeline-multiagente-para-hacer-mas-consistente-el-desarrollo-con-ia-57bf</guid>
      <description>&lt;p&gt;Mientras probaba distintas herramientas de coding con IA, me encontré con dos problemas bastante repetidos.&lt;/p&gt;

&lt;p&gt;El primero era de costo: usar el mismo modelo para planear, implementar, revisar, probar y documentar no tiene mucho sentido. No todas las etapas requieren el mismo nivel de razonamiento.&lt;/p&gt;

&lt;p&gt;El segundo era más importante: cuando un solo agente hace todo dentro de una conversación larga, el contexto se contamina. Empieza a mezclar decisiones, olvidar restricciones y perder precisión entre fases.&lt;/p&gt;

&lt;p&gt;Para resolver eso, construí agentflow, un CLI para configurar un flujo multiagente donde cada etapa tiene una responsabilidad clara:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;plan&lt;/li&gt;
&lt;li&gt;aprobación&lt;/li&gt;
&lt;li&gt;implementación&lt;/li&gt;
&lt;li&gt;review&lt;/li&gt;
&lt;li&gt;testing&lt;/li&gt;
&lt;li&gt;documentación&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La idea no es solo repartir tareas. También es trabajar con contexto más limpio en cada fase y usar el modelo adecuado según el tipo de trabajo.&lt;/p&gt;

&lt;p&gt;Algo que me llamó la atención durante las pruebas fue que el valor no estaba solo en el posible ahorro de costo, sino en la consistencia del proceso. A medida que el flujo fue madurando, mejoró la cobertura de pruebas, bajó la intervención manual y aparecieron errores que valía más la pena detectar antes.&lt;/p&gt;

&lt;p&gt;Lo que más me interesa de este enfoque no es “hacer que la IA programe sola”, sino diseñar mejor el proceso alrededor de ella.&lt;/p&gt;

&lt;p&gt;Si quieres leer la explicación completa, aquí está el post original:&lt;/p&gt;

&lt;p&gt;Post completo:&lt;br&gt;
&lt;a href="https://ricardolara.dev/es/blog/inteligencia-artificial-multiagente/" rel="noopener noreferrer"&gt;https://ricardolara.dev/es/blog/inteligencia-artificial-multiagente/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Paquete npm:&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/@riclara/agentflow" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@riclara/agentflow&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si trabajas con Claude Code, Codex o tooling similar, me interesaría mucho tu feedback.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tooling</category>
      <category>productivity</category>
      <category>softwareengineering</category>
    </item>
  </channel>
</rss>
