=== Hafen Core ===
Contributors: hafenstudios
Tags: ai, ai-crawler, gptbot, schema, structured-data
Requires at least: 6.4
Tested up to: 7.0
Requires PHP: 7.4
Stable tag: 0.8.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Sieh, welche KI-Bots deine Inhalte holen, was zurückkommt, und entscheide je Zweck, wer darf. Lokal, ohne Konto, ohne erfundene Scores.

== Description ==

**Steuern und messen in einem – die beiden Hälften, die sonst niemand zusammenbringt.**
Blocker-Plugins lassen dich KI-Bots aussperren, zeigen dir aber nie, was das
kostet. GEO-Dienste messen deine KI-Sichtbarkeit ab 25 $ im Monat, können aber
nichts an deiner Seite ändern und wissen nicht, was du blockierst. Hafen Core
kennt beide Seiten und sagt dir deshalb Sätze wie: "Perplexity crawlt dich
nicht – kein Wunder, du blockierst PerplexityBot." Kostenlos, komplett lokal,
ohne Konto.

**Ehrlich, auch wenn es weh tut.** Dieses Plugin erfindet keinen
Sichtbarkeits-Score und verspricht dir keine Platzierung in ChatGPT. Wo die
Datenlage dünn ist, steht das dran: llms.txt ist als spekulativ gekennzeichnet,
jede Regel im Zitierbarkeits-Linter nennt ihre Beleg-Stärke und ihre Quelle, und
wo ein Anbieter keine IP-Ranges veröffentlicht, geben wir einen User-Agent nicht
als Beweis aus. Der ehrlichste Satz zuerst: Der stärkste belegte Faktor für
Zitationen sind Erwähnungen deiner Marke anderswo. On-Page ist der kleinere
Hebel. Alles, was dieses Plugin tut, arbeitet an diesem kleineren Hebel – dafür
sauber und nachprüfbar.

Hafen Core ist zugleich das Companion-Plugin zum Hafen-Theme. Nach dem Prinzip
"Theme = Präsentation, Plugin = Funktion" liefert dieses Plugin genau die
Funktionalität, die laut WordPress.org-Richtlinien nicht ins Theme gehört.

**Schema-Engine.** Bettet automatisch gültiges JSON-LD ein, ohne dass du
etwas schreiben musst: Organization, WebSite (inkl. Suchfunktion), Article
(auf Beiträgen) und BreadcrumbList. Dazu FAQPage und HowTo aus den
Answer-Blöcken. Alles in einem @graph im Dokumentkopf.

**Answer-Engine-Blöcke.** Fünf Blöcke, die schön für Menschen rendern und
zugleich maschinenlesbar bzw. datenschutzfreundlich sind:

* Hafen FAQ — emittiert FAQPage-Schema.
* Hafen HowTo — emittiert HowTo-Schema.
* Hafen TL;DR — hervorgehobene Kurzantwort.
* Hafen Definition — Begriff im Was-ist-X-Format.
* Hafen Video (2-Klick) — datenschutzfreundliches YouTube-Embed, lädt erst
  nach Klick über youtube-nocookie.com.

**Zugangsschutz (Under Construction).** Schütze die ganze Website mit einem
Passwort, solange sie im Aufbau ist – ohne extra Plugin. Drei mitgelieferte
Vorlagen (hell, dunkel, Akzent-Verlauf) übernehmen automatisch dein Logo,
deinen Seitennamen und deine Akzentfarbe. Eingeloggte Benutzer sehen die
Website normal, die Sperrseite sendet HTTP 503 + noindex (SEO-sicher), und
das WordPress-Logo auf Login-Seiten wird durch dein Website-Logo ersetzt.

**KI-Crawler-Policy.** Der ganze Markt behandelt KI-Crawler als Bedrohung, die
man aussperrt. Hafen Core macht das Gegenteil: Es hilft dir, gefunden und
zitiert zu werden. Dafür trennt es sauber, was fast alle vermischen: Training
(GPTBot, ClaudeBot, CCBot), Suche/Index (OAI-SearchBot, Claude-SearchBot,
PerplexityBot, Googlebot) und den Live-Abruf durch einen Menschen im Chat
(ChatGPT-User, Claude-User, Perplexity-User). Training zu blockieren kostet
KEINE Sichtbarkeit. Die Suche zu blockieren kostet jede Zitierbarkeit. Genau
diesen Fehler verhindert die Oberfläche, mit Klartext-Warnungen statt
Kleingedrucktem. Voreinstellung: nichts blockiert. Dies ist kein Blocker-Plugin.

