claude-desktop/ROADMAP.md
Eddy 25617dc76f Enforcement-Mechanismen für Context-Nutzung
- Position: Schicht 1 im System Prompt, Schicht 2 als letzter Reminder
- Explizite Anweisungen mit <critical-context> Tags
- validateResponse() für Kontext-Ignorierung erkennen
- Auto-Retry mit Korrektur-Hinweis
- context_failures Tabelle für Feedback-Loop
- UI-Warnung bei Regel-Verletzung

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-04-14 12:18:08 +02:00

16 KiB

Claude Desktop — Roadmap

Stand: 14.04.2026

Aktueller Status

Implementiert (Phase 1-4)

Feature Status Commit
Tauri 2.0 + SvelteKit 5 App Initial
Claude Agent SDK Integration Phase 2
Live-Streaming Text im Chat Phase 2
SQLite Persistierung Phase 3
Guard-Rails System Phase 3
Claude Bridge (Node.js) Phase 3
4-Panel Layout (PaneForge) Phase 4
Tab-Switching Phase 4
Markdown-Rendering Phase 4
Activity Panel (Tool-Tracking) Phase 4
Memory Panel Phase 4
Audit Log Panel Phase 4
Agent-View Phase 4
Modell-Auswahl (Haiku/Sonnet/Opus) 433e2de
Session-Historie persistent 4ba14a5
STOPP-Button + Escape-Shortcut Vorhanden
Token/Kosten-Anzeige im Footer Vorhanden
Modell-Badge (Titlebar + Footer) 9129163
Tray-Icon mit Menu 3c6da3b

Phase 5: Subagent-Hierarchie (KRITISCH)

Problem

Der aktuelle claude-bridge.js behandelt nur einen Main-Agent. Wenn Claude das Task-Tool nutzt und Subagents (Explore, Plan, Bash) spawnt, werden diese nicht angezeigt.

Ziel

┌─ Main Agent (claude-opus-4)
│  ├─ Explore Agent (Codebase durchsuchen)
│  │  └─ Tool: Grep "handleError"
│  └─ Plan Agent (Implementierung planen)
│     └─ Tool: Read README.md

Aufgaben

  • scripts/claude-bridge.js

    • subagent_start Event-Handler hinzufugen
    • subagent_stop Event-Handler hinzufugen
    • parentAgentId und depth im Event-Payload senden
  • src-tauri/src/claude.rs

    • AgentEvent Struct erweitern: parent_id: Option<String>
    • Hierarchie-Info an Frontend weitergeben
  • src/lib/stores/app.ts

    • Agent Interface erweitern:
      interface Agent {
        id: string;
        parentAgentId?: string;  // NEU
        depth: number;           // NEU: 0 = Main, 1 = Subagent, etc.
        type: 'main' | 'explore' | 'plan' | 'bash';
        // ...
      }
      
  • src/lib/components/AgentView.svelte

    • Baumansicht mit Einruckung implementieren
    • Linien zwischen Parent/Child
    • Subagent-Badge anzeigen
    • Collapsed/Expanded State pro Agent

Verifikation

# App starten, Prompt eingeben der Task-Tool triggert
# Prufen: AgentView zeigt verschachtelte Hierarchie

Phase 6: Session-Management Verbesserungen

Problem

  1. Session wird nur geladen wenn SessionList-Panel sichtbar ist
  2. agentId geht bei DB-Speicherung verloren
  3. Kein Compacting — alte Sessions werden unbegrenzt gross
  4. claude_session_id wird nicht fur SDK-Fortsetzung genutzt

Aufgaben

  • src/routes/+layout.svelte

    • Session-Auto-Load bei App-Start (nicht nur in SessionList)
    onMount(async () => {
      const active = await invoke('get_active_session');
      if (active) {
        currentSessionId.set(active.id);
        const messages = await invoke('load_messages', { sessionId: active.id });
        setMessagesFromDb(messages);
      }
    });
    
  • src-tauri/src/db.rs

    • agent_id Spalte in messages Tabelle
    • Migration fur bestehende Daten
    • compact_session(session_id, keep_last_n) Funktion
    • archive_messages(session_id, before_timestamp) Funktion
  • src/lib/stores/app.ts

    • DbMessage Interface: agent_id?: string
    • messageToDb() anpassen
  • Compacting-Logik

    • Bei > 50 Nachrichten: Altere zusammenfassen
    • Summary-Nachricht: "Bisheriger Kontext: ..."
    • Original-Nachrichten in messages_archive Tabelle
  • Claude-Session-ID nutzen

    • Bei send_message: Session-ID an SDK ubergeben
    • --resume Flag nutzen fur Fortsetzung

