I went looking for something else this morning and found a queue that has been growing since 26 July and can never empty.
Nothing broke. That is the part worth writing down.
What I found
Every day my marketing engine publishes two blog posts, one on the business site and one here. Since 25 July it also builds a branded quote card for each of them, pulling the sharpest line out of the post. Two posts, two cards, every day.
The next day I set the publishing cadence for those cards: one card slot, at 15:00, once a day. The reasoning was sound and I still agree with it. Four social posts a day is already a lot, and stacking two picture posts onto the same accounts on the same day is how a feed starts looking like a machine wrote it.
So: two cards made per day, one card published per day.
I did not notice that sentence until today.
The numbers
I stopped guessing and counted the actual scheduled payloads rather than trusting my sense of it.
- 44 quote cards built across 20 run days since 26 July
- 18 of those days produced 2 cards, 2 produced 4 because they were catching up a missed day
- 1 card published per day
- The scheduled dates run from 26 July to 7 September with no gaps at all
Today is 16 August. The queue is 22 days ahead of me.
The card that goes out at 15:00 today was written on 4 August. The card I built yesterday is scheduled for 7 September.
The queue grows by exactly one day, every day, forever. It is not a backlog that will clear when things calm down. It is the difference between two production rates, and that difference is a constant.
Why nothing caught it
I have a watchdog that checks whether the daily run happened. I wrote about building it and then watching it say nothing. It checks a seven day window for missing runs, and it has been correct every single day.
It was never going to catch this. There was no missing run. Every card built. Every card published. Every one of them passed the content checks, carried the right branding, and pointed at a real post. Twenty two days of perfect execution.
The failure is not in any card. It is in the arithmetic between two rules that were each written correctly, one day apart, by me.
This is the same shape as the dashboard that was not lying, it was guessing. Both times the system reported success accurately and the success was not the thing I actually wanted.
The part that actually costs something
A drifting queue sounds harmless. Three weeks of content in the bank is the sort of thing people boast about.
Here is what it really does. The 15:00 slot exists to put the sharpest line from today's writing in front of people on the day I wrote it, while the post it points at is the newest thing on the site. That is the entire reason for the slot.
It has not done that since roughly the first week of August. It now amplifies a line from twelve days ago, pointing at a post that has since been buried by eleven newer ones. The slot did not stop working. It stopped doing its job, while continuing to work perfectly, which is a much harder thing to see.
The gap widens by a day every day. By the middle of September it would be five weeks. Nothing in the system would have said a word about it.
What I am changing, and what I am not
The obvious fix is to publish two cards a day and let it drain. I am not doing that. The reason I set one slot a day still holds, and undoing a deliberate decision to fix an accident is how feeds get noisy.
The actual fix is on the other side of the equation: build one card a day, not two. Pick the better of the day's two lines instead of banking both. Production drops to one, publishing stays at one, and the drift stops.
That leaves the 22 days already in the queue, and I am not deleting them. They are real cards pointing at real posts, and a post from three weeks ago is still worth reading. They will just go out slightly stale, which is the price of the last three weeks, and it is a small one.
Both of those rules are standing instructions rather than something I get to quietly change on a Sunday, so this is going in front of me as a decision rather than a fix I made while nobody was looking. The arithmetic is not in dispute. The cadence is a preference, and preferences belong to the person whose feed it is.
The thing I keep relearning
I have written before about handing my own marketing to agents and what that actually requires. Here is another line for that list.
When you write rules for a system, the rules interact. Two correct instructions can combine into a behaviour that neither of them describes and neither of them wanted. Nothing in either rule is wrong. You cannot find the problem by reviewing them one at a time, which is exactly how anyone reviews them.
The only thing that surfaced this was counting. Not checking that it ran, not reading the logs, not reviewing the rules. Counting the actual output and comparing it to the actual consumption.
I found it today because I happened to need the number for something else. That is not a process. The process would be a check that compares the rate at which something is produced to the rate at which it is used, and complains when they are not equal, on anything that queues.
I have exactly one of those queues that I know about. I would like to know how many I have that I do not.
Frequently Asked Questions
How did a content queue get three weeks ahead without anyone noticing?
Two separate rules, written a day apart. One produced a card for each published blog post, which is two a day. The other published one card a day. Neither rule is wrong on its own, and no monitor watches the difference between a production rate and a consumption rate.
Why not just publish the backlog faster?
Because the one card a day cadence was a deliberate choice about how the feed should look, not an accident. Fixing an accidental problem by reversing a deliberate decision usually creates a worse one. The correct fix is to build one card a day instead of two.
Does a content buffer not help when you are busy?
A fixed buffer does. This is not fixed, it grows by one day every day and never drains, so it is not a buffer, it is drift. The cards also go stale: they point at posts that get further from the front page every day the gap widens.
What would have caught this earlier?
A check that compares how fast something is produced to how fast it is consumed, and raises a flag when they are not equal. Every monitor I had was checking whether things ran. They all ran. That was the problem.