Most "AI slop" advice is a style guide. This is a checker.
The symptom: documentation that reads fine in review and breaks the reader later. A sentence that hides the actor. A run-on that buries the command. A paragraph of hedges. Nobody flags it during review, because review is where prose gets read politely. It surfaces in the incident, in the support ticket, in the runbook nobody can follow at 3 a.m.
Anti-slop-kit has two halves. A skill tells the model how to write. A linter proves whether the model did it. The linter is the half most advice leaves out, because rules are easy to state and annoying to enforce.
The linters
- English: ASD-STE100 mechanics, 11 rule groups
- Russian: GOST R 58049-2017 clause 8.2.3, 13 rule groups plus typography (ёлочки, тире) — the RU side is not a translation of the EN side: its own lexicon, its own morphology handling, its own samples
- Spanish, German, French: same shape
Each language lives in its own directory, and every clean sample is pinned in the gate.
Running it
pip install anti-slop-kit
anti-slop-check --version
python3 en/ste-lint.py docs/draft.md
Linters exit with code 1 above the limit, so they gate a build:
python3 en/ste-lint.py --max 5 docs/*.md
The score is a smoke alarm
Violations per 100 words. Lower is cleaner. It is not a grade.
| Text | Score | Longest sentence |
|---|---|---|
en/samples/baseline.md |
29.94 | 49 words |
en/samples/ste.md |
0.83 | 14 words |
ru/samples/baseline.md |
33.33 | 27 words |
ru/samples/utr.md |
0.00 | 11 words |
Two texts per language is a smoke test, not a benchmark — read RESULTS.md before quoting these numbers. The useful signal is the delta between two revisions of the same text, not an absolute number. A threshold means something only after a team picks one for a document class; the CI samples gate at 2, and that is a convention, not a law.
The score also splits:
python3 en/ste-lint.py --breakdown docs/draft.md
slop counts banned words, marketing adjectives, filler and hedges. cl counts controlled-language mechanics: sentence length, passive voice, nominalizations, participle chains. In the Russian baseline, 24 of 39 findings are structural, so a search for banned words finds 15 and misses the larger half.
For agents
tools/aslint/ holds the agent-facing half: JSON in, JSON out, an MCP server, baseline gating, a write-time hook. .anti-slop.yaml switches off rules that are wrong for a given document class, per project.
python3 en/ste-lint.py --explain docs/draft.md
prints one line per finding: line number, rule, matched text, suggested fix.
Where it does not fit
Essays, marketing copy where the voice is the point, fiction, anything where rhythm matters more than being parsed correctly. The sentence-length and semicolon rules will fight you there, and they should: they come from maintenance-manual standards, not from general writing advice.
A score of 0 says nothing about whether the text is correct or complete. Every rule can produce a false positive — passive voice is right when the actor is unknown. Use the score to find candidates for a rewrite, not to grade a writer.
Repo
https://gitlab.com/ameobius-ai/anti-slop-kit
MIT. Python 3.9+, standard library only: the linters read only the files you name, send nothing anywhere, and execute nothing they analyze.
One caveat, stated plainly: GitHub Actions is disabled at the account level for the account that hosts this repository, so the CI workflow never runs there. The local hooks (hooks/pre-commit, hooks/pre-push) are the only enforcement that exists until that is lifted.
Top comments (0)