GEO: Anti-AI-Lint-Skript im Build (Vokabel-Blacklist + Struktur-Patterns) #10

Open
opened 2026-04-29 13:28:19 +00:00 by mAi · 1 comment
Collaborator

Hintergrund

Guideline: docs/geo-seo-guideline.md (Section 3.6).

AI-generierte Texte haben charakteristische Muster (Vokabel-Cluster, Struktur-Schablonen), die Google's Helpful Content Update und LLM-Citation-Algorithmen abwerten. Beispiele:

Vokabel-Cluster:

  • "in der sich entwickelnden Landschaft" / "in today's evolving landscape"
  • "revolutionär", "bahnbrechend", "nahtlos", "robust"
  • "comprehensive", "leverage", "streamline", "holistic"
  • "It's important to note that", "Es ist wichtig zu erwähnen"

Struktur-Schablonen:

  • Schluss-Sektion "Challenges and Future Prospects" / "Herausforderungen und Zukunftsaussichten"
  • Bulleted lists mit 3 "-:"-Pattern ("Effizienz: ... — Skalierbarkeit: ... — Sicherheit: ...")
  • Einleitungsphrasen wie "In this article, we'll explore..."

Aufgabe

1. Lint-Skript in build pipeline

Neues Bash/Python-Skript: tools/anti-ai-lint.sh (oder lint-ai-patterns.py mit uv).

  • Prüft jede sites/*/index.html (rendered output build/<domain>/index.html)
  • Liest Blacklist aus tools/anti-ai-blacklist.yaml (zentral pflegbar):
    vocab:
      de:
        - "in der sich entwickelnden Landschaft"
        - "revolutionär"
        - "bahnbrechend"
        - ...
      en:
        - "in today's evolving landscape"
        - "leverage"
        - "streamline"
        - ...
    patterns:
      - regex: 'Challenges and Future Prospects'
        severity: warn
      - regex: '^\s*-\s+\w+:\s+\w+\s+—\s+\w+:\s+\w+\s+—\s+\w+:'
        severity: warn
    
  • Output: für jede Site eine Liste der Treffer mit Datei/Zeile.

2. Severity & Build-Verhalten

  • severity: warn — Build geht durch, Warnung im Log.
  • severity: fail — Build bricht ab.
  • Pro Match-Type konfigurierbar in der YAML.

3. Integration

  • build.sh ruft Lint-Skript am Ende auf (nach allen sites built).
  • Optional: build.sh --skip-lint für Notfall-Builds.
  • CI/Dokploy: lint-Failure soll Deploy stoppen, sonst durchwinken.

4. False-Positive-Handling

Satire-Sites benutzen vielleicht absichtlich AI-Speak (Wortspiele wie kAInco, kIlemma). Whitelist via # anti-ai-allow: <pattern>-Kommentar im HTML, oder per-site override in site.yaml.

QA

  • Lint läuft auf aktuelle 59 Sites — initial-Lauf erstellt Bestandsaufnahme. Keine sofortigen Fehler erwartet (Sites sind handgemacht), aber paar Treffer wahrscheinlich.
  • Test mit absichtlich eingebautem Pattern in einer Test-Site → muss erkannt werden.
  • Doku in README/docs ergänzen.

Folge-Aktion

Nach Merge: bestehende Treffer auf den 59 Sites bewerten und säubern (separates Issue oder im selben Sweep).

Priorität

p2 — Hygienevorrichtung, schützt vor künftigem AI-Slop. Greifen aber nur, wenn neue Sites gebaut werden.

## Hintergrund Guideline: `docs/geo-seo-guideline.md` (Section 3.6). AI-generierte Texte haben charakteristische Muster (Vokabel-Cluster, Struktur-Schablonen), die Google's Helpful Content Update und LLM-Citation-Algorithmen abwerten. Beispiele: **Vokabel-Cluster:** - "in der sich entwickelnden Landschaft" / "in today's evolving landscape" - "revolutionär", "bahnbrechend", "nahtlos", "robust" - "comprehensive", "leverage", "streamline", "holistic" - "It's important to note that", "Es ist wichtig zu erwähnen" **Struktur-Schablonen:** - Schluss-Sektion "Challenges and Future Prospects" / "Herausforderungen und Zukunftsaussichten" - Bulleted lists mit 3 "-:"-Pattern ("Effizienz: ... — Skalierbarkeit: ... — Sicherheit: ...") - Einleitungsphrasen wie "In this article, we'll explore..." ## Aufgabe ### 1. Lint-Skript in build pipeline Neues Bash/Python-Skript: `tools/anti-ai-lint.sh` (oder `lint-ai-patterns.py` mit uv). - Prüft jede `sites/*/index.html` (rendered output `build/<domain>/index.html`) - Liest Blacklist aus `tools/anti-ai-blacklist.yaml` (zentral pflegbar): ```yaml vocab: de: - "in der sich entwickelnden Landschaft" - "revolutionär" - "bahnbrechend" - ... en: - "in today's evolving landscape" - "leverage" - "streamline" - ... patterns: - regex: 'Challenges and Future Prospects' severity: warn - regex: '^\s*-\s+\w+:\s+\w+\s+—\s+\w+:\s+\w+\s+—\s+\w+:' severity: warn ``` - Output: für jede Site eine Liste der Treffer mit Datei/Zeile. ### 2. Severity & Build-Verhalten - `severity: warn` — Build geht durch, Warnung im Log. - `severity: fail` — Build bricht ab. - Pro Match-Type konfigurierbar in der YAML. ### 3. Integration - `build.sh` ruft Lint-Skript am Ende auf (nach allen sites built). - Optional: `build.sh --skip-lint` für Notfall-Builds. - CI/Dokploy: lint-Failure soll Deploy stoppen, sonst durchwinken. ### 4. False-Positive-Handling Satire-Sites benutzen vielleicht absichtlich AI-Speak (Wortspiele wie kAInco, kIlemma). Whitelist via `# anti-ai-allow: <pattern>`-Kommentar im HTML, oder per-site override in site.yaml. ## QA - Lint läuft auf aktuelle 59 Sites — initial-Lauf erstellt Bestandsaufnahme. Keine sofortigen Fehler erwartet (Sites sind handgemacht), aber paar Treffer wahrscheinlich. - Test mit absichtlich eingebautem Pattern in einer Test-Site → muss erkannt werden. - Doku in README/docs ergänzen. ## Folge-Aktion Nach Merge: bestehende Treffer auf den 59 Sites bewerten und säubern (separates Issue oder im selben Sweep). ## Priorität p2 — Hygienevorrichtung, schützt vor künftigem AI-Slop. Greifen aber nur, wenn neue Sites gebaut werden.
mAi self-assigned this 2026-04-29 13:28:19 +00:00
Author
Collaborator

