Repository navigation
Provenance and AI Text Rules
editwright keeps a provenance ledger for every job: the words any change would bring into the text that the author did not write. In human-authored mode, the default, apply refuses a set of changes whose AI-written words go over the limit. This page says how the words are counted, what the limits are, and the published rules behind them. The skill reads the same facts from its kb/ai-text-rules.md, checked on 2026-10-08.
ew.py compares each change's new text with the span it replaces, word by word, ignoring case and punctuation. These count as the author's:
- words reused from the replaced span, in any order (so a reorder adds nothing)
- cuts: deleting words adds none
- punctuation changes
- a spelling or inflection correction of a word the author wrote. It must start with the same letter (or the first two letters swapped). It may differ by one letter edit in words of up to four letters, and by two in longer ones.
- a change between two forms of one irregular word, such as "says" to "said" or "are" to "were" (since 0.1.1)
- a change between two words people often type for each other, such as "road" to "rode" or "your" to "you're" (since 0.1.1)
- a one-for-one swap to a word the author wrote in the same paragraph or the one on either side, such as "blanks" to "planks" (since 0.1.1). The word must be longer than three letters and not a common word. The ledger marks it "(the author's word nearby)". A word added without one taken out still counts as AI-written.
- words the author types with
--author-text, unless they copy the suggestion's own wording (below)
Every other word is AI-written. Three cases, run through the script's own counting function:
$ python3 -c "import ew; print(ew.provenance('do not', 'don’t')); print(ew.provenance('hat', 'hot')); print(ew.provenance('the dog barked', 'the dog growled'))"
{'reused': 0, 'corrected': [], 'removed': ['do', 'not'], 'new_words': ["don't"], 'new_word_count': 1, 'kind': 'new-words'}
{'reused': 0, 'corrected': ['hat>hot'], 'removed': [], 'new_words': [], 'new_word_count': 0, 'kind': 'correction'}
{'reused': 2, 'corrected': [], 'removed': ['barked'], 'new_words': ['growled'], 'new_word_count': 1, 'kind': 'new-words'}A contraction counts as one AI-written word. A one-letter swap such as "hat" to "hot" passes as a correction, even though it changes the meaning; the ledger names every correction (hat>hot) so the author can see it. A new verb is AI-written even when the rest of the sentence is reused.
Words the author types for a query are the author's. Words they copy from the same suggestion's change or options, that were not in the quoted text, are counted as AI-written, so a suggestion cannot be laundered by retyping it. Here the author typed exactly what S-004 proposed:
$ python3 ew.py --works works apply the-salt-road --accept S-004 --author-text S-004="the way mules will"
refused: these changes bring in 3 AI-written words (2.26%), over the limit (0 words / 0.0% for short-story in human-authored mode). Carrying AI words: S-004. Ask the author to write those words (--author-text) or to drop them; nothing applied.It was refused, and the count is 3 words, the same as the proposal. Common short words such as "the" and "will" count when they sit in a run of three or more words copied from the suggestion. In 0.1.0 the check skipped them, so this copy counted 1 word and a copied phrase could count lower than the proposal it came from.
| Kind of work | AI-written words allowed in human-authored mode |
|---|---|
| Fiction, short story, novel, poetry, script, other | 0 |
| Nonfiction | 1% of the piece and at most 50 words per job, whichever is lower |
On a 136-word essay, a one-word fix is within the limit, and adding a five-word change takes the job over 1%:
$ python3 ew.py --works works ledger essay --accept S-001
accepting S-001 would bring in 1 AI-written words (0.74%): within the limit (50 words / 1.0%)$ python3 ew.py --works works ledger essay --accept S-001,S-002
accepting S-001, S-002 would bring in 6 AI-written words (4.41%): over the limit (50 words / 1.0% for nonfiction in human-authored mode)
$ echo $?
1The 50-word cap matters only above 5,000 words, where 1% would allow more; it was not run for these pages. The author may ask for a lower limit. Turning the limit off is an override for one job, and the ledger still counts the words.
No publisher, platform, guild or office publishes a figure, and "de minimis" is not defined anywhere, so the numbers are editwright's own choice (recorded in the repository's decision of 2026-10-08):
- 0 for creative work, because the strictest magazines and contests allow no AI-written text at all, and the Human Authored allowance has no number.
- A small allowance for nonfiction. KDP treats editing and error-checking as AI-assisted. The Copyright Office asks for a disclaimer only above de minimis. The Human Authored rule names grammar checkers.
- The ledger lets an author answer a Copyright Office letter, a contract warranty or a detector dispute with evidence.
As stated in kb/ai-text-rules.md (checked 2026-10-08), with the sources it cites:
| Topic | What the source says | Source |
|---|---|---|
| Claude watermark | Announced 2026-08-14: a version of Google DeepMind's SynthID-Text approach, carried in word choices, with no hidden characters and no user identity. Covers current models, including Opus 5.5 and Sonnet 5.5. | anthropic.com/news/claude-text-watermark; support.claude.com article 16266773 |
| What it attaches to | Only words Claude chooses. When Claude proofreads a person's text, "there's very little (if anything) for the watermark to attach to". | Anthropic, same announcement |
| SynthID | Google's (Gemini). Survives light edits; weakens after thorough rewriting or translation. | ai.google.dev/responsible/docs/safeguards/synthid |
| OpenAI textGrain | Announced 2026-10-05: ChatGPT and Codex text for EU users, opt-in in the API. OpenAI says it cannot identify users or prove human authorship. | community.openai.com (a repost) |
| Who can check | Text checkers for these marks go to regulators, researchers and similar bodies, not publishers or readers. Claude's public checker does not check text. | claude.com/check-files |
| EU AI Act Art. 50(2) | Exempts systems with "an assistive function for standard editing" or that do not substantially alter the input. Applies from 2026-08-02. | artificialintelligenceact.eu/article/50 |
| Style detectors | Guess from style and misfire on human prose: seven detectors averaged 61% false positives on non-native English essays. Substack lets readers scan posts with Pangram since July 2026. | arxiv.org/abs/2304.02819 |
| Amazon KDP | AI that edits, refines or error-checks your own text is "AI-assisted" (no disclosure). Text an AI created is "AI-generated", even after heavy edits, and must be disclosed. | kdp.amazon.com help G200672390 |
| Authors Guild Human Authored | Only a "de minimis" amount of AI-generated or AI-modified text, for example grammar-checker fixes. No number published. | authorsguild.org/human-authored/faq |
| Strict markets | Clarkesworld, Asimov's, Uncanny, Writers of the Future and the Nebulas reject AI-written text; some reject AI "assistance" of any kind. | the skill's kb/short-story.md
|
| US Copyright Office | AI assistance does not bar copyright. AI-generated material that is "more than de minimis" must be disclaimed. | copyright.gov/ai |
| Copyright Office letters | It has written to authors whose books it suspected; answering "solely for proofreading" got them registered. | authormedia.com (marked unverified in the kb) |
Two practical points follow. Words the author types carry no watermark, so a text the author wrote, with only corrections from editwright, has very little for one to attach to. Style detectors are a bigger and less predictable risk, and no tool can promise a clean score.
These are fast-moving facts. The skill re-checks its research on a schedule (evergreen.json, 30-day interval) and dates every claim; read the kb file in the repository for the current text.
This wiki describes editwright 0.1.1 (tag v0.1.1, commit 8d9a0d5) and was last updated on 2026-10-09. The plugin is MIT licensed. Report problems in the issues.