DEV Community

ameobius
ameobius

Posted on

Deterministic linters for AI-written technical prose (EN, RU, ES, DE, FR)

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
Enter fullscreen mode Exit fullscreen mode

Linters exit with code 1 above the limit, so they gate a build:

python3 en/ste-lint.py --max 5 docs/*.md
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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)