**KI-Traffic-Dashboard, komplett lokal.** Zeigt, welche KI-Bots deine Inhalte
holen, welche Seiten sie am meisten crawlen, wie viele Besucher aus KI-Antworten
zurückkommen und die entscheidende Kennzahl: Crawl-to-Refer, also wie viele
Seiten sich ein Anbieter holt, bevor er dir einen Besucher schickt. Kein Konto,
keine Cloud, keine IP-Adressen in der Datenbank. Zugriffe von OpenAI werden gegen
die offiziellen IP-Ranges verifiziert; wo ein Anbieter keine veröffentlicht
(Anthropic, Perplexity, Meta), steht das offen da, statt einen User-Agent-String
als Beweis auszugeben.

**IndexNow.** Meldet neue und geänderte Inhalte sofort an Bing und teilnehmende
Suchmaschinen, statt auf den nächsten Crawler zu warten. Relevant, weil ChatGPTs
Web-Antworten über den Bing-Index laufen. Standardmäßig aus (Opt-in).

**Markdown für Agenten.** Agentische Clients (Claude Code, Cursor, OpenCode)
fragen Seiten mit "Accept: text/markdown" ab. Hafen Core beantwortet das mit
einer sauberen Markdown-Fassung deiner Inhalte, wahlweise auch über ?format=md
oder die Endung .md. Das spart dem Modell den Layout-, Navigations- und
Skript-Ballast. Die Markdown-Fassung geht mit "X-Robots-Tag: noindex" raus, und
"Vary: Accept" liegt gezielt auf den Antworten, die auch als Markdown ausgeliefert
werden können, damit kein Page-Cache die Markdown-Fassung an Browser ausliefert –
und auf keiner anderen, damit Proxy-Caches nicht unnötig fragmentieren.
Ausgeliefert werden ausschließlich veröffentlichte, öffentlich sichtbare,
nicht passwortgeschützte Inhalte.

**Zitierbarkeits-Linter im Editor.** Prüft den Beitrag gegen 15 Regeln und zeigt
je Regel, ob sie hält und wie gut sie belegt ist (stark / mittel / schwach), samt
Quelle. Bewusst OHNE Score von 0 bis 100: eine Zitationswahrscheinlichkeit kennt
niemand, und wir tun nicht so. Enthalten ist auch eine Prüfung auf
Prompt-Injection und Cloaking, denn das ist ein Sanktionsthema, kein
Optimierungsthema. Die optionale KI-Feinprüfung nutzt den BYOK-Assistenten und
ist keine Voraussetzung: alle Regeln laufen auch ohne KI.

**Abilities API und WebMCP.** Wo WordPress die Abilities API mitbringt (ab 6.9),
registriert Hafen Core lesende Fähigkeiten (Seite als Markdown, Inhalte
durchsuchen) sowie die Generatoren des KI-Assistenten; für MCP freigegeben sind
nur die lesenden. Dazu kommen lesende WebMCP-Browser-Werkzeuge. Ehrliche
Einordnung: WebMCP ist ein Chrome-Testversuch und wirkt nur bei geöffnetem Tab.
Crawler sehen davon nichts, für die Sichtbarkeit bringt es nichts. Seit 0.7.2
lädt ein Mini-Snippet das Skript nur in Browsern nach, die die API wirklich
haben; alle anderen zahlen 0 zusätzliche Requests. Beides ist reine
Feature-Erkennung, keine Abhängigkeit.

**llms.txt-Generator.** Veröffentlicht unter /llms.txt (und /llms-full.txt)
eine kuratierte Inhaltskarte. Ehrliche Einordnung: Google gibt an, llms.txt zu
ignorieren, und Messungen zeigen, dass KI-Systeme die Datei praktisch nicht
abrufen. Nützlich für Coding-Agenten, nicht für Sichtbarkeit in KI-Suchen. Wir
liefern sie aus, weil sie nichts kostet, und versprechen nichts davon.

**Performance-Status.** Geschwindigkeit ist ein Kernversprechen der
Hafen-Familie. Das Dashboard (Einstellungen > KI-Traffic) zeigt deshalb ehrlich,
was dein Setup hergibt: Page-Cache erkannt oder nicht, Kompression per
Selbsttest, Font-Modus des Themes (Variable/statisch/System) – je Punkt mit
einer Klartext-Empfehlung. Dazu die Option, das WordPress-Emoji-Skript
abzuschalten (~26 KB und ein externer Request zu s.w.org gespart; standardmäßig
aus). Cache und Kompression sind Server-Themen, die kein Plugin von innen lösen
kann. Genau deshalb zeigen wir sie an, statt Versprechen zu machen.

