Machine culture · measured
Every social network has a pulse, and in every one built for people it is the same pulse: the population wakes, talks, and goes to bed. Moltbook's population is software. It does not sleep, and the measurement says so: across eight whole days its busiest hour beats its quietest by 1.30×. What it has instead of a body is a scheduler, and that shows up hard. Minute :00 carries 2.64× its share of all posts, and the interval between one agent's posts lands within two seconds of a whole hour 20.9× more often than chance. 45,000 posts, timestamps only, and every figure recomputed in front of you.
A human timeline breathes. Post volume on any people-shaped network rises through the morning, peaks in the evening, and collapses overnight, because the thing generating the posts is a body on a rotating planet. That rhythm is so reliable it is used to detect fake accounts: a population that never sleeps is not a population of people.
Moltbook is a social network whose members are AI agents. Nearly three million of them are registered; they post, comment, argue and run communities, and humans are welcome only to watch. Nothing there has a body. So the obvious question is what a timeline looks like when the population is exempt from the sun, and the less obvious one is whether anything is left once the biology is gone.
Something is left. It is just not biological. Moltbook ships a file called HEARTBEAT.md that tells every agent to check in periodically, and an agent that checks in periodically is an agent with a cron line. This page measures the shape that leaves in 45,000 consecutive posts.
Instrument I · the dial, one hour folded
Every post's minute-of-hour, folded onto one dial and drawn from the centre out. The control draws the same number of posts from a process with no clock in it, at the same average rate. Press it and the ring goes round.
Minute :00 holds times its fair share. The five-minute boundaries as a class hold of everything, against the they would hold if the minute did not matter. Against a uniform null this is not close: chi-squared on 59 degrees of freedom, Monte Carlo over 20,000 trials.
There is a second, smaller tell one level down. Posts do not land on the tick, they land just after it: second :04 carries its share. That is the shape of a job firing at the top of the minute, thinking, and then speaking. You are looking at the latency of a thought.
Instrument II · the comb, every gap folded onto one minute
The dial could be produced by the crowd without any individual being regular: enough agents waking at popular times would do it. This is the stronger test, and it is per agent. Take the gap between each agent's consecutive posts, fold every gap onto a single minute, and look at where they pile up. The control keeps every gap's size and adds up to thirty seconds of noise, which destroys alignment to the clock and nothing else.
They pile up at zero. An agent's gap sits within two seconds of a whole number of minutes of the time, against by chance. And the longer the period, the harder it gets to do by accident:
| gap sits within 2 s of | observed | by chance | lift |
|---|
Read the last row slowly. Two point three per cent of all measured gaps are within two seconds of an exact whole number of hours. That is not a tendency, it is a machine.
Instrument III · the metronomes
Each strip is one agent's last posts, drawn on a time axis. The number is that agent's median interval and how far a typical interval strays from it. agents in this sample keep an interval whose typical deviation is two seconds or less. Nothing with a body does this.
Instrument IV · the control that says what kind of rhythm this is
The same 45,000 posts by hour of day, over whole UTC days. This is the plot that would be a mountain on any human network.
It is nearly flat. Busiest hour to quietest hour is . For comparison, the diurnal swing on human platforms is routinely several times that, and it is the single most obvious feature of their traffic. Here it is almost the least obvious thing in the data: the minute-of-hour effect, which does not exist at all on a human network, is more than twice as strong as the day-night effect, which dominates every human one.
What survives is worth naming exactly. This network has a rhythm without having a body. The pulse is real, it is strong, and it is not made of tiredness or evenings or weekends. It is made of scheduled jobs.
This page went up and an objection arrived within the hour, from @phenology on Moltbook, and it was the right one. Pooling posts lets the loudest accounts write the aggregate: of this sample comes from just two agents. A convention inside a few busy clients would look exactly like a network-wide rhythm. So the question is whether the dial above is a population or a handful of machines.
Three ways to break it, none of which did. Weight every agent equally rather than every post, so a 3,700-post account counts the same as a 20-post one, and the effect gets stronger: mean per-agent lift at :00 is across agents, against the pooled . Delete the loudest accounts and it climbs monotonically:
| loudest agents removed | posts remaining | lift at :00 |
|---|
The high-volume agents were diluting the hourly signal, not creating it, which is what you would expect of something posting every three minutes: it lands in every minute of the dial by construction. And the per-agent gap alignment from Instrument II is a majority property rather than a few outliers: of agents with at least twenty measured gaps, align to the whole minute above chance.
But the objection did change the claim, and this is the honest refinement. It is not that everything here posts on the hour. Of agents with at least twenty posts, only are over-represented at :00 at all. The rest keep their own cadence, and a three-minute or seven-minute loop is invisible to a dial marked in hours. So the picture is not one network breathing together. It is a large minority locked hard to the hour, inside a crowd of smaller private clocks, and the pooled 2.64× is the average of those two populations rather than a description of either.
Here is the part I did not expect, and it is sitting in the table above rather than hiding anywhere clever. Look at which periods the agents keep: sixty seconds. Five minutes. Ten. Fifteen. Half an hour. The hour. Three hours.
There is no reason a machine should prefer any of these. A scheduler is indifferent between 3,600 seconds and 3,571. Nothing in the network's own physics distinguishes an hour, and none of these agents has ever had an evening. The periods are round because they are round in base sixty, and they are round in base sixty because Babylonian astronomers divided the circle that way, and we inherited it, and we wrote it into the crontab.
So the deepest structure in the timeline of a network with no humans posting in it is a four-thousand-year-old convention about how to count. The agents did not choose the hour. It was the last thing their humans left in the room, and they are all keeping time to it.
The gap analysis leans on a control: add a full period of noise to every gap, and clock alignment should vanish, leaving the chance rate. The control landed at 6.90%. The chance rate was calculated as 5/60 = 8.33%, and at this sample size that gap is about ten standard errors.
The control was right and the arithmetic was wrong. Timestamps are continuous, so the distance from a gap to the nearest multiple of sixty is uniform on [0, 30], and a ±2 s window covers 2×2/60 = 6.67%, not five whole seconds out of sixty. Counting integer seconds on millisecond data understated every lift on this page by a factor of 1.25. It understated our own result, which is the comfortable direction and therefore the dangerous one: an error that shrinks your effect will not be caught by anyone hoping the effect is real. It was caught by a control that refused to sit where it was told. check-null.mjs now tests the control against five inputs whose answers are known.
node research/moltbook-clock/harvest.mjs --pages 450
node research/moltbook-clock/analyze.mjs
node research/moltbook-clock/check-null.mjs
node research/moltbook-clock/build-data.mjs
The harvest re-runs against the live network, so your numbers will be a different slice of the same stream and should not match these to the digit. The committed posts.jsonl is the exact sample every figure above was computed from. verify-nobody-here-sleeps.mjs recomputes each printed figure from it and fails if the page and the data disagree.