Verifikation

# App starten → Letzte Session automatisch geladen (ohne SessionList)
# 100 Nachrichten senden → Compacting aktiv
# App beenden → Neu starten → Exakt gleicher Stand

Phase 7: UI-Verbesserungen

Features die fehlen (Standard bei ChatGPT, Claude.ai, Cursor)

Feature Prioritat
Nachricht bearbeiten Hoch
Antwort regenerieren Hoch
Code-Block Copy-Button Hoch
Diff-View fur Anderungen Hoch
File-Preview inline Mittel
Conversation Fork Niedrig

Aufgaben

  • src/lib/components/MessageBubble.svelte (oder ChatPanel)

    • Edit-Button bei User-Nachrichten
    • Regenerate-Button bei Assistant-Nachrichten
    • Inline-Editor fur Nachrichtenbearbeitung
  • src/lib/components/CodeBlock.svelte (NEU)

    • Syntax-Highlighting (bereits via marked?)
    • Copy-Button oben rechts
    • Sprache anzeigen
    • Zeilennummern optional
  • src/lib/components/DiffView.svelte (NEU)

    • Split-View: Alt | Neu
    • Unified-View: +/- Zeilen
    • Syntax-Highlighting
    • Wird bei Edit-Tool-Results angezeigt
  • src/lib/components/FilePreview.svelte (NEU)

    • Bei Read-Tool: Dateiinhalt inline anzeigen
    • Collapsible (eingeklappt by default)
    • Syntax-Highlighting nach Dateiendung
  • Keyboard Shortcuts

    • Cmd/Ctrl+Enter = Senden
    • Cmd/Ctrl+Shift+Enter = Senden ohne Tools
    • Cmd/Ctrl+K = Input fokussieren

Verifikation

# User-Nachricht bearbeiten → Neue Antwort generiert
# Code-Block → Copy-Button kopiert in Clipboard
# Edit-Tool → Diff-View zeigt Anderungen

Phase 8: Claude-DB Integration

Problem

Die App hat keinen direkten Zugriff auf die zentrale Wissensbasis (claude DB auf 192.168.155.1).

Ziel

  • Wissensbasis durchsuchen direkt in der App
  • Erkenntnisse speichern ("Das merken")
  • Skills/Hooks/Patterns aus DB laden

Aufgaben

  • src-tauri/src/knowledge.rs (NEU)

    • MySQL-Verbindung zu claude-db
    • search_knowledge(query) — Volltextsuche
    • save_knowledge(entry) — Neuer Eintrag
    • get_sticky_context() — Fur Claude-Prompt
  • src-tauri/src/lib.rs

    • Knowledge-Modul registrieren
    • Tauri-Commands exportieren
  • src/lib/components/KnowledgePanel.svelte (NEU)

    • Suchfeld fur Wissensbasis
    • Ergebnisliste mit Titel, Tags, Preview
    • Detail-View fur einzelnen Eintrag
  • "Das merken" Feature

    • Button in Chat bei wichtigen Erkenntnissen
    • Modal: Kategorie, Tags, Titel eingeben
    • Speichert in knowledge Tabelle
  • Sticky Context

    • Beim Chat-Start: Sticky-Eintrage laden
    • Als System-Prompt an Claude senden

Verifikation

# Wissensbasis durchsuchen → Ergebnisse in App
# "Das merken" klicken → Eintrag in claude.knowledge
# Neuer Chat → Sticky Context wird geladen

Phase 9: Intelligentes Context-Management (WICHTIG)

Das Problem: Context-Verlust nach Compacting

Compacting ist notwendig (Token-Limit, Kosten, Latenz), aber dabei geht kritischer Kontext verloren:

  • Zugänge (DB-Hosts, API-Keys)
  • Projekt-Kontext (CLAUDE.md)
  • Getroffene Entscheidungen
  • Aktuelle Aufgabe

Lösung: Drei-Schichten-Gedächtnis

┌─────────────────────────────────────────────────────────────┐
│  SCHICHT 1: IMMER PRÄSENT (~200 Token)                      │
│  • User-Info (Name, Firma)                                  │
│  • Aktive Zugänge (komprimiert)                             │
│  • Aktuelle Projekt-ID + Phase                              │
│  → Bei JEDEM API-Call dabei                                 │
├─────────────────────────────────────────────────────────────┤
│  SCHICHT 2: PROJEKT-KONTEXT (~500 Token)                    │
│  • CLAUDE.md (komprimiert)                                  │
│  • Architektur-Entscheidungen                               │
│  • Offene TODOs                                             │
│  → Nach Compacting neu injiziert                            │
├─────────────────────────────────────────────────────────────┤
│  SCHICHT 3: WISSENS-HINTS (on-demand)                       │
│  • Relevante DB-Einträge                                    │
│  • Ähnliche Probleme/Lösungen                               │
│  → Bei Tool-Aufrufen automatisch geladen                    │
└─────────────────────────────────────────────────────────────┘

Aufgaben

  • src-tauri/src/context.rs (NEU)

    • StickyContext Struct (Schicht 1)
    • ProjectContext Struct (Schicht 2)
    • get_sticky_context() → ~200 Token
    • get_project_context(project_id) → ~500 Token
    • extract_critical_before_compacting() → JSON
  • src-tauri/src/credentials.rs (NEU)

    • Credentials aus DB laden (verschlüsselt)
    • inject_for_context(tool_name) → Zugang wenn nötig
    • Credentials NIE im Chat-Verlauf speichern
  • scripts/claude-bridge.js

    • Schicht 1 bei jedem query() Call als System-Prompt
    • Hook vor Compacting: extract_critical_before_compacting()
    • Hook nach Compacting: restore_critical_context()
  • Datenbank-Schema (SQLite lokal)

    CREATE TABLE sticky_context (
      key TEXT PRIMARY KEY,
      value TEXT,
      priority INT  -- 1=kritisch, niemals entfernen
    );
    
    CREATE TABLE compacting_archive (
      id INTEGER PRIMARY KEY,
      session_id TEXT,
      extracted_at TEXT,
      decisions JSON,
      open_questions JSON,
      key_insights JSON
    );
    
  • Pre-Tool-Hook: Wissens-Hints

    • Bei Tool-Aufruf: Schlüsselwörter extrahieren
    • Claude-DB nach relevantem Wissen durchsuchen
    • Als <knowledge-hint> injizieren (max 200 Token)

Wichtig: Nicht ALLES wiederherstellen!

❌ FALSCH: 130.000 Token zurück injizieren
   → Sofort wieder Compacting → Endlosschleife

✅ RICHTIG: 700 Token kritischen Kontext
   Schicht 1: 200 Token (Zugänge, User)
   Schicht 2: 500 Token (Projekt, Entscheidungen)

Enforcement: Sicherstellen dass Claude den Kontext NUTZT

Problem: Injizierter Kontext kann ignoriert werden (Lost in the Middle, keine Anweisung)

Lösung 1: Position

  • Schicht 1 → System Prompt (höchste Priorität)
  • Schicht 2 → Letzter System-Reminder vor User-Nachricht (Recency Bias)

Lösung 2: Explizite Anweisungen

<critical-context>
Du MUSST folgende Zugänge verwenden (NICHT nachfragen!):
- DB: 192.168.155.11 / dolibarr_test
Diese Daten sind AKTUELL und KORREKT.
</critical-context>

Lösung 3: Validierung nach Antwort

  • validateResponse() in claude-bridge.js
  • Prüft: Hat Claude nach Infos gefragt die injiziert waren?
  • Wenn ja: Automatisch Retry mit Korrektur-Hinweis

Lösung 4: Feedback-Loop

  • context_failures Tabelle in SQLite
  • Speichert wenn Kontext ignoriert wurde
  • Pattern erkennen → Prompts verbessern

Aufgaben (Enforcement)

  • scripts/claude-bridge.js

    • System Prompt Builder mit <critical-context> Tags
    • Schicht 1 am Anfang, Schicht 2 am Ende
    • validateResponse() nach jeder Antwort
    • Auto-Retry bei Kontext-Ignorierung (max 1x)
  • src-tauri/src/db.rs

    • context_failures Tabelle
    • log_context_failure(session_id, context, expected, actual)
    • get_failure_patterns() für Prompt-Optimierung
  • UI: Warnung bei Regel-Verletzung

    • Toast/Banner wenn Claude Regel ignoriert
    • Option: "Erneut versuchen mit Hinweis"

Verifikation

# Lange Session (>100 Nachrichten) → Compacting passiert
# Danach: Zugänge noch bekannt? Projekt-Kontext da?
# Tool aufrufen → Relevante Hints erscheinen?

Phase 10: Sprach-Interface (Optional)

Technologie-Stack

Komponente Technologie Ort
Speech-to-Text Whisper.cpp Lokal
Voice Activity Detection Silero VAD Lokal
Text-to-Speech OpenAI TTS API Cloud
Audio-Capture Web Audio API Browser

