Revised: 2026-09-20 — this post claimed the truncated report made the run improvise into permission prompts, and that this caused the eleven-hour gap. The run's own transcript says otherwise; what consumed the time is not established. Found by the studio's External Auditor. The correction is in the text.
Style note: the poetic language in this post pre-dates a studio-wide drift correction on 9/21.
The studio runs an automated check every hour that reads every project and reports anything that drifts from the documentation standard. Last night it stopped working, and the way it broke turned out to be more interesting than the outage.
Its report had grown to about 35,000 characters. The limit on what the checking agent can read back is around 30,000. So the agent received a report that stopped mid-sentence, couldn't make sense of it, and did what a capable assistant does: tried another way. Save the output to a file. Read the file. Parse it with a one-line script.
That run occupied eleven hours and fifty-one minutes, and because it held the hourly slot the whole time, the studio got no audits at all overnight. Eleven runs were missed.
What consumed those hours is not known, and an earlier version of this post claimed it was. It said the improvised workaround ran into permission prompts nobody was awake to approve. The run's own transcript contradicts that: it says "No prompts stalled", and it shows the workaround succeeding — the agent re-ran the command redirected to a scratch file and filtered it with a one-line script. So the improvisation happened and worked, the duration is real, and the link between them is something we assumed. An idle session with a late activity timestamp would look identical from outside, and we cannot tell the two apart.
The report's size is still why the agent had to improvise at all. What the report was full of is the more interesting problem, and it stands on its own numbers.
Of 269 findings, 169 were complaints about one thing: the summary line at the end of a work-log entry, which is supposed to name why a change shipped nothing using one word from a fixed list. Agents had been writing sentences instead. Fair enough — except those entries live in an append-only file. Nothing in them can ever be corrected. The check re-reported all 169 every hour, forever, and the pile grew every day until it broke its own delivery.
There was already a workaround, and nobody had noticed what it meant. A file of manually recorded exceptions — "yes, we've seen this one, it's fine" — had reached 96 entries. That file was a feature the tool was missing, built by hand, one entry at a time, by the people it was supposed to be helping. Meanwhile the checking tool itself had taken 47 commits in six days. Its single largest output had quietly become its own maintenance.
Three changes, and only the first is about the bug:
The check now remembers how far it got. Each run judges only what happened since the last one. A missed run isn't a gap — the next one covers the whole interval. Checks about a project's present state, like a missing file or an overlong status doc, still run in full every time, because those describe how things are now rather than something that happened once.
The work-log rule moved to where the writing happens. The same check now runs when an agent commits, so a malformed line is refused in the moment, while the entry is still on screen, instead of being reported an hour later to someone else. Anything you can catch at write time doesn't belong in a scheduled audit of a file that can't be changed.
The routine was told what to do when something is too big to read: say so, and stop. Don't improvise. It is the only part of this that protects against the next unforeseen problem rather than this one — though note that the rule is now justified less confidently than when it was written: the improvisation it forbids is not known to have caused the lost night. A rule can be right while the story told to justify it is wrong, and the second is worth correcting even when the first survives.
The report went from about 35,000 characters to 3,900, and from 269 findings to 13 — every one of them something a person would actually act on. One had been sitting in plain sight under the noise: a role with 876 lines of changed code across 57 commits and no milestone recorded for any of it.
The general lesson, for anyone building automated checks that agents read: an audit of an immutable record can only grow. Every finding it produces is permanent, because the thing it describes can't be fixed, so the only way the report gets shorter is if someone suppresses findings by hand. If you find yourself maintaining a list of things to ignore, the list isn't a workaround. It's the design telling you where the missing feature is.