Build a Reproducible Multi-Agent Pipeline on a Versioned Filesystem Tensorlake's Cloud Volumes enable a reproducible five-agent pipeline by versioning the filesystem instead of teaching agents Git, allowing every run to be snapshotted, diffed, and restored on a fresh machine. The tutorial, based on nine years of experience with LangGraph, CrewAI, and AutoGen, outlines seven steps to partition worker outputs into subtrees and autosave writes, with the config baked into the message for diffing run #17 against run #18. Here’s the part most multi-agent tutorials skip: making the run reproducible. Fan five agents out, and by the time they finish, their outputs are scattered across sandboxes that vanish on exit. Nothing versioned. Nothing to diff. This tutorial fixes that — without teaching a single agent Git. I’ve built fan-out pipelines for about nine years across LangGraph, CrewAI, and AutoGen, and the reproducibility gap has bitten me on every one. By the end of this tutorial you’ll have a five-agent pipeline whose every run is snapshot-able, diff-able, and restorable on a fresh machine — and you’ll know the exact flags and ordering that make it work the first time instead of the fifth. TL;DR:Version thefilesystem, not the agents. Give each worker its own subtree on a shared Tensorlake Cloud Volume, let writes autosave, snapshot at the end with the config baked into the message, and you can diff run 17 against run 18 or fork either onto a clean machine. No commits, no locks, no per-agent Git — just seven steps. Agents are unusually exposed to version drift: the same logical step depends on model version, prompt text, tool schema, and retrieval index, so if any of those shift before you re-run, replay diverges 2 . Left unversioned, agent output is a pile of mutable files you can save but can’t reason about 3 . The instinct is to teach every agent Git. It fights the grain — agents spray dozens of small, disjoint files as they go, not tidy commits. The cleaner move is to keep the version control and drop the per-agent ceremony 4 : capture the working state by versioning the filesystem itself, then restore it later to reproduce exact conditions 5 . Tensorlake’s Cloud Volumes give you a shared, durable, versioned POSIX directory that does exactly this 1 . Let’s build on it. Use the mount-free client for anything that just needs to persist output. It talks straight over HTTP through a native Rust core — no CLI, no FUSE, no root: python from tensorlake.filesystem import FilesystemClientclient = FilesystemClient reads TENSORLAKE API KEY / ORGANIZATION ID / PROJECT IDfs = client.create "pipeline-runs" fs.write file ".init", b"", message="initial commit" see the note below That empty write is just insurance, not a requirement. Send gives you one worker per item, then a single supervisor fan-in: python def fan out state : return Send "worker", { "agent index": i, "agent id": f"agent-{i}", "item": item, "run id": state "run id" , "filesystem": state "filesystem" , "sandbox id": state "sandbox id" , "token": state "token" , "temperature": state "temperature" , "prompt variant": state "prompt variant" , } for i, item in enumerate state "items" def build graph : graph = StateGraph PipelineState graph.add node "setup", setup graph.add node "worker", worker graph.add node "supervisor", supervisor graph.add edge START, "setup" graph.add conditional edges "setup", fan out graph.add edge "worker", "supervisor" runs once, after every worker finishes graph.add edge "supervisor", END return graph.compile Partition by subtree — runs/