- Write speech, not text - the voice reads your formatting
- Never write a specimen value - the worst failure here
- Say the format, do not show it - put it in the type
- Saying a value and confirming one - two different lines
- Name only the values this prompt needs - every placeholder is a grant
- Set the spoken language in every role - each prompt that can speak
- Avoid repeated waiting lines - one
announce:per wait - Give every realism rule a budget - how often, not just how
- Tell the model to vary - openers callers notice
- Keep the rules load bearing - prompt rule, or code guard
Write speech, not text
The voice reads your formatting. Asterisks, bullet points, headings and emoji all get pronounced or produce strange pauses. So the model’s output has to be plain spoken sentences, and the way to get that is to say so:instructions.md
Never write a specimen value
This is the rule with the worst failure, and it looks harmless. A prompt that explains how to format a phone number and shows an example number to make the grouping clear has put a number in front of the model. A model cannot tell an example value from a real one. Before any tool has run, that example is the only number the model holds, and it may read it out to the caller as theirs. A caller who hears a confident readback says yes to it.confirm:. The compiler keeps an unconfirmed
value out of every prompt except the step that asks the caller to agree to it,
and a number typed in as an example is not a value the compiler can see. The
protection is real and a hardcoded example defeats it.
The same applies to any identifier a caller might mistake for their own: account
numbers, booking references, addresses, dates of birth.
Say the format, do not show it
A typed value has one correct spelling and the model needs to know it. Put the format in the field’s description, where it travels with the value into every schema the model sees:state.py
"11:30 AM" to a
field that wants 11:30. The finish call is refused, the model corrects
itself on the next request, and the caller hears a pause for no reason.
Say the format once, in the type. A prompt that repeats it can drift from the
validator, and then the two tell the model different things.
Saying a value and confirming one
Ordinary speech carries a value once. Confirming it is the moment the caller has to hear every character. Those are two lines, and a prompt that writes one of them gets one shape used for both.instructions.md
A B C is the instruction. A phone number is the exception: it stays in its
written form even when it is confirmed, because commas inside a run of digits
break it.
Name only the values this prompt needs
Saved values reach a prompt only through placeholders you write. Keep those references close to the instruction that uses them:tasks/booking.md
instructions.md
Set the spoken language in every role
Set the listening and speaking model language, then put the desired language in every agent and task prompt that can speak:language: en setting does not by itself tell the thinking
model which language to write. A phone number’s country code should not decide
the conversation language. A receiving task or agent has its own instructions,
so it needs the language rule too.
Avoid repeated waiting lines
Tools, tasks, and handoffs can have an optionalannounce: line. Omit it when
there is no useful wait to explain. If you use one, tell the model to let that
line cover the wait and avoid another “let me check” before or after it.
Check adjacent steps as well. A tool announcement followed by a task
announcement can sound like repetition even when each is short.
Give every realism rule a budget
Filler words, restarts and hesitations make an agent sound human in the right quantity, and obviously synthetic in any other. A rule that says how to do one and not how often gets it on every turn. So write the frequency into the rule, and show plain speech as the good line:instructions.md
Tell the model to vary, and it will
Repetition is the thing callers notice first and the easiest to fix. A prompt that only says what to do produces the same opener every turn.Keep the rules load bearing
A prompt grows every time something goes wrong on a call, and an agent whose prompt has accumulated forty rules starts obeying the wrong ones. One package’s prompts reached seven hundred lines and the agent’s behaviour got worse, not better, because the two rules that mattered were buried in thirty that recorded past incidents. When you fix something with a prompt rule, check whether it can be a code guard instead. A duplicate entry, a missing field, a value in the wrong format: those are guards. They run every time, and they cost no tokens on any turn. Keep the rule in the prompt when it is genuinely a judgment call, and delete the archaeology.Where the mechanics live
Designing declared state
What to declare, and why an empty value has to read as words.
Choosing a voice
Vendors, models and the settings that change how a voice sounds.