- Das System ist funktional mächtig, aber einige Dateien (z.B. `chunker.py`) sind monolithisch geworden.
- Dokumentation und Code müssen synchronisiert werden.
**Dein Auftrag (WP-14):**
1.**Refactoring `chunker.py`:** Zerlege den Monolithen in ein sauberes Package `app/core/chunking/`.
-`strategies.py`: Enthält `sliding_window` und `by_heading` Logik.
-`orchestration.py`: Enthält `assemble_chunks` und Smart-Edge-Flow.
-`utils.py`: Helper.
2.**Cleanup:** Entferne veraltete / auskommentierte Code-Blöcke im gesamten Projekt.
3.**Doc-Sync:** Prüfe, ob alle Parameter in `types.yaml` auch im Code verwendet werden (Dead Config Detection).
**Regeln:**
- Funktionalität darf sich nicht ändern (Regression Tests!).
- Imports in `scripts/import_markdown.py` müssen angepasst werden.
Bitte bestätige und beginne mit der Strukturierung des neuen `chunking` Packages.
```
---
## WP-16: Auto-Discovery & Intelligent Ingestion
**Status:** 🟡 Geplant
**Fokus:** Automatisierung beim Import, "Smarter Text".
```text
Du bist der Lead Developer für "Mindnet".
Wir starten **WP-16: Auto-Discovery & Intelligent Ingestion**.
**Status Quo (v2.6.0):**
- Import verlässt sich auf explizite Wikilinks und manuelle Profil-Wahl in `types.yaml`.
- Smart Edges filtern nur vorhandene Links.
**Dein Auftrag (WP-16):**
Mache den Import intelligenter, bevor Daten gespeichert werden.
1.**Structure Analyzer:** Erweitere den Chunker um eine Vor-Analyse.
- Berechne "Heading Density" (Überschriften pro Wort).
- Wähle automatisch `structured` (hohe Dichte) oder `sliding` (niedrige Dichte), wenn `profile: auto` gesetzt ist.
2.**Smart Link Enricher:** Implementiere einen Service, der im Text nach Keywords sucht, die als Titel anderer Notizen existieren (Exact Match & Fuzzy Match).
- Schlage diese als `suggested_edges` vor.
3.**Hierarchy Merging:** Generalisiere die Logik, dass leere Überschriften ("Tier 2") automatisch mit dem folgenden Inhalt verschmelzen.
**Regeln:**
- Performance beachten! Der Import darf nicht ewig dauern.
- Änderungen am Content nur im RAM, Original-Datei bleibt unangetastet (außer User will Writeback).
Bitte bestätige und skizziere den Algorithmus für den Structure Analyzer.
```
---
## WP-17: Conversational Memory
**Status:** 🟡 Geplant
**Fokus:** Dialog-Qualität, Kontext.
```text
Du bist der AI-Engineer für "Mindnet".
Wir starten **WP-17: Conversational Memory**.
**Status Quo (v2.6.0):**
- Chat ist "stateless". Jede Anfrage wird isoliert betrachtet.
- RAG funktioniert, aber Rückfragen ("Was meinst du damit?") scheitern.
**Dein Auftrag (WP-17):**
Implementiere ein Kurzzeitgedächtnis für den Chat.
1.**API Update:** Erweitere `ChatRequest` (DTO) um ein Feld `history: List[Message]`.
2.**Frontend:** Passe `ui.py` an, um die letzten N Nachrichten mitzusenden.
3.**Token Management:** Implementiere eine Logik im `LLMService`, die das Kontext-Fenster (z.B. 4k Token) balanciert:
- System Prompt (fest)
- RAG Chunks (hoch gewichtet)
- Chat History (auffüllen bis Limit)
4.**Prompting:** Integriere `{chat_history}` in das Template in `prompts.yaml`.
- Prüfe: Gibt es Edges, deren `target_id` nicht in `notes` existiert?
- Aktion: Report oder Auto-Delete.
3.**Resolve References:** Erweitere das Skript um Logik, die "Unresolved Targets" (Text-Links) nachträglich in echte UUID-Links wandelt, wenn die Ziel-Notiz später importiert wurde.
**Regeln:**
- Sicherheit geht vor Geschwindigkeit.
- Keine Datenlöschung ohne Log-Eintrag.
Bitte bestätige und skizziere die Logik für den Transactional Hash Update.
- Erweitere `import_markdown.py` / `Chunker`: Mappe beim Einlesen alle Inline/Callout-Kanten auf den Canonical-Typ, *bevor* sie in Qdrant gespeichert werden. (Speichere das Original ggf. als Metadatum).
2.**Dynamic Boosting (Retrieval-Layer):**
- Erweitere die `DecisionEngine` (`app/services/decision_engine.py` und YAML).
- Füge `boost_edges` zu den Strategien hinzu (z.B. `strategy: EXPLANATION` -> `boost: {caused_by: 2.0}`).
- Passe den `Retriever` an, um diese dynamischen Gewichte im Query-Moment mit den statischen Config-Werten zu verrechnen (Multiplikator).
**Zielbild:**
- User schreibt: `[[rel:wegen Systemfehler]]`.
- System speichert: `caused_by` -> `Systemfehler`.
- User fragt: "Warum Absturz?".
- System erkennt "Warum" -> Boostet `caused_by` -> Findet die Notiz präzise.
**Regeln:**
- Abwärtskompatibilität wahren (alte Kanten müssen weiter funktionieren).
- Performance: Das Mapping muss O(1) sein (Hashmap Lookup), kein LLM-Call pro Kante!
Bitte bestätige die Übernahme, erstelle die `edge_mappings.yaml` Struktur und skizziere die Anpassung im `Retriever`.
---
### Warum diese Lösungsansätze?
1.**Warum Mapping beim Import (Ingestion) und nicht bei der Suche?**
* **Performance:** Es ist viel effizienter, die Daten *einmal* beim Schreiben zu säubern ("Canonical Form"), als bei *jeder* Suche tausende Synonyme abzufragen.
* **Konsistenz:** Der Graph in Qdrant bleibt sauber. `caused_by` ist immer `caused_by`, egal ob der User `wegen`, `durch` oder `ursache` geschrieben hat.
2.**Warum Boosting über die Decision Engine?**
* Wir haben den `HybridRouter` (aus WP-06) schon. Er "versteht" bereits, was der User will (`DECISION` vs `EMPATHY`).
* Es ist der logisch perfekte Ort, um zu sagen: "Wenn der User im Analyse-Modus ist, sind Fakten-Kanten wichtiger als Gefühls-Kanten."
Damit hast du das perfekte Paket für den nächsten Entwicklungsschritt geschnürt!