LLMGui — Recent Changes

Alle relevanten Änderungen, neuen Features und Bugfixes. Neueste Einträge zuerst.

Hinweis: Zukünftige Dokumentation zu neuen Features landet ebenfalls auf dieser Seite.


Navigation


2026-03-03 — /full-audit — Alle Checks in einem Durchlauf

brainy/commands/analysis.pyFullAuditCommand:
- Neuer Slash-Command /full-audit [path] führt alle 7 Quality- und Security-Checks sequenziell aus:
1. Linting (flake8 / ruff / pylint)
2. Type Check (mypy)
3. Security (bandit)
4. Complexity (radon)
5. Dead Code (vulture)
6. Vuln-Scan (pip-audit / safety / semgrep)
7. Secret-Scan (Regex + Entropy)
- Zeigt vor dem Start einen Plan-Header mit allen Schritten
- Jeder Schritt sendet scan_phase-SSE-Events (Spinner → Checkmark in VS Code)
- Abschluss: Summary-Tabelle (Rich Table) mit Status je Check + offene Findings aus der DB
- Ohne Argument: scannt den aktuellen Workspace. Mit Argument: scannt Datei oder Verzeichnis.
- Registriert in brainy/commands/__init__.py, brainy/tools/command_tools.py (Tool-Registry), brainy/mcp/server.py


2026-03-03 — VS Code: Security Findings TreeView

brainy/api/server.pyGET /api/findings:
- Neuer REST-Endpunkt liest Security-Findings aus ~/.brainy/security_findings.db
- Parameter: workspace (filtert project_path), status (default "open", "all" für alle)
- Antwort: { findings: [...], total: N } — max. 500 Einträge, sortiert nach CVSS-Score

clients/vscode/src/FindingsViewProvider.ts (neu):
- vscode.TreeDataProvider<FindingItem> — native VS Code TreeView
- 2-Ebenen-Struktur: Severity-Gruppe (Critical / High / Medium / Low / Info) → Finding-Items
- Jedes Finding zeigt: vuln_id · dateiname:zeile mit Tooltip (Beschreibung, Tool, CVSS, Fix-Hint)
- Klick auf Finding → Datei öffnen und direkt zur betroffenen Zeile springen
- getCount() für Badge-Zähler an der View

clients/vscode/src/extension.ts:
- createTreeView('llmgui.findingsView', ...) statt registerTreeDataProvider (Badge-Support)
- Badge wird nach jedem Refresh automatisch auf Anzahl offener Findings gesetzt
- Neue Commands:
- llmgui.findings.refresh — Refresh-Button in der Toolbar
- llmgui.findings.fixWithLLM — Baut Prompt aus Finding-Daten, öffnet Chat mit /agent-Modus
- llmgui.findings.openFile (intern) — Öffnet Datei an Zeile

clients/vscode/package.json:
- Neue View llmgui.findingsView unter llmgui-explorer (unterhalb des Chat-Panels)
- Toolbar: Refresh-Button $(refresh)
- Kontextmenü auf Finding-Items: "Mit LLMGui fixen" (view/item/context when: viewItem == finding)


2026-03-02 — Control Center: Security-Tab Trend-Anzeige & History-Vergleich

brainy/api/server.pyGET /api/security/trend:
- Neuer REST-Endpunkt, der Security-Findings aus ~/.brainy/security_findings.db nach Datum und Severity aggregiert
- Query-Parameter: days (7/30/90/0=alle) und project_path (optional)
- Antwort enthält data_points (täglich gruppiert: critical/high/medium/low/total) und comparison (Delta erster↔letzter Tag)

llmgui-control.py — Security-Tab:
- _tab_security(): Bestehender Findings-Pane und neuer Trend-Tab werden in einem Gtk.Notebook zusammengefasst (🔍 Findings / 📈 Trend & Vergleich)
- _build_sec_trend_tab(): Zeitraum-Dropdown (7/30/90 Tage / Gesamt) + Refresh-Button + Cairo-Chart + Vergleichs-Panel
- _draw_sec_trend(): Linien-Chart mit 4 Severity-Serien (critical=rot, high=orange, medium=gelb, low=blau), Y-Gitter, X-Datumsbeschriftungen, Legende
- _refresh_sec_trend() / _sec_trend_bg() / _apply_sec_trend_ui(): Async HTTP-Fetch vom /api/security/trend-Endpunkt, UI-Update im GLib-Idle
- _apply_scan_results_ui(): Ruft nach jedem Live-Scan automatisch _refresh_sec_trend() auf


