{"id":1223,"date":"2026-11-09T21:42:42","date_gmt":"2026-11-09T20:42:42","guid":{"rendered":"https:\/\/rosmarops.com\/es\/?p=1223"},"modified":"2026-11-09T21:42:42","modified_gmt":"2026-11-09T20:42:42","slug":"harness-engineering-rosmarops","status":"publish","type":"post","link":"https:\/\/rosmarops.com\/es\/blog\/harness-engineering-rosmarops\/","title":{"rendered":"Cada fallo de un agente, una pieza del sistema: harness engineering en RosmarOps"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Construyo con agentes de IA una herramienta para usar los agentes de IA con m\u00e1s cuidado. Esta semana sus fallos fueron los mismos que RosmarOps busca en los tuyos. As\u00ed convertimos cada uno en una pieza permanente del sistema.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">RosmarOps existe para que veas qu\u00e9 pueden hacer tus agentes de IA sin preguntarte. Y lo construyo, casi entero, con agentes de IA.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esta semana esa paradoja tuvo una segunda vuelta. Publiqu\u00e9 dos versiones en dos d\u00edas, la 0.10.1 y la 0.10.2, para arreglar fallos que ninguna prueba hab\u00eda visto. Los encontr\u00f3 mi propio ordenador, que tiene 48 proyectos y casi todos los agentes que RosmarOps conoce. Al mirarlos de cerca vi que <strong>los fallos de RosmarOps eran los mismos que RosmarOps busca en tus agentes<\/strong>: listas que dejan de coincidir, permisos que nadie sabe qui\u00e9n decidi\u00f3, errores que se quedan callados y un \u00abhe terminado\u00bb que nadie comprueba desde fuera.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Arreglarlos era lo f\u00e1cil. Lo que me interesa contar es qu\u00e9 hacemos para que no vuelvan.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Harness engineering, en una frase<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mitchell Hashimoto le puso nombre a una costumbre: cada vez que un agente comete un error, dedicas tiempo a construir algo para que no pueda volver a cometerlo. Al conjunto de esas piezas alrededor del agente lo llama <em>harness<\/em>, el arn\u00e9s.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ichigo a\u00f1ade un orden que he adoptado tal cual. Cuando algo falla, la soluci\u00f3n se busca en este orden:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Estructura:<\/strong> que el error sea imposible de cometer.<\/li>\n\n\n<li><strong>Una comprobaci\u00f3n autom\u00e1tica<\/strong> que lo cace siempre.<\/li>\n\n\n<li><strong>Texto en las instrucciones,<\/strong> solo donde de verdad hace falta criterio.<\/li>\n\n\n<li><strong>Una persona que revisa,<\/strong> al final.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Una l\u00ednea en las instrucciones es un deseo: el agente la leer\u00e1 y casi siempre la cumplir\u00e1. Una prueba autom\u00e1tica es un muro: la cumple aunque se le olvide.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Seis demonios y su pieza<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>1. El texto que no cab\u00eda.<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Qu\u00e9 pas\u00f3:<\/strong> cuando Codex tiene permiso para usar muchas aplicaciones del escritorio, el aviso las enumera todas. En mi ordenador, el t\u00edtulo superaba los 200 caracteres que admite el espacio, y el programa descartaba la revisi\u00f3n entera.<\/li>\n\n\n<li><strong>La pieza (comprobaci\u00f3n):<\/strong> una prueba que lee del propio formato cada l\u00edmite de longitud y de cantidad, y comprueba que el programa los respeta aunque los datos se pasen. Hoy cubre las listas y los textos del espacio. En la pr\u00f3xima versi\u00f3n, los l\u00edmites saldr\u00e1n directamente del formato, para que ning\u00fan campo nuevo se quede fuera.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>2. Las listas que dejaron de coincidir.<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Qu\u00e9 pas\u00f3:<\/strong> el programa sab\u00eda decir \u00aba este agente lo detecto, pero no lo puedo puntuar\u00bb para la app de Antigravity, pero esa raz\u00f3n no estaba en la lista que acepta el informe. En mi ordenador, el informe no se escrib\u00eda. Pas\u00f3 tres veces en una semana, con tres listas distintas.<\/li>\n\n\n<li><strong>La pieza (comprobaci\u00f3n):<\/strong> una prueba de paridad que compara 15 listas del c\u00f3digo con las del formato y falla si una se queda atr\u00e1s. Ya est\u00e1 en la 0.10.2.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>3. Las pruebas que miraban otro camino.<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Qu\u00e9 pas\u00f3:<\/strong> las pruebas de la nota de f\u00e1brica montaban el mapa de agentes a mano, por un camino distinto del que usa el programa de verdad. Estaban en verde porque probaban otra cosa. As\u00ed se escap\u00f3 la regla que faltaba en los ajustes de Cline, que dejaba mi revisi\u00f3n sin nota.<\/li>\n\n\n<li><strong>La pieza (estructura):<\/strong> una sola forma de montar el mapa, la misma para las pruebas y para el programa, sobre un ordenador de prueba completo con todos los agentes y rutas de Windows. Lleg\u00f3 con la 0.10.3.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>4. El \u00abhe terminado\u00bb sin comprobar.<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Qu\u00e9 pas\u00f3:<\/strong> todo estaba en verde y en mi ordenador no funcionaba. Una prueba en verde dice que algo funciona donde se ha probado, no donde se va a usar.<\/li>\n\n\n<li><strong>La pieza (comprobaci\u00f3n y persona):<\/strong>\n<ul class=\"wp-block-list\">\n<li>La 0.10.2 no se public\u00f3 hasta que la pas\u00e9 en mi ordenador y sali\u00f3 con nota y en mi espacio.<\/li>\n\n\n<li>Antes de publicarla la revis\u00f3 un agente que no hab\u00eda escrito ese c\u00f3digo, y la aprob\u00f3 con cinco condiciones que hubo que cumplir.<\/li>\n\n\n<li>El siguiente paso es que la m\u00e1quina haga esa prueba sola: un Windows limpio que, antes de cada lanzamiento, monta lo que dejan los agentes al instalarse, ejecuta la versi\u00f3n nueva y comprueba que termina, que hay nota y que el env\u00edo al espacio funciona. Si falla, la versi\u00f3n no sale.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>5. El silencio.<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Qu\u00e9 pas\u00f3:<\/strong> durante d\u00edas, el programa tiraba revisiones y solo lo apuntaba en una ventana que se cerraba sola.<\/li>\n\n\n<li><strong>La pieza (comprobaci\u00f3n):<\/strong> ning\u00fan error se queda solo en el registro. O aparece en el informe, o la revisi\u00f3n se para y lo dice. La 0.10.2 ya apunta en el registro de env\u00edos cada revisi\u00f3n que no se pudo enviar, y por qu\u00e9. La regla completa, con una prueba que busca en el c\u00f3digo errores que solo se registran, es parte del plan.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>6. La prisa con buena intenci\u00f3n.<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Qu\u00e9 pas\u00f3:<\/strong> un agente a\u00f1adi\u00f3 un cambio al formato de datos sin pedir permiso. Ten\u00eda raz\u00f3n en el fondo, y aun as\u00ed se salt\u00f3 una regla. Yo mismo mov\u00ed una hora en el servidor y dej\u00e9 mi espacio leyendo datos del d\u00eda anterior.<\/li>\n\n\n<li><strong>La pieza (instrucci\u00f3n y persona):<\/strong> cualquier cambio de formato se para y espera mi firma. Hoy es la pieza m\u00e1s d\u00e9bil, porque es una instrucci\u00f3n. El siguiente paso es convertirla en comprobaci\u00f3n.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">El harness completo: cinco fases<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Una revisi\u00f3n de ingenier\u00eda hecha por un agente que no hab\u00eda escrito el c\u00f3digo, comparando el proyecto con las pr\u00e1cticas de referencia de la industria, dej\u00f3 el plan en cinco fases. Cada una cierra una clase de fallo, no un fallo suelto:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Un solo camino.<\/strong> Las pruebas montan el mapa igual que el programa real, sobre el ordenador completo. Es la 0.10.3.<\/li>\n\n\n<li><strong>Una versi\u00f3n rota no se publica.<\/strong> La prueba en Windows antes de cada lanzamiento, y un procedimiento para retirar una versi\u00f3n si hiciera falta.<\/li>\n\n\n<li><strong>Un registro \u00fanico de agentes.<\/strong> Hoy, a\u00f1adir un agente toca unos 18 sitios en 12 ficheros. Con el registro, el agente n\u00famero 15 no podr\u00e1 romper a los otros 14.<\/li>\n\n\n<li><strong>Robustez frente a ordenadores reales.<\/strong> Ficheros mal escritos, rutas largu\u00edsimas, codificaciones raras. Lo peor que puede pasar es que algo salga como \u00abno le\u00eddo\u00bb, nunca como limpio.<\/li>\n\n\n<li><strong>Proceso y m\u00e9tricas.<\/strong> Cada cambio con su revisi\u00f3n independiente, cada versi\u00f3n con lo que incluye, y una medida de cu\u00e1ntas versiones hay que retirar y cu\u00e1nto se tarda en arreglarlas.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando est\u00e9n las cinco, otra revisi\u00f3n independiente auditar\u00e1 el c\u00f3digo entero.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Lo que me llevo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En mi gu\u00eda AI-First lo escrib\u00ed as\u00ed: un fallo arreglado donde se observa est\u00e1 escondido, no arreglado. Esta semana lo he comprobado en mi propio producto. Cada fallo de un agente era una pregunta sobre el sistema en el que trabaja: si ma\u00f1ana vuelve a pasar en otro sitio, \u00bfalgo lo para?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El trabajo no es conseguir un agente que no se equivoque. Es construir un arn\u00e9s donde sus errores no puedan llegar a ti dos veces.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Si usas RosmarOps<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Actualiza a la 0.10.3. Si tu espacio llevaba d\u00edas sin recibir revisiones, o te mostraba cifras distintas a las de tu informe, pasa el programa una vez y deber\u00eda ponerse al d\u00eda. Tu nota puede cambiar, porque ahora ve cosas que antes se le escapaban.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Fuentes: Mitchell Hashimoto, <a href=\"https:\/\/mitchellh.com\/writing\/my-ai-adoption-journey\">\u00abMy AI Adoption Journey\u00bb<\/a> (5 de febrero de 2026); <a href=\"https:\/\/x.com\/iiiichigo_chan\/status\/2118397992239571196\">hilo de Ichigo en X<\/a> (5 de noviembre de 2026); Albert Garcia Pujadas, <a href=\"https:\/\/guia.qtorb.com\/#\/dos-puertas\">Gu\u00eda AI-First<\/a>; notas de las versiones 0.10.1, 0.10.2 y 0.10.3 en el <a href=\"https:\/\/github.com\/qtorb\/rosmarops\/releases\">repositorio de RosmarOps<\/a>.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Escrito con ayuda de asistentes de IA. La experiencia, los errores y la decisi\u00f3n de publicar son m\u00edos.<\/em><\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>Construyo con agentes de IA una herramienta para usar los agentes de IA con m\u00e1s cuidado. Esta semana sus fallos fueron los mismos que RosmarOps busca en los tuyos. As\u00ed convertimos cada uno en una pieza permanente del sistema.<\/p>\n","protected":false},"author":1,"featured_media":1224,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"rosmarops_translation_url":"","rosmarops_url_en":"https:\/\/rosmarops.com\/blog\/harness-engineering-rosmarops\/","rosmarops_url_es":"","rosmarops_url_ca":"https:\/\/rosmarops.com\/ca\/blog\/harness-engineering-rosmarops\/","footnotes":"","_genesis_title":"Harness engineering: cada fallo de un agente, una pieza","_genesis_description":"Seis fallos de agentes de IA en una semana y la pieza que convierte cada uno en un error imposible de repetir. Un caso real de metodolog\u00eda AI-First.","_tsf_title_no_blogname":""},"categories":[332],"tags":[340,339],"class_list":["post-1223","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-novedades-de-rosmarops","tag-ai-first","tag-harness-engineering"],"_links":{"self":[{"href":"https:\/\/rosmarops.com\/es\/wp-json\/wp\/v2\/posts\/1223","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rosmarops.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rosmarops.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rosmarops.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rosmarops.com\/es\/wp-json\/wp\/v2\/comments?post=1223"}],"version-history":[{"count":1,"href":"https:\/\/rosmarops.com\/es\/wp-json\/wp\/v2\/posts\/1223\/revisions"}],"predecessor-version":[{"id":1227,"href":"https:\/\/rosmarops.com\/es\/wp-json\/wp\/v2\/posts\/1223\/revisions\/1227"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rosmarops.com\/es\/wp-json\/wp\/v2\/media\/1224"}],"wp:attachment":[{"href":"https:\/\/rosmarops.com\/es\/wp-json\/wp\/v2\/media?parent=1223"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rosmarops.com\/es\/wp-json\/wp\/v2\/categories?post=1223"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rosmarops.com\/es\/wp-json\/wp\/v2\/tags?post=1223"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}