Anforderungsdefinition: Vollautomatischer Artikel-Workflow
Spezifikation für Cody · 23. Juni 2026 · Stand: final
1. Ziel
Eine Pipeline, die aus einem beliebigen Input (Thema, PDF, URL, Stichwort) einen QC-geprüften, publikationsfertigen HTML-Artikel produziert. Basti gibt den Auftrag — der Rest läuft autonom.
2. Eingabe-Schnittstelle
Input: {
topic: string, // "Gamegenic wird Partner von Tolarian Community College"
sources: string[], // ["/pfad/pm.pdf", "https://icv2.com/...", "https://gamegenic.com"]
category_id: number, // Joomla-Rubrik (default: 61 = Korrektur)
rubric: string, // "Neuerscheinungen" | "Crowdfunding" | "Nachrichten" | ...
image_urls: string[], // optionale Bild-URLs aus PM
deadline: string | null // optional: ISO-Timestamp für zeitkritische Artikel
}
Input-Quellen-Erkennung (automatisch)
| Input | Quelle |
|---|---|
Pfad aus ~/.hermes/cache/documents/ | |
| URL | Direkt übernehmen |
| Nur Thema | Sub-Agent recherchiert selbstständig Quellen |
3. Pipeline-Stufen
Input Prep → STAGE 1
Research → STAGE 2
Write → STAGE 3
QC → STAGE 4
Deliver
Dauer: ~10–15 Minuten von Input bis fertigem Artikel
STAGE 0: Input Preparation
Basti (nicht Sub-Agent)
- PDFs OCRen:
python3 -c "import pymupdf; doc=pymupdf.open('…'); [print(page.get_text()) …]" - Prompt bauen aus Input + OCR-Text + Quellen-URLs
- Skills-Array:
["journalistic-article-writing", "korrekturschleife", "article-management"] - Toolsets:
["web", "terminal", "file", "search", "skills"]
Output: Fertiger Prompt für Stage 1
STAGE 1: Research
Sub-Agent #1 (Leaf, delegate_task)
| Feld | Wert |
|---|---|
| Skills | journalistic-article-writing |
| Toolsets | web, terminal, file, search, skills |
- Alle Quellen abrufen (
web_extract,curl,web_search) - Jede Quelle bewerten: AAA (Primär) / AA (Sekundär) / A (schwach)
- Fehlende Fakten ergänzen:
- BGG-Eintrag suchen:
web_search site:boardgamegeek.com SPIELNAME - Autor/Illustrator/Verlag verifizieren
- Preise, Daten, Awards gegenprüfen
- BGG-Eintrag suchen:
Output: research_brief.md
# Research Brief: THEMA
## Quellenbewertung
| Quelle | Stufe | URL |
|---------|---------|-----------------------|
| PM | AAA | https://gamegenic.com |
## Fakten
- Fakt 1 (Quelle: URL, AAA)
- Fakt 2 (Quelle: URL, AA)
## Offene Punkte
- Punkt X konnte nicht verifiziert werden → STREICHEN
Exit-Codes: 0 = vollständig · 1 = unvollständig (Abbruch, an Basti melden)
STAGE 2: Write
Sub-Agent #2 (Leaf, delegate_task)
| Feld | Wert |
|---|---|
| Skills | journalistic-article-writing, korrekturschleife, article-management |
| Toolsets | web, terminal, file, search, skills |
| Context | Research Brief + Original-Prompt |
<a href="…" target="_blank"><span><strong>Quellen</strong></span></html>Output: /home/hermes/workspace/artikel_NAME_DATUM.html
Pflicht-Elemente im HTML:
<head>
<meta charset="UTF-8">
<title>TITEL</title>
<meta name="description" content="…">
<meta name="keywords" content="…">
</head>
<body>
<article>
<h1>TITEL</h1>
<p class="meta">DATUM · Lesezeit: ca. N Minuten</p>
<!-- Inhalt -->
<hr id="system-readmore" />
<span style="…"><strong>Quellen</strong></span>
<ol>
<li><a href="URL" target="_blank">Name</a> — Beschreibung</li>
</ol>
<p class="qc"><!-- QC: Quelle1=AAA|URL, … --></p>
</article>
</body>
</html>
Exit-Codes: 0 = Artikel geschrieben · 1 = Fehler
STAGE 3: Quality Control
Sub-Agent #2 (gleicher Agent, nach dem Schreiben)
bash /home/hermes/workspace/verify_article.sh artikel_NAME.html
13 Checks (Stand 23.06.2026)
| # | Check | Kriterium |
|---|---|---|
| 1 | Read-More | Genau 1 × <hr id="system-readmore"> |
| 2 | br nach Read-More | Kein <br> direkt danach |
| 3 | p.meta | <p class="meta"> (nicht <div>) |
| 4 | Emojis | Keine im Body |
| 5 | Dateiende | Endet mit </html> |
| 6 | Meta im Body | Keine doppelte Datum·Lesezeit-Zeile |
| 7 | Quellen-Überschrift | Kein <h2>Quellen</h2> |
| 8 | Links target | Alle mit target="_blank" |
| 9 | Meta-Description | Vorhanden und nicht leer |
| 10 | QC-Zeile | In <p class="qc"> |
| 11 | BGG-Autorencheck | Designer gegen BGG verifizieren |
| 12 | XML-API-Referenzen | Keine "XML API" / "Betriebsgeheimnis" |
| 13 | Quellen verlinkt | Quellen-Block hat <a href> Links |
Fehlerbehandlung:
- Exit 0 → Stage 4
- Exit 1 → Korrigieren, erneut verify → max 3 Versuche → ABBRUCH, an Basti melden
- CHECK 11 (BGG-Autoren) Warnung → dokumentieren, nicht blocken
STAGE 4: Deliver
Basti
- Git-Commit:
git add artikel_NAME.html && git commit -m "artikel: THEMA" - Article-Server prüfen: Direkt-URL testen
curl "http://185.162.249.159:8890/artikel_NAME.html?key=…" | head -3 - Meldung:
✅ Artikel THEMA fertig
📄 /home/hermes/workspace/artikel_NAME.html
🔗 http://185.162.249.159:8890/artikel_NAME.html?key=…
📊 verify: 0 Fehler
4. Fehlermodi & Recovery
| Fehler | Erkennung | Recovery |
|---|---|---|
| PDF nicht OCR-bar | pymupdf wirft Exception | Basti manuell OCRen, Text in Prompt geben |
| Quelle nicht erreichbar | curl/web_extract Timeout/404 | 5-Stufen-Eskalation: curl → wget+UA → Wayback → Tavily → Google Cache |
| Keine AAA-Quelle für Kern-Fakt | Research-Gap | Fakt streichen → "unvollständig" an Basti |
| verify_article.sh fail | Exit ≠ 0 | 3 Korrekturversuche → Abbruch |
| BGG-Autorencheck uneindeutig | check_authors.py Warnung | Dokumentieren, Basti entscheidet |
| Article-Server down | curl auf :8890 Timeout | Server neu starten via python3 article_server.py & |
5. Cronjob-Integration
Der Workflow läuft als One-Shot-Cronjob mit deliver="local":
cronjob(
action="create",
schedule="1m",
repeat=1,
deliver="local",
skills=["journalistic-article-writing", "korrekturschleife", "article-management"],
enabled_toolsets=["web", "terminal", "file", "search", "skills", "delegation"],
prompt="…" // Stage-0-Output
)
Wichtig: deliver="local" — der Cronjob meldet sich NICHT bei Daniel. Basti pollt das Ergebnis.
6. Batch-Modus
Für mehrere Artikel: Parallele Cronjobs (max 3 gleichzeitig via delegation.max_concurrent_children). Jeder Cronjob bekommt denselben Prompt-Aufbau, nur mit anderem Input.
7. Was Cody bauen muss
7.1 article_pipeline.py — Orchestrator-Script
- Input entgegennimmt (JSON oder CLI-Args)
- Stage 0 ausführt (PDF-OCR, Prompt-Bau)
- Zwei
delegate_task-Aufrufe (Stage 1 Research, Stage 2 Write+QC) - Stage 4 ausführt (Git-Commit, Verify)
- Exit-Code zurückgibt
7.2 Integration
- Als Cronjob-Script lauffähig (
no_agent=falseModus) - ODER: Als Hermes-Skill
article-pipelineregistrierbar
7.3 Config
| Element | Pfad / Wert |
|---|---|
| Workspace | /home/hermes/workspace/ |
| verify_article.sh | /home/hermes/workspace/verify_article.sh |
| article_server.py | /home/hermes/workspace/article_server.py |
| PDF-Cache | ~/.hermes/cache/documents/ |
| Skills | journalistic-article-writing, korrekturschleife, article-management |
8. Aufruf-Beispiele
# Variante A: Thema + PDF
python3 article_pipeline.py \
--topic "Gamegenic wird Partner von Tolarian Community College" \
--pdf "/home/hermes/.hermes/cache/documents/GG_Press_release.pdf" \
--rubric "Nachrichten" \
--category-id 9
# Variante B: Nur Thema (autonome Recherche)
python3 article_pipeline.py \
--topic "Neue Kennerspiel-Nominierungen 2026" \
--rubric "Nachrichten"
# Variante C: Batch
python3 article_pipeline.py --batch topics.json
9. Erfolgskriterium
🎯 Basti gibt ein Thema ein → nach ~10 Minuten liegt ein Artikel im Workspace mit
verify_article.sh: 0 Fehler
Kein manuelles Eingreifen. Kein Nachbessern. Kein "XML API v2".
Anhang: Skills-Dokumentation
Folgende Skills werden im Workflow verwendet. Cody muss ihre Schnittstellen kennen:
| Skill | Typ | Funktion |
|---|---|---|
journalistic-article-writing |
Writing | HTML-Template, Quellenregeln, Sprachregeln, Formatvorgaben |
korrekturschleife |
QC | Zweistufiger Workflow (Write + Fact-Check), Writer-Fehler-Tabelle, Quellenbewertung AAA/AA/A |
article-management |
Deploy | Article-Server (Port 8890), Joomla-API, verify_article.sh, VG-Wort |