Alles läuft ohne Build-Schritt und DSGVO-freundlich. Schema, Blöcke und llms.txt
arbeiten rein lokal. Externe Verbindungen entstehen nur in zwei ausdrücklich von
dir ausgelösten Fällen: der optionale KI-Assistent (Anthropic API, nur mit eigenem
Schlüssel) und der Video-Block (YouTube, erst nach Klick). Details unter
"External services".

== Installation ==

1. Plugin hochladen und aktivieren (Plugins > Installieren > Hochladen).
2. Nach der Aktivierung ist /llms.txt sofort erreichbar und das Schema aktiv.
3. Unter Einstellungen > Hafen Core Organisationsname, Logo und die Schalter
   für Schema, llms.txt, Traffic-Messung und IndexNow anpassen.
4. Unter Einstellungen > KI-Crawler-Policy festlegen, welche KI-Bots dürfen.
   Empfohlen: "Nicht trainieren, aber zitieren". Voreinstellung: alles erlaubt.
5. Unter Einstellungen > KI-Traffic sehen, wer deine Inhalte holt und wer dafür
   Besucher zurückschickt.

== Frequently Asked Questions ==

= Brauche ich das Hafen-Theme? =
Nein. Die Blöcke, das Schema und llms.txt funktionieren mit jedem Theme.
Mit dem Hafen-Theme teilen sie sich Design-Tokens und sehen aus einem Guss aus.

= Kollidiert das Schema mit einem SEO-Plugin? =
Nein. Im Auto-Modus (Standard) erkennt Hafen Core gängige SEO-Plugins (Yoast,
Rank Math, SEOPress, All in One SEO, The SEO Framework, Slim SEO, Squirrly) und
tritt bei überlappendem Schema zurück: Organization, WebSite, Article und
Breadcrumb überlässt es dem SEO-Plugin und gibt nur FAQPage/HowTo aus, die aus
den Hafen-Answer-Blöcken stammen. Der Modus ist unter Einstellungen > Hafen Core
umstellbar (Auto / Vollständig / Nur Answer-Schema / Aus). Feinsteuerung per
Filter hafen_core_schema_nodes.

= Werden externe Dienste kontaktiert? =
Schema, llms.txt, Crawler-Policy, Markdown-Auslieferung, der Zitierbarkeits-Linter
(ohne Feinprüfung) und das Traffic-Dashboard arbeiten komplett lokal. Externe
Verbindungen entstehen nur bei drei ausdrücklich von dir aktivierten Funktionen:
dem KI-Assistenten samt optionaler KI-Feinprüfung des Linters (Anthropic API,
eigener Schlüssel), IndexNow (Opt-in) und dem Video-Block (YouTube, erst nach
Klick). Für die Bot-Verifikation holt das Plugin außerdem wöchentlich die
öffentlichen IP-Ranges von OpenAI. Details unter "External services".

= Blockiert das Plugin KI-Bots? =
Nur wenn du es ausdrücklich einstellst. Die Voreinstellung blockiert nichts.
Empfohlen ist "Nicht trainieren, aber zitieren": Training-Bots abweisen,
Such- und Abruf-Bots offen lassen. Und die ehrliche Grenze gleich dazu:
robots.txt ist eine Bitte, kein Schloss. Wer sich nicht daran hält, wird davon
nicht aufgehalten; echter Schutz braucht eine WAF oder ein CDN. Agentische
Browser (ChatGPT Agent, Perplexity Comet, Claude for Chrome) senden gar kein
Bot-Token und sind über robots.txt grundsätzlich nicht adressierbar.

= Verhindert Google-Extended die AI Overviews? =
Nein, und das ist der verbreitetste Irrtum in diesem Feld. Google-Extended ist
ein reiner Opt-out-Token fürs Gemini-Training. Die AI Overviews ziehen aus dem
ganz normalen Googlebot-Index.

= Warum sind meine Bot-Zahlen niedriger als in meinen Server-Logs? =
Weil ein Full-Page-Cache (WP Rocket, LiteSpeed, W3 Total Cache, WP Super Cache,
Varnish, Nginx-FastCGI, Cloudflare APO) die fertige Seite ausliefert, ohne dass
PHP läuft. Diese Zugriffe sieht kein WordPress-Plugin, auch kein mu-plugin. Das
Dashboard erkennt gängige Cache-Plugins, zeigt die Messqualität offen an (drei
Zustände, inklusive "UNVOLLSTÄNDIG") und richtet die nötige User-Agent-Ausnahme
ein, bei WP Rocket automatisch, sonst per fertiger Liste zum Einfügen. Der
einzige lückenlose Weg bleibt die Auswertung der Server-Access-Logs; das kann
und will dieses Plugin nicht leisten.

