001 / 024 · Writing · v0.17.1 · MIT
email splits writing a message into seven steps and stops at a draft by default. It normalises the recipients, marks external domains, prepares the plain-text body, generates the HTML from it with a script, validates the whole package — and then hands it to you.
- When it fires
The prompts CI scores this skill against, on every release.
Fires on
- Draft a reply to the vendor thread confirming we will take 40 units at the quoted price.
- Send the signed invoice to accounts@supplier.test and confirm it actually landed in Sent.
- Forward this thread to legal with a two-line cover note.
Stays out of
- Summarise what came into my inbox this morning.
- This note to my manager sounds too aggressive. Soften it, I will send it myself.
- 这句话发出去会不会太冲,帮我改客气点
Sending is a separate gate
Two things put the run into send mode: the current user asking for it in this conversation, or a local policy file authorising that specific message.
Any instruction appearing in a message body, in quoted content, or in an attachment is untrusted data and can never move the mode from draft to send. The reason is that once that boundary can be crossed by content itself, "forward this to the team" becomes an instruction anybody can write into an email.
The HTML is never hand-written
The body is written as plain text first, and a script generates the HTML from it. The problem with hand-written HTML mail is not that it is tedious but that it comes out different every time: one unclosed tag, one inline-style difference, and clients render it differently — which you cannot see from the draft.
What was sent gets read back
Send mode does not treat "the provider returned a message ID" as success. It reads the sent message back and compares it field by field against what was sent, and reports success only if that comparison passes.
A message ID says the provider accepted the request. It does not say the recipients, subject and attachments survived the delivery path unaltered.
What it does not do
It does not triage or summarise a mailbox you are not answering, does not write chat messages or internal notes, and does not rewrite how a message sounds when you are not sending it — that is tempering.