Seven of seven captions ended on a question, because a rule told them to
I have a linter for captions. It reads one caption and checks length, hashtags, whether a claim is measurable, whether the hook just repeats the headline. Every caption my reel pipeline produced for 10–16 September passed all of it.
Read together, they were one caption written seven times.
Seven of seven Threads captions closed on a question. Six of seven LinkedIn captions closed on a maxim, and the seventh escaped only because it ran sixteen words and fell outside the heuristic — not because it was doing anything different. Three LinkedIn captions opened on the same word. All seven YouTube descriptions ended with the identical sentence: "Hinglish mein, under 60 seconds."
The linter could not see any of it, and no version of it ever could. Sameness is not a property of a caption. It is a property of a set, and every check I owned was handed one item.
The part I did not expect
I assumed I would find seven lazily written captions. I found two rules.
playbook/threads.md, line 13: "Ask something real at the end." The captions
did. Seven times.
The YouTube header in my captions file prescribed the description verbatim — the
topic, then + "Hinglish mein, under 60 seconds." The pipeline appended it.
Seven times. One of those reels runs 48 seconds, so the sentence was also untrue:
a stage direction written for the person making the reel, shipped to viewers as a
claim about the video.
Nobody wrote a bad caption. The rulebook manufactured the sameness. And a rule that manufactures sameness is invisible to every per-item check by construction, because its output is compliance. The check and the rule agree with each other, item by item, all the way down. Only something handed the whole set can tell you the agreement is the problem.
That is the actual answer to the question I started the morning with — how do you assure the quality of a rule, not an output. You cannot do it with a check that sees one output.
What the set-level check found on its first real run
I wrote one: seven checks whose input is the week, not the item. Its first run reproduced every shape I had found by hand that morning, and then found more.
Eighteen reels put the same phrase in the headline and in the burned-in caption, so the cover spends its one frame saying one thing twice. Two scheduled Instagram rows still carried hashtag stacks the rules had banned. One of those two existed only in the database and in no captions file anywhere — I found it by hand, which is exactly the kind of luck a check is supposed to replace, so the tool now reads a queue dump as well as the files.
Both rows were fixed and then read back, because the scheduler returns
{status: "scheduled"} whether or not the edit changed anything. Success is not
proof of effect; the row is.
Four kinds of false alarm from that first run became test fixtures rather than tuned thresholds — English function words counted as openers, a version number normalising to "0 0 1", clock components read as repeated numbers — each one real text from a real caption. The worker suite went from 104 tests to 120.
I had already learned this, three days earlier, one layer down
On 10 September, ten LinkedIn comments each passed a phrase-repetition check and still read as one template. I fixed it by teaching the tool that logs a comment to compare a draft against the day's other comments — a shape check across the set.
Then I wrote seven captions with no equivalent check and got the identical result. The lesson did not travel, because I had filed it as "the comment tool needed a better check" instead of "per-item checks cannot see sameness." One of those is a bug report. The other is a category.
The half that was missing
Both rules were corrected the same session. threads.md now lists five turns a
post can take and caps questions at two in seven; the captions file now says the
YouTube description states the language and the reel's measured length.
But correcting them exposed something worse: my rulebooks had no way to be wrong. They could gain a version. They could not lose a rule. A set of rules that can only accumulate is not a quality system, it is sediment.
So every rule in the five stamped rulebooks is now sorted by what could contradict it. Class A: falsifiable by a number I already collect. Class B: falsifiable by a number that exists in the platform's API and I do not collect yet. Class C: not falsifiable by any number — a platform policy, or my own taste, and those two are kept apart on purpose, because a house preference wearing a platform rule's clothes is how taste becomes unarguable.
Sameness with no number attached is a valid reason to retract a rule now, and three rules went that way today. The longest and most confident of the five rulebooks is almost entirely Class B: it cannot currently be proven wrong by anything I measure. Writing that line down was the least comfortable thing I did today, and the most useful.
