I added 10 beliefs, 25 new banned words, and 12 HARD-labeled rules to personas/default.md this week. That's the source-of-truth persona file I give every agent that writes anything under my name. Commit 0cca1101. The file was richer than it'd ever been.
The model still wrote like AI.
The banned words stayed out. The outputs were clean on vocabulary. But there was a shape to the writing that felt wrong. Too balanced. Too resolved. Sentences that started by acknowledging complexity and then explained it away neatly. That's not how I write. The fix wasn't more rules. It was context. There's a specific difference between those two things.
The AI still wrote like AI after I added 30 rules
Here's what a 30-rule voice file looks like in practice. Word bans: "convergence" is out, "leverage" is out, a dozen more. Sentence-style rules: short sentences, contractions always, one idea at a time. Structural rules: answer the question first, TLDR before depth, name the tension instead of resolving it.
A model following these rules writes cleaner prose. It's less corporate. It avoids the worst patterns.
But rules describe surface. They don't describe why the surface looks the way it does.
When I write "The boring architecture works. Filesystem IPC, subprocess spawning, JSON files." — that's not a style choice. That's a belief. One I reached after months of building things the complicated way first. The model can learn the sentence pattern. It can't learn what it cost me to arrive at that belief unless I tell it.
voice-corpus-profile.md sampled 16 of my pieces. The recurring phrase analysis found 20 constructions across the corpus. The most useful ones aren't vocabulary. They're stances. "I tried X. It was worse than the simpler thing." "I don't have that answer." "Here's where I land." You can't replicate those stances with a banned-word list. A list of things I won't say is not the same as a record of things I actually think.
Beliefs do what bullet points can't
The new # Beliefs section in default.md has 10 stances. Not preferences. Positions. Positions the writing should be consistent with. Things like: AI doesn't replace experienced developers, it amplifies them in ways that reward experience more than mediocrity. That boring architecture wins. That the magic is implementation discipline, not the concept.
The difference between a rule and a belief matters here. A prompt is a list of constraints. A perspective is something else. A model working from constraints produces writing that avoids violations. A model working from a perspective produces writing that makes a point.
The # Voice Calibration section in voice.md tries to do the same thing for tone. Five quotes, verbatim or near-verbatim from the corpus, each labeled for the pattern it shows. "The model did not get dumber. It got less context." That's not a writing rule. It's a mechanism-reveal pattern: deflationary, pointing from behavior to design or incentive instead of treating the behavior as the whole story.
That quote is also the cleanest articulation of this article's own thesis. The AI writing improved because the model had more of my actual perspective to work from. More evidence of who I am, not more instructions about how I want to sound.
voice-ai-tell-gaps.md found 13 gaps between how I write and what the model defaulted to when left to its own sense of "good writing." Fifteen rules in voice.md § Structural AI Tells To Avoid came from those gaps. The most useful ones are structural: no trailing -ing clauses that editorialise after a fact ("…highlighting its enduring influence"), no negative parallelism, no vague authority citing unnamed experts. These are shapes of AI writing, not vocabulary. The model produces them because they're statistically common in training data, not because it's ignoring the rules. The priors run deep.
The em-dash rule the model ignored, and the script I wrote instead

