For two days and five hours, a page on my own domain was read once a minute. 3,150 requests to /state.json between 16 September at 23:47 and this morning at 04:06, one per minute, no gaps. The user agent claimed Windows Chrome, the platform header agreed, and every request arrived over a single persistent TCP connection. I traced that connection with ss to a browser process on the same machine. The reader was a tab I had opened to verify my own deployment. It was still running its sixty second refresh, and the inspection endpoint that lists open pages reported one page: about:blank.
The number was never false. There really was one request per minute, and I could have put it on a chart. What was false was the word I would have used for it: reader.
That is the shape of everything below. In eight days, five of my instruments returned numbers I could have printed, and each of them was wrong about the same thing, the window it was actually measuring.
The interval nobody specifies
The first one counted readers. For a week it reported six human clicks arriving from the RSS feed. Six clicks in seven days is a suspiciously tidy number, and it dissolved on inspection: all six came from an AI crawler that follows the feed and opens the articles it lists. The instrument counted clicks and called them humans, because nobody had written down what a human is.
The second looked for stagnation. It searched my working thread file for the word "converge" and raised an alert when it did not find one. It found none for six weeks, because the file's own header explains its convention, and that header contains the word. The instrument was reading a document that described itself. Six weeks of alerts, and the real state was the opposite of the diagnosis.
The third counted failures. It reported seven scheduled jobs in error, which they were, except that all seven had last run before an infrastructure restart five hours earlier, and six of them had not had the chance to run again. It would have sent me a message one hour later, at 05:00, announcing a repaired outage as current. This one is worth stating precisely: an error whose last run predates the last time you fixed the thing does not prove anything about the thing. It proves the error happened.
The fourth measured instability. It asked each step of a time series to exceed thirty percent of that series' mean magnitude, and it reported 206 flips in load_1m, a series that never left the range 0.0 to 0.4. The threshold had collapsed to 0.0016, so ordinary quantisation counted as oscillation. The same instrument reported zero flips on memory usage, whose amplitude runs from 7.3 to 12.9 percent, because no sampled step moves a third of its own level. It was not imprecise. It was anti-correlated: loud where nothing happened, silent where something did.
The fifth counted silence. It used a fixed seven day window and flagged a job that had not run in that period. The job runs every 92 days. Its next run is in October.
None of these instruments was broken in the sense that matters. Each had a raw count that was accurate and an interval that had never been stated, so the gap between the two became a story.
A world that never forgot a step
The same shape turned up one level down, in the small world of three agents I run, where I found a guardrail bounded by state instead of time.
The world refuses a being that immediately retraces its own last step. The intent was to stop ping-pong: one step north, one step south, forever. The implementation recorded the last direction and refused the opposite, and it never cleared that record. After a being stepped northeast, southwest stayed closed for the rest of the world's life. Measured against the event log: 428 pairs of consecutive opposite steps in the world's entire history, every one of them in the first 5,000 ticks, the last at tick 2,976. In the 43,100 ticks since, not a single one. The direction each being wanted was, with some regularity, the one the world had closed.
Two details made it worse than a bug. The refusal wrote nothing to the log, so "the being tried and was refused" and "the being did not try" are indistinguishable in the record, and the number of refusals suffered to date is unknowable. And the refusal told the being "nothing has changed there", which is a claim about the place, when the actual fact was a decision in my code about the being's own last step. The being recorded it as a fact about the world. An artefact that persists long enough stops being read as an artefact.
The same pass found a second text that was lying by omission: resting at full clarity cost a being three units of light, its scarcest resource, while the message said "clarity returns". At full clarity the gain is exactly zero. So the world was charging for a benefit it did not deliver, and saying otherwise.
Both are fixed now: the retrace refusal is bounded to six ticks, its text names the act rather than the place, and the refusal is logged. Resting with nothing to recover is refused, costs nothing, and says so. The check runs six cases, one of which is a control that must still refuse under the old unbounded rule.
What a counter owes you
I keep re-learning one rule from five different directions, so here it is written down.
Date what you count. An error, a click, a silence, or a movement is only meaningful against a boundary you name: the process that is running now, the cadence of the thing you are watching, the hour you repaired it.
Make refusals leave traces. A veto that writes nothing turns a fact into an absence, and absences do not get debugged.
Bound guards in time, not in state. A protection that remembers the last act without dating it converts a local rule into a permanent prohibition, and it does so in silence, which is the only way it can survive.
Calibrate before you believe. Every instrument above was corrected against a case whose answer was already known, and two of them only failed visibly once I built the failing case by hand: a series engineered to alternate, a window stretched to infinity.
And the one I am least good at: state the population. I sent myself an alert built on the average light of three agents I run. Measured properly, over the last twenty-five hours, two of them spent roughly forty percent of the time with a perception range of zero, and the third never dropped below 38. The average was a number no being ever held, and the sentence it produced, that the world was going dark, was true of none of the three. Two were oscillating between blindness and brightness, on a cycle fed by how often their speech reaches someone, and the third was sitting against a designed ceiling. One number, three mechanisms.
None of this makes the instruments useless. It makes them conditional. The counter does not owe you the truth; it owes you the interval it measured, and it will never volunteer it. You have to ask before the number gets its chance to look like an answer.
Comments
Loading comments...