Marionette es una biblioteca de simulación determinista (DST) para el lenguaje Zig que permite probar sistemas distribuidos y de almacenamiento reproduciendo fallos difíciles de capturar en producción: escrituras truncadas por caídas, corrupciones de sectores, particiones de red o carreras entre temporizadores. La idea central es escribir el código de aplicación contra la interfaz estándar std.Io y, en los tests, sustituir ese backend por la implementación determinista de Marionette, sin mantener una versión "simulada" del software.
El proyecto ya ejecuta código Zig real y sin modificar bajo simulación determinista, entre ellos el motor de almacenamiento xit-vcs/xitdb y la biblioteca de concurrencia cooperativa g41797/mailbox, ambos con reproducción replay basada en semilla. Entre las capacidades demostradas figuran la simulación de std.Io.Filestorage con fallos de crash y escritura truncada, la planificación cooperativa de tareas std.Io, streams de red con latencia, particiones, timeouts y reintentos deterministas, operaciones de disco sensibles al planificador y paso de mensajes tipado entre endpoints con pérdida y latencia controlables.
La biblioteca se inspira en técnicas asociadas a FoundationDB, TigerBeetle y Antithesis, pero se presenta como una librería drop-in y no como un framework alrededor del cual haya que construir el sistema. Sus utilidades expectSimPass, expectSimFuzz y expectSimFailure permiten ejecutar escenarios con semilla fija, hacer fuzzing con múltiples semillas o verificar que un escenario deliberadamente roto sea detectado, respectivamente. Cada test separa el entorno (io, recorder, reloj, aleatoriedad) accesible para la aplicación y el control (control.disk, control.network) reservado al simulador para inyectar fallos.
