{"slug": "deterministic-linters-for-ai-written-technical-prose-en-ru-es-de-fr", "title": "Deterministic linters for AI-written technical prose (EN, RU, ES, DE, FR)", "summary": "A developer released anti-slop-kit, an MIT-licensed Python tool that pairs a writing skill for models with deterministic linters for AI-generated technical prose in English, Russian, Spanish, German and French. The linters score violations per 100 words and split findings into banned-word \"slop\" and controlled-language mechanics such as sentence length, passive voice and nominalizations, exiting with code 1 above a threshold so they can gate a build. Sample texts show the English baseline scoring 29.94 violations per 100 words versus 0.83 for the controlled-language version, though the author cautions that two texts per language is a smoke test, not a benchmark.", "body_md": "Most \"AI slop\" advice is a style guide. This is a checker.\n\nThe 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.\n\nAnti-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.\n\nEach language lives in its own directory, and every clean sample is pinned in the gate.\n\n```\npip install anti-slop-kit\nanti-slop-check --version\npython3 en/ste-lint.py docs/draft.md\n```\n\nLinters exit with code 1 above the limit, so they gate a build:\n\n```\npython3 en/ste-lint.py --max 5 docs/*.md\n```\n\nViolations per 100 words. Lower is cleaner. It is not a grade.\n\n| Text | Score | Longest sentence | \n|---|---|---|\n| `en/samples/baseline.md` | 29.94 | 49 words | \n| `en/samples/ste.md` | 0.83 | 14 words | \n| `ru/samples/baseline.md` | 33.33 | 27 words | \n| `ru/samples/utr.md` | 0.00 | 11 words | \n\nTwo 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.\n\nThe score also splits:\n\n```\npython3 en/ste-lint.py --breakdown docs/draft.md\n```\n\n`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.\n\n`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.\n\n```\npython3 en/ste-lint.py --explain docs/draft.md\n```\n\nprints one line per finding: line number, rule, matched text, suggested fix.\n\nEssays, 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.\n\nA 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.\n\n[https://gitlab.com/ameobius-ai/anti-slop-kit](https://gitlab.com/ameobius-ai/anti-slop-kit)\n\nMIT. Python 3.9+, standard library only: the linters read only the files you name, send nothing anywhere, and execute nothing they analyze.\n\nOne 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.", "url": "https://wpnews.pro/news/deterministic-linters-for-ai-written-technical-prose-en-ru-es-de-fr", "canonical_source": "https://dev.to/ameobius/deterministic-linters-for-ai-written-technical-prose-en-ru-es-de-fr-1lnl", "published_at": "2026-10-23 19:04:06+00:00", "updated_at": "2026-10-23 19:09:51.468751+00:00", "lang": "en", "topics": ["ai-tools", "developer-tools", "natural-language-processing", "ai-agents"], "entities": ["anti-slop-kit", "GitLab", "GitHub Actions", "ameobius-ai"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/deterministic-linters-for-ai-written-technical-prose-en-ru-es-de-fr", "markdown": "https://wpnews.pro/news/deterministic-linters-for-ai-written-technical-prose-en-ru-es-de-fr.md", "text": "https://wpnews.pro/news/deterministic-linters-for-ai-written-technical-prose-en-ru-es-de-fr.txt", "jsonld": "https://wpnews.pro/news/deterministic-linters-for-ai-written-technical-prose-en-ru-es-de-fr.jsonld"}}