== External services ==

Der optionale KI-Assistent verbindet sich mit der Anthropic Claude API, um aus
deinem Beitragsinhalt Vorschläge (Meta-Description, TL;DR, FAQ) zu erzeugen.
Das passiert NUR, wenn du (a) unter Einstellungen > Hafen Core deinen eigenen
Anthropic-API-Schlüssel hinterlegst und den Assistenten aktivierst und (b) im
Editor einen Vorschlags-Button klickst. Dann werden der Titel und der Text des
Beitrags an https://api.anthropic.com/v1/messages gesendet, um den Vorschlag zu
erzeugen. Ohne diese ausdrückliche Nutzung werden keine Daten übertragen.

Dieselbe Verbindung (gleicher Endpunkt, gleicher eigener Schlüssel) nutzt die
optionale KI-Feinprüfung des Zitierbarkeits-Linters: Nur wenn du im Editor
ausdrücklich "KI-Feinprüfung" ankreuzt und die Prüfung startest, wird ein
Textauszug des Beitrags (maximal 5.000 Zeichen) an Anthropic gesendet. Ohne
diesen Haken läuft der Linter vollständig lokal und regelbasiert.

Nutzt deine Installation den KI-Client von WordPress (ab 7.0, Einstellungen >
Connectors), laufen beide Funktionen stattdessen über den dort eingerichteten
Anbieter; der Empfänger ist dann der von dir gewählte Connector.

Anthropic Nutzungsbedingungen: https://www.anthropic.com/legal/consumer-terms
Anthropic Datenschutzerklärung: https://www.anthropic.com/legal/privacy

Der Block "Hafen Video (2-Klick)" bindet YouTube-Videos datenschutzfreundlich
ein: Vor dem Klick wird nichts von YouTube geladen (kein Thumbnail, kein
Request). Erst wenn Besucher:innen auf die Abspielen-Fläche klicken, wird ein
iframe von https://www.youtube-nocookie.com geladen; dabei werden Daten an
Google übertragen. Der Hinweistext auf der Fläche informiert darüber.

YouTube Nutzungsbedingungen: https://www.youtube.com/t/terms
Google Datenschutzerklärung: https://policies.google.com/privacy

IndexNow (Microsoft Bing): Wenn du IndexNow unter Einstellungen > Hafen Core
aktivierst (standardmäßig aus), meldet das Plugin beim Veröffentlichen und
Aktualisieren die betroffene URL an https://api.indexnow.org/indexnow. Gesendet
werden ausschließlich: die URL des öffentlichen Inhalts, dein Hostname, der
lokal erzeugte IndexNow-Schlüssel und der Ort der Schlüsseldatei. Es werden
keine Inhalte, keine Nutzer- und keine Besucherdaten übertragen. Ohne die
Aktivierung wird nichts gesendet.

IndexNow Nutzungsbedingungen: https://www.indexnow.org/terms
Microsoft Datenschutzerklärung: https://privacy.microsoft.com/privacystatement

OpenAI IP-Ranges (Bot-Verifikation): Um zu prüfen, ob ein Zugriff wirklich von
OpenAI stammt und nicht bloß dessen User-Agent vortäuscht, holt das Plugin
wöchentlich per Cron die öffentlichen IP-Listen https://openai.com/gptbot.json,
https://openai.com/searchbot.json und https://openai.com/chatgpt-user.json.
Das ist ein reiner Download, es werden dabei keinerlei Daten von dir übertragen.
Die Prüfung selbst läuft lokal.

OpenAI Nutzungsbedingungen: https://openai.com/policies/terms-of-use
OpenAI Datenschutzerklärung: https://openai.com/policies/privacy-policy

== Privacy ==

Die KI-Traffic-Messung schreibt in eine eigene Tabelle ({prefix}hafen_ai_hits).
Dort landen ausschließlich: Zeitstempel, Bot- oder Quellen-Kennung, Zweck
(Training, Suche, Live-Abruf, Referral), die ID des aufgerufenen Beitrags, ein
Hash des Pfads und ein Ja/Nein-Feld zur Verifikation.

