Working practice / July 2026

A correction loop for a collaborator with no memory

An agent forgets everything between sessions. So I built the memory outside it. Twelve weeks in, the loop has caught 269 mistakes and broken itself twice, both times without saying a word.

The hard part of working with an AI agent day to day is not that it makes mistakes. It is that it makes a mistake, you correct it, and the correction evaporates when the session ends. The next session starts from zero and is perfectly willing to make the same mistake again.

So the memory has to live outside the agent, in something durable it reads on the way in. That is a plumbing problem more than an AI problem, and it has the failure modes of plumbing.

Lessons
269
Span
12 wks
Repeats
0
Loop breaks
2

01 The design

One markdown file. Every entry is dated, states the mistake, and ends with a rule phrased so it can be checked later. There is no reflection in it. The format is closer to a lint rule than a diary.

WRITEsession close appends a dated mistake plus rule, once per session, from one place only
STOREone file, newest first, never archived by age
READgrep the file before planning anything non-trivial in a domain with prior corrections

Three parts. Each one has failed independently.

Two rules about the store turned out to matter more than they look.

Only one place writes to it

Several routines cite the log. Exactly one appends to it. When I checked this I found I had been telling myself three different skills wrote entries, which was wrong, and would have made the write path impossible to reason about the first time something went missing.

Age is not an archiving axis

The instinct with an append-only file is to archive the old end of it. For this file that is exactly backwards. A lesson from May is not less binding than one from July, and the whole point is that the agent has no sense of which mistakes are recent. Splitting by date would quietly demote two thirds of the rules to somewhere nothing looks.

02 Both times it broke, it broke quietly

A feedback loop with a severed read path is a diary. That is not a hypothetical.

WRITEkept working throughout
STORE / break 2a stranded header sat mid-file. 192 of 261 entries landed below it, invisible to any top-down read
READ / break 1a config refactor removed the only pointer to the file. Entries were written for weeks and read by nothing

Neither failure produced an error. Both were found by going to look.

The first break came from a cleanup. I refactored the agent's always-loaded configuration to be leaner, and the instruction telling it to consult the log lived in the part I removed. Nothing errored. Sessions kept appending faithfully to a file that no session ever opened again.

The second is the one I find genuinely funny. A header had drifted into the middle of the file, and new entries were being appended below it rather than at the top. By the time I noticed, 192 of 261 entries, about three quarters of every lesson recorded, were sitting in a region that a top-down read never reached. The file looked healthy. It had the right number of lines. Opening it showed recent, relevant entries. The missing 74% were just further down than anyone looked.

A system built to catch things that fail silently, failing silently, twice, in the two different ways it was capable of failing.

Both were repaired the same way: merge everything into one list, write down the invariant that there is one list and no second section, and move the read instruction somewhere the refactor could not casually delete. The merge recovered all 260 entries with nothing lost.

03 Evidence the loop actually runs

Two numbers say more than the entry count does.

The rate is not going anywhere, and it took three tries to see that

Corrections per day appears to rise sharply. Per session it still rises, by 25%. Per unit of work actually done it moves 10% and goes down before it goes up. Same 269 events, three denominators, three different stories.

Two denominators, shown together rather than chosen between
monthcorrectionssessionsper sessionwords loggedper 1k words
May881610.54782,3911.068
June721170.61570,5551.020
July1091600.68197,1481.122

Neither denominator is right on its own. Counting sessions treats a three minute one-shot task and a five hour sprawl as equal. Counting words fixes that but depends on session notes being written with consistent thoroughness, so a terse note about heavy work shrinks the denominator it should have grown. They are biased in different directions, which is the argument for showing both instead of picking the flattering one.

And then the trend evaporates

Before reading anything into a 25% climb it is worth asking whether a constant underlying rate would have produced these numbers anyway. Testing each month's count against what a fixed rate predicts:

Goodness of fit against a constant rate
exposurechi-squarepverdict
per 1k words0.3980.82no trend
per session2.3700.31no trend

Neither is close to significant. With around 90 corrections a month, random variation alone is plus or minus about 11%, so a real trend has to be larger than that to be visible in twelve weeks of data. The 25% climb that looked like a story is inside the noise floor once you account for the fact that counts of rare events are lumpy by nature.

The honest summary is the least dramatic one. Across twelve weeks the correction rate did not measurably change, in either unit. Whether that stays true is a question for a year of data, not a quarter.

What it does rule out is the least comfortable explanation, that the agent is simply making more mistakes than it used to. That would have shown up here, and it does not.

Nothing repeats

Comparing every entry against every other one on shared vocabulary, about 36,000 pairs, six came back near-identical. All six were the same entry present twice, confined to a single three day window in late June, with none before it and none in the 126 entries after. That is the fingerprint of the one time repair that reunified the fragmented file, which faithfully kept both copies of anything that had been written into both halves. The write path itself is clean. The duplicates have since been removed, which is why the count here is 269 rather than 275.

269 lessons, and not one of them is something already learned and forgotten. Every entry is new ground.

That is the finding I would stand behind. A declining rate was only ever plausible if the work stayed inside one domain, and it does not. What the absence of repeats shows is that corrections keep landing somewhere new instead of relitigating old ground. The loop is not making the work error-free. It is making each error survive being made once.

The most common words across all 269 rules are verify and check, which together touch about a sixth of them. The one that says the most is silently, the only adverb near the top. The dominant failure mode is not something breaking. It is something appearing to work.

A static host returning 200 on an unexpected path is not proof the file is there.
Verify unpushed commits against the remote, not against a stale session's memory of them.
Audit all status-filter consumers when extending a config schema.
Probe the actual data before accepting a problem's surface framing.

04 What I would not claim

I cannot measure what the loop prevents. There is no control version of the last twelve weeks without it, and as the denominator problem shows, the headline number moves for reasons that have nothing to do with whether the loop works. The evidence I trust is the absence of repeats, not the count.

The deeper limit is that none of this can see a mistake nobody caught. The log holds errors that were noticed. Sizing the ones that got past both of us would take a fresh audit of finished work, looking for defects that were never logged, which is the only honest way to measure the denominator and is a genuinely expensive thing to do.

There is a selection effect at the entrance, too. The log holds mistakes that got noticed. Some entries are ones the agent caught on its own before I saw them, which is the loop working well. The ones nobody caught are by definition absent, and I have no way to size that group.

The part I would defend without hedging is the shape. A dated mistake bound to a greppable rule beats a page of reflection, because the rule is the only part that ever gets read again. And any loop like this needs someone to periodically open it and confirm the parts are still connected, because when it comes apart it will not tell you.