The em-dash situation is the clearest receipt I have for all of this.
voice.md has a rule: "prefer commas or periods when an em dash is decorative; reserve em dashes for genuine asides." That rule went in during the AI-tells audit. I added it because ANTI AI WRITING STYLE.md flagged em-dash overuse, and a diff of my own drafts showed it appearing too often.
The model read the rule. The model continued using em dashes.
So I wrote scripts/strip-em-dashes.sh. Commit 1148ee8f. 143 lines. It replaces U+2014 with , , leaves U+2013 and U+002D alone, and ships with a --self-test mode. It's not wired into any pipeline yet (that's TRK-610), but the script exists.
The em-dash rule was in the voice file. The model ignored it. So I wrote a script.
That's the pattern. A rule in a prompt is a suggestion the model weighs against everything else it knows. A script in a pipeline is a constraint the output can't escape. Context as infrastructure beats context as instruction.
I'm not saying rules are useless. Most of them hold. But the ones that don't hold point to something real: the model has priors about what good writing looks like, and those priors don't always yield to a bullet point in a system prompt. When a rule keeps failing, the right response isn't a better-worded rule. It's a different kind of intervention.
Honest Limitations is the fingerprint, not the vocabulary
voice-corpus-profile.md found one pattern that no word ban captures. Four of 16 sampled pieces have a named "Honest Limitations" section: src-1, src-2, src-7, src-11. An epilogue where the author walks back the main claim with specific boundary conditions. Not hedging. Specific named limits.
That's a structural fingerprint. A consistent authorial move across very different pieces. A model that knows "use short sentences" might produce something that sounds a bit like me. A model that knows "at the end, name three things the main claim doesn't cover" is writing with my architecture.
The # Signature Phrases section in voice.md tries to capture this. Nine constructions. "Not X. Y." is a two-word inversion contrast. "One confound worth naming:" is a preemptive flag. "I built this. It was worse than [the simpler thing]." is an anti-cleverness self-audit. These are architectures, not ornaments. Each one is labeled with where it appears in the corpus and what it demonstrates. A model working from that has more to go on than a model working from "be direct."
The # Litmus Test at the end of voice.md does something similar but as a quality gate. Three questions. The third: "Would a coworker who codes be able to quote one specific sentence back at you tomorrow, or would they just nod?" That's not a check you can run with grep. It's a judgement call. Which means the voice file can't replace the writer. It can only narrow the space between a generic AI output and something that sounds like it came from a specific person with specific opinions.
The drift checker is the only thing keeping three files honest
Here's the infrastructure problem I didn't fully think through at the start. The voice system lives in three files:
personas/default.md: source-of-truth personajoey-notes.md: the lightweight reference for agents that don't need the full persona.claude/skills/article/voice.md: article-scoped rules
Three sections mirror across all three: Word Choices, Sentence Style, What Joey Never Does. When any of them drifts, the system gives different instructions in different contexts. The agent producing LinkedIn posts follows different rules than the agent drafting articles. That's not a model bug. That's a maintenance failure.
scripts/check-voice-drift.sh is 73 lines. It diffs the three mirrored sections across the three files, strips <!-- mirror-of: --> comments before comparing, and exits 1 with a unified diff on any mismatch. Commits d8c38002 and 97ca473f added the mirror-hint parsing and fixed a bleed in the mirror-of detection.
2026-04-22-voice-system-consolidation-option-a.md captures the decision. Option A: discipline, not infrastructure. Don't consolidate to a single file (that breaks backward compatibility with agents already configured with the separate files). Don't auto-sync on commit (that hides drift instead of surfacing it). Ship a script that surfaces drift when you run it. The theory is that a solo maintainer's future self is the most likely drift source, and a tripwire is better than a merge strategy.
The corpus showed zero active drift across the three files before the checker was wired. The script has never exited 1 in production. It's never caught anything. It might never catch anything.
I still think Option A was right. Not because the checker is definitely going to save me from future drift — I don't know that. Because having a file that lives in three places with no way to verify they match is a bad system regardless of whether they drift. The checker is documentation that the three files are supposed to match. That's useful even if it never fires.
Honest limitations
This is a log of one week's work on one voice system for one person. The conclusions don't generalize cleanly.
The "context beats prompts" framing holds for my use case: agentic writing tasks, long-running sessions, multiple agents with different scopes all trying to maintain consistent voice. It probably also holds for anyone with a specific, documented style. It probably doesn't hold as cleanly for short tasks where a single focused prompt is all you need and there's no character to maintain.
Rules still matter. The banned words work. The sentence-style rules work. The point is that rules without anchors produce writing that's clean but characterless. The model is doing its best with what it has. Give it better evidence.
The # Signature Phrases section might be the most underrated part. Nine constructions pulled from 16 corpus sources, each labeled with where it appears and what it demonstrates. A model that knows "Not X. Y." shows up in src-1 and src-2, and has five calibration quotes demonstrating the stance, is working from a richer foundation than a model that knows "be concise."
The voice file isn't the voice. It's the evidence.
I don't know yet if check-voice-drift.sh is discipline or paranoia. It's never exited 1. It might run quietly for a year and get deleted the next time someone audits dead scripts. Ask me in a month.