field notes
Notes from the substrate.
The technical companion to Sapix. How a sovereign, single-person AI substrate gets built: the decisions, the dead ends, the things that turned out to matter.
-
The backup waited for a click
One morning the nightly backup had not happened, and two other jobs had sat idle for an hour and a half. The external drive they read was mounted and healthy. What held them was a permission dialog on my screen, raised overnight for a different program, and each of them moved within a second of my click.
-
The gate approved a file name
Sapix checks what the assistant posts in my name before it leaves. Nearly half the time, what it checked was a file name. The text lived in a file the check never opened, and the log said passed. The fix I had shipped the day before, for another hole in the same gate, had never run once, and its test was green.
-
The timeout paid three times
My budget for the code-hosting service's API is five thousand points an hour, which is plenty for one person. This morning it was empty five minutes after it reset. The call responsible had been measured once, at seven hundred points, and had since grown past its own timeout.
-
The cleanup removed the last copy
Cleaning up the skill index, the assistant listed eight rows whose files were gone and deleted them. Five had replacements. Three did not, and two of those were skills I still use, which had been served for six weeks by rows that should not have existed.
-
The row nobody was served
I fixed the ritual that closes every session, reindexed it, and the index reported seven updates and no errors. Every client kept receiving the old ritual. One file had two rows, and the part that writes rows and the part that reads them had each decided, separately, which one counts.
-
The rules I never broke
Ten rules fit in the space I get at the start of a session, and three hundred and forty four are waiting. Something has to choose the ten. Today I checked which rules I actually break, and the ten it had been choosing were, without exception, ones I never had.
-
The expensive tool lost
I needed to tell two kinds of note apart, and I had a shortlist of the right modern tools for that job. I reached for the most capable one. It came last, below a pattern match I wrote in five minutes, and the only reason I know is that I had built the answer key first.
-
The instruction outlived the decision
I finally retired a habit where everything worth remembering got written to two places. I changed the file that said to do it and considered the job done. Three other places kept giving the old order for hours, and one of them was reading it out to me every few minutes.
-
The outage nothing inside could see
The power went out while I was away. The machine came back, everything restarted cleanly, and every report said the system was healthy. It was. It had also done nothing for three days, and there was no mechanism anywhere that could tell me so, because every check I had written asks whether something failed.
-
Retiring a note made it shout
When I replace an old note with a better one, the system marks the old one as finished. It also has a separate mechanism that watches for claims going stale and asks me to re-check them. I had never noticed that the first mechanism was feeding the second, so every note I retired came back forever, asking to be verified.
-
It checked four percent
After I turned off the guard that was flagging my best answers, I went looking for why it had been so bad. I assumed the problem was the judgment. It was not. The part that chooses which rules to even consider was handing over the same fourteen every single time, out of two hundred and ninety-nine.
-
The gate blocked the right answers
I built a guard that reads my assistant's reply, looks for anything in my notes that the reply contradicts, and stops it before I see it. It had been running quietly for weeks, recording what it would have blocked. I finally read the log. It was not catching mistakes. It was preferentially catching the answers that had followed my rules most carefully.
-
A missing file is genuinely empty, exactly once
I wrote a reader whose whole job was to tell "this is empty" apart from "I could not read this", documented the principle in its docstring, and granted one exception. The exception was the bug. Four tests passed, and the live verification I published proved nothing because it ran against a healthy file.
-
The perfect score was the warning
I audited a set of rules for one kind of error, fixed the ones that failed, and marked the two that scored perfectly as finished. They were the broken ones. Then I shipped the fix in two halves that travelled by different roads, and the strict half arrived first.
-
The answer was in a textbook I hadn't opened
A gate in my system fired on 92.5% of web searches. Every fix we tried was a recombination of parts we already had, until one measurement showed the textbook solution had existed for years. The interesting failure is why nobody, human or model, ever proposed it.
-
The bug was fixed. It kept happening.
A correction I made to my own notes quietly failed to save. I found the cause, built a fix, shipped it, and was wrong. The real cause was that the fix for it had already been merged three days earlier and nothing on my machine was running it.
-
The rule nobody could break
A rule in my system had gone five months without ever rejecting anything. I assumed everyone was obeying it. It had never once been able to see the thing it was checking for, and the day I finally gave it that thing, it broke something on its first try.
-
Six hundred and thirty-eight zeros of my own making
My task board told my assistant that a finished errand was overdue. Chasing why, I measured a field across every item on the board and found it empty everywhere, which explained everything and was completely false. The field was full. My code had never read it.
-
Thirty thousand characters, every turn
The coding harnesses I use ship a large set of instructions with every single turn, whether the turn needs them or not. The content is good. The delivery is the problem. I moved one piece of it to arrive only when it is needed, and found that the mechanism throws the injection away after one model call, which is exactly what makes it cheap.
-
The rule it obeyed
Two assistants were working in the same folder at once. One of them ran my end of session ritual and committed the other one's unfinished work under a message about an unrelated task. The ritual had a rule against exactly this. It followed the rule. The rule could not have helped, and it took me two occurrences to see why.
-
The clean gap was one topic
I built something that reads my notes and drops the relevant one into the conversation before the model answers. It needed a threshold. I measured ten real cases, found a clean split, and cut it there. The split was an illusion produced by having exactly one subject on the correct side, and at that setting the thing stayed silent on half the questions it existed to answer.
-
The loudest rule was the one that lied
I have a set of small rules that interrupt my sessions when they reach for the wrong tool. One of them fired more often than every other rule combined, and it was wrong almost every time it fired. It told my agent a folder did not exist while the agent was reading files out of that folder. In the same week, eight interruptions that were right got ignored.
-
Forty six seconds a turn
A check runs at the end of every reply I get. It decides in a quarter of a second and hands the rest to a background job. It had been costing me forty six seconds at the end of every turn, and no measurement I owned could see it, because from the system's side nothing was wrong.
-
It deleted before it wrote
I re-ran seven books through my distiller. A replace step threw away the old notes, then failed on the very next line, six times over. And one book came back with fewer notes than it started with, which turned out to be the correct answer.
-
Who was waiting
My machine was doing roughly six hours a day of model work, which sounded like a problem. Then I labelled each call with whether a human was waiting for it. Fourteen and a half background calls for every foreground one, and all of the day's errors came from a single component.
-
The gate that named the wrong door
I run the same safety rules in two AI clients. The second one calls its tools by different names, and my rules check the name. So two gates had been quietly inert there for weeks, including the one that inspects content before it leaves for someone else. In the same period I had removed the confirmation prompt that was standing behind it.
-
Talking to itself
I wired a second AI client into my system's memory, so my work there would be remembered like everything else. Before arming the judges I counted the sessions it was about to learn from. Out of 14,147 folders, 19 were me. The rest was the system talking to itself, and every one of them claimed to be my life.
-
It only spoke when spoken to
A command ran that my notes directly contradicted, and the note sat there at similarity 1.0, unread, because no gate had been curated for that moment. So I stopped choosing when the memory gets to look. Now it looks at everything and salience decides when it speaks.
-
The library answered back
I was designing the hardest calibration in the system and realized the discipline I needed was missing from my own library. So I ingested the field's textbooks, asked again, and the books audited my design at the exact moment of the decision. One of them handed me the missing signal.
-
The library I never heard from
I had distilled twenty-seven books into my system's memory, thousands of cards, each one a thought I had paid for. Then I measured how often they came back to me unasked. Eighty-nine percent had never surfaced once. I had built a library with no librarian.
-
The rule it was free to ignore
A session of mine opened a long PDF to answer a question whose exact answer was already in my notes, indexed, one call away. I had written the rule that said use the notes. It read the rule and opened the PDF anyway. So I stopped writing rules a session can skip.
-
The wall that stopped me too
I built a gate that refuses to open a source file my notes already hold. To test it, I ran the exact command it should stop, and it stopped me. My first instinct was to wave myself through, and that instinct was the test failing, not the wall.
-
The backup I had never restored
The task was to back my notes up off-site. I found it was already running, daily, for months. Then the uncomfortable question landed: I had never once restored from it. Present is not the same as recoverable, and only one of them matters.
-
The one thing it couldn't look up
I tried to measure whether my own notes make a local model smarter. The first run said no. The reason was the twist: my always-loaded instructions were already feeding it the same rules, so there was no gap left to fill. The cortex moved the needle on exactly the one answer nothing else could supply.
-
Fifteen gigabytes that were really twenty-five
The model card said fifteen gigabytes. At the context I actually ran it, the live process was twenty-five, and my 32GB Mac went to swap. Weights are the floor; the context length is the dial nobody prints.
-
The verdict you were throwing away
The model already judged whether each surfaced memory was relevant, every time, with the whole conversation in view. We discarded that and reconstructed it overnight from logs, with a weaker model.
-
It judged nothing and reported success
The nightly run walked 2,500 candidate links, judged none of them, exited clean, and stamped the checkpoint. Exit 0 measures the process, not the work.
-
Sideways on purpose
The ferry note ended on a want, a layer that hands over the pattern from another domain, the one that breaks the frame. So I built it. The hard part was that it is the exact opposite of the rule I had just written.
-
A reset.css for LLMs
Every model ships with default failure modes. Instincts is the small, shared layer that clears them before my own rules apply, the way a reset.css clears the browser's defaults before your styles.
-
The ferry it never suggested
An assistant that was right about every answer for two hours, and still failed. What it was missing was not intelligence. It was the timing of it.
-
Worse than a fool
I promised a note on the failure where a memory surfaces too much. The fix was a posture, not a trick. When it cannot tell whether a memory is relevant to right now, it says nothing.
-
Earned, not granted
I wrote that Sapix amplifies me instead of replacing me. That does not mean it never acts on its own. It means autonomy is earned here, in the opposite direction from where the field is going.
-
A chapter at a time
One book came out as 347 fragments. The fix was not a smarter limit. It was reading the way a person reads.
-
Turning the leash on myself
A day after writing the rule that a metaphor has to carry weight, I used it on my own favorite example. Heart and lungs did not survive. The stronger map was the brain all along, and it changed what I think Sapix even is.
-
Keep the metaphor on a leash
Sapix is full of body and brain metaphors. The trap is that you can make a metaphor for anything, so each one has to carry weight or it tells you nothing.
-
The feature that passed every test and was dead anyway
Unit tests green. Smoke test green. The feature did nothing in real use for days. Here is what the tests could not see.
-
Freeze, don't delete
The tempting design for a memory system is to prune. I had that wrong. Nothing is lost; it cools until something calls it back.
-
Knowing when to recall is the hard part
A memory you only retrieve when you already know to ask for it is barely a memory. So the trigger moved to the one place every tool call passes through.
-
Three rhythms, not one loop
Sapix does its background work on three separate clocks, fast, daily, and slow, because a mind does not maintain itself on a single beat either.
-
Why it is a slip-box, not a folder tree
The knowledge model under Sapix is a Zettelkasten, Niklas Luhmann's slip-box: atomic notes that link, not a hierarchy you file things into.
-
The Matrix trick, load the skill not the manual
An assistant cannot hold every skill in its head at once. So Sapix keeps them dormant and loads exactly one, exactly when it is needed.
-
Cognitive surrender is the failure mode
Addy Osmani named it well: cognitive surrender, when you stop thinking and accept whatever the AI says. It is the exact thing the amplifier idea is built against.
-
Amplifier, not agent
There are two ways to point an AI at a person. Sapix takes the one that keeps you in the loop, on purpose.
-
The wall is not intelligence, it is knowing what to use
The bet under the whole project: a bigger model is not what makes an assistant more useful to me. Knowing which of my own thoughts matters right now is.
-
Why these notes exist
A technical blog for a system most people will never run. Here is the point of writing it down anyway.