How to make Claude write like a human: the tell that's left is the story it makes up
In my test Claude Sonnet 5.5 skipped the em dashes and the stock words before I banned them. What it did instead was open eight texts out of nine with an incident from a team that doesn't exist, and a humanizer pass kept every one of them, because they read as human.
Contents
On October 23 Tim O’Reilly posted that he had been teaching Claude to write more like a human, “and it’s finally gotten good enough that we can give it a byline!”

Post on X, October 23, 2026 (US time), reproduced for review.
The replies split the way these threads always do. Some readers liked it. One wrote “It sounds AI to me.” Another asked whether it would pass Pangram, the detector. The most useful reply came from someone who had tried the same thing:
a banned-phrases list got me maybe halfway when i tried this. what kept leaking was rhythm, every paragraph landing on a neat little takeaway
That reply is right about the first half and, I think, wrong about what leaks. I ran a small test on Claude Sonnet 5.5: nine generations of the same opening paragraph under three prompts, then one pass of a popular humanizer skill over each result. The model avoided every word on my banned list before I banned it. A voice prompt moved the rhythm a little. And eight of the nine texts opened with an incident from “our team” that never happened. The humanizer pass kept all eight.
What did Tim O’Reilly’s Claude byline actually say?
The byline is the O’Reilly account, and the page carries one line of disclosure:
Created by Claude with light editing by Tim O'Reilly
The article’s first sentence is “Raffi Krikorian, Mozilla’s CTO, joined Tim O’Reilly at our recent AI Codecon to talk about open source AI.” So it reports a conversation O’Reilly took part in. The post doesn’t say what Claude was given to work from, but whoever checks a write-up of an event they were at can tell a misquote from a quote. That matters more than the prose, and it is why several replies went straight to responsibility: a byline says who answers for a factual error. O’Reilly is well placed to answer for this one. The case gets harder when the model has to supply the facts itself, which is where my test ended up.
Why does a banned-word list only get Claude halfway?
Because it targets tells that the model I tested had already dropped, and because a ban says what not to write without saying what to write instead.
Wikipedia’s Signs of AI writing, the WikiProject AI Cleanup field guide that blader/humanizer names as its source, now lists em-dash overuse for the years 2022 to September 2026 and says newer models “have more and more often been found to be hard coded to not use em dashes at all.” It files the tidy “Conclusion” section under historical patterns as well. Anthropic describes its newest model the same way from the other side. Its guide to prompting Claude Fable 5.1 says that model’s writing “has few stock phrases and little unexplained jargon,” and that what’s left is density: longer sentences, fewer paragraph breaks, and what it calls mannered prose.
Anthropic’s general prompting guide puts the second reason first in its formatting advice: “Tell Claude what to do instead of what not to do.” A banned list does the opposite. The model keeps its default style and swaps out the listed words. In the agency thread on r/PromptEngineering one commenter described the treadmill: they banned “delve,” now they get “in todays landscape,” and they expect something else next month.
What happened when I tested three Claude prompts and a humanizer pass?
The banned words and em dashes were absent with or without the ban, the voice prompt changed the endings and a little of the rhythm, and an invented first-person incident survived every prompt and the humanizer pass.
The setup: one task, three prompts, three runs each, on Claude Sonnet 5.5 through Claude Code 2.1.310 on October 25, 2026. Each run replaced Claude Code’s default instructions with a single neutral line, loaded no settings or project files, and had no file or web tools. The task was a 300-word opening for a blog post on why a five-person engineering team should keep a changelog. Prompt A was the task alone. Prompt B added the usual hard rules: no em dashes, no “it’s not X, it’s Y”, nine banned words (delve, landscape, crucial and six more), no groups of three. Prompt C added a voice description instead (plain, specific, short sentences next to long ones, no summary line at the end of a paragraph), one example paragraph in that voice, and Anthropic’s one-line fix for mannered prose. Then I ran each of the nine texts once through blader/humanizer 2.5.1, with its SKILL.md loaded as the model’s instructions, on the same model.
The mechanical counts come from this script. Spread is the standard deviation of sentence length divided by the mean, a rough measure of how much the rhythm varies. The sentence splitter is a punctuation heuristic, good enough for these texts and not for general use:
import re
import statistics
import sys
BANNED = ["delve", "landscape", "crucial", "pivotal", "seamless",
"robust", "leverage", "tapestry", "foster"]
BANNED_RE = re.compile(r"\b(" + "|".join(BANNED) + r")\b", re.I)
# A sentence ends at . ! or ?, optionally followed by a closing quote,
# when the next word starts with a capital, a digit or an opening quote.
SPLIT_RE = re.compile(r"(?<=[.!?])[\"\u201d\u2019]?\s+(?=[\"\u201cA-Z0-9])")
for path in sys.argv[1:]:
text = open(path, encoding="utf-8").read()
sentences = [s for s in SPLIT_RE.split(text.strip()) if s.strip()]
lengths = [len(s.split()) for s in sentences]
spread = statistics.pstdev(lengths) / statistics.mean(lengths)
em_dashes = text.count("\u2014")
banned = len(BANNED_RE.findall(text))
print(f"{path}: sentences={len(lengths)} spread={spread:.2f} "
f"em_dashes={em_dashes} banned_words={banned}")The last three columns I counted by reading: whether the text opens with a first-person incident (“last month, one of our engineers…”), whether that incident was still there after the humanizer pass, and whether the text ends by announcing the rest of the post (“In this post, I’ll cover…”).
| Prompt | Em dashes | Banned words | Sentence spread, before / after the pass | Opens with an invented incident | Incident kept by the humanizer | Ends by announcing the post |
|---|---|---|---|---|---|---|
| A: task only | 0 | 0 | 0.47 / 0.46 | 2 of 3 | 2 of 2 | 3 of 3 |
| B: hard rules | 0 | 0 | 0.48 / 0.47 | 3 of 3 | 3 of 3 | 3 of 3 |
| C: voice and example | 0 | 0 | 0.54 / 0.53 | 3 of 3 | 3 of 3 | 1 of 3 |
Three runs per prompt is a demonstration, not a measurement, so read the table for its zeros and its threes. Prompt A already had no em dashes and no banned words, so on those counts prompt B had nothing to remove. On the rule I didn’t count with the script it simply lost: one B text has “you sit close together, you read each other’s pull requests, and you talk in the same chat channel every day,” a group of three in a prompt that banned them. Prompt C changed several things at once, so I can’t say which part of it did what. Its texts varied their sentence length a bit more, and two of the three stopped closing on a signpost. The humanizer pass changed the wording and left the spread where it was.
And every prompt produced the same fiction. Prompt A wrote “Last month, one of our engineers spent forty minutes trying to work out why the export feature had started returning dates in UTC.” Prompt C, which asked for concrete detail, made the fiction more concrete: “We shipped 2.14.0 on a Tuesday and spent Wednesday finding out that the export endpoint now returned UTC timestamps.” It closed by promising “the two times it saved us a day of work.” There is no team, no release 2.14.0, and no saved day. After the humanizer pass both sentences were still there, word for word. The one text without an incident, the third from prompt A, used a scenario it marked as hypothetical (“Picture a Tuesday three months from now”), and that one also came through the pass intact.
Why is an invented anecdote the most dangerous Claude writing tell?
Because it reads as human, so a pass that hunts for AI patterns has nothing to flag, and it is false.
Writing advice tells you to add a specific detail and a first-person view. Those are good rules when you have the details. Given a topic and no facts, the model follows the same rule by producing the most plausible detail, and the most plausible detail for an engineering blog is an incident at the author’s own company. My prompt C asked for “a concrete detail (a version number, a date, a command)” and got one, made up.
The humanizer skill’s own documentation shows the same failure. The author of a 623-vote r/ClaudeCode thread about humanizer skills recommends blader/humanizer as the best one. It tells the editor to “Use ‘I’ when it fits” and to have opinions. Its full worked example, in version 2.5.1 of the SKILL.md, starts from a paragraph of AI filler that contains no study, no person and no first-person experience. The draft rewrite adds “a 2024 study by Google,” an engineer called Mira “at a fintech startup I interviewed,” and “I have mass-accepted suggestions that compiled.” The skill’s audit step then notes that the named people and study citations “can read like plausible-but-made-up placeholders unless they’re real and sourced,” and the final version drops Mira and the study. It keeps “I’ve accepted suggestions that compiled” and “People I talk to tend to land in two camps,” experience the input never had. So the audit catches an invented name and lets an invented “I” through. In my run it let through every invented “we.”
The Wikipedia guide warns about the general version of this: “Please do not merely treat these signs as the problems to be fixed; that could just make detection harder.” A pass that removes the tells from a text with an invented story in it can only return a more fluent version of the same story.
Should you put Claude’s voice rules in the prompt or run a humanizer pass afterwards?
Both, because they do different jobs. The prompt has to carry the facts and the voice; the pass afterwards can tidy wording, but in my run it neither added variety nor removed invented material.
The argument runs through both threads I read. In the r/ClaudeCode humanizer thread one commenter asked why people use the skill as post-generation editing at all: “Just have this be a constraint on the generation itself. You’ll use less tokens.” Another answered that models are better at critiquing and editing, and that the model “will default to its garbage writing style as often as it can regardless.” The agency post on r/PromptEngineering reports a three-layer setup: hard rules, a voice scored on four scales, and a persona with real writing samples.
My test didn’t compare those approaches head to head, but it points one way. The differences I could see came from the prompt, and the pass mostly reworded. Anthropic’s guidance agrees on where to put the effort. Examples are “one of the most reliable ways to steer Claude’s output format, tone, and structure,” best in sets of three to five and varied enough that Claude doesn’t copy the wrong pattern. The guide also says the formatting style of your prompt can carry over into the response, so a voice prompt written as a bulleted policy can pull the model toward bullets. Whether a real sample of your own writing beats a written description of it, I didn’t test; my example paragraph was written for the experiment.
Why do repeated humanizer passes make text read more like AI?
In my judgment, because each pass averages, and averaging removes the irregular parts first.
I argued this for translation and copy in You can’t verify a translation by reading it: run text through one cleanup pass, then another, and the passes converge on the bland middle instead of on your voice. The fix there was to stop sooner and make one coherent edit.
blader/humanizer has a version of this loop built into it. After its rewrite it asks itself “What makes the below so obviously AI generated?” and rewrites again. Run once, that is a reasonable audit. Put the skill in a loop, or chain it after other cleanup prompts, and you are compounding. A quick check before you accept a second pass: diff it against the first. If the second pass mostly removed sentences you liked, keep the first.
Will humanized Claude text pass Pangram or another AI detector?
Nobody has published a test of an editing skill like this against Pangram, and passing it is the wrong target anyway.
The best independent study I know of is a working paper by Brian Jabarian and Alex Imas, Artificial Writing and Automated Detection (NBER, September 2025). They compared Pangram, Originality.ai, GPTZero and an open-source RoBERTa detector on text from GPT-4.1, Claude Opus 4, Claude Sonnet 4 and Gemini 2.0 Flash. Pangram came out with near-zero false-positive and false-negative rates, held up against “humanizer” tools, and was the only one of the four to stay under a strict cap of 0.5% false positives without losing accuracy. The humanizer in that study was StealthGPT, a paraphrasing product built to evade detection, which is a different thing from an editor that removes clichés even though both go by the same name. If a tool built to get past Pangram didn’t, I wouldn’t expect a cliché editor to do better, but that is my expectation and not a result.
There is a second layer now. Supported Claude models have watermarked their text since August, and only Anthropic holds the key, so Pangram can’t read that mark. I went through what the watermark can and can’t prove in AI text watermarks: OpenAI’s textGrain, Claude’s SynthID mark, and who gets to check them. Whether it survives a humanizer pass, I didn’t test. Style detectors also have a documented bias problem: a 2023 study in Patterns found seven detectors flagging essays by non-native English speakers as AI-written 61% of the time on average. A detector score needs validating for the detector, model and kind of text you care about before it tells you much in either direction.
If the goal is that readers trust the text, a detector score is the wrong metric. One reply under O’Reilly’s post did the simple thing: the writer labels their own posts “edited with the assistance of AI” or “drafted with the assistance of AI.”
How to make Claude write like a human: the procedure
Give Claude your material before you ask for prose, describe the voice with real samples, rule out invented experience and say why, then edit once and check the facts.
- Give Claude the facts first: notes, a transcript, the numbers, the incident as it happened. No later pass can supply them, and in my test no pass removed the ones the model made up.
- Forbid invented experience and give the reason. Anthropic’s guide notes that Claude generalizes from the reason behind a rule, not only from the rule.
- Describe the voice in positive terms and attach three to five samples of your own writing, varied enough that the model doesn’t latch onto one of them.
- On Claude Fable 5.1, Anthropic suggests a line against mannered prose. Its guide says the short form, “Please remove all mannered prose.”, tends to work. I included it in prompt C together with other changes, so I can’t say what it did alone.
- Generate, then run one edit pass with a tells catalog such as blader/humanizer, and check every factual statement against your notes: first-person experience above all, and also dates, versions, names and numbers. Anything you can’t trace, cut.
- Read it aloud once and stop.
Here is the prompt block I would start from, with steps 1 to 4 in it:
<material>
[Your notes, transcript or data. Everything the text may state as fact.]
</material>
Write [the piece] from the material above. Use only facts that are in it.
Do not invent anecdotes, incidents, people, dates, versions, numbers or
first-person experience: the text will be published under my name, and a
made-up story is a false statement I would have to answer for. If you need
an illustration the material doesn't have, write it as an explicit
hypothetical ("imagine a team that...") and never as something that
happened. If a fact the piece needs is missing, leave a [TODO: fact]
marker instead of filling it in.
Voice: plain and specific, an engineer writing to engineers. Mix short
sentences with long ones. State an opinion and give the reason. End a
paragraph when the point is made, without a summary line.
The examples below show tone only. Do not reuse their content or their
kind of story.
<examples>
<example>[A paragraph you wrote]</example>
<example>[Another, on a different topic]</example>
<example>[A third]</example>
</examples>
Please remove all mannered prose.
The hypothetical instruction is there because of the one text in my run that didn’t invent an incident. It wrote “Picture a Tuesday three months from now,” and that reads fine, because it doesn’t claim anything happened. The [TODO: fact] marker is the part that does the work, though. It turns a missing fact into something you see before publishing instead of a release number nobody shipped.
01 / Discussion
No comment section here — all discussions happen on X.
02 / More articles
Vox's AGENTS.md lines, tested in 90 Claude Code runs: the line that worked best wasn't one of his
Line one made the agent leave out the input check. Line two's extras disappeared when line one shared the file. 'Without breaking anything' showed no clear effect beyond what a named test command already did. What 90 runs can and cannot say, and how to test a line before you keep it.
Attack surface reduction with Claude Code: Anthropic's three passes on my own site, and a fourth they don't ask
The skill is not out, the method rebuilds in an afternoon, and the hard part is choosing where to point it. Here the most useful result was a broken verification file, and the exposure that mattered lived in a deploy setting my three passes never opened.
Claude auto mode becomes the default in the Claude apps: what the check blocks and what 89% measured
Anthropic's study is honest about its setup: tired testers against one planted command. It reports no false-positive rate and no miss rate on real traffic, and in cloud sessions there is no Manual mode to switch back to.