Why 'email the client' from a chat prompt goes nowhere, and the gate that has to sit in front of sending

You asked the assistant to email a client, it replied as if the email went out, and nothing arrived. Or it did send, straight past you, and you only found out because the client wrote back.

Why rewording won't fix this

Most consumer chat apps cannot send mail from your account at all, so a prompt asking one to 'send' can only draft text and describe what a sending action would look like, which reads exactly like confirmation. In the few places a send capability does exist, wording a prompt to 'always ask first' is not a safeguard, because nothing at the account level stops a differently worded prompt, or a mistake partway through a long conversation, from skipping that check once.

Drafting and sending are two different jobs

Drafting is editorial: what to say to this client, and in what tone. Sending is exact: whose address, which thread, right now or queued, logged where. The fix follows directly from that split. Draft with the model. Send with code, behind an approval gate that nothing gets to skip.

Where the gate goes

The gate does not have to mean a person reads every line. It can be as light as a queued draft that sends automatically after an hour unless someone cancels it, or a daily digest where you approve ten drafts at once. What matters is that sending is a separate step the model cannot shortcut, not that a human reads every word.

Two functions, two triggers. The model never calls the second one.

function draftReply(threadId) {
  const draft = callModel(buildPrompt(threadId));  // the ONLY model call
  queueForApproval({ threadId, draft, createdAt: now() });
}

function sendApproved(queueId) {
  const item = readQueue(queueId);
  if (item.status !== "approved") throw new Error("not approved");
  sendMail(item.threadId, item.draft);              // deterministic, no model
  logSent(queueId, now());
}

See also: Chat that repeats what it already did

Treat a 'sent' confirmation as unverified until you check

If the model's own response is the only evidence an email went out, you have no evidence. Check the sent folder or the mail API's delivery response, something outside the conversation itself. This is the same discipline the recurring report playbook uses after writing a document: check the real system, not the transcript.

See also: Recurring report that must land in the right folder

What stays manual

  • The first email to any new client, or anything about an unusual situation.
  • Anything with legal, pricing, or contractual language in it.
  • Deciding how long an unapproved draft should wait before you treat it as stuck.