Anti-AI-Text-Lint integriert

Branch: mai/artemis/issue-10-anti-ai-lint
Commit: https://mgit.msbls.de/m/onepager/commit/fdac496

Geliefert

  • tools/anti-ai-lint.py — Python-Linter (stdlib + yq subprocess). Strippt HTML via html.parser, prüft Vokabel-Substrings (DE+EN, case-insensitive) und Regex-Patterns gegen sichtbaren Text. Eine Meldung pro Treffer pro Datei, Snippet + Zeilennummer. --json für strukturierten Report, --quiet für Fail-only.
  • tools/anti-ai-blacklist.yaml — Vokabel-Cluster aus docs/geo-seo-guideline.md §3.6 plus drei Regex-Patterns (em-dash-3-bullet, not-only-but-also, as-an-ai). Phrasen-Fingerprints sind fail, Einzel-Buzzwords warn.
  • tools/test-anti-ai-lint.sh — Self-Test mit synthetischer AI-Fixture: prüft Erkennung, Whitelist-Suppression, Exit-Codes.
  • build.sh — Lint läuft als Schritt 4/4. --skip-lint für Notfälle.
  • Dockerfilepython3 zur Builder-Stage hinzugefügt (kein Effekt aufs Caddy-Image).
  • README.md + docs/geo-seo-guideline.md aktualisiert.

Whitelist-Mechanismen

  • HTML-Kommentar im Markup: <!-- anti-ai-allow: revolutionär, em-dash-3-bullet -->
  • Per-Site in site.yaml:
    anti_ai_allow:
      - revolutionär
      - em-dash-3-bullet
    

Initial-Lauf auf 59 Sites (Bestandsaufnahme)

killusion.de
  warn vocab (de): revolutionär  line 233: Jede Woche ein neues KI-Modell.
                                            Jedes "revolutionär". Alle machen
                                            im Grunde das Gleiche…
kilofant.de
  warn vocab (de): robust        line 659: Dicke Haut gegen Angriffe. Unsere
                                            KI-Lösungen sind robust, DSGVO-
                                            konform und standhaft.

anti-ai-lint: WARN — 2/57 sites flagged (0 fail, 2 warn)

Beide Treffer sind erklärbar:

  • killusion.de: "revolutionär" steht in Anführungszeichen, ironischer Kontext, mockt Hype-Vokabular. Whitelist-Kandidat (<!-- anti-ai-allow: revolutionär -->).
  • kilofant.de: "robust" als Marketing-Adjektiv. Kann redaktionell ersetzt werden (z. B. "stabil", "ausfallsicher") — Folge-Sweep.