2026-03-02 — Control Center: Security-Tab Live-Scan

llmgui-control.py_tab_security():
- Neue Scan-Toolbar zwischen Stats-Cards und Findings-Tabelle:
- Pfad-Entry (Placeholder: aktuelles Verzeichnis)
- Vuln Scan Button → POST /api/scan/vuln
- Secret Scan Button → POST /api/scan/secrets
- Spinner + farbige Status-Meldung (blau = läuft, grün = fertig, rot = Fehler)
- _on_sec_scan(mode): liest Pfad, startet BG-Thread
- _sec_scan_bg(path, mode): HTTP POST an localhost:8080 mit 180s Timeout
- _apply_scan_results_ui(data, mode, path): befüllt vorhandene _sec_store-Tabelle direkt aus REST-Response (kein SQLite nötig); aktualisiert Total/Critical-Cards; Severity-Icons (💥🔴🟡💡)
- _sec_scan_error_ui(msg): zeigt Fehler rot an (Server nicht erreichbar etc.)
- Live-Scan-Ergebnisse haben DB_ID = -1 → „Fix with AI" aktiv, „Verify Fix" deaktiviert


2026-03-02 — Control Center: Benchmark-History in Modellliste

llmgui-control.py:
- _bm_model_store: 3 neue Spalten — bench_hint (Text), bench_color (Farbe), bench_tooltip (Tooltip)
- _bm_collect_history(): liest alle benchmark_results_*.json + planning_results_*.json, gibt {model: {std_speed, std_date, plan_score, plan_date}} zurück; bm_dir.exists()-Guard, encoding="utf-8", per-File try/except
- _bm_history_hint(): erzeugt (text, color, tooltip) 3-Tuple:
- (grau) = kein Benchmark
- ⚡7.1 (blau) = nur Standard (avg. Tokens/s)
- ★8.5 (lila) = nur Planning (Total-Score)
- ⚡7.1 ★8.5 (grün) = beide gelaufen
- _bm_apply_models(history): history im BG-Thread vorgeladen, Spalten 4/5/6 je Modell befüllt; set_tooltip_column(6)
- _bm_refresh_hints(): aktualisiert nur Hint-Spalten ohne Ollama-Reload; wird nach Benchmark aufgerufen
- Bugfix: _bm_is_vision_model von @staticmethod auf @classmethod umgestellt — ControlCenterApp war im GLib-Idle-Kontext nicht auflösbar → nur 2 Modelle wurden angezeigt
- Robustheit: size-Check via isinstance(size, (int, float)) für Ollama-Modelle ohne Größenangabe


2026-03-02 — Strukturierte Security-Scan-Ergebnisse (Phase 1)

brainy/commands/security.py:
- VulnScanCommand.execute(): speichert _scan_results (List[VulnerabilityReport]), _scan_warnings und _merged_count nach Deduplication
- SecretScanCommand.execute(): speichert _secret_results (List[dict]) nach Findings-Sammlung

brainy/api/server.py:
- ScanRequest Pydantic-Modell (path, workspace)
- _resolve_scan_path() Hilfsfunktion für absolute/relative Pfadauflösung
- _make_mock_app() modulweiter Mock-App-Factory für REST-Endpoints
- POST /api/scan/vuln — führt VulnScan aus, gibt JSON zurück (total, merged, tool_summary, reports[], warnings[])
- POST /api/scan/secrets — führt SecretScan aus, gibt JSON zurück (total, findings[])
- run_slash_command() emittiert scan_result SSE-Event nach /vuln-scan und /secret-scan

clients/vscode/src/extension.ts:
- DiagnosticCollection llmgui-scan erstellt und per subscriptions verwaltet, an ChatViewProvider weitergegeben

clients/vscode/src/ChatViewProvider.ts:
- ScanReport Interface + applyDiagnostics() Funktion (CVSS → DiagnosticSeverity, byFile-Gruppierung)
- _scanDiagnostics Parameter im Konstruktor
- case 'scan_result': empfängt Reports vom Webview, befüllt VS Code Problems-Panel

clients/vscode/media/webview.js:
- case "scan_phase": animierter Spinner-Card (running → done mit ✓)
- case "tool_missing": rote Fehlerkarte mit Tool-Name und Install-Hint
- case "scan_result": forwarded Reports per vscode.postMessage an Extension-Host


