Vollständiges Multi-Agenten-System für Fact-Checking, Artikelschreiben und Argumentationsanalyse. Zwei Backends: llama.cpp (★ bevorzugt) und Ollama. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
309 lines
14 KiB
Markdown
309 lines
14 KiB
Markdown
# WORKLOG.md — Append-only Arbeitslog
|
||
|
||
Neueste Einträge oben. Nicht bearbeiten — nur anhängen.
|
||
|
||
---
|
||
|
||
## [2026-05-12] llama-logic-editor + Dokumentation vollständig aktualisiert
|
||
|
||
### Erledigt
|
||
- `agenten/llama-logic-editor.ts` — Pi-Tool: `analyze_logic_llama` ★ BEVORZUGT
|
||
- `logic-editor.ts` → `ollama-logic-editor.ts` (Naming-Convention)
|
||
- BEDIENUNGSANLEITUNG.md: Kompletter Rewrite auf llama.cpp-Pipeline
|
||
- README.md: logic-editor-Einträge auf ollama/llama-Varianten aktualisiert
|
||
- AGENTS.md: logic-editor-Einträge aktualisiert
|
||
|
||
### tsc: fehlerfrei
|
||
### Getestet
|
||
- `npx tsx agenten/llama-logic-editor.ts "Sokrates-Syllogismus"` → STARK, 13s ✓
|
||
|
||
---
|
||
|
||
## [2026-05-12] Vollständige llama.cpp-Pipeline + Writer-Umbenennung
|
||
|
||
### Erledigt
|
||
|
||
**Neue llama.cpp-Agenten** (alle: Schema im System-Prompt, `/no_think`, `reasoning_content`-Fallback, Retry 3×/15s):
|
||
- `agenten/llama-claim-extractor.ts` — Pi-Tool: `extract_claims_llama`
|
||
- `agenten/llama-verifier.ts` — Pi-Tool: `verify_claim_llama` ★ BEVORZUGT, `userLanguage`-Parameter
|
||
- `agenten/llama-verify-article.ts` — Pi-Tool: `verify_article_llama`, Batch-Verdict-Aufruf
|
||
- `agenten/llama-writer.ts` — Pi-Tool: `write_article_llama` ★ BEVORZUGT
|
||
|
||
**Umbenennungen** (Naming-Convention `ollama-*` / `llama-*`):
|
||
- `writer.ts` → `ollama-writer.ts` (Pi-Tool bleibt `write_article`)
|
||
- `verify-article.ts` → `ollama-verify-article.ts` (Pi-Tool bleibt `verify_article`)
|
||
|
||
**Deployment:**
|
||
- `~/.pi/agent/extensions/fact-checker/package.json`: 9 Extensions
|
||
- Symlinks: `writer.ts` entfernt, `ollama-writer.ts` + `llama-writer.ts` hinzugefügt
|
||
- Alle anderen llama.cpp-Symlinks angelegt
|
||
|
||
**Dokumentation:** AGENTS.md, README.md, HANDOFF.md, TODO.md, WORKLOG.md aktualisiert
|
||
|
||
### tsc: fehlerfrei
|
||
|
||
### Getestet
|
||
- `npx tsx agenten/llama-writer.ts --from-job pipeline-test --style blog` → 253 Wörter, 18.7s ✓
|
||
- Pipeline-Test: `llama-verify-article` → `llama-writer` kompatibel (gleiche `VerificationReport`-Struktur) ✓
|
||
|
||
### Probleme und Lösungen
|
||
| Problem | Lösung |
|
||
|---------|--------|
|
||
| `writer.ts` → "fetch failed" mit qwen3.5:27b + `format:` | llama-writer.ts: Schema im System-Prompt, `/no_think` |
|
||
| `createLogger("name", "debug")` — falsige Signatur | `createLogger({ verbose: true })` verwendet |
|
||
|
||
### Verbleibende offene Punkte
|
||
- Pi `/reload` (manuell) damit `write_article_llama` aktiv wird
|
||
- OLLAMA_KEEP_ALIVE via systemd (optional, niedrige Priorität)
|
||
|
||
---
|
||
|
||
## [2026-04-17] Standard-Modell auf qwen3.5:9b gesetzt
|
||
|
||
### Erledigt
|
||
- **claim-extractor.ts** — Standardmodell von `qwen3.5:27b` auf `qwen3.5:9b` geändert
|
||
- Präzision: 8/9 Claims vs. 9/9 (qwen3.5:27b) — fast gleich
|
||
- Geschwindigkeit: 2× schneller (96 s vs. 205 s bei Apollo-11-Text)
|
||
- VRAM: 6.6 GB statt 17 GB — vollständig in VRAM, kein CPU-Offloading
|
||
- Kommentar in Header aktualisiert: Empfehlung qwen3.5:9b (6.6 GB, 1 GPU, fast gleiche Präzision wie 27B, 2× schneller)
|
||
- TypeBox-Parameter-Beschreibung ergänzt: "Empfohlene Alternative: qwen3.5:27b für maximale Präzision"
|
||
|
||
### tsc: fehlerfrei
|
||
|
||
### Getestet
|
||
- `npx tsx agenten/claim-extractor.ts --verbose "Test"` → zeigt "Ollama-Modell: qwen3.5:9b"
|
||
- Apollo-11-Test: 8 Claims extrahiert (qwen3.5:27b: 9 Claims) — akzeptabler Trade-off
|
||
|
||
---
|
||
|
||
## [2026-04-16] Job-Speicher implementiert
|
||
|
||
### Erledigt
|
||
|
||
**lib/jobs.ts** (neue Datei, ~200 Zeilen) — reines File-I/O, keine Agenten-Abhängigkeiten
|
||
- `createJob(slug, model)` → legt `~/.pi/agent/jobs/<datum>_<slug>/` + `perplexity/`-Unterverzeichnis an
|
||
- `findJobDir(slug)` → neuestes Job-Verzeichnis mit diesem Slug
|
||
- `getOrCreateJob(slug, model)` → Resume-Logik: vorhandenes wiederverwenden oder neu anlegen
|
||
- `saveJobFile/loadJobFile/loadJobText/jobFileExists` → Datei-I/O mit JSON-Serialisierung
|
||
- `updateJobMeta` → shallow merge in `meta.json` mit `updatedAt`-Timestamp
|
||
- `listJobs` → alle Jobs sortiert nach Datum (neueste zuerst)
|
||
- `formatJobList` → Tabellenausgabe für CLI
|
||
|
||
**verify-article.ts — `--job-id <slug>`**
|
||
- Erstlauf: erstellt Job, speichert `input.txt`, `claims.json`, `perplexity/<id>.json`, `report.json`
|
||
- Resume: gecachte `claims.json` → Extraktion übersprungen; gecachte `perplexity/<id>.json` → kein API-Aufruf
|
||
- `meta.json` wird bei jedem Schritt aktualisiert (status + step-Metadaten)
|
||
- Fehler: `meta.json` auf `status: "failed"` gesetzt
|
||
|
||
**writer.ts — `--from-job <slug>` + `--from-report`**
|
||
- `--from-job`: lädt `report.json` aus Job, speichert `article.md` nach Fertigstellung
|
||
- Fehlerausgabe wenn Job oder report.json nicht gefunden
|
||
|
||
**tsc:** fehlerfrei
|
||
|
||
### Verzeichnisstruktur
|
||
|
||
```
|
||
~/.pi/agent/jobs/<datum>_<slug>/
|
||
├── input.txt
|
||
├── claims.json
|
||
├── perplexity/
|
||
│ ├── c001.json
|
||
│ └── c002.json ...
|
||
├── report.json
|
||
├── article.md
|
||
└── meta.json
|
||
```
|
||
|
||
---
|
||
|
||
## [2026-04-16] Verbose-Modus + lib/logger.ts implementiert
|
||
|
||
### Erledigt
|
||
|
||
**lib/logger.ts** (neue Datei, ~90 Zeilen)
|
||
- `Logger`-Klasse mit `info/warn/error/debug`-Methoden
|
||
- Schreibt in `~/.pi/agent/logs/YYYY-MM-DD_HH-MM-SS[_jobId].log` (append, FS-Fehler werden ignoriert)
|
||
- `verbose=true` → alle Einträge zusätzlich auf stderr; `warn`/`error` immer auf stderr
|
||
- `createLogger(opts)` — Factory; legt LOG_DIR automatisch an
|
||
- `nullLogger` — Null-Objekt für Pi-Extension-Kontext (keine Seiteneffekte)
|
||
|
||
**claim-extractor.ts — Logging + --verbose**
|
||
- Alle Chunking-Schritte geloggt: Chunk-Aufteilung, Token-Counts, Laufzeit pro Chunk, Dedup-Stats
|
||
- Ollama-Antwort-Details geloggt (promptTokens, outputTokens, rawLength)
|
||
- Fehler (API-Fehler, JSON-Parse, 0-Claims) mit Kontext geloggt
|
||
- `--verbose` / `-v` CLI-Flag: erstellt Logger mit verbose=true
|
||
|
||
**verify-article.ts — Logging + --verbose**
|
||
- Pipeline-Start/Ende geloggt (textLength, model, totalCostUSD, latencyMs)
|
||
- Perplexity-Outcomes geloggt (successful/failed Count, Kosten)
|
||
- `--verbose` / `-v` CLI-Flag
|
||
|
||
**verifier.ts — Logging + --verbose**
|
||
- Perplexity-Aufruf + Urteilssynthese geloggt
|
||
- `--verbose` / `-v` CLI-Flag
|
||
|
||
**tsc:** fehlerfrei
|
||
|
||
### Chunking-Test läuft
|
||
|
||
- `claim-extractor.ts --verbose "$(cat Umerziehung.md)"` gestartet
|
||
- Logger bestätigt: 7 Chunks (2945–2984 Zeichen), Chunk 1/7 wird verarbeitet
|
||
- Alter Fehler (`fetch failed`) war temporär (Ollama nicht bereit); kein Code-Bug
|
||
|
||
---
|
||
|
||
## [2026-04-16] Phasen 1–3 komplett, Handoff-Dokumentation
|
||
|
||
### Erledigt
|
||
|
||
**Phase 1 — Fundament**
|
||
- Projektstruktur analysiert, GPU-Setup entschieden (qwen3.5:27b auf 1 GPU)
|
||
- `package.json` + `tsconfig.json` erstellt (ESM, tsx, no-build)
|
||
- `types/pi-coding-agent.d.ts` — Stub für lokale TS-Prüfung ohne Pi-Paket
|
||
- `schemas/claim.schema.json` — ClaimSet mit 6 Claim-Typen, 3 Checkability-Stufen
|
||
- `schemas/source-record.schema.json` — Perplexity-Quellen
|
||
- `schemas/verification-result.schema.json` — 5 Status-Werte
|
||
- `agenten/claim-extractor.ts` (509 Zeilen) — Pi-Extension + CLI
|
||
- Getestet: qwen3.5:27b extrahiert korrekt, structured output funktioniert
|
||
|
||
**Phase 2 — Kernpipeline**
|
||
- `lib/perplexity.ts` (175 Zeilen) — Retry, Kostenberechnung, Deduplizierung
|
||
- `agenten/verifier.ts` (427 Zeilen) — Perplexity + Ollama-Verdict
|
||
- Getestet: "Inflationsrate 3,2%" → WIDERLEGT (korrekt: 2,2%, Destatis-Quelle)
|
||
- Kosten: ~$0.0054/Claim
|
||
- `agenten/verify-article.ts` (600 Zeilen) — Orchestrator
|
||
- `runWithConcurrencyLimit()` für max. 5 parallele Perplexity-Calls
|
||
- Batch-Ollama-Verdict (1 Call für N Claims, `num_ctx: 16384`)
|
||
- End-to-End-Test: 4 falsche Facts erkannt, 2 korrekte bestätigt — $0.0324, 407s
|
||
|
||
**Phase 3 — Produktionsreife**
|
||
- `lib/router.ts` (232 Zeilen) — TaskType-basiertes Routing, ENV-Overrides
|
||
- `schemas/argument-map.schema.json` — 12 Fehlschluss-Typen
|
||
- `schemas/article-draft.schema.json` — 5 Stile, Quellenverzeichnis
|
||
- Bugfix: `"type": "["string", "null"]"` (String) → `"type": ["string", "null"]` (Array)
|
||
- `agenten/logic-editor.ts` (538 Zeilen) — deepseek-r1:32b, Pi + CLI
|
||
- Zwei Bugs gefixt (location-Feld, Chinesische Zeichen im Output)
|
||
- **Retest nach Fix steht noch aus**
|
||
- `agenten/writer.ts` (522 Zeilen) — Pipe-CLI, 5 Stile, Quellenautomatik
|
||
- tsc fehlerfrei, **End-to-End-Test steht noch aus**
|
||
|
||
**Deployment**
|
||
- `~/.pi/agent/extensions/fact-checker/` mit 5 Symlinks
|
||
- `~/.pi/agent/extensions/lib` → `~/Pi_Agent_Projekts/text_agent/lib`
|
||
- Pi `/reload` noch nicht getestet
|
||
|
||
**Handoff-Dokumentation**
|
||
- `AGENTS.md`, `SYSTEM.md`, `HANDOFF.md`, `TODO.md`, `WORKLOG.md`, `docs/ARCHITECTURE.md`
|
||
|
||
### Probleme und Lösungen
|
||
|
||
| Problem | Lösung |
|
||
|---------|--------|
|
||
| `@mariozechner/pi-coding-agent` nicht von tsc gefunden | Lokaler Typ-Stub in `types/` |
|
||
| `execute params` implicit `any` in Stub | Generic entfernt, `params: any` direkt |
|
||
| `ClaimSet` nicht exportiert | `export type` zu allen Typen in claim-extractor.ts |
|
||
| `ArticleDraft` fehlt `schema_version` | Lokaler Typ ergänzt in writer.ts |
|
||
| `article-draft.schema.json` type-Bug | Array-Syntax korrigiert |
|
||
| logic-editor zeigt JSON-Keys statt Textzitate | Prompt-Anweisung mit Zitat-Beispiel ergänzt |
|
||
| Chinesische Zeichen im Output | "Antworte ausschließlich auf Deutsch." an Prompt-Anfang |
|
||
| Nutzer will `.bashrc` nicht von Claude editieren lassen | Anleitung gegeben: manuell `export OLLAMA_KEEP_ALIVE=-1` einfügen |
|
||
| Ollama läuft via systemd, nicht direkt | Anleitung: `sudo systemctl edit ollama` + `Environment=...` |
|
||
|
||
### Offen nach dieser Session
|
||
|
||
- logic-editor.ts retest nach Fixes
|
||
- writer.ts End-to-End-Test
|
||
- Pi `/reload` bestätigen
|
||
- OLLAMA_KEEP_ALIVE in systemd setzen (Nutzer)
|
||
- Testkorpus aufbauen
|
||
|
||
---
|
||
|
||
<!-- Neue Einträge OBEN einfügen, nach diesem Kommentar -->
|
||
|
||
## [2026-04-16] 0-Claims-Bug gefixt, sequential-Guideline ergänzt
|
||
|
||
### Erledigt
|
||
|
||
**claim-extractor.ts — dynamisches num_ctx**
|
||
- Ursache des 0-Claims-Bugs: `num_ctx=8192` für 17964-Zeichen-Essay zu klein
|
||
(Eingabe ~4491 Tokens + Prompt ~1000 + Output ~3200 = ~8691 → Overflow)
|
||
- Fix: `estimateNumCtx(textLength, maxClaims)` berechnet 8192/16384/32768 dynamisch
|
||
- Umerziehung.md (17964 Zeichen) → 16384 ✓
|
||
- Kurze Texte (<~3000 Zeichen) → bleiben bei 8192
|
||
- Fix: 0-Claims wirft jetzt Fehler: `"Ollama hat 0 Claims extrahiert (num_ctx=..., prompt_tokens=...)"`
|
||
- Fix: System-Prompt Duplikat-Unterdrückung: "Extrahiere jeden Sachverhalt nur einmal"
|
||
|
||
**verify-article.ts — Warnung bei 0 prüfbaren Claims**
|
||
- `onProgress("⚠ Keine prüfbaren Claims gefunden...")` wenn checkableClaims.length === 0
|
||
|
||
**verifier.ts — sequential Guideline**
|
||
- `promptGuidelines` ergänzt: nie mehrere verify_claim gleichzeitig aufrufen
|
||
|
||
**tsc:** fehlerfrei nach allen Änderungen
|
||
|
||
## [2026-04-16] Probelauf analysiert, Status-Dateien aktualisiert
|
||
|
||
### Probelauf-Ergebnisse (Probelauf.md)
|
||
- Pi lädt alle 6 Extensions korrekt ✓
|
||
- `extract_claims` auf 2.000-Wort-Essay: 25 Claims (14 prüfbar, 10 teilweise, 1 Meinung) — 285s ✓
|
||
- `verify_claim` einzeln: 11/14 bestätigt, 2 widerlegt (41 Mio. Wohnungen veraltet, IW-Zahl nicht belegbar), 1 → deep retry → bestätigt ✓
|
||
- `research_web`: korrekte Recherche zu Wohnungsbestand ✓
|
||
- **Problem:** `verify_article` auf langem Text → 0 Claims extrahiert (173s) — Bug
|
||
- **Problem:** parallele `verify_claim`-Aufrufe → viele `fetch failed` — Ollama-Überlastung
|
||
|
||
### Status-Dateien aktualisiert
|
||
- HANDOFF.md: Probelauf-Ergebnisse und neue offene Punkte eingetragen
|
||
- TODO.md: P1 um Bug-Fix und Prompt-Guidelines ergänzt, erledigte P1-Items abgehakt
|
||
|
||
## [2026-04-16] P2-Features implementiert
|
||
|
||
### Erledigt
|
||
|
||
**verify-article.ts — Fortschrittsanzeige**
|
||
- `onProgress`-Callback als optionaler Parameter in `verifyArticle()`
|
||
- Meldet: "Claims extrahieren...", "N Claims extrahiert — M prüfbar", "[1/3] ✓ ...", "Urteilssynthese..."
|
||
- CLI-Modus: Callback schreibt auf `process.stderr` → `--json`-Output auf stdout unberührt
|
||
- Pi-Extension: kein Callback → keine Seiteneffekte
|
||
|
||
**logic-editor.ts — `--only-fallacies` Flag**
|
||
- Neues CLI-Flag `--only-fallacies`: gibt nur Fehlschlüsse ohne vollständige ArgumentMap aus
|
||
- Kombinierbar mit `--json` → liefert JSON-Array der fallacies
|
||
- Ohne `--json` → formatierter Text mit Icon, Typ, Beschreibung, Zitat
|
||
|
||
**Beide:** tsc fehlerfrei, CLI-Tests bestanden
|
||
|
||
## [2026-04-16] P1-Bugs gefixt, alle Agenten getestet
|
||
|
||
### Erledigt
|
||
|
||
**logic-editor.ts — Bugfix + Retest**
|
||
- Gefunden: `analyzeWithOpenRouter(model, text, signal)` — Argumente vertauscht (model/text)
|
||
- Fix: `analyzeWithOpenRouter(text, model, signal)`
|
||
- Prompt-Fixes aus vorheriger Session (location-Feld, Deutsch-Anweisung) bestätigt
|
||
- Retest erfolgreich: 3 Fehlschlüsse korrekt erkannt (Ad Hominem critical, Falsche Dichotomie critical, Autoritätsargument moderate)
|
||
- location-Felder zeigen wörtliche Zitate ✓, kein Chinesisch ✓, alles Deutsch ✓
|
||
|
||
**writer.ts — Bugfix + End-to-End-Test**
|
||
- Gefunden: `routeModel("article_writing")` ohne cloud-Flag wählte OpenRouter statt Ollama
|
||
(weil OPENROUTER_API_KEY gesetzt → medium-Complexity → Cloud-Branch)
|
||
→ OpenRouter-Modell lieferte `body` als Array, `lead` als undefined
|
||
- Fix in writer.ts: complexity "low" wenn kein --cloud → Router wählt immer Ollama
|
||
- End-to-End-Test: 3 Claims → verify-article → writer --style blog
|
||
- c001 (Inflationsrate 3,2%) korrekt als `contradicted` ausgeschlossen
|
||
- c002 (EZB-Zinssenkung Juni 2024) + c003 (DAX 20.000) als `supported` verwendet
|
||
- Blog-Artikel mit Quellenverzeichnis, editorial_notes korrekt
|
||
- Laufzeit: ~144s, kostenlos (lokal)
|
||
- tsc nach allen Fixes: fehlerfrei
|
||
|
||
**Handoff-Dokumentation vervollständigt**
|
||
- SYSTEM.md, HANDOFF.md, TODO.md, WORKLOG.md, docs/ARCHITECTURE.md geschrieben
|
||
- TODO.md: P1-Aufgaben abgehakt
|
||
- HANDOFF.md: Offene Punkte aktualisiert
|
||
|
||
### Verbleibende offene Punkte
|
||
|
||
- Pi `/reload` in Pi-App testen (nur vom Nutzer durchführbar)
|
||
- OLLAMA_KEEP_ALIVE via systemd setzen (nur vom Nutzer durchführbar)
|
||
- Testkorpus (tests/corpus/) — P3, noch nicht begonnen
|