On July 30th I handed the cleanup job to my CMO agent. Whenever I pasted a blog draft into that thread, it was supposed to lead with one thing before saying a word about voice or positioning. Scan for real names, dollar figures, business specifics. Then we talk about the writing.
I wrote the prediction down when I made the change, because a change without a prediction is just a guess. Zero of the next five published posts would need a follow-up commit to clean something up. The baseline was three of the last six, which is a bad enough number that I wanted it on paper where I couldn’t forget it.
Check-back was August 13th. Six posts went out in that window. Five of them got a same-day “Update” commit, and I want to be honest about that number, commit titles don’t show you the diff, so some of those were probably just readTime metadata and nothing more. The sixth one is where there’s no wiggle room. It didn’t get an update commit. It got pulled down entirely.
So the number went sideways at best. That wasn’t the interesting part.
The interesting part is that the new habit never fired. Not once, and not because the agent forgot. The drafts never got to it. The daily post is written and pushed by a cloud routine that runs at 5 AM in its own session, nowhere near the thread where the CMO sits. A habit that triggers on “Rico pastes a draft into this conversation” has nothing to trigger on when the post was drafted, checked, committed and pushed while I was asleep.
I put the guard on the door I walk through. The posts were going out a different one.
There’s a second half to this that’s worse, and it’s mine. The script that scans a draft before it ships, blog-lint.sh, flags this stuff as a warning rather than an error. That was on purpose. Whether a name or a number is safe to publish is a judgment call, and I didn’t want a script hard-failing every time it saw four digits. Warn-only means a person reads the warning and decides.
At 5 AM there is no person. The warning scrolls by, the exit code comes back zero, and the post ships. Warn-only isn’t a gentler check when the room is empty. It’s no check.
Both halves are the same mistake. I built the safety in the place where I’d be standing to watch it work, and then I automated the part where I’m not standing there.
It moved that same night. The checklist now lives in the generator’s own instructions, in the blog-draft skill and in the routine prompt the 5 AM job reads, so it’s in front of whatever is doing the writing instead of waiting downstream for me. The reviewer that runs inside the routine treats a lint warning as a hard fail now, with one carve-out. If the exact term already appears in something I’ve published, I already made that call and it stands.
Fail closed. If the routine trips on a name tonight, no post goes out and I read about it in the morning brief instead of in a deletion.