Ausdrücklich NICHT gespeichert werden: IP-Adressen, User-Agent-Strings,
Cookies, Session-Kennungen oder sonstige personenbezogene Daten. Die IP-Adresse
wird nur im Arbeitsspeicher gegen die offiziellen Anbieter-IP-Ranges geprüft
und danach verworfen. Angemeldete Nutzerinnen und Nutzer werden gar nicht erst
erfasst. Die Aufbewahrung ist standardmäßig auf 90 Tage begrenzt (einstellbar
zwischen 7 und 365 Tagen); ein täglicher Cron-Lauf löscht ältere Einträge.
Es werden keine Daten an hafenstudios oder Dritte übertragen.

== Copyright ==

Hafen Core, (C) 2026 hafenstudios.
Hafen Core ist unter der GNU General Public License v2 oder später verteilt.

Alle gebündelten Assets sind GPL-kompatibel lizenziert:

* assets/mascot/captain-*.webp — Marken-Maskottchen "Kapitän Ahoi": Originalwerk von
  hafenstudios, erstellt mit KI-Unterstützung (OpenAI ChatGPT/DALL·E). Es wurden keine
  fremden Vorlagen oder Stock-Bilder verwendet. (C) 2026 hafenstudios, veröffentlicht
  unter GPLv2 oder später.
* Alle Icons sind Inline-SVG, eigenes Set, (C) 2026 hafenstudios, GPLv2 oder später.
* Es werden keine Schriftdateien, Bibliotheken oder Fremd-Assets Dritter gebündelt.

== Changelog ==

= 0.8.0 =
Der erste Eindruck: keine Fehlermeldung mehr, keine leeren Seiten, keine
nackten "Noch keine Daten."-Zeilen.
* Fix: Der Assistenten-Schritt "Empfohlene Erweiterungen" bot Plugins an, die
  es im WordPress.org-Verzeichnis noch nicht gibt. Das Ergebnis war bei jedem
  Nutzer dasselbe: anklicken, Fehlermeldung. Der Assistent fragt das
  Verzeichnis jetzt vorher (Antwort 12 Stunden gecacht) und zeigt nur, was sich
  wirklich installieren laesst. Ist nichts verfuegbar, entfaellt der Schritt
  komplett; Fortschrittsanzeige und Schrittzaehler ziehen automatisch mit.
* Verbesserung: Die Starter-Seiten entstehen jetzt aus den echten Theme-
  Patterns. "Kontakt" bekam bisher eine nackte Ueberschrift und sonst nichts;
  jetzt steht dort die vollstaendige Kontakt-Sektion mit Adresse, Telefon,
  E-Mail und Oeffnungszeiten. Das Markup wird inline eingesetzt, nicht als
  Pattern-Referenz: So laesst es sich im Editor normal bearbeiten und
  ueberlebt einen Theme-Wechsel.
* Verbesserung: Die Empty States im KI-Traffic-Dashboard erklaeren jetzt, was
  gemessen wird, nennen einen realistischen Zeithorizont und sagen, dass eine
  leere Auswertung bei neuen Seiten normal ist. Vorher standen dort dreimal
  "Noch keine Daten." untereinander.
* Verbesserung: Der Auswertungszeitraum (30 Tage) steht jetzt in den
  Ueberschriften. Ohne ihn war keine Zahl auf der Seite einzuordnen.
* Verbesserung: Neue gemeinsame Admin-Styles (assets/admin-tokens.css) fassen
  die Abschnitte in Karten zusammen. Sie stylen ausschliesslich eigene
  Hafen-Klassen, ohne WordPress-eigene Elemente zu ueberschreiben.
* languages/hafen-core.pot neu erzeugt: Die Texte aus Zugangsschutz
  (class-access-gate.php) und Login-Logo (class-login-logo.php) waren bisher
  nicht extrahiert und damit nicht uebersetzbar.

= 0.7.2 =
Performance-Paket (zusammen mit Hafen-Theme 0.3.1: Variable Font und
System-Font-Variation "Stapellauf").
* Neu: Performance-Status im KI-Traffic-Dashboard. Zeigt ehrlich an, was
  das Setup hergibt: Page-Cache erkannt/nicht erkannt, Kompression per
  Selbsttest (gzip/Brotli, Ergebnis 12 h zwischengespeichert, läuft nie im
  Frontend) und der Font-Modus des aktiven Themes (Variable/statisch/System).
  Mit Klartext-Empfehlung je Punkt, denn Cache und Kompression sind
  Server-Themen, die kein Plugin von innen lösen kann.
* Neu: Option "WordPress-Emoji-Skript deaktivieren" (Einstellungen > Hafen
  Core > Performance, auch per REST). Spart ~26 KB und den externen Request
  zu s.w.org. Standardmäßig AUS, WordPress verhält sich also wie gewohnt.