Build geht durch, kein hard-fail wie geplant.

Tests

./tools/test-anti-ai-lint.sh

Vier Test-Cases — synthetische AI-Fixture wird komplett erkannt, Whitelists unterdrücken Vocab- und Pattern-Hits, fail-Severity triggert weiterhin Exit 1, neutraler Text exitet 0.

Nicht selbst nach main gemerged

Branch ist gepusht, wartet auf Review + Merge durch head.

Folge-Aktionen

  1. Bestehende Treffer auf killusion.de und kilofant.de bewerten/säubern (separates Issue oder im selben Sweep, wie im Issue erwähnt).
  2. Bei zukünftigen Modellen kann die Blacklist gepflegt werden — Drift-Wartung ist als Quartals-Punkt in der Guideline (§7) bereits vorgesehen.
## Anti-AI-Text-Lint integriert Branch: `mai/artemis/issue-10-anti-ai-lint` Commit: https://mgit.msbls.de/m/onepager/commit/fdac496 ### Geliefert - `tools/anti-ai-lint.py` — Python-Linter (stdlib + yq subprocess). Strippt HTML via `html.parser`, prüft Vokabel-Substrings (DE+EN, case-insensitive) und Regex-Patterns gegen sichtbaren Text. Eine Meldung pro Treffer pro Datei, Snippet + Zeilennummer. `--json` für strukturierten Report, `--quiet` für Fail-only. - `tools/anti-ai-blacklist.yaml` — Vokabel-Cluster aus `docs/geo-seo-guideline.md` §3.6 plus drei Regex-Patterns (`em-dash-3-bullet`, `not-only-but-also`, `as-an-ai`). Phrasen-Fingerprints sind `fail`, Einzel-Buzzwords `warn`. - `tools/test-anti-ai-lint.sh` — Self-Test mit synthetischer AI-Fixture: prüft Erkennung, Whitelist-Suppression, Exit-Codes. - `build.sh` — Lint läuft als Schritt 4/4. `--skip-lint` für Notfälle. - `Dockerfile` — `python3` zur Builder-Stage hinzugefügt (kein Effekt aufs Caddy-Image). - `README.md` + `docs/geo-seo-guideline.md` aktualisiert. ### Whitelist-Mechanismen - HTML-Kommentar im Markup: `<!-- anti-ai-allow: revolutionär, em-dash-3-bullet -->` - Per-Site in `site.yaml`: ```yaml anti_ai_allow: - revolutionär - em-dash-3-bullet ``` ### Initial-Lauf auf 59 Sites (Bestandsaufnahme) ``` killusion.de warn vocab (de): revolutionär line 233: Jede Woche ein neues KI-Modell. Jedes "revolutionär". Alle machen im Grunde das Gleiche… kilofant.de warn vocab (de): robust line 659: Dicke Haut gegen Angriffe. Unsere KI-Lösungen sind robust, DSGVO- konform und standhaft. anti-ai-lint: WARN — 2/57 sites flagged (0 fail, 2 warn) ``` Beide Treffer sind erklärbar: - **killusion.de**: "revolutionär" steht in Anführungszeichen, ironischer Kontext, mockt Hype-Vokabular. Whitelist-Kandidat (`<!-- anti-ai-allow: revolutionär -->`). - **kilofant.de**: "robust" als Marketing-Adjektiv. Kann redaktionell ersetzt werden (z. B. "stabil", "ausfallsicher") — Folge-Sweep. Build geht durch, kein hard-fail wie geplant. ### Tests ```bash ./tools/test-anti-ai-lint.sh ``` Vier Test-Cases — synthetische AI-Fixture wird komplett erkannt, Whitelists unterdrücken Vocab- und Pattern-Hits, `fail`-Severity triggert weiterhin Exit 1, neutraler Text exitet 0. ### Nicht selbst nach main gemerged Branch ist gepusht, wartet auf Review + Merge durch head. ### Folge-Aktionen 1. Bestehende Treffer auf killusion.de und kilofant.de bewerten/säubern (separates Issue oder im selben Sweep, wie im Issue erwähnt). 2. Bei zukünftigen Modellen kann die Blacklist gepflegt werden — Drift-Wartung ist als Quartals-Punkt in der Guideline (§7) bereits vorgesehen.
mAi added the
needs-review
label 2026-04-30 00:51:23 +00:00
mAi added
done
and removed
needs-review
labels 2026-04-30 14:28:15 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: m/onepager#10
No description provided.