2026-03-02 — Planning-Benchmark: Vision-Filter, SHA256-Fix, Prompt-Verbesserungen

llmgui-control.py:
- _BM_SKIP_PATTERNS: Vision/Multimodal-Modelle (llava, moondream, -vision, -vl, …) werden im Planning-Benchmark standardmäßig nicht vorausgewählt — sie können keine Python-Coding-Aufgaben lösen
- _bm_is_vision_model(): Pattern-Matcher auf Modellnamen (case-insensitive)

benchmark/planning_benchmark.py:
- Schritt 3: expliziter hashlib.sha256().hexdigest()-Aufruf + "genau 64 Hex-Zeichen" verhindert dass Modelle SHA1 (40 Zeichen) verwenden


2026-03-02 — Planning-Benchmark Fixes, checkov 3.2.506

benchmark/fixtures/index.html:
- Apache-Sort-Links (?C=N;O=D) entfernt — sauberes, minimales HTML verhindert HTML-Parsing-Fehler bei deepseek-r1:14b, deepseek-coder:6.7b, llama3.2-vision:11b

benchmark/planning_benchmark.py:
- PROMPT_TEMPLATE Schritt 5: explizites print()-Beispiel mit os.path.basename() — kein vager "Gib Pfade aus"-Text mehr (Fix für qwen2.5-coder:7b)
- PROMPT_TEMPLATE Schritt 7: klärt dass venv-Befehle nur gedruckt, nicht ausgeführt werden (Fix für deepseek-coder-v2:16b, mistral-nemo)
- FIX_PROMPT_TEMPLATE: Hinweise zu absolutem Pfad in os.walk() und zwingender print()-Ausgabe ergänzt

requirements-sec-tools.txt, build_sec_tools.sh:
- checkov 3.2.03.2.506 (stark veraltete Version aktualisiert)


2026-03-02 — Tests, /format CSS/SCSS/HTML/YAML

tests/test_security_phase2.py:
- TestCVEDeduplication: 10 neue Unit-Tests für _deduplicate_reports() — identische CVE/GHSA/PYSEC-IDs, höchster CVSS, Tool-Merge, case-insensitive, Tool-spezifische IDs (B601 etc.) unberührt

brainy/commands/analysis.py:
- FormatCommand._JS_EXTS erweitert: .css .scss .less .html .htm .yaml .yml
- prettier mit --ignore-unknown behandelt alle neuen Typen automatisch


2026-03-02 — CVE-Deduplication, /format mit prettier, Install-Fixes

brainy/commands/security.py:
- _deduplicate_reports(): Findings mit identischer CVE-/GHSA-/PYSEC-ID aus mehreren Scannern werden zusammengeführt (trivy + osv-scanner meldeten dieselbe CVE doppelt)
- Höchster CVSS-Score gewinnt, Tool-Namen werden gemergt (z.B. trivy+osv-scanner)
- Tool-spezifische IDs (B601, TAINT-PATH, …) bleiben unangetastet
- Summary zeigt 🔁 N Duplikat(e) zusammengeführt
- Deduplizierte Liste fließt in LLM-Analyse und _save_reports ein

brainy/commands/analysis.py:
- /format erkennt jetzt Datei-Extension und dispatcht:
- .py/.pyi → black + isort + pyupgrade (wie bisher)
- .js/.mjs/.jsx/.ts/.tsx/.cjs/.jsonprettier --write
- Verzeichnis → beides (Python-Formatter auf .py, prettier mit --ignore-unknown)
- _lint_php: tool_missing-Hinweis korrigiert (curl phpstan.phar statt composer global require)
- _lint_js: tool_missing-Hinweis korrigiert (npm install -g --prefix "$HOME/.local")

llmgui-control.py:
- prettier zur TOOLS-Liste hinzugefügt (Code Quality, npm binary)
- prettier zu _GROUPS (qa_grid) hinzugefügt


2026-03-02 — AppSec-Toolchain: 12 neue Tools, /format, sprachübergreifendes /lint

Kernpunkt: Vollständige Integration einer SAST/SCA/IaC-Toolchain und einer Tool-Discovery-Engine die externe Binaries automatisch findet.

Neue Tools

Security Scanning (gehen in /vuln-scan und /secret-scan):

