Text_Agent/WORKLOG.md

309 lines
14 KiB
Markdown
Raw Normal View History

# 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