Writing the product is talking to someone already inside

Say less. Say it.

Marketing voice is sharp. Product voice is direct. No personality. No apology. No hedging. The user did something; the system answers. This page is the floor for every string we ship in the product.

§A · Buttons · action-first verb · destructive carries the noun
CONTEXT
— don't write this
— write this
PRIMARY
Submit
Run simulation
SECONDARY
Yes / No
Cancel (ghost text, not a button)
DESTRUCTIVE
Delete
Delete run · 38
REMOVAL
Remove
Remove member · avi@
RESET
Reset
Reset audience · "U.S. Pro"
EXTERNAL LINK
Click here to learn more.
Read the methodology
A button is a verb. The verb carries the noun when the action is destructive. Cancel is always the secondary, never the primary — ghost text or transparent. "Submit" is banned. The user is not submitting a form to the DMV; they're running a simulation.
§B · Errors · what · why · what to do
§B.1 · the pattern

Three parts.

WHAT
HEADLINEThe event, as a noun + verb. "Run failed."
WHY
BODY · 1 sentenceCause and cost. "Stopped at agent 412 — model timeout. No charge applied."
WHAT TO DO
LINKS · ink, never buttonsOne or two next moves. "Resume from checkpoint · View incident report."
§B.2 · in place

How it reads.

Run failed
Stopped at agent 412 of 2,047.

Model timeout. No charge applied. The last successful checkpoint was at 50% — we can resume from there.

If we don't know the cause, say that: "We don't know why this failed. The trace ID is xxx. Email support and we'll find out within an hour." Never blame the user. "Your file is invalid" is acceptable; "You uploaded an invalid file" is not.
§C · Empty states · name the absence
FLAVOR
— don't write this
— write this
ZERO
No data.
No simulations yet. Your library will fill up here. Start by describing a decision in plain English.
NO RESULTS
No matches found.
Nothing matches "churn risk." Closest match in your library is "Trial cohort · 14d" — different word, similar question.
ERROR
Failed to load.
We couldn't load run · 38. Transient storage issue. The intake spec is intact — duplicate it and re-run.
§D · Loading · be honest about how long
DURATION
— don't write this
— write this
< 1s
Loading…
(silent — no copy)
1–4s
Please wait
Verifying audience · 2,047 agents matched
4–30s
Loading…
Run · 38 · 62% · 1m 24s left
> typical
Almost there!
This is taking longer than usual — about 9 min remaining.
§E · Confirmations · destructive only · two buttons
§E.1 · in place

The shape.

Destructive · cannot be undone
Delete run · 38 and 2,047 agent traces?

The result, the cohort breakouts, and every agent's reasoning trace will be removed permanently. The intake spec will stay in your library so you can re-run it.

§E.2 · the rules

What's banned.

"Are you sure?" as the headline.

Yes / No buttons.

"OK" as the destructive button.

"Don't show this again" — every confirmation earns its interruption.

A third button.

Reversible actions never get a confirmation — they get an undo.

§F · Toasts · receipts, not announcements
CHANNEL
— don't write this
— write this
SUCCESS · 4s
Saved! 🎉
Saved — spec saved to your library as "Pro $29 → $49"
INFO · 7s
FYI: simulation started.
Running — 2,047 agents · est. 4 min remaining
WARN · sticky
Heads up — things are slow!
Slow — inference queue is busy; your run is delayed about 9 min.
ERROR · sticky
Oops! Something went wrong.
Failed — run · 38 stopped at agent 412 · model timeout. Retry the simulation.
Don't toast a successful click. ("Saved!" "Copied!" "Done!") The next state is the receipt.
§G · Numbers · tabular always · units attached
§G.1 · currency
EXACT$1,249.00
ROUND$1,499
HERO$1.4M
B$38B
§G.2 · time · count
DELTA+3.4%
PT-DELTA+3.4pt (not "pp")
DURATION4m 12s
DATETIME26.04 14:02 EU sort
COUNT2,047 / 2.1k / 1M
§G.3 · ranges
NUMERIC$39 → $49
DURATION2 – 4 min
QUARTERQ3 2026
UNIT3.4% · 14ms spaces & not
Tabular nums everywhere a number could change. No space before %, pt, pp. Space before min, s, ms. Currency two decimals when known exactly; round when projecting.
§H · Forbidden words · strike on sight
these signal the writer reached for personality, not clarity
just simply easily quickly effortlessly please sorry oops whoops uh-oh hey there friend folks y'all let's amazing awesome wonderful perfect you've got this you're all set

Two patterns to watch: the fake-friend opener ("Hey there!" "Welcome back!") and the reassuring hedge ("Don't worry," "no problem"). The product is not a person. If there's a problem, name it. If there isn't, say nothing.

§ The 90-second checklist · before shipping any string

Before you commit.

  1. Does it say what happened, in noun + verb?
  2. Did I use any forbidden word? Strike it.
  3. Is there a "please" or "sorry"? Strike it.
  4. If destructive: does the verb carry the noun?
  5. If error: does it say what · why · what to do, in that order?
  6. Is there a number? Is it tabular? Is the unit attached?
  7. Could I cut a word and still be understood? Cut it.
Authority the product team — disagreements resolved by "the user is already inside, return their attention quickly"  ·  Doc WRITING.md at project root  ·  Companions Voice & Tone (marketing voice) · Components → Forms · Components → Feedback · Components → Overlays