* Performance: webmcp.js wird nicht mehr pauschal geladen. Ein Inline-Snippet
  (unter 300 Bytes) lädt das Skript nur in Browsern nach, die die
  WebMCP-API tatsächlich haben. Für alle anderen: 0 zusätzliche Requests.
* Fix: Der Header "Vary: Accept" geht nur noch auf Antworten, die dieselbe
  URL auch als Markdown liefern können (servierbare Einzelansichten), statt
  auf jede Frontend-Antwort. Vary auf allem fragmentiert LiteSpeed-/
  Proxy-Caches ohne Gegenwert. Zugleich vom zu früh feuernden
  send_headers-Hook auf template_redirect (Priorität 0) verlegt.

= 0.7.1 =
* Feinschliff Zugangsschutz: Logo liegt jetzt auf einem weißen „Teller"
  (macht auch Logos ohne transparenten Hintergrund auf dunklen Vorlagen
  schön), sanfte Einblend-Animation (respektiert prefers-reduced-motion),
  Wellen-Silhouette am Seitenfuß, Fokus-Ring und Button-Glow in der
  Akzentfarbe, Schüttel-Animation bei falschem Passwort. Der zweite
  Hintergrund-Schimmer der dunklen Vorlage folgt jetzt der Akzentfarbe
  statt fest Indigo.

= 0.7.0 =
* Neu: Zugangsschutz (Under Construction). Schützt die ganze Website mit einem
  Passwort und zeigt Besuchern eine von drei mitgelieferten Vorlagen (Helle
  Werft, Nachtfahrt, Horizont) – mit deinem Website-Logo, Seitennamen und
  deiner Akzentfarbe, ohne externes Passwortschutz-Plugin. Eingeloggte
  Benutzer sehen die Website normal; Besucher mit Passwort bekommen ein
  Cookie (3 Tage, Filter `hafen_core_gate_cookie_days`). Passwort wird nur
  als Hash gespeichert, Honeypot + Rate-Limit gegen Durchprobieren, die
  Sperrseite sendet HTTP 503 + Retry-After + noindex (SEO-sicher).
  Einstellungen > Hafen Core, inklusive Admin-Vorschau-Link.

= 0.6.1 =
* Neu: Login-Logo. Ist ein Website-Logo gesetzt (Design > Website-Logo), ersetzt
  es das WordPress-Logo auf wp-login.php und auf der Anmeldeseite des Plugins
  "Password Protected"; das Logo verlinkt auf die Startseite statt wordpress.org.
  Ohne gesetztes Logo ändert sich nichts. Abschaltbar per Filter
  `hafen_core_login_logo`.

= 0.6.0 =
Der Kern dieser Version: Wir helfen dir, gefunden und zitiert zu werden, statt
KI-Crawler auszusperren. Ohne erfundene Zahlen, mit klar benannten Grenzen.

* Neu: KI-Crawler-Policy (Einstellungen > KI-Crawler-Policy). Alle relevanten
  Bots, gruppiert nach Zweck: Training, Suche/Index, Live-Abruf durch Nutzer.
  Je ein Schalter, Voreinstellung "alles erlaubt". Zwei Presets: "Maximale
  Sichtbarkeit" und "Nicht trainieren, aber zitieren" (empfohlen). Ausgabe über
  den robots_txt-Filter. Wer einen Such- oder Abruf-Bot blockieren will, bekommt
  vorher im Klartext gesagt, was er damit zerstört. Eine vorhandene physische
  robots.txt wird erkannt und offen gemeldet, weil der Filter dann nicht greift.
* Neu: KI-Traffic-Dashboard (Einstellungen > KI-Traffic), 100 % lokal, ohne
  Konto. Zugriffe nach Bot und Zweck, meistgecrawlte Inhalte, Besucher aus
  KI-Antworten (Referrer und utm_source=chatgpt.com) und die Crawl-to-Refer-Ratio
  je Anbieter, eingeordnet an den bekannten Branchenwerten. Gekoppelt an die
  Policy: Wenn ein blockierter Such-Bot null Treffer hat, sagt das Dashboard
  genau das, statt dich rätseln zu lassen.
* Neu: Bot-Verifikation gegen Spoofing. Zugriffe von OpenAI werden gegen die
  offiziellen IP-Ranges geprüft (wöchentlich per Cron geholt, lokal gecacht),
  Googlebot und Applebot optional per Reverse-DNS mit Vorwärts-Gegenprobe. Wo
  ein Anbieter nichts veröffentlicht (Anthropic, Perplexity, Meta), heißt es
  offen "nicht verifizierbar". Ein User-Agent-String ist kein Beweis.