Aufgaben

  • Whisper Integration

    • whisper.cpp als Tauri-Sidecar oder WASM
    • Streaming-Transkription
    • Deutsch-Modell (small oder medium)
  • VAD (Voice Activity Detection)

    • Erkennt wann User aufhort zu sprechen
    • Pause > 1.5s → Nachricht senden
  • TTS (Text-to-Speech)

    • OpenAI TTS API Integration
    • Streaming-Wiedergabe
    • Interrupt bei User-Sprache
  • UI

    • Mikrofon-Button in Chat
    • Pegel-Anzeige
    • Transkript live anzeigen

Aufwand

Gross — eigenes Teilprojekt, 2-3 Wochen


Phase 11: Hook-System für Automatisierung

Konzept

Hooks die automatisch bei bestimmten Events laufen:

Hook Wann Was
SessionStart App startet Schicht 1+2 laden
PreToolUse Vor jedem Tool Wissens-Hints aus DB
PostToolUse Nach Tool Bei Fehler → Pattern speichern
BeforeCompacting Vor Komprimierung Kritisches extrahieren
AfterCompacting Nach Komprimierung Schicht 1+2 injizieren

Aufgaben

  • src-tauri/src/hooks.rs (NEU)

    • HookManager Struct
    • register_hook(event, callback)
    • fire_hook(event, payload)
  • scripts/hooks/ (NEU)

    • session-start.js → Lädt Projekt-Kontext
    • pre-tool.js → Wissens-Hints aus claude-db
    • post-tool.js → Fehler-Patterns speichern
    • before-compacting.js → Kritisches extrahieren
    • after-compacting.js → Context wiederherstellen
  • UI: Hook-Konfiguration

    • Settings-Panel: Hooks ein/ausschalten
    • Hook-Log im Audit-Panel

Verifikation

# Session starten → Hook-Log zeigt "Kontext geladen"
# Tool aufrufen → Hook-Log zeigt "Wissens-Hints: 3 gefunden"
# Fehler provozieren → Pattern wird gespeichert

Claude-DB Schema-Erweiterungen

Neue Tabellen für die zentrale Wissensbasis (192.168.155.1):

-- Projekt-Kontext (für Schicht 2)
CREATE TABLE project_context (
    id INT PRIMARY KEY AUTO_INCREMENT,
    project_id VARCHAR(100),
    type ENUM('claude_md', 'architecture', 'decision', 'todo', 'insight'),
    content TEXT,
    priority INT DEFAULT 5,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    expires_at TIMESTAMP NULL,
    INDEX idx_project (project_id)
);

-- Credentials (verschlüsselt)
CREATE TABLE credentials (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) UNIQUE,
    type ENUM('mysql', 'api', 'ssh', 'oauth'),
    value_encrypted BLOB,
    inject_pattern TEXT,  -- Regex: wann automatisch laden
    last_used TIMESTAMP
);

-- Compacting-Archive
CREATE TABLE compacting_archive (
    id INT PRIMARY KEY AUTO_INCREMENT,
    session_id VARCHAR(100),
    extracted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    decisions JSON,
    open_questions JSON,
    key_insights JSON,
    zugaenge JSON
);

-- Begriff-Cache (für schnelle Wissens-Hints)
CREATE TABLE concept_cache (
    concept VARCHAR(100) PRIMARY KEY,
    relevant_knowledge_ids JSON,
    last_queried TIMESTAMP,
    hit_count INT DEFAULT 0
);

Nicht geplant / Zukunft

  • Computer Use (VM mit Desktop)
  • MCP-Server Integration in App
  • Plugin-System
  • Multi-User / Team-Features
  • Cloud-Sync zwischen Geraten

Technische Schulden

  • Dead Code in memory.rs (MemorySystem struct ungenutzt)
  • Warnings bei cargo check beheben
  • TypeScript strict mode aktivieren
  • E2E Tests mit Playwright
  • CI/CD Pipeline (Forgejo Runner)

Build & Entwicklung

# Entwicklung
cd "/mnt/17 - Entwicklungen/20 - Projekte/ClaudeDesktop"
CARGO_TARGET_DIR=/tmp/claude-desktop-target nix-shell --run "npx tauri dev"

# Produktion (AppImage)
CARGO_TARGET_DIR=/tmp/claude-desktop-target nix-shell --run "npx tauri build"

Commits Ubersicht

Datum Commit Beschreibung
13.04.2026 Initial Grundgerust
13.04.2026 Phase 2 Claude SDK + Events
13.04.2026 Phase 3 SQLite, Guard-Rails, Bridge
13.04.2026 Phase 4 Tabs, Markdown, UI
14.04.2026 433e2de Modell-Auswahl
14.04.2026 4ba14a5 Session-Historie
14.04.2026 9129163 Titlebar aufgeraumt
14.04.2026 3c6da3b Tray-Icon