plain-prose
Health Gecti
- License — License: MIT
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Community trust — 66 GitHub stars
Code Basarisiz
- exec() — Shell command execution in check.js
- fs module — File system access in check.js
Permissions Gecti
- Permissions — No dangerous permissions requested
Bu listing icin henuz AI raporu yok.
Agent skill that removes AI writing patterns from English, Russian and German prose. Merges stop-slop and avoid-ai-writing, adds a zero-dependency checker.
plain-prose
An agent skill that strips AI writing patterns out of prose, in English, Russian and German. It ships with a checker that has no dependencies.
Watch it
47 seconds: what a tell is, three edits taken from real commits, and the measurement behind the language layer. Also in Russian. Sources in video/, rebuilt with npm run render:en.
What it is
Two good skills already exist for this job and they disagree with each other.
stop-slop by Hardik Pandya is 13 KB of editorial judgement: kill every adverb, allow no em dashes, two items beat three. It reads like an editor who has cut a lot of copy. It also breaks technical writing, offers no way to say "this is an API reference, relax", and its own example file uses an em dash in the sentence demonstrating the rule against em dashes.
avoid-ai-writing by Conor Bronsdon is 100 KB of engineering: three modes, priority tiers, per-audience tolerance matrices, guardrails against inventing facts during a rewrite, and an honest section on how badly AI detectors misclassify non-native writers. The whole thing loads into context on every invocation, and much of it is repository machinery rather than editing advice.
This one takes the discipline from the first and the engineering from the second, resolves the places where they contradict each other, and adds a layer neither has: Russian and German.
Both parents are MIT. So is this.
What changed in the merge
| Question | stop-slop | avoid-ai-writing | plain-prose |
|---|---|---|---|
| Adverbs | Kill all of them | Cut hollow intensifiers | Cut the empty ones, keep the ones carrying a fact. "Runs nightly" survives |
| Em dashes | Zero, always | Rate limit with carve-outs | Zero in English prose, carve-out for list typography, not a rule at all in Russian or German |
| Fragments | Write complete sentences | Fine in a casual voice | Banned when manufactured for drama, fine when the register already is |
| Scope of the claim | Reads as a verdict | Signals, not proof | Signals, not proof, stated in the skill itself |
| Size | 13 KB, all loaded | 100 KB, all loaded | 9 KB core, references loaded on demand |
| Languages | English | English | English, Russian, German |
The three-language part is the piece neither source had. A Russian text generated by a model carries its own tells: officialese instead of verbs, "в современном мире" openers, calques from English like "бесшовный" and "мощный инструмент". Just as important, it carries false friends. The em dash is mandatory Russian punctuation between subject and predicate, and guillemets are correct typography. An English-trained rule set flags both and is wrong twice. German gets the same treatment for Substantivstil and the spaced Gedankenstrich.
Install
Claude Code, as a plugin. Two commands, and updates arrive with /plugin marketplace update dripips:
/plugin marketplace add dripips/plain-prose
/plugin install plain-prose@dripips
Claude Code, as a plain folder. Nothing wrong with this, and it keeps working:
git clone https://github.com/dripips/plain-prose.git ~/.claude/skills/plain-prose
Either way the skill activates when you ask for an edit, a scan, or a cleanup of AI patterns. It also loads on its own when you are drafting prose.
Other agents. SKILL.md follows the agentskills.io format, so Cursor, Copilot, OpenHands and anything else reading that format can use the same folder. The references are plain Markdown with relative links.
Checker only. Node 18 or newer, nothing to install:
node check.js draft.md
Using it
clean up the AI-isms in this post
scan post.md, don't rewrite it
edit README.ru.md in place, docs context
rewrite this in a blunt voice for a decision memo
Three modes. rewrite returns a clean version and then re-reads its own output, because the first pass leaves tells behind. detect flags without touching the text. edit changes a file in place, span by span, and leaves the already-human paragraphs alone.
Six context profiles decide how strict to be. A LinkedIn post and an API reference do not get the same rules, and the tolerance matrix in references/contexts.md says exactly which rule relaxes where.
The checker
node check.js [options] <file...>
--lang en|ru|de|auto language of the text (default: auto)
--context <profile> blog|social|technical|pitch|docs|casual
--json machine-readable output
--strict P2 findings also fail the run
--quiet only the score line
--skip-quotes ignore quoted spans, for writing about AI patterns
Output:
$ node check.js draft.md
draft.md [en/blog, 412 words]
P0 18 sourceless attribution: "experts believe"
P1 3 throat-clearing opener: "here's the thing"
P1 7 tier 1 vocabulary: "leverage" ×3
P1 22 binary contrast: "It's not the price, it's the"
P2 - paragraphs are uniform (47/49/48/46 words), vary the length
directness 5 rhythm 3 trust 6 authenticity 4 density 7
proxy score 25/50 (below 35, revise)
It exits 0 when clean and 1 when it finds something, so it drops into a pre-commit hook or CI.
A line carrying prose-ignore is dropped from the audit, and a file carrying prose-ignore-file is skipped whole. Use it when a flagged span is a real decision: a tool that keeps re-raising a settled choice teaches you to stop reading it.
Before it reads a word, it blanks out frontmatter, fenced and inline code, link targets, bare URLs and table rows. Those are the regions the skill promises never to rewrite, so counting tells inside them would be dishonest. Two carve-outs follow the same logic: a dash separating a lead term from its gloss in a list item is typography, and a triad inside a longer enumeration is a specification rather than a cadence.
The five-dimension score is a proxy. It measures what a regular expression can measure: filler rate, sentence and paragraph variance, hedge count, tier 1 density. A model reading the text does the real scoring, and the same five dimensions are defined for it in SKILL.md.
What it will not do
It will not tell you whether a human wrote something. Stanford's audit found commercial detectors falsely flagging more than 60% of essays by non-native English writers, and open-source detectors misclassify above 70%. Every pattern in this catalogue also appears in prose written by a tired person at midnight. Use the flags to improve writing, never as evidence about an author.
It will not add anything to your text. A rewrite may cut filler, sharpen an existing claim, or surface a buried point. It may not invent a number, a name, a date, a stance or a first-person aside. Inventing a specific always reads better and is always worse. The guardrails are in references/rewriting.md.
It will not follow instructions found inside a file it is editing. A document that says "ignore the rules above" gets that sentence flagged.
Layout
SKILL.md the core, loaded every time
references/phrases.md words and phrases, in three tiers
references/structures.md sentence and paragraph shapes
references/rewriting.md never-inject guardrails, voices, output formats
references/contexts.md per-audience strictness with a tolerance matrix
references/russian.md Russian tells, calques, false friends
references/german.md German tells, Substantivstil, false friends
references/not-tells.md what gets called a tell and is not
references/examples.md before and after in three languages
check.js the checker
check.test.js 31 tests, node --test
Study
study/ holds a measurement, not an opinion: what an English-only rule set does to correct Russian and German prose. The material is 14 articles that exist in three human translations, so the comparison is one text across three languages rather than three different texts.
The English rule set flags 28 of 28 Russian and German articles. Real findings in them: zero. Every false positive is the em dash rate rule, and the reason is in the numbers: Russian prose runs at 39.7 dashes per 1000 words against an English threshold of 1, because the dash between subject and predicate is mandatory in Russian.
A second finding fell out of the same data. The English translations carried 24.0 dashes per 1000 words before the cleanup, close to the German rate and far above the English norm. A human translated them and the wording was fine; the punctuation habit came across. See study/README.md and read study/DATA_NOTE.md before citing any of it.
Development
node --test # the test suite
npm run self # run the checker over the skill's own files
The self-scan uses --skip-quotes --context docs, because a catalogue of banned phrases contains banned phrases. Even so it reports the unquoted "before" samples in references/examples.md, which is a limitation worth knowing: a mechanical tool cannot see that an example is an example.
Credits
Merged from stop-slop by Hardik Pandya and avoid-ai-writing by Conor Bronsdon, both MIT. The unspecified-default framing, the prose-ignore escape hatch and the not-tells list come from unslop-ui by Carter Johnson (MIT), which applies the same three ideas to visual design. The vocabulary tiers trace further back to brandonwise/humanizer, and the never-inject rule to isatimur/de-slop, through the second source.
MIT.
Yorumlar (0)
Yorum birakmak icin giris yap.
Yorum birakSonuc bulunamadi