Tool Typ Command Funktion
trivy Go Binary /vuln-scan Filesystem-Scan: Pakete, Secrets, Misconfigs (JSON: Results[].Vulnerabilities/Misconfigurations/Secrets)
osv-scanner Go Binary /vuln-scan Google OSV-Datenbank: Dependency-CVEs über Lockfiles
checkov Python .pyz /vuln-scan IaC-Scan: Terraform, Kubernetes, Dockerfile
gitleaks Go Binary /secret-scan Git-History-Scan auf hardcodierte Secrets

Code Quality (gehen in /complexity und /lint):

Tool Typ Command Funktion
xenon Python .pyz /complexity Radon-basiertes Complexity-Thresholding (-b B -m A -a A)
lizard Python .pyz /complexity Complexity-Analyse für 16+ Sprachen (CCN > 15, -w-Flag)
shellcheck System Binary /lint Statische Analyse für Shell-Skripte (.sh/.bash/.zsh/.ksh)
phpstan PHP Phar /lint Statische Analyse für PHP-Code (.php/.phtml)
eslint npm Binary /lint Linting für JavaScript, TypeScript, JSX/TSX

Formatierung (neuer /format-Command):

Tool Typ Funktion
black Python .pyz Opinionated Python-Formatter
isort Python .pyz Import-Sortierung und -Gruppierung
pyupgrade Python .pyz Automatisches Modernisieren auf Python 3+ Syntax

Neuer Slash-Command: /format

/format <file|dir> — Führt black + isort + pyupgrade in Sequenz aus. Bei Verzeichnissen werden alle .py-Dateien globbed (max 200), __pycache__/, venv/, dist/ und build/ übersprungen.

Tool-Discovery-Engine

brainy/tools/sec_tools.pyfind_sec_tool(name) sucht jetzt in Prioritätsreihenfolge:

1. $LLMGUI_TOOLS_DIR/name.pyz
2. dist/tools/name.pyz
3. ~/.local/lib/llmgui/tools/name.pyz
4. dist/tools/name            (plain binary)
4b. ~/.local/lib/llmgui/tools/name
4c. ~/.local/bin/name         (npm --prefix, curl-Downloads)
5. shutil.which(name)         (System-PATH)
6. python -m MODULE           (Legacy-Venv-Fallback)

Schritte 4, 4b und 4c sind neu. Externe Binaries (trivy, gitleaks, osv-scanner, eslint, phpstan) werden automatisch gefunden, sobald sie in ~/.local/bin/ oder dist/tools/ landen — ohne Code-Änderung.

/lint: Sprachübergreifender Dispatch

LintCommand dispatcht jetzt nach Datei-Extension:

/complexity: xenon + lizard

ComplexityCommand dispatcht jetzt:
- .py-Datei → radon (Details) + xenon (Thresholding)
- Directory / Nicht-Python → lizard (CCN > 15, warnings-only)

Control Center: Tools & Config Tab

.pyz Build System

build_sec_tools.sh verwaltet jetzt 15 Tools (neu: xenon, lizard, checkov, black, isort, pyupgrade). Versionen in requirements-sec-tools.txt gepinnt.


2026-03-01 — Benchmark: Correctness-Checks verbessert

Diagnose: Analyse aller bisher gelaufenen Benchmark-Runs ergab zwei systematische Fehler in der Correctness-Verifikation.

Bug 1: SHA256 nie erkannt (betraf fast alle Modelle)

verify_execution() prüfte, ob der rohe 64-Zeichen-Hex-Hash im stdout vorkommt. Der Prompt fragte aber nur "gib aus, ob die Prüfsumme stimmt" — LLMs gaben also SHA256 verified: True aus, nicht den Hash selbst. Einzige Ausnahme: thirdeyeai/Qwen2.5-Coder-7B druckte den Hash zufällig mit.

Fix planning_benchmark.py: Aufgabe 3 im Prompt explizit erweitert:

"Gib den Hash im Format SHA256: <64-Zeichen-Hex-Hash> aus"

Bug 2: Kommaformatierte Zahlen nicht erkannt

biggest_bytes_correct und most_lines_count_correct prüften str(n) in stdout. LLMs geben Zahlen teils als 1,234,567 aus — dann schlägt "1234567" in stdout fehl.

Fix planning_benchmark.py: Neue Hilfsmethode _int_in_stdout(n_str, stdout):
- Prüft zuerst auf plain n → danach auf f"{n:,}" (kommaformatiert)
- Gilt für biggest_bytes_correct und most_lines_count_correct

Verbleibende offene Frage

