The first version of my little agent worked, in the sense that it completed tasks. It also drove me slightly mad, in three specific ways, and after a fortnight of using it I sat down and rebuilt the parts that grated. This is the second draft, and it's better for being annoyed at the first.
The first annoyance was context bloat. Every tool result got appended to the conversation and stayed there forever. By step eight the model was reading the full text of four files it had looked at and forgotten about, paying for all of them on every turn, and getting slower and dafter as the window filled. The fix was unglamorous: I summarise old tool results once they're a couple of turns old. The full output goes to disk where I can read it; the model gets a one-line "read file X, 240 lines, here's the gist". It keeps the working context small and sharp, and the cost stopped creeping.
The second annoyance was that it didn't know when to stop. It would reach a perfectly good answer and then, because the loop kept going, second-guess itself and start "improving" things nobody asked about. So I gave it an explicit done tool that it has to call to finish, with a required field summarising what it did. Forcing it to declare completion as a deliberate act, rather than just trailing off, made it noticeably more decisive. It's a small thing but it changed the feel of using it from "babysitting" to "delegating".
The third annoyance was the one I expected least. It had no memory between runs. Every invocation started from nothing, rediscovered the project layout, relearned where the config lived, made the same wrong first guess as last time. So I gave it a scratch file, a plain markdown notes file in the repo that it can read at the start and append to at the end. Nothing clever, no vector database, just a file. "The tests live under test/, not tests/. The build needs make gen first." After a few runs it had built up a little crib sheet of facts about the project, and stopped tripping over the same things. It's the cheapest possible memory and it works embarrassingly well.
What I deliberately did not change is the safety posture. It still proposes diffs rather than applying them. It still can't touch anything outside the repo. I still read everything before I trust it. The temptation, once a thing starts working, is to loosen the leash and let it run further unattended, and I'm resisting that on purpose. The agent is good at the mechanical middle of a task. It is not good at judgement, and the two weeks I've spent with it have made me more sure of that line, not less.
Is it useful? Yes, genuinely, for a narrow band of work. Would I let it run unsupervised against anything that matters? Not a chance. Both of those can be true at once, and getting comfortable holding both is, I think, most of the skill here.