feat(pipeline): redaktionelle Freigabe vor der Veroeffentlichung
Die Pipeline liess GPT Artikel umschreiben und legte sie direkt als geplanten WordPress-Beitrag an - ohne dass ein Mensch sie gesehen hat. Der KI-Hinweis auf dem Blog sagt aber redaktionelle Pruefung zu, und genau daran haengt die Ausnahme in Art. 50 Abs. 4 KI-VO. Neuer Status `pending_review` zwischen Rewrite und Publish: Die Pipeline endet beim Rewrite, ohne WordPress-Beitrag und ohne Publish-Slot. Erst die Freigabe im Portal stempelt Pruefer und Systemzeit, reserviert den Slot und legt den Beitrag an. - Migration: editorial_review_at/_by/_note, Status-CHECK erweitert - Spalten-Migration laeuft nach den Tabellen-Neubauten erneut, sonst verwirft der aeltere no_image-Rebuild die frisch angelegten Spalten - Jeder Weg nach `approved` stempelt (Button, Statuswechsel, API) - Jeder maschinelle Rewrite loescht einen alten Stempel - Telegram: Info mit Portal-Link statt Draft-Meldung, kein Freigabe-Button - Altbestand bleibt unberuehrt und veroeffentlicht weiter - EDITORIAL_REVIEW_REQUIRED=false stellt den alten Ablauf wieder her - 14 neue Tests, docs/KI-VO.md Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
682755c6a0
commit
a233012887
21 changed files with 1151 additions and 64 deletions
|
|
@ -2,19 +2,32 @@
|
|||
|
||||
## Überblick
|
||||
|
||||
Das System läuft vollautomatisch und benötigt nur noch gelegentliche Telegram-Interaktion.
|
||||
Import, Bewertung und Rewrite laufen automatisch. **Veröffentlicht wird erst nach
|
||||
deiner redaktionellen Freigabe im Portal** — siehe `docs/KI-VO.md` für den
|
||||
rechtlichen Hintergrund (Art. 50 Abs. 4 KI-VO).
|
||||
|
||||
```
|
||||
N8N (2× täglich, 08:00 + 16:00 Uhr)
|
||||
└─► POST /api/n8n/pipeline (X-API-Key Header)
|
||||
├── RSS Ingestion (alle aktivierten Feeds)
|
||||
├── Relevanz-Score per GPT (0–100)
|
||||
│ ├── Score ≥ 80 → Rewrite + WP-Draft + Telegram
|
||||
│ ├── Score ≥ 80 → Rewrite + Tags → Status "Wartet auf Freigabe"
|
||||
│ ├── Score 60–79 → Telegram-Warnung + manueller Override möglich
|
||||
│ └── Score < 60 → Abgelehnt + tägliche Telegram-Liste
|
||||
└── Pipeline-Zusammenfassung via Telegram
|
||||
|
||||
Danach, manuell im Portal (news.vanityontour.de):
|
||||
Artikel öffnen → lesen → [✅ Redaktionell geprüft & freigeben]
|
||||
├── Stempel: Prüfer + Systemzeit (nicht editierbar)
|
||||
├── Publish-Slot reservieren
|
||||
└── WordPress-Beitrag anlegen (Status "future" zum Slot)
|
||||
```
|
||||
|
||||
Vor der Freigabe existiert **kein** WordPress-Beitrag und **kein** belegter
|
||||
Publish-Slot. Wer das Gate abschalten will: `EDITORIAL_REVIEW_REQUIRED=false` —
|
||||
dann gilt wieder der alte, vollautomatische Ablauf, und der KI-Hinweistext auf
|
||||
dem Blog muss angepasst werden.
|
||||
|
||||
---
|
||||
|
||||
## Einrichtung
|
||||
|
|
@ -82,18 +95,32 @@ In N8N einen neuen Workflow erstellen:
|
|||
|
||||
## Telegram-Benachrichtigungen
|
||||
|
||||
### Neuer Draft erstellt
|
||||
Wenn ein Artikel erfolgreich verarbeitet wurde:
|
||||
### Artikel wartet auf Freigabe
|
||||
Wenn ein Artikel umgeschrieben wurde und geprüft werden muss:
|
||||
|
||||
```
|
||||
✅ Neuer Draft erstellt
|
||||
📝 Neuer Artikel wartet auf Freigabe
|
||||
📰 [Artikel-Titel]
|
||||
🟢 Relevanz-Score: 87/100
|
||||
📅 Vorgeschlagene Veröffentlichung: Mo, 24.03.2026 um 09:00 Uhr
|
||||
📄 312 Wörter
|
||||
🏷 #VanLife #Camping #Wohnmobil
|
||||
🔗 Draft in WordPress öffnen
|
||||
🔗 Im Portal prüfen und freigeben
|
||||
Erst nach der Freigabe geht der Beitrag nach WordPress und wird eingeplant.
|
||||
```
|
||||
|
||||
[✏️ Neu schreiben] [❌ Verwerfen]
|
||||
Diese Nachricht trägt **bewusst keinen Freigabe-Button**: Der Sinn des Gates ist,
|
||||
dass der Artikel gelesen wurde. Freigeben, neu schreiben und verwerfen passiert
|
||||
auf der Artikelseite im Portal, einen Tipp auf den Link entfernt.
|
||||
|
||||
### Freigegeben und eingeplant
|
||||
Bestätigung nach der Freigabe im Portal:
|
||||
|
||||
```
|
||||
✅ Freigegeben und eingeplant
|
||||
📰 [Artikel-Titel]
|
||||
👤 Geprüft von: admin
|
||||
📅 Veröffentlichung: Mo, 24.08.2026 um 09:00 Uhr
|
||||
🔗 Beitrag in WordPress
|
||||
```
|
||||
|
||||
### Relevanz-Warnung (Score 60–79)
|
||||
|
|
@ -118,8 +145,8 @@ Der GPT-basierte Score bewertet die Themenrelevanz für den VanLife/Camping-Blog
|
|||
|
||||
| Score | Aktion |
|
||||
|-------|--------|
|
||||
| 80–100 | Automatisch verarbeiten |
|
||||
| 60–79 | Telegram-Warnung, manueller Override |
|
||||
| 80–100 | Rewrite, danach Warteschlange „Wartet auf Freigabe" |
|
||||
| 60–79 | Telegram-Warnung, manueller Override (führt ebenfalls in die Warteschlange) |
|
||||
| 0–59 | Automatisch abgelehnt |
|
||||
|
||||
Themen die hoch scored werden: Campingplätze, Stellplätze, Wohnmobile, Van-Ausbau,
|
||||
|
|
@ -140,8 +167,10 @@ PIPELINE_RELEVANCE_WARN=60
|
|||
- Zwischen den Slots liegen jeweils **3 Stunden Abstand**
|
||||
- Veröffentlichungsfenster: **09:00 bis 19:00 Uhr** (`Europe/Berlin`)
|
||||
- Gleichmäßig über die Woche verteilt
|
||||
- Der Vorschlag erscheint in der Telegram-Nachricht
|
||||
- Manuell in WordPress setzen oder über WP Scheduling-Plugin automatisieren
|
||||
- Der Slot wird **im Moment der Freigabe** reserviert, nicht schon beim Rewrite —
|
||||
ein wartender Artikel blockiert also keinen Sendeplatz
|
||||
- Der zugeteilte Slot erscheint in der Freigabe-Bestätigung per Telegram
|
||||
- WordPress veröffentlicht den Beitrag zum Slot selbst (Status `future`)
|
||||
|
||||
Einstellbar via:
|
||||
```
|
||||
|
|
|
|||
119
docs/KI-VO.md
Normal file
119
docs/KI-VO.md
Normal file
|
|
@ -0,0 +1,119 @@
|
|||
# KI-Verordnung: redaktionelle Freigabe vor der Veröffentlichung
|
||||
|
||||
Stand: 24.08.2026. Keine Rechtsberatung — die Umsetzung folgt der Auslegung, die
|
||||
unten begründet ist. Bei wirtschaftlich kritischen Fällen juristisch prüfen.
|
||||
|
||||
## Warum das Gate existiert
|
||||
|
||||
Die Pipeline lässt ein Sprachmodell (OpenAI) Nachrichtentexte **neu schreiben**,
|
||||
verschlagwortet sie und bewertet ihre Relevanz. Das Ergebnis wird als Beitrag auf
|
||||
`vanityontour.de` veröffentlicht — also ein KI-erzeugter Text, der die
|
||||
Öffentlichkeit informiert.
|
||||
|
||||
Art. 50 Abs. 4 UAbs. 2 KI-VO (Verordnung (EU) 2024/1689, Transparenzpflichten
|
||||
anwendbar seit dem 02.08.2026) verlangt für solche Texte die Offenlegung, dass
|
||||
sie künstlich erzeugt oder manipuliert wurden. **Ausgenommen** sind Inhalte, die
|
||||
|
||||
- einer **menschlichen Überprüfung bzw. redaktionellen Kontrolle** unterzogen
|
||||
wurden **und**
|
||||
- für die eine natürliche oder juristische Person die **redaktionelle
|
||||
Verantwortung** trägt.
|
||||
|
||||
Der KI-Transparenzhinweis auf dem Blog (Plugin `vot-ki-hinweis`) sagt genau das
|
||||
zu: „Jeder Text wird von mir redaktionell geprüft, auf Fakten kontrolliert und
|
||||
inhaltlich verantwortet." Bis zum 24.08.2026 lief die News-Pipeline jedoch
|
||||
vollautomatisch: Rewrite, WordPress-Beitrag und geplante Veröffentlichung ohne
|
||||
menschlichen Zwischenschritt. Die zugesagte Kontrolle fand faktisch nicht statt.
|
||||
|
||||
Das Freigabe-Gate schließt diese Lücke: Es macht die Aussage wahr und
|
||||
dokumentiert sie nachprüfbar.
|
||||
|
||||
## Der Ablauf
|
||||
|
||||
```
|
||||
N8N (2× täglich) → POST /api/n8n/pipeline
|
||||
├── RSS-Ingestion
|
||||
├── Relevanz-Score (GPT)
|
||||
│ ├── < 60 → abgelehnt
|
||||
│ ├── 60–79 → Telegram-Warnung, Übernahme per Button möglich
|
||||
│ └── ≥ 80 → Rewrite + Tags (GPT)
|
||||
│
|
||||
└── Status: pending_review ──► KEIN WordPress-Beitrag, KEIN Slot
|
||||
Telegram: Info + Link ins Portal
|
||||
│
|
||||
Mensch öffnet den Artikel im Portal, liest ihn
|
||||
│
|
||||
┌─────────────────────────┼──────────────────────────┐
|
||||
▼ ▼ ▼
|
||||
„Redaktionell geprüft „Rewrite ausführen" „Verwerfen"
|
||||
& freigeben" (neu schreiben) (Status close)
|
||||
│
|
||||
▼
|
||||
Stempel: editorial_review_at / _by / _note (Systemzeit, nicht editierbar)
|
||||
Status: approved → Publish-Slot reservieren → WordPress-Beitrag (future)
|
||||
→ WordPress veröffentlicht zum Slot
|
||||
```
|
||||
|
||||
Wichtig an der Reihenfolge:
|
||||
|
||||
- **Kein WordPress-Beitrag vor der Freigabe.** Sonst läge dort ein
|
||||
`future`-Beitrag, der sich selbst veröffentlicht, bevor jemand hingesehen hat.
|
||||
- **Kein Slot vor der Freigabe.** Es gibt vier feste Slots pro Tag; ein Artikel,
|
||||
der stundenlang auf die Prüfung wartet, darf keinen davon blockieren. Der Slot
|
||||
wird im Moment der Freigabe reserviert, der Scheduler füllt Lücken auf.
|
||||
|
||||
## Wo der Nachweis liegt
|
||||
|
||||
| Ort | Inhalt |
|
||||
|-----|--------|
|
||||
| `articles.editorial_review_at` | Zeitpunkt der Freigabe (UTC, ISO 8601), vom System gesetzt |
|
||||
| `articles.editorial_review_by` | angemeldeter Benutzer, der freigegeben hat |
|
||||
| `articles.editorial_review_note` | optionale Notiz zur Prüfung |
|
||||
| `meta_json.review_events[]` | Ereignis `editorial_review` im Audit-Trail, zusätzlich der Statuswechsel |
|
||||
|
||||
Der Zeitstempel ist **nie** ein Eingabefeld. Er entsteht ausschließlich beim
|
||||
Klick auf „Redaktionell geprüft & freigeben" (bzw. beim manuellen Statuswechsel
|
||||
nach `publish`) und kann in der Oberfläche nicht nachträglich gesetzt werden.
|
||||
|
||||
## Kein Schlupfloch nach `publish`
|
||||
|
||||
Jeder Weg in den Status `approved` stempelt die Freigabe:
|
||||
|
||||
- `POST /admin/articles/{id}/approve` — der reguläre Button
|
||||
- `POST /admin/articles/{id}/transition` mit Ziel `publish` — leitet auf denselben
|
||||
Weg um, wenn noch kein Stempel vorliegt
|
||||
- `POST /api/articles/{id}/transition` mit Ziel `publish` — stempelt ebenfalls
|
||||
|
||||
Die Pipeline selbst erreicht `approved` nicht mehr, solange
|
||||
`EDITORIAL_REVIEW_REQUIRED=true` gesetzt ist.
|
||||
|
||||
## Altbestand
|
||||
|
||||
Artikel, die vor dem 24.08.2026 freigegeben oder veröffentlicht wurden, haben
|
||||
keinen Stempel und brauchen keinen: Sie durchlaufen die neue Pipeline nicht
|
||||
erneut, und der Publisher blockiert sie nicht. Das Gate greift ausschließlich für
|
||||
Artikel, die ab sofort neu verarbeitet werden.
|
||||
|
||||
## Konfiguration
|
||||
|
||||
| Variable | Default | Wirkung |
|
||||
|----------|---------|---------|
|
||||
| `EDITORIAL_REVIEW_REQUIRED` | `true` | Gate aktiv; `false` stellt den alten vollautomatischen Ablauf wieder her |
|
||||
| `PORTAL_BASE_URL` | `https://news.vanityontour.de` | Basis für die Deep-Links in Telegram |
|
||||
|
||||
Wird das Gate abgeschaltet, ist der KI-Hinweistext auf dem Blog anzupassen — die
|
||||
Zusage der redaktionellen Prüfung träfe dann nicht mehr zu.
|
||||
|
||||
## Was bewusst nicht umgesetzt ist
|
||||
|
||||
- **Maschinenlesbare Markierung der KI-Ausgabe** (Art. 50 Abs. 2) ist eine
|
||||
Pflicht des Anbieters des KI-Systems, nicht des Betreibers. Sie liegt bei
|
||||
OpenAI.
|
||||
- **Ein zweiter, abweichender Hinweistext für vollautomatische Beiträge** wird
|
||||
nicht gebraucht, solange das Gate aktiv ist: Es gibt dann keine
|
||||
vollautomatischen Beiträge mehr.
|
||||
|
||||
## Referenzen
|
||||
|
||||
- Verordnung (EU) 2024/1689 (KI-VO), Art. 50: https://eur-lex.europa.eu/legal-content/DE/TXT/?uri=OJ:L_202401689
|
||||
- Plugin `vot-ki-hinweis` (Hinweistext auf dem Blog): eigenes Repository `VoT-KI-Hinweis`
|
||||
|
|
@ -19,6 +19,9 @@
|
|||
- [x] Artikel-Datum + Relevanzscore im UI/Export
|
||||
|
||||
## Recht/Qualitaet
|
||||
- [x] Redaktionelle Freigabe vor Veroeffentlichung (Art. 50 Abs. 4 KI-VO), siehe `docs/KI-VO.md`
|
||||
- [ ] KI-Register/Export der Freigaben fuer die Dokumentation (CSV je Zeitraum)
|
||||
- [ ] Erinnerung, wenn Artikel laenger als X Tage auf Freigabe warten
|
||||
- [x] Source-Policy in DB + Admin-UI abbilden
|
||||
- [x] Pflichtfelder je Quelle erzwingen (Autor, URL, Lizenz, Hinweise)
|
||||
- [x] Auto-Block bei fehlender Lizenzinfo
|
||||
|
|
|
|||
|
|
@ -1,5 +1,11 @@
|
|||
# Recht und Quellen
|
||||
|
||||
## KI-Verordnung
|
||||
- Jeder KI-umgeschriebene Artikel braucht vor der Veroeffentlichung die
|
||||
redaktionelle Freigabe im Portal (Art. 50 Abs. 4 KI-VO)
|
||||
- Nachweis: `editorial_review_at` / `_by` / `_note` je Artikel
|
||||
- Details und Begruendung: `docs/KI-VO.md`
|
||||
|
||||
## Grundregeln
|
||||
- Nur freigegebene Quellen aus Source-Register
|
||||
- Pflicht-Attribution pro Artikel
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue