Skip to main content
Who your agent is — what it is told, which model it runs on, what tools it has, what reaches you when you are not in the chat — is code, in a git repository called a harness. You do not write that code. The agent does, when you ask it to, in the same conversation you use for everything else. So a change to your agent is a sentence.
Nine minutes later that chat came back with:
The next message in that chat could call notes__write, and every chat opened after it can too. Nothing was installed, restarted or deployed, and nobody opened an editor.
A Splox chat where the agent describes writing a tool, testing it and publishing version 6

The same run, in the chat: the agent reading its own repository, testing the tool, and pushing the version

The loop

1

You ask, in the chat

Say what you want the agent to be able to do, or how you want it to behave. Ask for the outcome — “keep notes for me” — rather than for a file with particular contents. The agent reads its own repository before it changes anything, so it already knows the shape its code has to have.
2

It edits its own checkout

Your machine carries the harness at ~/harness. The agent edits that directory: a new file under tools/, a line in programs/splox/main.py, a paragraph in a prompt. This is the part you can watch happen — every edit is a tool call in the transcript.
3

It tries it before it tells you

A good change ends with the agent having run the thing. In the transcript above it loaded the tool the same way the platform’s own loader does and exercised nine cases against it, including a path-traversal attempt, before it published anything.
4

It publishes a version

git commit and git push from the checkout. That is what a version is — there is no separate deploy. The push either produces the next numbered version or is refused with what is wrong with the tree, and until it succeeds nothing anybody else runs has changed.
5

The next turn is different

The platform asks the harness who your agent is at the moment it needs to know — at the start of every run. There is nothing to reload.

Two speeds, and the one that surprises people

A change lands in this conversation as soon as the file is saved, because this machine is reading the checkout the agent just edited. The next message you send picks it up. A change reaches a new chat, or a second machine only after the publish. If you ask for something, see it work, then open a fresh chat and find the old behavior, the answer is almost always that the agent edited but did not push.
is a reasonable follow-up, and the agent can do it in one turn.
Say “publish it when it works” in the original ask and you skip the round trip. The agent that wrote the notes tool tested it first and pushed once, which is also the order you want: a published version that was never run is a version you will have to go back past.

What you can ask for

A tool it does not have

“Give yourself a tool that does X.” A named call it can reach for, described in its own words, on every run from then on.

A way to reach you

“Answer me in Telegram.” “Watch this mailbox.” A program that keeps running on the machine after the conversation ends.

Something on a schedule

“Do this every morning.” The same shape, triggered by the calendar instead of by a message.

Different behavior

“Be shorter.” “Stop asking me before you run things.” “Use a cheaper model when we are only talking.”

Access to a service

“Get into my Linear.” Part of this one is yours: somebody has to click Authorize.

Undoing any of it

“Put back how you answered before version 7.” Every version is kept, and going back is another ask.

What a version is

A numbered snapshot of the whole harness, with the sentence that says why it was made. Here is a real history, read off the account this documentation was written from:
Version 1 is what you got when you signed up. Every line after it is somebody asking for something. Two of them are worth reading twice: version 5, where version 4’s bot was broken, the person said so, and the fix is its own version with its own sentence explaining what was wrong — and version 7, which is what undoing looks like. Going back does not delete version 2; it adds a version that carries the older tree, and the history says which change was undone. Versions are immutable and nothing deletes one. A new chat opens on the newest; a machine can be held on an older one.

The two questions after every change

Did it work? The transcript is the first answer — the agent’s edits and its test runs are tool calls you can open. The second answer is the version list: if the change is not in it, it was not published. Both are on Versions. How do I go back? Ask. “Undo the last change” and “go back to how you answered before version 5” are both things the agent does with git in one turn, and both end in a new version whose message says what was undone. If the agent itself is the thing that got worse — it will not stop apologising, or it now refuses ordinary work — When it goes wrong is the page for that, because the fix there is to pin the machine to an older version rather than to ask the broken agent for help.

What it costs to be wrong

A change that misses costs one run. The notes tool above was 9 minutes and $0.37 of the account’s usage, and that is the whole exposure: the previous version is still in the list, no other machine picked the new one up until the push, and any run already going kept the version it started on. The thing that does not undo itself is what the agent wrote to disk. Code goes in the harness and is versioned; files go in the machine’s home directory and are not. If an ask involves deleting or rewriting your data, that part is worth saying out loud in the ask — “don’t touch what’s already in there” — because git will not give it back.

You can look, without writing anything

The machine opens in VS Code and over SSH from the chat’s side panel. That is for reading what the agent wrote, checking which version is running, and watching a program’s log — not for authoring. See VS Code and SSH.

What is actually on the machine

The checkout at ~/harness, what lives in it, and why the platform reads that file at the moment it needs to know.