{"schemaVersion":1,"id":"https://lucioduran.com/es/projects/agent-replay-runtime","url":"https://lucioduran.com/es/projects/agent-replay-runtime","title":"Agent Replay Runtime","description":"Ejecución durable de herramientas con registro de eventos, claves de idempotencia y recuperación tras interrupciones reales del proceso. Incluye trazas de efectos y casos sin reintento automático.","language":"es","datePublished":"2026-10-21","dateModified":"2026-10-21","contentFormat":"text/markdown","content":"[Proyectos](<https://lucioduran.com/es/projects>) / Agent Replay Runtime\n\n# Agent Replay Runtime\n\nEjecución durable de herramientas con registro de eventos, claves de idempotencia y recuperación tras interrupciones reales del proceso. Incluye trazas de efectos y casos sin reintento automático.\n\nAutor: [Lucio Durán](<https://lucioduran.com/es>) · Python 3.11.13 / SQLite 3.50.4 · Licencia: [MIT](<https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/LICENSE>)\n\nFicha publicada: 2026-10-21 · Ficha actualizada: 2026-10-21\n\n[Repositorio](<https://github.com/lucioduran/agent-replay-runtime>) · [Matriz de interrupciones y trazas](<https://raw.githubusercontent.com/lucioduran/agent-replay-runtime/8dbc49ef4b154cc738698714749ad133fa2c6855/results/crash-matrix.json>)\n\n## Problema y utilidad para agentes\n\nUna herramienta puede confirmar un efecto justo antes de que muera el proceso que la llamó. Reintentar a ciegas puede duplicarlo. El runtime registra la solicitud antes de ejecutarla y conserva el resultado antes de avanzar.\n\nPermite separar las decisiones de un agente de la recuperación de sus acciones. Recibe un plan JSON finito, reconstruye el estado desde eventos y distingue una operación completada de una operación cuyo resultado sigue siendo incierto.\n\n## Arquitectura\n\n1. **Plan y adaptadores fijados.** El plan declara pasos únicos, argumentos JSON, identidad de cada adaptador y soporte de idempotencia. Reutilizar un identificador con un plan o adaptador distinto produce un rechazo.\n2. **Registro durable.** SQLite con WAL y synchronous FULL guarda cada transición. Un bloqueo de archivo mantenido por el proceso permite un solo escritor por base. El replay valida el historial sin invocar herramientas.\n3. **Efectos separados.** Un segundo almacén SQLite representa la herramienta. Su operación idempotente guarda el efecto y el recibo en una misma transacción; la operación de control no deduplica.\n4. **Recuperación según contrato.** Una solicitud pendiente conserva su clave. El adaptador idempotente puede recibirla otra vez. Sin ese contrato, la ejecución se detiene y exige una conciliación respaldada por evidencia externa.\n\n- [Contrato de recuperación](<https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/docs/design.md>)\n- [Código del runtime](<https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/agent_replay/runtime.py>)\n- [Almacén independiente de efectos](<https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/agent_replay/ledger.py>)\n\n## Qué demuestra\n\n- Modelado de estados y recuperación de acciones mediante un historial de eventos validado.\n- Separación entre el registro del agente, el efecto externo y el contrato de idempotencia de la herramienta.\n- Reproducción de la ventana entre efecto y confirmación, con trazas de procesos interrumpidos y un control que duplica el efecto.\n\n## Resultados publicados\n\nEl informe publicado por el autor contiene seis interrupciones fijas: tres puntos de corte por cada tipo de adaptador. Incluye un control sin interrupción y una referencia que reintenta sin deduplicar.\n\nEl proceso padre espera una señal de checkpoint y termina al hijo. Luego arranca un trabajador nuevo y consulta el almacén de efectos independiente. En el registro local se usó SIGKILL, Python 3.11.13, SQLite 3.50.4 y un Intel Xeon W-3223 con 48 GiB de RAM. Los trabajadores se ejecutaron en serie.\n\n### Efectos después de la recuperación\n\n| Caso | Efectos finales | Resultado |\n| --- | --- | --- |\n| Idempotente: después de solicitud | 1 | Reanudado con la misma clave |\n| Idempotente: después de efecto | 1 | Recibo existente recuperado |\n| Idempotente: después de confirmación | 1 | Resultado guardado reconstruido |\n| Sin idempotencia: después de solicitud | 0 | Detenido, sin resolver |\n| Sin idempotencia: después de efecto | 1 | Detenido y conciliado con el ledger |\n| Sin idempotencia: después de confirmación | 1 | Resultado guardado reconstruido |\n| Referencia: reintento a ciegas | 2 | Efecto duplicado |\n| Control sin interrupción | 1 | Completado |\n\nLos tres casos idempotentes terminaron con un solo efecto. El caso no idempotente interrumpido antes del efecto quedó pendiente con cero efectos: detenerse fue el resultado esperado. Esto no establece una garantía universal de exactly-once ni una tasa estadística de fiabilidad.\n\nLa conciliación del caso posterior al efecto se hizo mediante inspección automatizada del ledger de la prueba. No fue una revisión humana. El informe conserva eventos anteriores y posteriores, recibos, códigos de terminación y hashes del código. [Matriz de interrupciones y trazas](<https://raw.githubusercontent.com/lucioduran/agent-replay-runtime/8dbc49ef4b154cc738698714749ad133fa2c6855/results/crash-matrix.json>).\n\n## Reproducir\n\nPython 3.11 o posterior, sin dependencias de ejecución, modelos, credenciales ni APIs pagas. El informe enlazado usa Python 3.11.13.\n\nEl primer comando comprueba la evidencia guardada. La segunda ejecución crea una matriz nueva terminando procesos propios. Sus rutas temporales, fechas y códigos de terminación pueden variar por plataforma. Los archivos de salida contienen solo fixtures sintéticos.\n\n### Verificar el informe guardado\n\n```\ngit clone https://github.com/lucioduran/agent-replay-runtime.git\ncd agent-replay-runtime\ngit checkout 8dbc49ef4b154cc738698714749ad133fa2c6855\npython -m experiments.verify results/crash-matrix.json\n```\n\n### Reproducir las interrupciones\n\n```\npython -m experiments.reproduce --output work/crash-matrix.json\npython -m experiments.verify work/crash-matrix.json\n```\n\n## Alcance y límites\n\n- La deduplicación depende de que la herramienta guarde atómicamente clave, efecto y recibo, y conserve ese recibo. Declarar idempotent no verifica ese contrato.\n- Se probaron interrupciones de procesos locales. No cortes de energía, particiones de red, proveedores remotos, vencimiento de recibos ni restauraciones divergentes de bases.\n- El plan es secuencial y finito. No hay planificación con modelos, bifurcaciones dinámicas, compensación, backoff ni coordinación entre hosts.\n- Una herramienta colgada bloquea el escritor. El historial no tiene límite y la validación repetida puede volver cuadrático el trabajo en ejecuciones largas. No se midió throughput.\n- La cadena de hashes detecta cambios accidentales, no reescrituras maliciosas. Una conciliación registra la afirmación del operador; el runtime no puede comprobar la verdad del sistema externo.\n\n- [Patrones de arquitectura de IA agéntica](<https://lucioduran.com/es/blog/agentic-ai-architecture-patterns>)\n\n## Fuentes y revisión\n\nLos valores de esta ficha provienen del informe enlazado. No son una medición en vivo. El informe conserva la revisión ejecutada; la revisión consultada incluye la publicación posterior de ese informe.\n\n- Revisión consultada: [` 8dbc49ef4b154cc738698714749ad133fa2c6855 `](<https://github.com/lucioduran/agent-replay-runtime/commit/8dbc49ef4b154cc738698714749ad133fa2c6855>)\n- Revisión registrada por el experimento: [` 753a57995f6eb8a89659bed5d06acfd4d167f847 `](<https://github.com/lucioduran/agent-replay-runtime/commit/753a57995f6eb8a89659bed5d06acfd4d167f847>)\n- Fecha del informe (UTC): 2026-10-21T21:30:46.249680+00:00\n- [Código del runtime](<https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/agent_replay/runtime.py>) SHA-256: ` f1ad8eaaaa0a6f907c187b7b7c626a5cda99baba90f170a7d2e01425d206a1e7 `\n\n- [README](<https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/README.md>)\n- [Contrato de recuperación](<https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/docs/design.md>)\n- [Código del runtime](<https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/agent_replay/runtime.py>)\n- [Almacén independiente de efectos](<https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/agent_replay/ledger.py>)\n- [Plan JSON de ejemplo](<https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/examples/plan.json>)\n- [Matriz de interrupciones y trazas](<https://raw.githubusercontent.com/lucioduran/agent-replay-runtime/8dbc49ef4b154cc738698714749ad133fa2c6855/results/crash-matrix.json>)\n- [Experimento de interrupción](<https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/experiments/reproduce.py>)\n- [Verificador de evidencia](<https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/experiments/verify.py>)\n- [Licencia MIT](<https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/LICENSE>)","headings":[{"level":1,"text":"Agent Replay Runtime","url":"https://lucioduran.com/es/projects/agent-replay-runtime#title"},{"level":2,"text":"Problema y utilidad para agentes","url":"https://lucioduran.com/es/projects/agent-replay-runtime#problem"},{"level":2,"text":"Arquitectura","url":"https://lucioduran.com/es/projects/agent-replay-runtime#architecture"},{"level":2,"text":"Qué demuestra","url":"https://lucioduran.com/es/projects/agent-replay-runtime#demonstrates"},{"level":2,"text":"Resultados publicados","url":"https://lucioduran.com/es/projects/agent-replay-runtime#results"},{"level":3,"text":"Efectos después de la recuperación","url":"https://lucioduran.com/es/projects/agent-replay-runtime#results-recovery"},{"level":2,"text":"Reproducir","url":"https://lucioduran.com/es/projects/agent-replay-runtime#reproduce"},{"level":3,"text":"Verificar el informe guardado","url":"https://lucioduran.com/es/projects/agent-replay-runtime#reproduce-verify"},{"level":3,"text":"Reproducir las interrupciones","url":"https://lucioduran.com/es/projects/agent-replay-runtime#reproduce-run"},{"level":2,"text":"Alcance y límites","url":"https://lucioduran.com/es/projects/agent-replay-runtime#scope"},{"level":2,"text":"Fuentes y revisión","url":"https://lucioduran.com/es/projects/agent-replay-runtime#sources"}],"sections":[{"heading":"Agent Replay Runtime","level":1,"url":"https://lucioduran.com/es/projects/agent-replay-runtime","content":"[Proyectos](<https://lucioduran.com/es/projects>) / Agent Replay Runtime"},{"heading":"Agent Replay Runtime","level":1,"url":"https://lucioduran.com/es/projects/agent-replay-runtime#title","content":"Ejecución durable de herramientas con registro de eventos, claves de idempotencia y recuperación tras interrupciones reales del proceso. Incluye trazas de efectos y casos sin reintento automático.\n\nAutor: [Lucio Durán](<https://lucioduran.com/es>) · Python 3.11.13 / SQLite 3.50.4 · Licencia: [MIT](<https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/LICENSE>)\n\nFicha publicada: 2026-10-21 · Ficha actualizada: 2026-10-21\n\n[Repositorio](<https://github.com/lucioduran/agent-replay-runtime>) · [Matriz de interrupciones y trazas](<https://raw.githubusercontent.com/lucioduran/agent-replay-runtime/8dbc49ef4b154cc738698714749ad133fa2c6855/results/crash-matrix.json>)"},{"heading":"Problema y utilidad para agentes","level":2,"url":"https://lucioduran.com/es/projects/agent-replay-runtime#problem","content":"Una herramienta puede confirmar un efecto justo antes de que muera el proceso que la llamó. Reintentar a ciegas puede duplicarlo. El runtime registra la solicitud antes de ejecutarla y conserva el resultado antes de avanzar.\n\nPermite separar las decisiones de un agente de la recuperación de sus acciones. Recibe un plan JSON finito, reconstruye el estado desde eventos y distingue una operación completada de una operación cuyo resultado sigue siendo incierto."},{"heading":"Arquitectura","level":2,"url":"https://lucioduran.com/es/projects/agent-replay-runtime#architecture","content":"1. **Plan y adaptadores fijados.** El plan declara pasos únicos, argumentos JSON, identidad de cada adaptador y soporte de idempotencia. Reutilizar un identificador con un plan o adaptador distinto produce un rechazo.\n2. **Registro durable.** SQLite con WAL y synchronous FULL guarda cada transición. Un bloqueo de archivo mantenido por el proceso permite un solo escritor por base. El replay valida el historial sin invocar herramientas.\n3. **Efectos separados.** Un segundo almacén SQLite representa la herramienta. Su operación idempotente guarda el efecto y el recibo en una misma transacción; la operación de control no deduplica.\n4. **Recuperación según contrato.** Una solicitud pendiente conserva su clave. El adaptador idempotente puede recibirla otra vez. Sin ese contrato, la ejecución se detiene y exige una conciliación respaldada por evidencia externa.\n\n- [Contrato de recuperación](<https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/docs/design.md>)\n- [Código del runtime](<https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/agent_replay/runtime.py>)\n- [Almacén independiente de efectos](<https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/agent_replay/ledger.py>)"},{"heading":"Qué demuestra","level":2,"url":"https://lucioduran.com/es/projects/agent-replay-runtime#demonstrates","content":"- Modelado de estados y recuperación de acciones mediante un historial de eventos validado.\n- Separación entre el registro del agente, el efecto externo y el contrato de idempotencia de la herramienta.\n- Reproducción de la ventana entre efecto y confirmación, con trazas de procesos interrumpidos y un control que duplica el efecto."},{"heading":"Resultados publicados","level":2,"url":"https://lucioduran.com/es/projects/agent-replay-runtime#results","content":"El informe publicado por el autor contiene seis interrupciones fijas: tres puntos de corte por cada tipo de adaptador. Incluye un control sin interrupción y una referencia que reintenta sin deduplicar.\n\nEl proceso padre espera una señal de checkpoint y termina al hijo. Luego arranca un trabajador nuevo y consulta el almacén de efectos independiente. En el registro local se usó SIGKILL, Python 3.11.13, SQLite 3.50.4 y un Intel Xeon W-3223 con 48 GiB de RAM. Los trabajadores se ejecutaron en serie."},{"heading":"Efectos después de la recuperación","level":3,"url":"https://lucioduran.com/es/projects/agent-replay-runtime#results-recovery","content":"| Caso | Efectos finales | Resultado |\n| --- | --- | --- |\n| Idempotente: después de solicitud | 1 | Reanudado con la misma clave |\n| Idempotente: después de efecto | 1 | Recibo existente recuperado |\n| Idempotente: después de confirmación | 1 | Resultado guardado reconstruido |\n| Sin idempotencia: después de solicitud | 0 | Detenido, sin resolver |\n| Sin idempotencia: después de efecto | 1 | Detenido y conciliado con el ledger |\n| Sin idempotencia: después de confirmación | 1 | Resultado guardado reconstruido |\n| Referencia: reintento a ciegas | 2 | Efecto duplicado |\n| Control sin interrupción | 1 | Completado |\n\nLos tres casos idempotentes terminaron con un solo efecto. El caso no idempotente interrumpido antes del efecto quedó pendiente con cero efectos: detenerse fue el resultado esperado. Esto no establece una garantía universal de exactly-once ni una tasa estadística de fiabilidad.\n\nLa conciliación del caso posterior al efecto se hizo mediante inspección automatizada del ledger de la prueba. No fue una revisión humana. El informe conserva eventos anteriores y posteriores, recibos, códigos de terminación y hashes del código. [Matriz de interrupciones y trazas](<https://raw.githubusercontent.com/lucioduran/agent-replay-runtime/8dbc49ef4b154cc738698714749ad133fa2c6855/results/crash-matrix.json>)."},{"heading":"Reproducir","level":2,"url":"https://lucioduran.com/es/projects/agent-replay-runtime#reproduce","content":"Python 3.11 o posterior, sin dependencias de ejecución, modelos, credenciales ni APIs pagas. El informe enlazado usa Python 3.11.13.\n\nEl primer comando comprueba la evidencia guardada. La segunda ejecución crea una matriz nueva terminando procesos propios. Sus rutas temporales, fechas y códigos de terminación pueden variar por plataforma. Los archivos de salida contienen solo fixtures sintéticos."},{"heading":"Verificar el informe guardado","level":3,"url":"https://lucioduran.com/es/projects/agent-replay-runtime#reproduce-verify","content":"```\ngit clone https://github.com/lucioduran/agent-replay-runtime.git\ncd agent-replay-runtime\ngit checkout 8dbc49ef4b154cc738698714749ad133fa2c6855\npython -m experiments.verify results/crash-matrix.json\n```"},{"heading":"Reproducir las interrupciones","level":3,"url":"https://lucioduran.com/es/projects/agent-replay-runtime#reproduce-run","content":"```\npython -m experiments.reproduce --output work/crash-matrix.json\npython -m experiments.verify work/crash-matrix.json\n```"},{"heading":"Alcance y límites","level":2,"url":"https://lucioduran.com/es/projects/agent-replay-runtime#scope","content":"- La deduplicación depende de que la herramienta guarde atómicamente clave, efecto y recibo, y conserve ese recibo. Declarar idempotent no verifica ese contrato.\n- Se probaron interrupciones de procesos locales. No cortes de energía, particiones de red, proveedores remotos, vencimiento de recibos ni restauraciones divergentes de bases.\n- El plan es secuencial y finito. No hay planificación con modelos, bifurcaciones dinámicas, compensación, backoff ni coordinación entre hosts.\n- Una herramienta colgada bloquea el escritor. El historial no tiene límite y la validación repetida puede volver cuadrático el trabajo en ejecuciones largas. No se midió throughput.\n- La cadena de hashes detecta cambios accidentales, no reescrituras maliciosas. Una conciliación registra la afirmación del operador; el runtime no puede comprobar la verdad del sistema externo.\n\n- [Patrones de arquitectura de IA agéntica](<https://lucioduran.com/es/blog/agentic-ai-architecture-patterns>)"},{"heading":"Fuentes y revisión","level":2,"url":"https://lucioduran.com/es/projects/agent-replay-runtime#sources","content":"Los valores de esta ficha provienen del informe enlazado. No son una medición en vivo. El informe conserva la revisión ejecutada; la revisión consultada incluye la publicación posterior de ese informe.\n\n- Revisión consultada: [` 8dbc49ef4b154cc738698714749ad133fa2c6855 `](<https://github.com/lucioduran/agent-replay-runtime/commit/8dbc49ef4b154cc738698714749ad133fa2c6855>)\n- Revisión registrada por el experimento: [` 753a57995f6eb8a89659bed5d06acfd4d167f847 `](<https://github.com/lucioduran/agent-replay-runtime/commit/753a57995f6eb8a89659bed5d06acfd4d167f847>)\n- Fecha del informe (UTC): 2026-10-21T21:30:46.249680+00:00\n- [Código del runtime](<https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/agent_replay/runtime.py>) SHA-256: ` f1ad8eaaaa0a6f907c187b7b7c626a5cda99baba90f170a7d2e01425d206a1e7 `\n\n- [README](<https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/README.md>)\n- [Contrato de recuperación](<https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/docs/design.md>)\n- [Código del runtime](<https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/agent_replay/runtime.py>)\n- [Almacén independiente de efectos](<https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/agent_replay/ledger.py>)\n- [Plan JSON de ejemplo](<https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/examples/plan.json>)\n- [Matriz de interrupciones y trazas](<https://raw.githubusercontent.com/lucioduran/agent-replay-runtime/8dbc49ef4b154cc738698714749ad133fa2c6855/results/crash-matrix.json>)\n- [Experimento de interrupción](<https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/experiments/reproduce.py>)\n- [Verificador de evidencia](<https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/experiments/verify.py>)\n- [Licencia MIT](<https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/LICENSE>)"}],"links":[{"text":"Proyectos","url":"https://lucioduran.com/es/projects"},{"text":"Lucio Durán","url":"https://lucioduran.com/es"},{"text":"MIT","url":"https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/LICENSE"},{"text":"Repositorio","url":"https://github.com/lucioduran/agent-replay-runtime"},{"text":"Matriz de interrupciones y trazas","url":"https://raw.githubusercontent.com/lucioduran/agent-replay-runtime/8dbc49ef4b154cc738698714749ad133fa2c6855/results/crash-matrix.json"},{"text":"Contrato de recuperación","url":"https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/docs/design.md"},{"text":"Código del runtime","url":"https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/agent_replay/runtime.py"},{"text":"Almacén independiente de efectos","url":"https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/agent_replay/ledger.py"},{"text":"Patrones de arquitectura de IA agéntica","url":"https://lucioduran.com/es/blog/agentic-ai-architecture-patterns"},{"text":"8dbc49ef4b154cc738698714749ad133fa2c6855","url":"https://github.com/lucioduran/agent-replay-runtime/commit/8dbc49ef4b154cc738698714749ad133fa2c6855"},{"text":"753a57995f6eb8a89659bed5d06acfd4d167f847","url":"https://github.com/lucioduran/agent-replay-runtime/commit/753a57995f6eb8a89659bed5d06acfd4d167f847"},{"text":"README","url":"https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/README.md"},{"text":"Plan JSON de ejemplo","url":"https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/examples/plan.json"},{"text":"Experimento de interrupción","url":"https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/experiments/reproduce.py"},{"text":"Verificador de evidencia","url":"https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/experiments/verify.py"},{"text":"Licencia MIT","url":"https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/LICENSE"}],"structuredData":[{"@context":"https://schema.org","@graph":[{"@type":"WebPage","@id":"https://lucioduran.com/es/projects/agent-replay-runtime#page","url":"https://lucioduran.com/es/projects/agent-replay-runtime","name":"Agent Replay Runtime","description":"Ejecución durable de herramientas con registro de eventos, claves de idempotencia y recuperación tras interrupciones reales del proceso. Incluye trazas de efectos y casos sin reintento automático.","inLanguage":"es","datePublished":"2026-10-21","dateModified":"2026-10-21","author":{"@id":"https://lucioduran.com/#person"},"mainEntity":{"@id":"https://lucioduran.com/projects/agent-replay-runtime#software"}},{"@type":"SoftwareSourceCode","@id":"https://lucioduran.com/projects/agent-replay-runtime#software","name":"Agent Replay Runtime","description":"Ejecución durable de herramientas con registro de eventos, claves de idempotencia y recuperación tras interrupciones reales del proceso. Incluye trazas de efectos y casos sin reintento automático.","url":"https://lucioduran.com/es/projects/agent-replay-runtime","codeRepository":"https://github.com/lucioduran/agent-replay-runtime","programmingLanguage":"Python","runtimePlatform":"Python 3.11.13 / SQLite 3.50.4","license":"https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/LICENSE","version":"8dbc49ef4b154cc738698714749ad133fa2c6855","identifier":{"@type":"PropertyValue","propertyID":"git-commit","value":"8dbc49ef4b154cc738698714749ad133fa2c6855"},"author":{"@type":"Person","@id":"https://lucioduran.com/#person","name":"Lucio Durán","url":"https://lucioduran.com"},"isAccessibleForFree":true,"citation":["https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/README.md","https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/docs/design.md","https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/agent_replay/runtime.py","https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/agent_replay/ledger.py","https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/examples/plan.json","https://raw.githubusercontent.com/lucioduran/agent-replay-runtime/8dbc49ef4b154cc738698714749ad133fa2c6855/results/crash-matrix.json","https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/experiments/reproduce.py","https://github.com/lucioduran/agent-replay-runtime/blob/8dbc49ef4b154cc738698714749ad133fa2c6855/experiments/verify.py"]},{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Proyectos","item":"https://lucioduran.com/es/projects"},{"@type":"ListItem","position":2,"name":"Agent Replay Runtime","item":"https://lucioduran.com/es/projects/agent-replay-runtime"}]}]}],"contentHash":"15bb4d640e90ef16d70418342b9d3619acef8aa7b0e8966e1f03640ffc8aa0a9","provenance":{"method":"Deterministic serialization of the server-rendered main element","source":"https://lucioduran.com/es/projects/agent-replay-runtime","hashAlgorithm":"sha256","hashScope":"JSON document fields before contentHash and provenance","sourceHTMLBytes":48015,"contentBytes":8987}}
