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.

What an agent writes

“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.”

Written to The Pitch

Approve a sentence and the agent stops editing it. Every number is checked against the command that printed it.

Written to Noir

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.

Install /plugin marketplace add owllight-studio/stet Then /stet in any project. Zero dependencies. MIT.
Line E · Establish

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.

All seventeen, and what each one measures

PresetMedianCounted off
Field Notes8 Darwin's 15 Beagle notebooks, the Lewis and Clark journals, Scott's Last Expedition, Thoreau
Noir10 Hammett, Chandler, Cain, Sunset Boulevard, Mosley
The Manual12 93 Kubernetes pages, 78 Raspberry Pi pages, 72 GitHub Docs pages, 18 man pages, GNU coreutils
Plainspoken15 Orwell, Hemingway, GOV.UK content guidance, Butterick, Paul Graham
The Broadsheet18 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.

Line R · Refine

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.

The whole catalogue, 104 of them

stet tells, on one bad paragraph
$ 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.

Line A · Authorship

The line that has to stand

A slogan. A testimonial. A promise your lawyers went over twice. The sentence you spent an hour on, threw away, and wrote back almost exactly as it was.

Lock it, and the agent can change the voice, move the section and rebuild the page around it. The line does not move.

Stet holds it as your words, character for character, rather than as a line number. That is how it survives the page being torn up around it. Change the words yourself and the lock comes off, because they are different words.

A hook reads that record before the edit lands. It does not advise. It refuses.

Three states, and who may edit what

Agent

Every block of content carries an owner and a policy.

Yours · locked

The reason I started this project is not a thing an agent gets to paraphrase.

Agent

The record is read before the edit lands.

The hook, refusing

“Those words are theirs, character for character. Everything else in this file is still open to you: edit around them.”

PreToolUse · permissionDecision: deny
Line V · Evaluate

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.

Every check, and what it catches

CountedOf 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
Line O · Operate

Half of it does not need a model at all

The CLI · 25 commands

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.

The plugin · 7 readings, 10 agents

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

Authorship

claim · release · approve · proof · policy · mark
Whose words these are, and what may be done to them

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

The whole map, station by station

Line M · Maintain

What is in the box

36commands, seven groups
10agents
17measured voices
154tests
0dependencies

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.

Adding it
/plugin marketplace add \
        owllight-studio/stet

# then, in any project
/stet

It runs context first and tells you what it found.