Unser Vorbehalt gegen KI-Training war an niemanden adressiert. Die Zeile Content-Signal: search=yes, ai-input=yes, ai-train=no stand in der Datei robots.txt von wppoland.com genau einmal, in der Gruppe User-agent: *, und darunter lagen zwanzig benannte Crawler-Gruppen.
Nach RFC 9309 erbt keine dieser zwanzig Gruppen irgendetwas aus der Sternchen-Gruppe. GPTBot, ClaudeBot, PerplexityBot, Google-Extended und der Rest der Liste lasen ausschließlich ihre eigenen Abschnitte, und dort stand diese Zeile nicht.
Wir schreiben darüber, weil es unsere Datei und unser Fehler ist. Wir haben die robots.txt immer daraufhin geprüft, ob sie versehentlich etwas blockiert, und nie daraufhin, ob die Erklärung ihren Empfänger überhaupt erreicht.
Content-Signal-Beispiel in der robots.txt
Der Aufbau sah so aus, wie er in den meisten Dateien aussieht, die uns begegnet sind: eine allgemeine Gruppe oben, darunter eine Liste benannter Bots mit erweiterten Allow-Regeln für maschinenlesbare Endpunkte.
User-agent: *
Content-Signal: search=yes, ai-input=yes, ai-train=no
Allow: /
Disallow: /cdn-cgi/
Sitemap: https://wppoland.com/sitemap-index.xml
Agentmap: https://wppoland.com/.well-known/ai-catalog.json
User-agent: GPTBot
Allow: /
Allow: /llms.txt
Allow: /facts.json
User-agent: ClaudeBot
Allow: /
User-agent: PerplexityBot
Allow: /Das wirkt sauber. Das Signal ist da, die benannten Gruppen sind da, die Endpunkte für Agenten sind separat aufgeführt. Das Problem ist, dass diese beiden Teile keinen Kontakt zueinander haben. Wer die Datei als Dokument liest, sieht oben eine Richtlinie und darunter Berechtigungen und ergänzt im Kopf eine Beziehung zwischen beidem, die der Parser nicht kennt.
Erbt eine robots.txt-Gruppe Regeln vom Stern-Block
Der Client vergleicht sein Product Token mit den Namen in den User-agent-Zeilen, ohne auf Groß- und Kleinschreibung zu achten, und wendet eine Gruppe an: die, die ihn nennt. Der Stern ist nicht das unspezifischste Muster, sondern der Rückfall, und RFC 9309 greift nur dann darauf zurück, wenn keine Gruppe den Client beim Namen nennt. Existiert eine benannte Gruppe, wendet der Client ausschließlich deren Direktiven an, und die Sternchen-Gruppe betrifft ihn komplett nicht mehr. Der Rest der Datei wird verworfen, bevor eine einzige Direktive darin gelesen wurde.
Das ist keine Ausnahme für Content Signals. Dieselbe Regel gilt seit jeher für Allow und Disallow, und genau deshalb schützt eine Datei, in der jemand Disallow: /wp-admin/ nur in die Sternchen-Gruppe geschrieben hat, gar nichts vor einem Bot, der weiter unten seinen eigenen Abschnitt hat.
Der Unterschied liegt danach. Bei Disallow sieht man die Folge, denn die Seite taucht im Index auf oder eben nicht, und eine Woche Indexierungsdaten sagt, welches von beidem gilt. Bei Content-Signal sieht man nichts, in keine Richtung. Eine Rechteerklärung hat keine Rückkopplung, also erzeugen eine falsche und eine richtige Erklärung dieselbe beobachtbare Geschichte, so lange man auch hinschaut.
Content Signals ist ein Vorschlag von Cloudflare und nicht Teil von RFC 9309, und Cloudflare aktiviert diese Richtlinie in seiner verwalteten robots.txt standardmäßig. Der Gruppenmechanismus, in dem diese Zeile wohnt, stammt jedoch vollständig aus RFC 9309, also gilt die Ein-Gruppen-Regel für sie genauso wie für alles andere in dieser Datei. Eine neue Direktive im alten Container erbt die Regeln des Containers, auch diejenigen, die niemand nachgeschlagen hat, bevor er die Direktive hinzufügte.
Was search, ai-input und ai-train bedeuten
Die Spezifikation definiert drei Signale, jeweils mit dem Wert yes oder no:
| Signal | Worum es geht |
|---|---|
search | Aufbau eines Suchindex und Ausliefern von Ergebnissen, also Links und kurze Textausschnitte |
ai-input | Zuführen von Inhalten an ein KI-Modell während der Antwort, also RAG und Grounding |
ai-train | Training und Feintuning von Modellen |
Unsere Kombination search=yes, ai-input=yes, ai-train=no ist eine bewusste Entscheidung, und der Kompromiss darin gehört ausgesprochen. Wir wollen in generativen Antworten zitiert werden, weil das heute einer der Kanäle ist, über die uns jemand findet. Wir wollen unseren Korpus nicht fürs Training hergeben, weil ein trainiertes Modell den Text weiterträgt, ohne dass ein Weg zurück zur Quelle bleibt.
Ja zum Ersten und Nein zum Zweiten heißt: wir nehmen in Kauf, dass derselbe Crawler an verschiedenen Tagen beide Aufgaben erledigt, und verlassen uns darauf, dass er die Tage auseinanderhält. Ein fehlendes Signal bedeutet etwas Drittes als no: der Betreiber erteilt auf diesem Weg weder Zustimmung noch Absage.
Keines dieser Signale blockiert irgendetwas. Es ist eine Textzeile in einer Datei, die ein Client abrufen kann oder nicht, lesen kann oder nicht und respektieren kann oder nicht. Der Server beantwortet die Anfrage unabhängig davon, was in dieser Datei steht.
Blockieren ist eine eigene Schicht, ausgewertet vor der Anwendung, und sie entsteht aus WAF-Regeln, Rate Limits oder der Verifikation der Bot-Identität. Diese Schicht kostet etwas: sie läuft bei jedem Request mit, sie kann sich bei einem Menschen irren, und sie braucht Pflege, sobald sich die Identitätsmerkmale ändern. Eine Erklärung kostet nichts und erzwingt nichts, was ein vernünftiger Tausch ist, solange man weiß, welches von beidem man gerade ausgeliefert hat. Ein Signal ist genau so viel wert wie eine eindeutige Nachricht an die richtige Adresse. Unsere war eindeutig und ging an die falsche.
Content-Signal in der robots.txt prüfen
Das dauert ein paar Sekunden und funktioniert auf jeder Domain:
curl -s https://ihre-domain.de/robots.txt \
| awk 'tolower($0) ~ /^user-agent:/ {ua++} tolower($0) ~ /^content-signal:/ {cs++} END {print "User-agent-Gruppen: " ua "\nContent-Signal-Zeilen: " cs}'Eine Einschränkung, bevor Sie auf die Ausgabe reagieren: gezählt werden User-agent-Zeilen und keine Gruppen, und die ABNF in RFC 9309 erlaubt mehrere User-agent-Zeilen am Anfang einer einzigen Gruppe. Wer seine Namen so stapelt, bekommt hier einen Fehlalarm und sollte sich an die Liste des zweiten Kommandos halten statt an die Rechnung des ersten.
Ist die Zahl der Gruppen größer als die Zahl der Signale, sagt die Differenz, wie viele Gruppen Ihren Vorbehalt nicht sehen. Bei uns lautete das Ergebnis einundzwanzig zu eins.
Die genauere Variante gibt die Namen der Gruppen aus, in denen das Signal fehlt:
curl -s https://ihre-domain.de/robots.txt \
| awk '/^[Uu]ser-agent:/ {if (name != "" && !sig) print "kein Signal: " name; name=$2; sig=0} /^[Cc]ontent-[Ss]ignal:/ {sig=1} END {if (name != "" && !sig) print "kein Signal: " name}'Das zweite Kommando gehört in die Pipeline, denn seine Ausgabe ist eine Liste zum Abarbeiten und keine Zahl zum Interpretieren.
Wo Content-Signal in der robots.txt stehen muss
Die Korrektur ist langweilig: die Zeile Content-Signal in jeder Gruppe wiederholen, für die sie gelten soll. Es gibt keine Abkürzung, keine Kurzform und keine Vererbung, die man einschalten könnte.
User-agent: *
Content-Signal: search=yes, ai-input=yes, ai-train=no
Allow: /
Disallow: /cdn-cgi/
User-agent: GPTBot
Content-Signal: search=yes, ai-input=yes, ai-train=no
Allow: /
Allow: /llms.txt
Allow: /facts.json
User-agent: ClaudeBot
Content-Signal: search=yes, ai-input=yes, ai-train=no
Allow: /
User-agent: PerplexityBot
Content-Signal: search=yes, ai-input=yes, ai-train=no
Allow: /Diese Änderung haben wir am 18. September 2026 ausgeliefert, am Tag dieses Beitrags. Das Signal steht jetzt in 18 von 23 Gruppen; die fünf ausgelassenen sind Scraper, die bei uns ohnehin ein Disallow haben, und denen eine Erlaubnis nur die Aussage verwässern würde.
Bei der Korrektur ist eine Sache zu entscheiden, die eine Datei mit wiederholter Zeile nicht von selbst entscheidet: ob derselbe Signalsatz zu jeder Gruppe passt. Für einen indexierenden Crawler und für einen Crawler, der Trainingskorpus sammelt, fällt die Antwort unterschiedlich aus, und eine Datei mit zwanzig identischen Zeilen legt nahe, dass niemand darüber nachgedacht hat. Eine Gruppe, in der search=yes keinen Sinn ergibt, weil der Client keinen Index baut, braucht ihren eigenen Eintrag, und mit dem Schreiben dieses Eintrags hört die Datei auf, eine Kopie zu sein, und wird zu einer Richtlinie.
Claude-User und Claude-SearchBot in der robots.txt
Beim selben Lesen der Datei kam heraus, dass wir nur die Gruppe ClaudeBot hatten und die beiden anderen nicht: Claude-User für vom Nutzer ausgelöste Abrufe und Claude-SearchBot für das Grounding der Suche.
Das sind drei verschiedene Rollen und drei verschiedene Absichten auf der Clientseite. Ein Bot, der eine Seite abruft, weil ein Mensch gerade deren Adresse in ein Gespräch geklebt hat, tut etwas anderes als ein Bot, der einen Korpus aufbaut, und es ist sinnvoll, ihm etwas anderes zu antworten.
Die Folge der fehlenden Gruppen ist dieselbe wie oben, nur von der anderen Seite: ein Client ohne eigenen Abschnitt fällt auf die Sternchen-Gruppe zurück. In unserem Fall hieß das ausgerechnet, dass Claude-User das korrekte Signal sah, weil es im Sternchen stand. In einer Datei, in der das Signal zwanzig benannte Bots nicht erreichte, erreichte es also die unbenannten. Genau umgekehrt zur Absicht, und erzeugt von derselben Regel, die exakt so arbeitet, wie sie geschrieben ist.
Warum eine robots.txt-Prüfung diesen Fehler übersieht
Drei Gründe, alle strukturell, keiner davon Unaufmerksamkeit.
Eine robots.txt liest man von oben nach unten, und der allgemeine Abschnitt wirkt übergeordnet. Etwas dort hineinzuschreiben weckt die Intuition aus CSS oder aus Serverkonfigurationen, wo die allgemeine Einstellung der Default ist und die spezifische sie überschreibt. In RFC 9309 gibt es kein Überschreiben. Es gibt die Wahl einer Gruppe und das Verwerfen des restlichen Dateiinhalts.
Zweiter Grund: es gibt kein Werkzeug, das das meldet. robots.txt-Tester prüfen, ob eine bestimmte Adresse für einen bestimmten Bot erlaubt ist, und von Content-Signal wissen sie nichts, weil es keine Direktive aus dem RFC ist. Die Zeile geht in den Augen des Validators als Kommentar durch und in den Augen des Menschen als Richtlinie, und beide Lesarten sind in sich stimmig.
Dritter und wichtigster Grund: eine Rechteerklärung hat kein Rücksignal. Setzen Sie Disallow falsch, sehen Sie es eine Woche später im Indexierungsbericht. Setzen Sie Content-Signal falsch, passiert nichts, was sich beobachten ließe, und das Ausbleiben eines Ereignisses sieht in beiden Fällen identisch aus. Diese Fehlerklasse findet man durch Lesen der Datei, nicht durch Beobachten der Wirkung, und das ist unangenehm zu planen, weil Lesen keinen Auslöser hat.
Geltungsbereich von Sitemap und Content-Signal in der robots.txt
In dieser Datei steckt etwas, das die falsche Intuition direkt nahelegt. Neben den User-agent-Gruppen kennt robots.txt gruppenunabhängige Records, und Sitemap ist so ein Record. In unserer Datei steht er nach der Sternchen-Gruppe:
Sitemap: https://wppoland.com/sitemap-index.xml
Agentmap: https://wppoland.com/.well-known/ai-catalog.jsonSitemap gilt für die ganze Datei, unabhängig davon, wo Sie ihn hinschreiben und wie viele Gruppen darunter stehen. Niemand wiederholt ihn zwanzigmal, und niemand muss das. Wer weiß, wie sich Sitemap verhält, und Content-Signal in derselben Gegend der Datei sieht, zwei Zeilen darüber, hat jedes Recht anzunehmen, dass sich diese Zeile genauso verhält.
Tut sie nicht. Das eine ist ein globaler Record, das andere eine Direktive innerhalb einer Gruppe, und nichts in der Syntax weist darauf hin. Beide sind eine zweiteilige Zeile mit einem Doppelpunkt, direkt nebeneinander.
Praktischer Schluss beim Lesen fremder Dateien: Einrückung und Reihenfolge bedeuten nichts, es zählt allein, ob eine Direktive als gruppenbezogen definiert ist. Allow, Disallow und Content-Signal sind gruppenbezogen. Sitemap ist es nicht.
Ist ai-train=no für KI-Crawler verbindlich
Zwei Dinge lassen wir bewusst außerhalb des Rahmens, weil sie nicht unsere sind.
Erstens die rechtliche Wirkung des Vorbehalts. Content Signals beruft sich auf einen urheberrechtlich formulierten Rechtevorbehalt, und genau so ein Text steht im Kommentar oben in unserer Datei. Ob und wann dieser Vorbehalt wirksam ist, entscheidet eine Anwältin oder ein Anwalt und nicht die Person, die robots.txt bearbeitet. Unser Beitrag ist rein technisch: wenn eine Erklärung irgendein Gewicht haben soll, muss sie wenigstens den Client erreichen, an den sie adressiert ist, und unsere erreichte ihn nicht.
Zweitens das Verhalten einzelner Betreiber. Wir haben nicht gemessen, welcher Crawler Content-Signal liest, welcher es respektiert und was er mit widersprüchlichen Signalen in verschiedenen Gruppen anstellt. Ohne eigene Messung haben wir dazu nichts zu sagen, und fremde Zahlen wiederholen wir nicht. Die beschriebene Korrektur lohnt sich unabhängig von diesem Wissen, denn sie repariert eine Datei, die etwas anderes sagt, als ihr Autor gemeint hat, und das ist für sich genommen ein Defekt.
Automatischer robots.txt-Test in der CI-Pipeline
Die Reichweite des Signals einmal zu prüfen kostet ein paar Minuten, sie zu halten ist keine einmalige Arbeit. Jede neue Gruppe in der Datei, und die kommen regelmäßig dazu, weil die Liste der KI-Crawler von Monat zu Monat wächst, ist eine Gruppe ohne Signal, bis jemand daran denkt. Deshalb gehört das zweite Kommando oben in die Tests und nicht in eine Notiz. Eine Regel, die sich selbst prüft, überlebt; eine Regel in einem Dokument überlebt bis zur nächsten Bearbeitung der Datei durch jemanden, der das Dokument nicht gelesen hat.
Es lohnt sich auch, im Kopf zu behalten, über welchen Anteil des Traffics wir hier reden. In unserer Messung vom August 2026, beschrieben im Beitrag über Bot-Traffic auf einer kleinen Website, kamen 72 % der Requests nicht aus einem Browser.
Die Datei robots.txt ist der einzige Ort, an dem wir mit dieser Mehrheit überhaupt sprechen, und das Einzige, was diese Mehrheit über unsere Bedingungen weiß. Ist der Satz darin an die falsche Gruppe adressiert, ist das kein weicher Fehler, sondern Schweigen.
Eine technische Grenze bleibt dabei bestehen, und sie gehört an dieser Stelle genannt: die Datei sagt nur etwas aus, sie erfährt nie, ob jemand zugehört hat. Wer mehr will als eine Aussage, landet zwangsläufig in der Schicht vor der Anwendung, mit allen Kosten, die dort anfallen.
Checkliste für Content-Signal in robots.txt
- Zählen Sie die
User-agent-Gruppen und dieContent-Signal-Zeilen in Ihrer Datei. Stimmen die Zahlen nicht überein, ist die Differenz die Menge der Gruppen ohne Vorbehalt. - Wiederholen Sie die Zeile in jeder Gruppe, für die sie gelten soll. Die Wiederholung ist hier die korrekte Form und kein Duplikat.
- Entscheiden Sie bewusst, ob jede Gruppe denselben Signalsatz bekommt. Zwanzig identische Zeilen sind meist ein Zeichen dafür, dass niemand entschieden hat.
- Prüfen Sie, ob Sie eigene Gruppen für die Rollen desselben Anbieters haben, etwa für vom Nutzer ausgelöste Abrufe und für das Sammeln von Korpus.
- Hängen Sie die Prüfung in die Pipeline. Die Crawler-Liste wächst, und jede neue Gruppe startet ohne Signal.
- Reden Sie sich nicht ein, dass ein Signal irgendetwas blockiert. Blockieren ist die Schicht vor der Anwendung, das hier ist eine Erklärung.
robots.txt Gruppe für Gruppe zu lesen gehört auch in ein EU-Konformitätsaudit für WordPress: Crawler-Regeln und regionale Claims müssen zu dem passen, was die Site wirklich ausliefert.