Modelle wie qwen2.5-coder:14b und llava:13b laufen erfolgreich durch, scheitern aber an allen 4 restlichen Checks (Dateiname, Bytes, Zeilen). Ursache unklar — vermutlich andere Traversal-Logik führt zu anderen Ergebnissen. Zur Diagnose: exec_stdout (erste 2000 Zeichen) wird jetzt in planning_results_*.json mitgespeichert.

llmgui-control.py:
- exec_stdout[:2000] als Feld in jedem Ergebnis-JSON-Eintrag


2026-03-01 — Benchmark-Scoring: Ergebnis-first

Kernthese: Ein schöner Plan und eleganter Code taugen nichts, wenn das Ergebnis falsch ist.

Neues Scoring-Schema

Das Planning-Benchmark-Scoring wurde grundlegend überarbeitet. Correctness — ob das Skript die richtigen Werte in den Output schreibt — ist jetzt mit 40% das dominante Kriterium.

planning_benchmark.py:
- Neues 6-dim-Gewichtungsschema (WEIGHTS): Correctness 40%, Unit-Tests 20%, Implementation 15%, Adherence 10%, Planning 10%, Quality 5%
- Neues 5-dim-Fallback (WEIGHTS_5): wenn nur Unit-Tests laufen (kein Correctness): UT 40%
- Neues 4-dim-Fallback (WEIGHTS_4): reine Heuristik ohne Ausführung: Impl 40%
- score() bekommt neuen Parameter correctness_score=None
- export_markdown() zeigt das jeweils aktive Gewichtungsschema

llmgui-control.py:
- bm.score() wird jetzt mit correctness_score=corr aufgerufen
- Score-Anzeige im Live-Output zeigt Correctness oben mit ← 40%-Hinweis
- Dimensionsbezeichnung im Output: 6-dim, Ergebnis-first / 5-dim, UT-Proxy / 4-dim, Heuristik

Recalculated Results

Alle bisher gelaufenen Benchmark-Runs wurden mit der neuen Formel nachberechnet und in benchmark/planning_results_recalculated.json gespeichert. Das JSON enthält total_score (neu) und total_score_old (Vergleich) sowie ein scoring_mode-Feld.


2026-03-01 — Benchmark: Alle Modelle – letzter Stand

llmgui-control.py:
- Neue Combo-Option "Alle Modelle – letzter Stand" in der Benchmark-Ergebnisauswahl
- Kombiniert alle planning_results_*.json-Dateien, dedupliziert nach Modellname (neuester Run gewinnt)
- Sofort sichtbar nach jedem Benchmark-Run (automatisches Refresh der Combo)


2026-03-01 — Radar Chart: Interaktive Legende

llmgui-control.py:
- Klick auf Einträge in der Radar-Chart-Legende blendet das jeweilige Modell ein/aus
- Sofortiges visuelles Feedback ohne Neuzeichnen des gesamten Charts
- Koordinierte Ein-/Ausblendung von Polygon + Marker pro Modell


2026-03-01 — Live Output: Word-Wrap + Progress

llmgui-control.py:
- Live-Output-Bereich im Benchmark-Tab bricht lange Zeilen jetzt korrekt um
- Progress-Indikator zeigt aktuelles Modell und Phase (z.B. "Generiert Code … / Ausführung: 2 Versuche · Scoring …")


2026-03-01 — Fix: GTK ListStore int overflow (>2 GB Modelle)

llmgui-control.py:
- Modellgrößen >2 GB führten zu einem int overflow im GTK ListStore
- Fix: Größen werden jetzt als GLib.TYPE_INT64 (64-bit) gespeichert statt Standard-int


2026-03-01 — ARCHITECTURE.md + erste Benchmark-Ergebnisse


2026-02-xx — VRAM-Auto-Detect via SSH

llmgui-control.py:
- Automatische Erkennung des GPU-VRAMs des Remote-Ollama-Servers dana via SSH + nvidia-smi
- VRAM-Gesamtkapazität und -Auslastung pro Modell in der Modell-Liste
- Kein manuelles Eintragen von VRAM-Werten mehr nötig


2026-02-xx — Planning Benchmark: Unit-Tests + Radar Chart

planning_benchmark.py:
- Unit-Test-Suite (test_generated.py) für automatisierte Verifikation der generierten Lösung
- run_unit_tests(): Führt pytest gegen Artefakte im work_dir aus, setzt Ground-Truth als Env-Vars
- unit_test_score fließt in den Gesamt-Score ein (war Vorläufer des aktuellen 6-dim-Schemas)

