← All posts

Examples Are the Spine, Not the Rulebook

I tried to teach an AI to write in my voice with a list of rules. It produced text that obeyed every rule and sounded nothing like me. The fix was to throw the rules out.

  • ai
  • prompting
  • llm
  • writing
  • engineering

I wanted an assistant that could draft emails in my voice — close enough that I’d send them with a light edit instead of rewriting from scratch. So I did the obvious thing. I wrote my style down as rules.

Keep it short. Lead with the ask. No corporate hedging. Warm but direct. Don’t over-explain.

The drafts that came back obeyed every rule and sounded nothing like me. They were short, direct, warm, and unmistakably written by a machine working through a checklist. The rules were all true and the result was lifeless.

Here’s what I eventually figured out: a style described is not a style transferred. If you want a model to write like you, stop describing your style and show it real things you’ve written. The voice lives in the data, not in a description of the data.

My first instinct was that the rules were just incomplete — sharper ones, more of them, a better paragraph would fix it. That instinct is wrong, and understanding why will save you from polishing a style guide that was never going to carry the voice.

A voice is a thousand small, correlated choices: which word you reach for, where the line break falls, how you open, how you sign off, when you’re blunt and when you soften. You can’t enumerate those. Any list you write is a lossy, low-resolution sketch — and worse, the model treats each rule as an independent constraint to satisfy rather than as one facet of a coherent whole. It hits the rules and misses the music.

The information about your voice already exists in perfect resolution. It’s in the things you’ve actually written. The mistake is trying to compress that into prose instructions when you could just show the model the real thing.

So I rebuilt it inside out. In Claude Code — Anthropic’s command-line agent — a skill is a self-activating instruction file the model loads when it decides the task matches. I made that skill a thin fingerprint: a few lines of orientation wrapped around a bank of real examples. Actual messages I’d sent, curated and stripped of anything private, organized by the kind of situation they handle. The examples are the spine. Everything else is connective tissue.

The difference was immediate. Shown fifteen real examples, the model doesn’t follow rules — it pattern-matches against how I actually write, including all the correlations no rule captures. The voice comes through because the voice is in the data, not in a description of the data.

A few things mattered in the build:

  • Curate, don’t dump. A bank of genuinely representative examples beats a larger pile of mediocre ones. I had a model classify candidates and keep only the ones that actually carried the voice.
  • Cover the situations, not just the average. Voice changes with context — a quick yes reads differently than a hard no. The bank needs examples across the real range of cases, or the model only learns the median.
  • Anonymize at the source. Real examples carry real names and details. Those get scrubbed before anything goes into the bank, so the spine is voice without payload.

Concretely, it’s a Claude Code skill: a SKILL.md plus an examples/ directory. The structure inverts the usual one:

the mechanism — few-shot at the file level give me the detail

The directory layout is doing real work, not just organizing files:

JonEmail/
├── SKILL.md          # ~40 lines: orientation + "the examples carry the voice"
└── examples/         # the spine — real sent messages, anonymized, by situation
    ├── quick-yes.md
    ├── hard-no.md
    ├── intro.md
    └── …

Why it works: this is few-shot prompting taken seriously. When Claude Code auto-activates a skill, it injects SKILL.md plus every file under examples/ into the model’s context window — typically 10–20 k tokens of real prose. The model never sees a rule; it sees a distribution. Its next-token predictions regress toward that distribution, which means it replicates correlations (word choice × register × sentence rhythm) that no explicit rule can enumerate. This is the same mechanism behind few-shot chain-of-thought (Brown et al., 2020) — older than ChatGPT and still underused.

The curation pipeline matters as much as the principle. Pull a corpus of real sent mail, run a lightweight classifier (gpt-4o-mini with a 2-shot rubric works fine) to label each message carries the voice / doesn’t, scrub names with a regex + a model pass, and keep only the genuine ones. Bad examples are worse than no examples — they teach the wrong distribution.

Testable: drop five real emails in a folder, write a 10-line SKILL.md that says nothing except “write as this person; the examples carry the voice,” then prompt “draft a quick decline to a cold outreach.” Compare that output to a version with a 500-word style guide and no examples. The gap is not subtle.

Blind eval (the honest check): mix five model drafts with five real messages you’ve sent on the same topic, strip all metadata, and ask someone — or a model acting as judge — to label each human / machine. Accuracy below 60 % means the voice transferred. This is a standard LLM-as-judge setup; you don’t need a crowd.

The fingerprint is deliberately short — a paragraph of orientation, not a rulebook. The weight lives in examples/. Building the bank was its own small pipeline: pull a corpus of real sent mail, have a model classify each candidate as carries the voice or doesn’t, scrub names and specifics, and keep only the genuine ones — I ended up with a few dozen across a dozen-plus categories. The pattern sits on top of Daniel Miessler’s PAI — Personal AI Infrastructure, a framework of self-activating skills — whose skill system is built exactly for this kind of self-activating, example-driven unit.

The trap with anything subjective is grading it subjectively. “That sounds like me” is not a measurement. So the test was a blind A/B — my real writing shuffled in with the model’s drafts, both unlabeled — and the question was simply whether they could be told apart. If you can’t reliably pick the machine’s draft out of a lineup, the voice transferred. If you can, it didn’t, and no amount of “feels close” changes that.

The principle goes well beyond email. When you want a model to be a certain way — a voice, a format, a judgment call — your instinct is to describe the way. Resist it. Find the examples that already embody it and put those in front of the model instead. Show, don’t tell, turns out to be an engineering instruction, not just a writing one.


Built on: Claude Code skills · Daniel Miessler’s PAI, whose skill system this pattern lives inside. The example-bank-over-rulebook idea is just few-shot prompting taken seriously — old, underused, and worth far more than a style guide.