Every Claude session I open about the portfolio starts with the same paragraph somewhere near the top: no em dashes, no en dashes, and a list of about a dozen words I don’t want to see. The list includes delve, leverage, robust, cutting-edge, seamless, empower, unlock, harness, synergy, ecosystem, pivot as a verb, truly, and simply put.
The reason it matters is that without it, the default drift is toward LLM voice. Em dashes show up everywhere because the model has read a lot of online prose where em dashes are abundant. “Robust” and “seamless” appear in three sentences out of ten in any draft that touches infrastructure or product. None of those words mean anything specific. They communicate “this is meant to sound impressive” rather than carrying information.
Cutting them out doesn’t make the prose mine. It makes the prose not-not-mine. The voice still has to be developed by writing, not by filtering. But the filter is a precondition: without it, the agent’s voice contaminates whatever else gets generated, and I spend my editing time on punctuation rather than on substance.
The list lives in docs/VOICE.md in the repo and gets pasted into every session. It’s not a stylesheet in the design-system sense. It’s an input constraint, the same way a build target is an input constraint. The agent treats it as something the output must satisfy, like a passing test.
I’ve added entries to the list as I’ve found them. “Killed” got banned after a draft that said an old version of a page got “killed” when “replaced” or “retired” would have been more honest. “Navigate the complexities” went on the list after a particularly bad PR description. The list grows because the model keeps surfacing new candidates.
The principle: constraints aren’t restrictions on creativity. They are the surface against which the creative choices become visible.