Nobody wrote this.
You can spot machine-written prose in a paragraph. Sometimes in a line. A cover letter, a property listing, a poem somebody sent their mother, all arriving in the same voice. Every sentence the same length. Every paragraph ending by telling you what it just said.
Stet is a plugin for Claude Code, and it does two things about that. Seventeen voices come with it, and none is a mood you typed into a box. Each was read off named books before it was written: Chandler for the noir, Darwin's Beagle notebooks for the field notes, the Reuters handbook for the wire. Then counted, sentence by sentence. Take one as it stands, edit it, or describe what you are after.
The second thing is that you can lock a line. A slogan, a testimonial, the sentence you spent an hour on. Everything around that line can be pulled apart and rebuilt twice before lunch, and the line comes back exactly as you left it.
“It is worth noting that any sentence you have marked as your own will be preserved exactly as written, while the surrounding content remains fully editable by the agent, ensuring that all numerical claims are continuously validated against the commands that generated them.”
Approve a sentence and the agent stops editing it. Every number is checked against the command that printed it.
I approved one sentence and left the rest to the agent. It rebuilt the page twice. The sentence was where I left it.
One claim, three times. Two of the seventeen. Their medians run 9 words and 10, counted off sixteen software home pages and off Chandler and Hammett, and not off these two lines: two sentences cannot show you a distribution.
/plugin marketplace add owllight-studio/stet
Then /stet in any project. Zero dependencies. MIT.
Seventeen voices, and the reading behind them
Why not just tell the agent how you want to sound? Because what you can tell it is an adjective. Friendly but professional. Clear and concise. Nobody can check an adjective, so nobody does.
These were built the other way round, off named books rather than out of anybody's impression of them. Fifteen of Darwin's Beagle notebooks. Chandler, Hammett and Cain. Ninety-three pages of Kubernetes documentation. Every file says which.
What comes back is a set of numbers. How long the sentences run. Where the pauses land. How often the writing hedges. Each one sits in the file beside the book it was counted off, so when a draft stops sounding like you, you can point at the number that moved.
And if you cannot name the voice you want? Most people cannot. Describe it in your own words, badly, and the agents go and do the reading. What comes back is yours.
| Preset | Median | Counted off |
|---|---|---|
| Field Notes | 8 | Darwin's 15 Beagle notebooks, the Lewis and Clark journals, Scott's Last Expedition, Thoreau |
| Noir | 10 | Hammett, Chandler, Cain, Sunset Boulevard, Mosley |
| The Manual | 12 | 93 Kubernetes pages, 78 Raspberry Pi pages, 72 GitHub Docs pages, 18 man pages, GNU coreutils |
| Plainspoken | 15 | Orwell, Hemingway, GOV.UK content guidance, Butterick, Paul Graham |
| The Broadsheet | 18 | The Reuters handbook, the AP statement of news values, the BBC styleguide, The Economist |
132 measurements across the library. Every one of the seventeen names the work it came from.
The tells, named and checked
An em dash. “Not X, it is Y.” A small paragraph standing in front of every list to announce that a list is coming. A closing sentence summarising the paragraph you just read.
Every voice file ends by naming how a fake of it gives itself away, and across seventeen that comes to 104 separate ways. Put the 104 together and you have a list of what a machine writes.
Can a checker catch a voice? No, and tells does not try. It catches the
phrases instead, because you can count an em dash and you cannot count a voice. No dependencies, no network, no model,
and it ran over this page.
$ stet tells draft.md
draft.md
1 corporate It is important to note that our robust solution will empower your team.
1 important-to-note It is important to note that our robust solution will empower your team.
3 tells in 1 files
2 corporate corporate filler. Use the plain word.
1 important-to-note if it were not worth noting you would not write it.
Readers told a headline was AI-generated rated it less accurate and were less willing to share it. That held whether or not the headline was true, and whether or not a machine wrote it.
Altay and Gilardi, PNAS Nexus, 2024. Preregistered, n=4,976.
The page still has to be true
A price on your site went up three weeks ago and the page still quotes the old one. A study you cited was retracted in March. Your footnote has no idea. Two percentages in the same paragraph do not add up to the total sitting underneath them.
None of that is a matter of taste. It is arithmetic. Ten checks run in your build, and a build that fails is a page that does not ship.
| Counted | Of what |
|---|---|
| 76.35% | References that had drifted from what was cited. Jones and others, PLOS ONE, 2016 |
| 70%+ | URLs across three Harvard law journals no longer reaching the material. Zittrain, Albert and Lessig, 2014 |
| 49.6% | Papers reporting a significance test that carry a p-value disagreeing with its own statistic. Nuijten and others, 2015 |
| 5.4% | Post-retraction citation contexts that acknowledge the retraction. Hsiao and Schneider, 2021 |
Half of it does not need a model at all
Questions with one answer
Is this word spelled two ways across your project. Does this figure still match the command that produced it. Was this paper retracted.
Nobody has to read anything to answer those. They run in your build with nothing installed.
Questions that need reading
Does this source actually support the sentence citing it. Can a reader who is not you follow this paragraph. What voice is this person reaching for.
Each of those needs somebody to read and decide, so they live where there is a model. The help screen prints them under a heading saying they are not there.
So how much of it costs you model time? Seven commands. The other twenty-nine never load one, and twenty-five of those ship as a CLI you can run in a build with nothing installed.
Establish
init · style · style-sheet · voice · voice-stats · ia · ingest
What this project is, what it sounds like, what is already in it
Compose
outline · write · expand
Author in the voice, to the architecture
Evaluate
audit · critique · cite · standing · verify · sums · check · tells · measure · claims
Held against its sources, its figures and its own arithmetic
Refine
tighten · clarify · restructure
Cut, make it land, move it about
Maintain
refresh · doctor
Change the figure, leave the sentence
Operate
context · scan · owner · admin · pin
What an agent needs before touching a word, and how to get out of its way
What is in the box
Stet touches your words and nothing else. No components, no routing, no CSS. Put it on Next, Astro, Hugo, a folder of Markdown or a manuscript, and it behaves the same.
Node 20 or newer. MIT.
/plugin marketplace add \
owllight-studio/stet
# then, in any project
/stet
It runs
context first and tells you what it found.