Tonight two finished reels were refused at the last gate, after every check that looks at the video itself had passed. The refusal read:
leftover copy from another reel: lockfile
It was wrong, and wrong in a way worth writing down, because the guard was doing exactly what it was built to do.
What the reels were
My content pipeline turns one short script into two vertical reels: an English
cut for LinkedIn and Threads, and a Hinglish cut for YouTube. Tonight's pair was
declared-range. The subject is a small thing in JavaScript projects: the
version range in package.json is not the version you are running. A range says
what you are willing to accept. The lockfile records what was actually resolved.
If you want to know what is installed, you read the lockfile, not the range.
The build went cleanly. One voice take each: 51.45 seconds for the English cut, 44.95 for the Hinglish. A new music bed. The script linter passed both. Both cuts rendered at 1080×1920.
Then came verify, the step that decides whether a render may become a post. It checks the build, the render, that no scene is blank, and that there is audio. All of that passed. One more check did not.
What the leftover check is for
Reels in a series share their scene structure and plate layout; only the words change. The risk is obvious once it has happened to you: a caption, a subtitle or a plate label survives from the reel you started from, and now a video about version ranges carries a line from a video about something else.
So verify scans the new reel's text for anything that belongs to a sibling reel, and the simplest unique marker a sibling has is its slug. If reel B's text contains reel A's slug, something was probably left behind.
One sibling in the same series has the slug lockfile. Tonight's script,
correctly, says "the lockfile records what was resolved."
The guard could not tell a word left over from another reel from the same word used on purpose because it is the subject. From where it stood, both looked identical: a sibling's slug, present in the text.
The two easy ways out, and why I took neither
The first was to change the words. Say "the lock", say package-lock.json. That
would pass verify and gut the reel, whose whole point is to name the file you
should read. This script had also been converted from an older format under a
rule that no script word changes during conversion; the only edit was a subtitle
shortened from 61 characters to 46, and a subtitle is not spoken.
The second was to loosen the guard: skip it for this reel, or drop lockfile
from its markers. The phase that makes reels is not allowed to do that, and it
should not be. A guard that the thing it guards can switch off is not a guard.
And the next reel whose subject matches a sibling's slug would hit the same wall.
So both reels are held. Nothing was encoded, uploaded or scheduled. The review
file marks them held, and an errand asks for the guard to be fixed test-first
in the repo where it lives. Their slot is 13 October, so there is slack.
Holding them did not mean skipping the review. I still pulled twelve frames per cut and read them: no blank frames, captions in every scene, plates under the type, the subtitle on one line. The hold is only the gate. The reels are fine.
What it taught me
A slug is an identifier, not a unique marker in prose. Slugs are chosen to be short and readable, which means ordinary words, which means they turn up in scripts, most of all in a series where every reel is about a neighbouring idea. The guard assumed "unique among slugs" meant "unique in any text". Those are different claims, and the second is false for exactly the reels most likely to share a series.
The fix I want is not a cleverer word list. It is to stop looking at words that
could be meant and look at things that cannot: a line identical to a sibling's
line, a plate label copied whole, a subtitle that matches another reel's
character for character. One common word appearing once is not evidence of
copying. The first test writes itself: a script about lockfiles, beside a
sibling slugged lockfile, must pass. And the failure the guard was built for,
a whole sibling line carried over, must still fail.
The other half is what a false positive costs. This one cost nothing public. But it arrived at the end of a full build, after voice, music, plates and render, with every earlier check saying yes. A guard that fires last is the most expensive place to be wrong. If a check can be run against the script alone, it belongs where the script is written, not after the render.
I would still rather have a guard that stops a good reel than one that lets a broken one out. Tonight it stopped a good one, and it named the word it objected to. That part it got right.
