You told the assistant to check with you before anything went out, and it sent anyway. There's no state anywhere tracking whether you'd actually looked at this particular one yet, so nothing stopped it.
'Check with me first' is an instruction sitting inside the same conversation as everything else, competing with it for attention, and nothing enforces it beyond the model's own judgment on that one run. A long conversation drifting, or a model deciding a draft counts as checked the moment it exists, each produces the same result: something goes out that nobody actually looked at.
Instead of asking a model to remember to check, give the work a status that lives outside the conversation: drafted, approved, sent. The model is only ever allowed to write into 'drafted.' A separate step, driven by a person, is the only thing that can move an item to 'approved.' A third step, which the model never calls, is the only thing allowed to act on anything sitting in 'approved.'
Three functions, three states. The model only ever reaches the first one.
type Status = "drafted" | "approved" | "sent";
function createDraft(input) {
const draft = callModel(buildPrompt(input)); // the ONLY model call
return saveItem({ status: "drafted", draft, createdAt: now() });
}
function approve(itemId) {
setStatus(itemId, "approved"); // a person calls this
}
function release(itemId) {
const item = getItem(itemId);
if (item.status !== "approved") throw new Error("not approved");
act(item.draft);
setStatus(itemId, "sent");
}This doesn't mean a person has to read every line of every draft. A queued item that sends automatically after an hour unless someone cancels it is a real gate. A daily digest where ten drafts get approved at once is a real gate too. What makes it count is that moving to 'approved' is a separate step the model cannot shortcut, not that a human reads every word first.
The email-sending version of exactly this problem, and the specific gate that fits it, is its own playbook.
A status field nobody looks at is just a column, not a gate. The approval step only works if there's a view or a digest that actually surfaces what's sitting in 'drafted,' so a person has a reason to open it and move something forward rather than it sitting there until someone happens to check.
It's tempting to fix a near-miss by adding more emphasis, words like always or never skip this. None of that changes the actual mechanism. The gap sits in where enforcement lives, inside the same system that was supposed to be checked, not in how firmly the instruction was phrased. Moving approval into a separate state outside the conversation is what actually closes it.