Stop the slop – auf Deutsch. Ein Linter für Floskeln, Nominalstil und leere Behauptungen in deutschen Texten, egal ob sie aus einem Sprachmodell stammen oder aus der eigenen Feder.
Linten, umschreiben, von einer fremden Modellfamilie gegenlesen lassen, erneut linten. Für Landingpages, Newsletter, Produkttexte, Stellenanzeigen, also alles, was ein Mensch liest und beurteilt.
Die lautesten Tells im Deutschen gibt es im Englischen gar nicht: Nominalstil, Genitivketten, Amtsdeutsch, aufzählende Absatzanfänge. Und der stärkste ist eine Abwesenheit. Ein deutscher Text ohne ein einziges aber, der stattdessen auf „jedoch" und „allerdings" ausweicht, klingt fast immer nach Maschine.
Slop ist Text, in dem nichts steht. Den gab es lange vor den Sprachmodellen: Nominalstil, Amtsdeutsch und Genitivketten füllen seit Jahrzehnten Geschäftsberichte. Die Modelle haben diese Muster aus solchen Texten gelernt und setzen sie heute häufiger als jeder Mensch. Deshalb funktioniert der Linter bei eigenen Texten genauso. Er fragt nicht, wer geschrieben hat, sondern ob da etwas steht.
Das Ziel ist ein besserer Text, kein unauffälligerer. Die meisten Korrekturen machen einen Text überprüfbarer: das Gründungsjahr statt „langjährige Erfahrung", eine gemessene Zahl statt „deutlich schneller". Erfundene Belege sind die einzige harte Regel. KI-Detektoren zu überlisten verspricht dieses Projekt ausdrücklich nicht. Detektoren sind Rauschen, das Ziel ist das Bauchgefühl eines menschlichen Lesers.
Verhindern lässt sich trotzdem nicht, dass jemand damit einen KI-Text als eigenen ausgibt. Aber wo Offenlegung verlangt ist (in der Hausarbeit, in der Redaktion, bei einer gesetzlichen Kennzeichnungspflicht), ersetzt ein Score von 6/6 sie nicht.
1. LINTEN tools/deslop_de.py Score /6, rot unter 6. Regex, keine Meinung.
2. UMSCHREIBEN drei Durchgänge Wörter → Satzformen → eine Person einsetzen
3. GEGENLESEN tools/cleanse.sh fremde Modellfamilie räumt auf
4. NACHLINTEN tools/deslop_de.py erst bei 6/6 raus damit
Der Linter hat das erste und das letzte Wort, weil er ehrlich ist und das Modell überzeugend.
git clone https://github.com/artsunique/rotstift && cd rotstift
# einen Satz prüfen
python3 tools/deslop_de.py --text "Nicht nur schnell, sondern auch nahtlos."
# → Score 5/6, benennt beide Tells, Exit 1
# eine Datei prüfen
python3 tools/deslop_de.py texte/landingpage.md
# eine gebaute Seite prüfen (liest nur, was ein Besucher sieht)
python3 tools/deslop_de.py index.html
# Zahlen sind belegbar? Gruppe blockiert nicht mehr, Fundstellen bleiben sichtbar
python3 tools/deslop_de.py index.html --belege-ok
# Entwurf von der anderen Modellfamilie gegenlesen lassen
tools/cleanse.sh entwurf.md > gereinigt.md && python3 tools/deslop_de.py gereinigt.md
# Regel geändert? Das hier fängt einen halbblinden Katalog
python3 tools/test_deslop_de.pyKeine Abhängigkeiten. Der Linter ist reines Python aus der Standardbibliothek,
offline, ohne Modellaufruf. Das Cleanse-Skript braucht eine KI-CLI (claude,
codex oder gemini) — oder keine, dann gibt es den Prompt zum Kopieren aus.
Ein echter Durchlauf an einem typischen deutschen KI-Absatz:
| Score | |
|---|---|
| Wie das Modell es ausgab | 2/6 — nahtlos, Mehrwert, „nicht nur … sondern auch", zwei Genitivketten |
| Nach einem Durchlauf | 6/6 — Aussage unverändert, Länge im Rahmen, nichts erfunden |
Jeder Befehl mit seiner Ausgabe: beispiele/durchlauf.md.
Je ein Punkt. Voller Katalog mit Fundstellen und Ersatzvorschlägen:
references/katalog.json.
- KI-Vokabular —
nahtlos,ganzheitlich,maßgeschneidert,Mehrwert,Potenzial entfalten,Reise. Zwei Stufen: Wörter ohne normale Bedeutung werden über den Wortstamm gefangen, Wörter mit echter Fachbedeutung (effizient,innovativ) zählen nur halb — damit „Die Anlage ist effizient ausgelegt: 0,8 kWh pro Kilogramm" sauber bleibt. - KI-Satzschablonen — „nicht nur X, sondern auch Y" (der lauteste Tell überhaupt), „Genau hier kommt … ins Spiel", „In der heutigen schnelllebigen Geschäftswelt", selbstbeantwortete Fragen. 18 Formen.
- Deutschspezifische Tells — Amtsdeutsch, Nominalstil, Genitivketten,
jedochstattaber, aufzählende Absatzanfänge, gestapeltes Passiv. - Satzzeichen und Rhythmus — zwei Gedankenstriche in einem Satz, Gedankenstrich als Listenzeichen, Dreiergruppen, Emojis. Dreiergruppen werden nur bei kleingeschriebenen Gliedern gezählt, weil deutsche Substantivlisten („Eiche, Esche und Buche") völlig normal sind.
- Erfundene Belege — Zahl neben Nomen, Erfahrungsjahre, Marktführer- Behauptungen. Absichtlich streng: ein Fehlalarm kostet zehn Sekunden, eine erfundene Zahl die Glaubwürdigkeit — in Deutschland zusätzlich mit wettbewerbsrechtlichem Risiko.
- Menschliche Signale — die Umkehrprüfung, und die eigentliche Neuerung hier. Sie misst nicht, was dasteht, sondern was fehlt: kein einziges „aber", zu gleichförmige Satzlängen, keine erste Person. Greift ab 120 Wörtern, bei anderen Textsorten früher (siehe unten).
Gruppe 6 braucht Text, um etwas messen zu können. Unterhalb der Schwelle wurde sie bisher still als bestanden verbucht — eine Über-mich-Seite mit 75 Wörtern bekam 6/6, ohne dass je jemand nach dem fehlenden „aber" gesehen hätte. Genau die Textsorten, die Kunden zuerst prüfen lassen, waren die ungeprüften.
--textsorte verschiebt die Schwelle und schaltet einzelne Metriken ab:
python3 tools/deslop_de.py --textsorten # zeigt, was der Katalog kennt
python3 tools/deslop_de.py ueber-mich.md --textsorte profil
python3 tools/deslop_de.py claim.txt --textsorte kurz
| Sorte | Stimme ab | abgeschaltet | wofür |
|---|---|---|---|
standard |
120 W | — | Landingpage, Blogpost, Newsletter, Angebot |
profil |
90 W | s-ich-wir |
Über-mich-Seite, Unternehmensprofil, Pressetext |
kurz |
45 W | s-satzlaengen |
Claim, Hero, Social-Post, Betreffzeile |
profil nimmt die Ich-Prüfung raus, weil ein Text in der dritten Person sie
nicht bestehen kann und sonst dauerhaft bei 5/6 deckelt. Die eigene Sicht muss
trotzdem irgendwo stehen — als Einwand, Abgrenzung oder Bedingung. Das prüft
kein Regex.
Was nicht geprüft werden konnte, steht jetzt in der Ausgabe:
[ uebersprungen ] Menschliche Signale (Umkehrpruefung)
Metriken nicht geprueft, 75 < 120 Woerter
Score 6/6 · 1 ungeprueft (stimme)
Eigene Sorten kommen wie eigene Regeln in references/katalog.json, unter
textsorten. Ein Tippfehler im Namen bricht ab, statt stillschweigend auf
standard zurückzufallen — sonst prüft man monatelang das Falsche.
Der kürzeste Weg, weil kein Upload nötig ist:
git clone https://github.com/artsunique/rotstift ~/.claude/skills/rotstiftNeue Sitzung starten, dann /rotstift oder einfach „Rotstift über die
Landingpage". Für ein Projekt statt für alle: nach .claude/skills/ im Repo
klonen, dann liegt der Skill im Git-Verlauf des Projekts und alle im Team haben
ihn.
Voraussetzung ist ein Plan mit Codeausführung (Pro, Max, Team, Enterprise). Erst Einstellungen → Funktionen → Codeausführung und Dateierstellung einschalten — ohne das bleibt das Skills-Menü ausgegraut, und zwar unabhängig vom Plan. Bei Team und Enterprise kann nur ein Owner den Schalter umlegen.
Dann ZIP bauen:
cd rotstift
zip -r ../rotstift.zip . -x '.git/*' '.DS_Store' '**/__pycache__/*'Hochladen unter Anpassen → Skills → +. Wird das ZIP abgewiesen, liegt es fast
immer daran, dass SKILL.md nicht dort liegt, wo Claude sie sucht: sie gehört
auf die oberste Ebene des Archivs. Der Finder packt beim Rechtsklick den
Ordner mit ein und schiebt damit alles eine Ebene tiefer — deshalb der
Befehl oben mit cd und . statt zip -r rotstift.zip rotstift.
Anschließend im Chat: „Nutze Rotstift auf diesen Text". Weil Skills hier
ohnehin Codeausführung voraussetzen, läuft deslop_de.py in der Sandbox
wirklich — Claude rät den Score nicht, sondern misst ihn und kann iterieren,
bis 6/6 steht. Was dort nicht geht, ist tools/cleanse.sh: die Sandbox hat
keine zweite KI-CLI. Das Gegenlesen machst du von Hand, indem du den Entwurf
in einen Chat einer anderen Modellfamilie gibst und danach erneut lintest.
Ein Update ist kein Update, sondern ein zweiter Upload derselben Datei — die alte Fassung vorher löschen, sonst hast du zwei.
Ein Skills-System wie bei Claude gibt es dort nicht. Zwei Wege, die funktionieren:
Custom GPT. SKILL.md und references/katalog.json als Wissensdateien
hochladen, tools/deslop_de.py dazu. In die Instructions einen Satz, der den
Ablauf auslöst: „Bei deutschen Texten den Ablauf aus SKILL.md befolgen, den
Linter mit Code Interpreter ausführen, Score und Fundstellen ausgeben."
Code Interpreter muss aktiv sein, sonst wird nur geraten.
Einzelner Chat. Die drei Dateien in den Chat ziehen und schreiben: „Führe
deslop_de.py auf dem Text unten aus und halte dich an SKILL.md." Ohne Upload
geht es auch, dann arbeitet das Modell den Katalog von Hand ab — es findet
dann weniger und schätzt den Score. Der Abschnitt Ohne Terminal in
SKILL.md beschreibt genau diesen Fall.
Den Agenten auf SKILL.md im Repo zeigen lassen, oder den Pfad in AGENTS.md
aufnehmen. SKILL.md und der Katalog enthalten nichts Claude-Spezifisches;
der Linter braucht nur python3 aus der Standardbibliothek.
Der Skill läuft nur auf ausdrückliche Bitte. Er lintet nichts, was das Modell gerade selbst geschrieben hat, und hängt keine Score-Zeile unter normale Antworten. Das ist Absicht: ein Linter, der sich ungefragt einmischt, wird abgeschaltet.
references/katalog.json ist reines JSON, kein Python nötig. Eine Regel:
{
"id": "v-eigenes",
"muster": "\\bhochkar(ae|ä)tig\\w*",
"hinweis": "Superlativ ohne Beleg.",
"ersatz": "Streichen oder belegen.",
"gewicht": 1.0,
"case": false
}Danach python3 tools/test_deslop_de.py. Die Testdatei enthält eine Liste
echter deutscher Sätze, die nicht anschlagen dürfen — das ist die Hälfte,
die zählt. Ein Linter mit Fehlalarmen wird abgeschaltet, und dann schützt er
gar nichts mehr.
Nie Belege erfinden. Keine Kundenzahlen, keine Bewertungen, keine
Erfahrungsjahre, die niemand nachgezählt hat. Fehlt eine Zahl, schreib
[Zahl fehlt] und mach weiter.
Es heißt „keine bekannten Muster", nicht „guter Text". Ein flacher, belangloser Text besteht mühelos. Ein Rotstift streicht an, was auffällt. Ob der Text gut ist, weiß er nicht. Wer nur gegen die Wortliste optimiert, schreibt in zwei Jahren den nächsten erkennbaren Einheitssound.
Bevor du es ausprobierst: Diese README fällt auf dem eigenen Linter durch, weil sie jeden Tell zitiert, den sie dokumentiert. Lass ihn über deine Texte laufen, nicht über den Katalog, der die Texte beschreibt.
Alle Quellen in references/quellen.md. Kurz: die
Schleifen-Architektur und die Idee des gegenlesenden Fremdmodells stammen von
SlopMonster, der deutsche
Musterkatalog und die „aber"-Beobachtung von
klartext, das editierbare
Regelformat von ai-text-cleaner.
Alle drei MIT.
Für englische Texte gibt es stop-slop von Hardik Pandya, einen verbreiteten Skill mit ähnlichem Ziel. Rotstift ist kein Fork davon, sondern setzt dort an, wo englische Regeln im Deutschen nicht greifen.
MIT. Wie das, worauf es steht.