Text_Agent/WORKLOG.md
dschlueter 5146b7fa30 feat: Pi Text-Agent — initialer Commit (sauberes Repo)
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>
2026-05-12 04:21:48 +02:00

309 lines
14 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 (96s vs. 205s bei Apollo-11-Text)
- VRAM: 6.6GB statt 17GB — vollständig in VRAM, kein CPU-Offloading
- Kommentar in Header aktualisiert: Empfehlung qwen3.5:9b (6.6GB, 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 (29452984 Zeichen), Chunk 1/7 wird verarbeitet
- Alter Fehler (`fetch failed`) war temporär (Ollama nicht bereit); kein Code-Bug
---
## [2026-04-16] Phasen 13 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