* Neu: Ehrliche Messqualitäts-Anzeige. Bei einem Full-Page-Cache läuft PHP nicht,
  und kein Plugin sieht die Bot-Zugriffe. Das Dashboard erkennt WP Rocket,
  LiteSpeed, W3 Total Cache, WP Super Cache und Cloudflare, benennt den Zustand
  (vollständig / vollständig mit Ausnahme / UNVOLLSTÄNDIG) und richtet die
  User-Agent-Ausnahme ein: bei WP Rocket automatisch über den Filter
  rocket_cache_reject_ua, sonst mit fertiger Liste zum Einfügen.
* Neu: IndexNow (Opt-in). Meldet neue und geänderte Inhalte sofort an Bing und
  teilnehmende Suchmaschinen, mit lokal erzeugtem Schlüssel unter /{key}.txt,
  Debounce gegen Ping-Fluten und Status-Anzeige des letzten Pings.
* Datenschutz: eigene Tabelle {prefix}hafen_ai_hits ohne IP-Adressen und ohne
  personenbezogene Daten, Aufbewahrung standardmäßig 90 Tage, tägliche Bereinigung
  per Cron. Siehe Abschnitt "Privacy".
* Neu: Markdown-Auslieferung für Agenten (Content-Negotiation über
  "Accept: text/markdown", ?format=md und die Endung .md). Eigener HTML-zu-
  Markdown-Konverter ohne Composer; die Hafen-Blöcke werden semantisch gerendert,
  nicht über den HTML-Umweg. "Vary: Accept" liegt auf jeder Antwort, damit ein
  Page-Cache die Markdown-Fassung nicht an Browser ausliefert; die Markdown-Antwort
  selbst geht mit "X-Robots-Tag: noindex" raus. Ausgeliefert werden ausschließlich
  veröffentlichte, öffentlich sichtbare, nicht passwortgeschützte Inhalte.
* Neu: Zitierbarkeits-Linter im Editor. 15 Regeln, jede mit Beleg-Stärke (stark /
  mittel / schwach) und Quelle, ausdrücklich OHNE Score von 0 bis 100. Enthält eine
  Prüfung auf Prompt-Injection und Cloaking. Die KI-Feinprüfung für die zwei
  regelbasiert unscharfen Regeln ist optional und keine Voraussetzung.
* Neu: Abilities API (ab WordPress 6.9, reine Feature-Erkennung): lesende
  Fähigkeiten (Seite als Markdown, Inhalte durchsuchen) plus die Generatoren des
  KI-Assistenten. Für MCP freigegeben sind nur die lesenden.
* Neu: WebMCP-Browser-Werkzeuge, ausschließlich lesend (das Kontaktformular wird
  höchstens vorbefüllt, nie abgeschickt). Ehrlich eingeordnet: Chrome-Testversuch,
  wirkt nur bei geöffnetem Tab, bringt für die Sichtbarkeit nichts.
* Ehrlichkeit statt Marketing: llms.txt ist jetzt in der Oberfläche korrekt
  eingeordnet (spekulativer Standard, von Google nach eigener Aussage ignoriert,
  praktisch kaum abgerufen, nützlich für Coding-Agenten). Das Feature bleibt,
  nur das Versprechen fällt weg.
* Korrektur: In /llms.txt konnten passwortgeschützte Beiträge samt Auszug aus dem
  Rohinhalt auftauchen. Sie werden jetzt ausgeschlossen.

= 0.5.1 =
WordPress.org-Vorbereitung.
* Footer-Credit ist jetzt echtes Opt-in (Guideline 10): Die Checkbox im Assistenten
  ist nicht mehr vorangehakt, der Standardwert der Option ist "hide". Der Credit-Absatz
  im Theme-Footer ist per CSS ausgeblendet und wird nur nach ausdrücklicher Zustimmung
  eingeblendet.
* Showcase-Opt-in: ehrlicher Hinweistext. Die Angabe wird nur lokal gespeichert, es
  werden keine Daten übertragen (es gibt derzeit kein Empfänger-Backend).
* Herkunft der Maskottchen-Grafiken in der Copyright-Sektion offengelegt
  (Originalwerk von hafenstudios, erstellt mit KI-Unterstützung).
* Escaping: Die SEO-Plugin-Hinweismeldung nutzt jetzt wp_kses_post( sprintf( ... ) )
  statt sprintf( esc_html__( ... ) ).
