stet

Content that knows who owns it.

A Claude Code plugin that stops agents rewriting your words, and keeps the rest true.

stet

The reason I started this was not a thing I want paraphrased. It took me four attempts and a walk to find the sentence.

Every word of that paragraph is mine, and no agent gets to improve it.

Ramp casts are 47% of what you press before a spike. That figure came from a query this morning, and it will be right again tomorrow without anyone remembering to check.

stet  /stet/    proofreader's mark: let it stand. Ignore the correction.

The problem

Point an agent at your writing and three things go wrong.

It writes too much

A sentence and a half doing the work of a sentence. A preamble before every list. You spend longer unwinding it than writing would have taken, and that time comes out of the work only you can do.

It rewrites what is not its own

The paragraph you laboured over comes back improved. You did not ask. You asked for a redesign, or a fix three files away, and your words were collateral.

It leaves what it should refresh

A sentence quotes a number that moved three weeks ago. Nothing in the file says where the number came from, so nothing noticed, and the page states it with a straight face.

The model

Every piece of content carries a state. Approval is what confers ownership.

An agent's draft belongs to the agent until a person reads it and accepts it. Nothing else transfers ownership: not time, not the writing being good, not the agent having written every word of it.

draft
An agent wrote it and nobody has approved it. An agent may rewrite it freely.
approved
An agent wrote it and a person accepted it. Closed. Rebuilt only if asked, each time.
authored
A person wrote it. Closed, and never regenerated at all. Only its author replaces it.

Ownership is per sentence, not per file. Correct one line on the proof sheet and that line becomes yours: the paragraph around it stays the agent's to improve. Sentences are stored by their own words rather than by position, so yours survive everything around them moving, and lapse the moment the words themselves change. You own what you wrote.

Policy sits alongside it and says what may still be done to closed content. authored plus refresh is the combination the whole thing exists to make sayable: these are my words, and I want the numbers in them kept true. Change the figure. Leave the sentence.

---
stet:
  state: authored
  policy: refresh
  sources: [corpus.rampShare]
---

Ramp casts are 47% of what you press before a spike.

Enforcement

A hook that refuses, not a rule that asks.

Every other part of this is an instruction, and instructions are advice. Advice loses. A PreToolUse hook reads the state before any edit and denies the ones that are not the agent's to make.

VOICE.md is authored. You may not edit it.

A person wrote this. Do not edit it and do not regenerate it.

You may propose a rewrite in your reply. Show it to the author.
Do not put it in the file.

Three boundaries keep it out of the way. A project with no config is not using Stet and the hook has no opinion. Only declared content paths count, so code passes through. A file that does not exist yet is new, which is a draft, which is allowed.

Voice

The other half: writing that does not read as written by a machine.

Ownership stops your words being changed. It does nothing about the words an agent adds, and that is the half people actually notice. Readers told a headline was AI-generated rated it less accurate and were less willing to share it, whether or not the headline was true and whether or not a machine wrote it. The penalty attaches to how prose reads, so writing that merely sounds generated pays it with no label attached.

So Stet ships a library of registers, and none of them is a description of how a kind of writing feels. Each was counted off the real texts, and each carries the specific ways an imitation of it gives itself away. Orwell fails modern plain-language guidance inside his own manifesto, at a mean sentence of 25.9 words. Chandler's famous simile appears once every 545 words, which is roughly forty times rarer than pastiche runs it. Those are the parts you cannot get by describing the style to yourself.

Four ways to have one: pick a preset, describe your own in a sentence, point at writing you already did, or let it read the project and derive the house voice from what is there.

Explore the library

Commands

Establish a project, then work in it.

For a project that already has writing, the order is ingest, init, voice, ia. Read it before you describe it.

ingest

Reads everything there, claims all of it for you, and reports what it found: the inventory, how it sounds, and every claim that will go stale.

init

What this is, who reads it, and what it must never be. The last one is the answer nobody volunteers and the one worth most.

voice

Derives the house voice from writing you already did, because nobody can describe their own. Rules with your sentences as examples, and a counter-example for each.

ia

What exists, what job each page does, and the rules for where the next one goes. Without those rules every new page is a fresh argument.

claim · release · approve

Whose words these are. Only the author approves; the agent records it.

audit · verify · refresh

Stale claims, figures typed by hand, orphaned pages, voice breaks. Then check each claim against its real source and bring current only what policy allows.

Install

Early, and honest about it.

/plugin marketplace add owllight-studio/stet
/plugin install stet@stet

The Establish group, the authorship model and the hook are built. Everything else is designed and not written yet. Stet's own content is marked draft rather than approved, because its author has directed it and not yet read it line by line, and marking it approved would be the exact failure the model exists to prevent.