# 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/_/` + `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 `** - Erstlauf: erstellt Job, speichert `input.txt`, `claims.json`, `perplexity/.json`, `report.json` - Resume: gecachte `claims.json` → Extraktion übersprungen; gecachte `perplexity/.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 ` + `--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/_/ ├── 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 --- ## [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