llmgui-control.py:
- Radar-Chart-Visualisierung der Score-Dimensionen pro Modell
- Score-Verlaufsgraph über mehrere Runs


2026-02-xx — Planning Benchmark: Ground Truth + Correctness

planning_benchmark.py:
- establish_ground_truth(): Führt reference_solution.py aus, extrahiert SHA256, größte Datei, meiste Zeilen
- verify_execution(): Vergleicht LLM-Stdout gegen Ground-Truth-Werte (5 binäre Checks)
- correctness_score (0–10) als separates Ergebnis-Feld
- Bis zu 5 Ausführungsversuche mit automatischer Fehlerkorrektur via LLM


2026-02-xx — Planning Benchmark: Basisimplementierung

planning_benchmark.py:
- Vollständiger Benchmark-Framework: Fixture-HTTP-Server, Code-Generierung, Ausführung, Heuristisches Scoring
- 4 heuristische Dimensionen: Planning, Adherence, Implementation, Quality
- Fix-Loop: Bei Fehler wird Fehlermeldung zurück an LLM geschickt


2026-02-xx — LLM-as-Judge

planning_benchmark.py:
- judge_score(): Optionaler Judge-Modus mit separatem LLM-Modell
- 4 Qualitätsdimensionen: correctness, completeness, code_quality, robustness
- judge_total als unabhängige Qualitätsperspektive (fließt nicht in total_score ein)
- Robust gegenüber JSON-Wrapping und Markdown-Artefakten im Judge-Output


2026-02-28 — Bugfixes: Slash Commands im API-Server

Systematische Überarbeitung aller Slash Commands für korrekte Funktion im FastAPI-Server-Modus:

# Bug Command Fix
1 /help → "not found" help Builtin-Fallback in run_slash_command()
2 /tools → "not found" tools ToolsCommand zum Builtin-Fallback
3 /model (no args) → Workspace als Modellname model _NO_AUTO_DEFAULT_CMDS Set
4 /autofix → Crash get_combined_output autofix get_combined_output() zu MockAppForCommand
5 /harden → Crash get_combined_output harden Gleicher Fix wie #4
6 /callers hängt (falscher cwd) callers _get_workspace() statt os.getcwd()
7 /callees hängt callees Gleicher Fix wie #6
8 /testgaps <py_file> → JSON-Parsefehler testgaps Prüft ob Arg .json-Datei ist

2026-02-28 — PHP-Security-Scanning

brainy/commands/security.py:
- Semgrep als primärer PHP-Scanner in /vuln-scan (p/php + p/secrets)
- Fallback: eigene Regex-Patterns (_parse_php()) wenn semgrep nicht verfügbar
- semgrep in requirements.txt (wird in .pyz gebundled)
- CVSS-Matrix: ERROR+HIGH=9.0, ERROR+MEDIUM=8.0, WARNING+MEDIUM=5.5, ...
- _semgrep_available(): sucht via shutil.which() dann venv-relativ

brainy/quality/code_reviewer.py:
- PHP_SECURITY_PATTERNS + .php-Branch hinzugefügt
- /review funktioniert jetzt auch für PHP-Dateien und PHP-Verzeichnisse


2026-02-xx — Local-Only Modus

brainy/llm/client.py + Server + Extension:
- Neuer localOnly-Flag: Deaktiviert alle Cloud-Fallbacks (Gemini etc.)
- Bei aktiviertem Local-Only: Fehler statt Remote-Weiterleitung
- Konfigurierbar in: ~/.llmgui/slash_commands.yaml, VS Code Extension Settings, Chat-Panel


2026-02-xx — Markdown-Export für Slash Commands

brainy/commands/:
- Slash-Command-Ergebnisse können als Markdown-Reports gespeichert werden
- Zielverzeichnis: .llmgui/ (konsolidiert, kein Streuen von .llmgui_*-Dateien mehr)
- /risk-scan speichert Ergebnisse in .llmgui/risk-scan.md


2026-02-xx — OOM-Handling + Lokaler Fallback

brainy/llm/client.py:
- Kein Retry bei OOM-Fehlern (Out-of-Memory) — sofortiger Fallback
- Lokale Modelle werden vor Gemini als Fallback probiert
- Bessere Fehlermeldungen bei VRAM-Engpässen


Ältere Einträge

Ältere Änderungen sind im Git-Log des Repositories dokumentiert:

git log --oneline