← ~/articles

Every Change, Committed

Lion Hummer/

Kit's workspace is a directory. A regular directory on my filesystem, with a git repo in it. Every time Kit writes a file, it commits. Every time I edit something in that directory myself, a file watcher picks up the change and commits that too. The entire history of what happened, who did what, is just git log.

This wasn't a grand architectural decision. I needed the agent to have somewhere to put files, and I already had a Docker sandbox that mounts a host directory at /workspace. The git part started because I wanted undo. If Kit overwrites something important I want to get it back. Auto-committing every file operation was the simplest way to get that, and simple-git made it about 40 lines of code.

The interesting thing is what fell out of it for free.

Everything is visible

I can open Kit's workspace in my editor and see exactly what it's been doing. Research notes, drafts, task outputs, whatever. No database console, no special query language. Just files in folders. When something looks wrong I open a file and read it. When I want to see what changed, git diff. When I want to know the full sequence of what Kit did on a task, git log --oneline.

I built a version history view into the TUI (Ctrl+G) that shows commits with diffs. But honestly I use the command line just as often. The point is there's nothing proprietary about the format. Anything that knows how to read files or talk to git works with Kit's workspace.

The model already knows this

Files and git are probably the most represented tool interfaces in LLM training data. When I tell Kit to write findings to a research/ folder, or to check git diff before committing, there's no translation layer required. The model has seen millions of examples of this workflow. Compare that to wiring up a custom database tool where you're fighting schema mismatches and the model passes a string where an integer goes.

I think this is underappreciated. The filesystem is the path of least resistance for agent tool design, and that's a feature, not a limitation. The agent works better with tools it's been trained on.

Both sides are tracked

The detail I'm most happy with: a FileWatcher monitors the workspace for changes that Kit didn't make. If I open a file and edit it manually, the watcher detects it and auto-commits with a summary. So the git history shows both sides of the collaboration. Kit's commits say things like create: research/sources.md. My commits say external: modified research/sources.md.

This means Kit can pick up where I left off. It can check what changed since it last looked at a file. And I get a complete record of the whole project, not just the agent's half of it.

What this replaces

I don't have a database for agent state. I don't have a message broker for coordination. Persistence is files. History is git. If I want to hand context to a different process, I give it a path. If I want to back everything up, I push to a remote. The whole thing composes with tools that already exist and already work.

There are obvious limits. I'm not going to store a million records in flat files. But for a personal assistant doing research, writing drafts, managing tasks, files are exactly the right level of abstraction.

Every Change, Committed — Lion Hummer