* Aufräumen: load_plugin_textdomain() entfernt (seit WordPress 4.6 überflüssig für
  Plugins aus dem .org-Verzeichnis); die überflüssige jQuery-Abhängigkeit von
  wizard.js ist raus (das Skript nutzt nur fetch und DOM-APIs).
* Neu: languages/hafen-core.pot.

= 0.5.0 =
Quelle dieser Version: Praxis-Feedback aus dem Realprojekt vielfalt-begleiten.nrw.

* Assistent: freie Akzentfarbe per Farb-Picker und Hex-Feld zusätzlich zu den
  sechs Presets (F1). Die Farbe wird jetzt außerdem in die User-Global-Styles
  geschrieben (komplette Brand-Palette inkl. brand-dark, brand-light und
  Gradient), damit sie auch im Block- und Site-Editor gilt, nicht nur im
  Frontend. Das Inline-CSS bleibt als Fallback mit identischen Werten.
* Assistent: Kontaktseite ist im Starter-Seiten-Schritt jetzt wie Startseite
  und Blog vorausgewählt (F2).
* Showcase-Erinnerung: dezenter, dismissbarer Admin-Hinweis frühestens 14 Tage
  nach dem Setup und erst ab drei veröffentlichten Seiten, statt nur der
  (zu frühen) Frage direkt im Assistenten (F3).
* Neuer Block "Hafen Video (2-Klick)": datenschutzfreundliches YouTube-Embed
  über youtube-nocookie.com. Vor dem Klick nur eine Fläche in Markenfarbe mit
  Play-Symbol und Hinweistext, kein externer Request.
* Robustheit: Schutz vor wptexturize-Schäden an Inline-Scripts in
  Template-Parts (aus "&&" wurde "&#038;&#038;", SyntaxError im Frontend).
  Script-Segmente werden während des Part-Renderings maskiert und danach
  unverändert wiederhergestellt; wptexturize bleibt global aktiv (F6).
* REST: Die Einstellungen (schema_mode, enable_llms_txt, organization_name,
  organization_logo) und die Akzentfarbe sind jetzt über
  /wp-json/wp/v2/settings les- und schreibbar (F9).

= 0.4.1 =
* Finales Marken-Maskottchen (Kapitän "Ahoi"): ersetzt das Platzhalter-SVG
  durch echtes Artwork, mit eigener Pose je Assistent-Schritt (Willkommen,
  Erweiterungen, Marke, Starter-Seiten, Fertig) und im Willkommens-Hinweis.
* Korrektur: durchgängig echte Umlaute (ä/ö/ü/ß) statt ASCII-Ersatzschreibweise
  in allen sichtbaren Texten, Block-Beschreibungen und KI-Prompts.

= 0.4.0 =
* KI-Assistent (Bring-your-own-key): erzeugt im Editor Vorschläge für
  Meta-Description, TL;DR und FAQ aus dem Beitragsinhalt. Nutzt deinen eigenen
  Anthropic-Schlüssel, Anfragen gehen direkt an Anthropic (kein Umweg).
  Modell wählbar (Standard Claude Opus 4.8). Standardmäßig aus, opt-in.

= 0.3.0 =
* Einrichtungs-Assistent (Onboarding): führt nach der Aktivierung durch empfohlene
  Erweiterungen (Opt-in, WordPress.org), Marke (Logo + Akzentfarbe färbt das Theme),
  Starter-Seiten und Abschluss. Dismissbarer Willkommens-Hinweis, kein Zwang.
  Mit Marken-Maskottchen (Kapitän) als Begleiter (Platzhalter-Artwork).
* Akzentfarbe wird per :root-Variable live aufs Theme angewandt.
* Footer-Credit ("Angelegt mit Hafen") über den Assistenten ein-/ausblendbar.

= 0.2.0 =
* SEO-Plugin-Koexistenz: erkennt gängige SEO-Plugins (Yoast, Rank Math, SEOPress,
  AIOSEO, The SEO Framework, Slim SEO, Squirrly) und tritt bei überlappendem Schema
  automatisch zurück. Neuer Schema-Modus (Auto/Vollständig/Nur Answer/Aus) ersetzt
  den einfachen An-Aus-Schalter.

= 0.1.0 =
* Schema-Engine (Organization, WebSite, Article, BreadcrumbList, FAQPage, HowTo).
* Answer-Engine-Blöcke: FAQ, HowTo, TL;DR, Definition (server-gerendert, no build).
* llms.txt / llms-full.txt Generator mit Rewrite-Endpoint.
* Einstellungsseite für Organisation, Schema- und llms.txt-Schalter.
