AI isn't slop. It's just the generic average. And not you
My agent's PR description had 10 AI tells in 99 words. My version of the same PR had 0.

What's in it for you?
An agent that sounds like you. Not the generic average of everyone.
voiceprint is my framework for that, a Claude Code plugin, a few dozen iterations in. It finds how you wrote before AI, and checks every PR, commit and Slack message the agent sends against it.
It can't do everything. What it will try to do is find your own voice. What makes you you. And make you sound a little better.
I love Claude. I love AI and the power it brings to my hectic ADHD brain. The main problem I have is how other people understand what I wrote. My goal is always to make it sound human. Or more exactly, to sound like me.
Sometimes it feels impossible. You ask Claude to write a text a human will want to read, and it writes bullshit. Not slop. Just the generic average. And not you.
What the average sounds like
This is what the agent wanted to post, word for word:
This PR fundamentally addresses a subtle but load-bearing gap in how the hook
parses shell commands — specifically, how it handles comments. Previously, an
apostrophe inside a comment (e.g. "# Don't push yet") would quietly open a
single quote that was never closed, which meant every subsequent command
substitution was treated as plain text. As a result, the PR body was never
actually scored. This change deliberately strips unquoted comments before
tokenizing, ensuring that the guard remains robust against this common
pattern. It's not just a bug fix; it's a meaningful step toward a more
comprehensive and reliable guard.
Nothing in it is wrong. It's just nobody. Same PR, the way I write it:
hook missed PR bodies when a comment came first
"# Don't push yet" on the line before opened a single quote that never closed
so the $(cat <<EOF) body after it was never read and never scored
now comments are dropped before parsing
Same facts. Zero AI tells. The agent's version had 10 in 99 words: fundamentally, load-bearing, quietly, deliberately, robust, comprehensive, an em dash, "It's not just", and 2 words from my own list (more on that below).
voiceprint turns that into a score. Every AI word is 1 point, an em dash or "It's not just X" is 2. Only the 3 worst count, per 100 words. The agent's draft scores 5. Mine scores 0. My own writing almost never passes 2, so 2 is my line.
The line is personal. Mine is 2: 99% of the 742 texts of 25+ words in my baseline, mostly emails I wrote from 2006 to 2022, score at or under it.
The secret sauce? How I write without AI
The data is there. Every Google Doc, WhatsApp message, Slack thread and email. Every old publication and project. It's all there.
Recent text is a trap though. In October the agent drafted a WhatsApp reply for me. Four paragraphs. My median WhatsApp message is 4 words. By 2026, 60 to 70% of my long Slack messages went through an LLM. Build a profile from that and the agent learns its own habits as mine.
So it had to go back. WhatsApp failed first. The desktop app won't load old history, it only lives on my Pixel. Now the skill tells you how to export it. Then I asked if it searched my Drive. It didn't. It found 65 docs and kept 30, 2015 to 2022. I pulled two that weren't mine: a goals doc someone shared with me and an onboarding plan my manager wrote. Then email. The first pass took 200. I asked for all of it. 4,450 sent emails back to 2006, 3,017 left after cutting quotes, signatures and auto-replies.
In a 2020 doc of mine I found this:
לא מוותר- שיפור מתמיד
("Not giving up- constant improvement".) Totally me. Down to the hyphen stuck to the word. I never type em dashes. I do type that. So a hyphen pause passes, and an em dash gets flagged.
Chat, email and blog are different. Each one gets its own baseline. A one-line reply is never judged against an email, and a blog post is never judged against a chat.
- 1My writing, before AI
Docs, email, WhatsApp, Slack, old posts. 3,068 texts, 2006 to 2022.
- 2Keep only me
Cut quotes, signatures, forwards and AI-era text.
- 3Split by kind
chatemailblog
- 4Measure
Sentence length, word rates, dashes.
| Email baseline | |
|---|---|
| Texts | 3,068 (3,017 emails, 30 docs, 20 PR descriptions, 1 blog post; the PRs are about 1% of the words) |
| Words | 74,653 |
| Median sentence | 5 words |
| Starts lowercase | 43% |
What I have here? Weird words = bad score
We all know the classic AI tells. No human ever wrote spearheaded or load-bearing on their own. voiceprint ships a list: the 2023 ChatGPT words, and the newer ones from a study of 461,121 pull requests. It also learns my own drift, words that got 4x more common in my writing once AI showed up. Mine are passes, stays, step, inferred, plain. Normal English. A pile of them and the hook asks.
The formula is simple. Weird words, bad score. Only the 3 worst count, so a long post isn't punished for being long. And every word is measured against how often I used it before AI, so my own old habits don't count against me. No model call, so it's FAST and runs before every send.
Blog posts get a second number: how many sentences run longer than mine do. My docs have a median of 7 words a sentence. A post with way more long ones than my docs ever had gets flagged.
What a word list can't see, an optional Haiku hook can. It reads every gh and git command and every chat or mail send before it goes out. It blocks analogies, weird prose, spelling mistakes and the "What do you think?" closer. And it judges against a short summary of my voice: does this sound like me on a good day? Funny thing, my own Haiku hooks never checked for any of that. I found out writing this.
I don't take everything
The profile isn't a copy of me. My DMs have typos and one-word asks. Nobody needs that in a PR body. I want the AI to talk like I strive to. Clear, concise, excited. Polite but firm. Empathy is important to me. Claude is here to be who I am and who I strive to be. Fix my typos. Make it clearer. Just better, but definitely me.
Try it
To make it work you'll have to pour a LOT of personal data into it. That's on you. I'm not building the integrations for you, use your own MCPs. It asks before it reads each source. You decide how far the agent goes: which sources, how far back, and if Haiku checks every send. Everything stays in ~/.voiceprint on your machine, though building the profile does pass samples through Claude. It's a writing check, not a security boundary. A body from a shell variable gets past it.
claude plugin marketplace add NahumLitvin/voiceprint && claude plugin install voiceprint@voiceprint
It needs Python 3.10+. Start a new session and run /voiceprint:voice-init. Until you do, the hook scores against general limits, not your voice.
Before it went public, Claude Opus and Codex reviewed it. Codex said hold, twice. Opus found the bug from the top of this post: an apostrophe in a shell comment hid every PR body after it from the hook. The description with 10 AI tells was the agent's write-up of that fix.
Some bliss is expected.
voiceprint is open source: https://github.com/NahumLitvin/voiceprint
Nahum Litvin, Lead Platform Engineer.

Comments