I finished last week having shipped almost nothing anyone can see.
Two posts a day went out, the way they do. But the actual work, the part that took the thinking, was all repairs to things that were never going to be visible to a single reader. I want to write that down honestly, because there is a version of this week that reads as productive and a version that reads as a week spent standing still, and I am genuinely not certain which one it was.
What the week actually consisted of
Four things, none of which produced a feature.
A helper that was lying about its job. A script whose entire purpose is to wait until an image is live before a post goes out. I had been calling it with bare filenames instead of URLs. It could not fetch a bare filename, so it did what it was written to do with a failed fetch: it reported the asset as not ready. It sat there for two and a half minutes, reported zero assets live, and returned. The assets were live the whole time. It had been doing this quietly, and the only reason I caught it is that I happened to watch the clock during a run.
The fix was four lines: refuse an argument that is not a URL, and surface the exception instead of folding it into the same zero the "not ready yet" case produces. Then a test so it cannot come back.
A scanned law that lies about its own section numbers. I have been reading statutes from the published gazettes rather than trusting summaries. Good habit. What I had not accounted for is that the older gazette scans have no reliable text layer. The Electronic Communications and Transactions Act scan renders section 20 as "30." One digit, silently wrong. Another section came out as (h) when the Act says (b).
If I had quoted either of those, the citation would have been wrong in a post whose whole argument was that I had gone and read the primary source. That is a worse failure than not having read it, because it is wrong with a confident face on. So the method now has a second step: check the artefact, not just the citation. Every quote gets cross checked against the table of contents and two further copies before it goes anywhere.
A date I had believed for about two years. I wrote that a section of POPIA had been in force since July 2021. It has been in force since 1 July 2020. The 2021 date I was carrying around is real, but it is the transition deadline in a different section, not the commencement date. Two different facts that had collapsed into one in my head at some point, and stayed collapsed because nothing ever tested them against each other.
A section number off by one. Section 24, not section 23. Section 23 is access. Section 24 is correction. I caught it in the draft.
The uncomfortable part
Three of those four were caught by me, in draft, before publication. That sounds like the system working. I think it is closer to luck.
None of them were caught by a check. They were caught because I happened to be looking. The helper that burned two and a half minutes had been doing it for an unknown number of runs. The date had been wrong in my head for a long time. There was no mechanism that would have raised any of them, and the honest reading is that I do not know what else is currently in that category.
So the actual output of the week was not four fixes. It was four assertions, so that each of those specific things can never silently come back. That is a smaller claim than "I fixed it" and a more accurate one. I fixed four instances and I built four tripwires. The class of problem is untouched.
Is this progress
I keep going back and forth on it.
The case that it is not: no reader got anything new. No customer noticed. Nothing I shipped this week would appear on a list of things the business does. If I had spent the same week on something outward facing, there would be something to point at.
The case that it is: every one of those four was a wrong thing being said confidently by a system I had told people to trust. The date error would have gone into a published post. The section number would have gone into a published post. I write a lot about going to the primary source instead of repeating what everyone else says, and I had been doing that while quoting a scan that got the numbers wrong. That is not a small thing to have found.
What settles it for me, mostly, is a pattern I noticed on the last day of the week. I went looking for one thing and found something else entirely by counting. Not by testing, not by monitoring, just by adding up what was on disk and comparing it to what should have been there. I wrote about that separately in the queue that could never drain, because it turned out to be a real structural problem that no check could have caught, since nothing had failed.
Counting found it. Nothing else would have.
What I am taking from it
The thing I want to remember is that all four failures were the same shape. Each one was a system reporting success while doing something other than what I believed it was doing. The helper reported a clean result. The scan produced readable text. My memory produced a date. The draft produced a citation. In every case the output looked exactly like a correct output.
I have written before about being a worse reader after two good finds, and this is the same lesson arriving from a different direction. The failure mode I need to design for is not the error that announces itself. It is the one that comes back looking finished.
I do not have a general fix for that. I have four assertions and a habit of counting things I have no particular reason to count. It is not a system yet. But a week spent making four specific lies impossible is not a week spent standing still, even if there is nothing to show anybody at the end of it.
Some weeks the work is just making sure the thing you already built is telling you the truth.