Files
glpi-neural-brain/README.md
2026-08-07 21:54:37 +02:00

355 lines
21 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Neural Knowledge Brain
Eigenständiger Go-Dienst für Agent, lokale Knowledgebase, GLPI-Knowledgebase und autonome AI-THINK-Anreicherung. Der Dienst hält einen vollständigen Wissensgraphen im Arbeitsspeicher und rendert eine hierarchisch verdichtete Fullscreen-Ansicht als lebende Hirnaktivität.
## Kernfunktionen
- Fullscreen-Canvas mit 3D-Hirnform, semantischen Cortex-Regionen und hierarchischem Level-of-Detail.
- Drei Visualisierungen: Neural-Brain, gleichmäßige 3D-Honeycomb-Wabe und semantische Constellation-Ansicht mit Themensternen.
- Persistierbarer **ECO**-Modus für schwächere Systeme sowie weiche Node-, Edge- und Ansichtsübergänge ohne sichtbaren Komplett-Reload.
- Laufzeitsteuerung für Learning und Thinking sowie drei einfache, exakte `source`-Filter für Lernen, Anzeige und AI-THINK.
- Echtzeitaktivierung über Server-Sent Events: Nodes glühen, aggregierte Edges leuchten und Partikel folgen tatsächlichen Wissenspfaden.
- Ingest lokaler produktiver Knowledge-JSONs sowie separater AI-THINK-Staging-Dateien.
- Optionaler read-only Ingest sichtbarer Beiträge aus der GLPI-Knowledgebase.
- Read-only Tailing der Agent-`runs.jsonl` und optionale Suchtelemetrie aus Agent und KB.
- Ollama-Pool mit mehreren unabhängigen Instanzen, Routing, Healthchecks, Cooldown und Failover.
- Embeddings über `embeddinggemma`, Beziehungsanalyse über `qwen3:8b`.
- Mehrstufiger AI-THINK-Worker: Relation Thinking, quellengebundene Wissenskonsolidierung, Recherche offener Punkte und reine Knowledge-Synthesis für vollständige KB-Artikel.
- Persistente **Autonomous-Research-Queue**: selbstständige Wissenslückensuche, externe Trigger, Leerlauf-/Budgetsteuerung und niedrig priorisierte Übergabe an den vorhandenen Ollama-Pool.
- Inkrementelle SQLite/WAL-Persistenz über `modernc.org/sqlite`: binäre Float32-Embeddings und standardmäßig alle fünf Minuten gebündelte Row-Updates.
- Separates **BRAIN ANALYSIS CENTER** mit persistenter Laufhistorie, exakten Node-/Edge-/Vektoränderungen, Similarity-/Confidence-Auswertung, Research-Ergebnissen und technischem Roh-Eventstream.
## Vertrauens- und Schreibgrenzen
Das Brain liest produktive Quellen und GLPI-KB ausschließlich. Es schreibt niemals in produktive Knowledge-Dateien oder nach GLPI zurück.
Schreibbar sind nur:
- das eigene `BRAIN_DATA_DIR` für Graphzustand und GLPI-KB-Cache;
- der erste Pfad aus `BRAIN_STAGING_DIRS` für AI-THINK-Entwürfe.
AI-THINK bleibt `auto_reply: false`, trägt die Kategorien `AI-THINK` und `AI-Staging` und wird erst nach einer expliziten Freigabe im bestehenden Editor produktiv. Artikelentwürfe erhalten zusätzlich `AI-Synthesis`; `text` und `answer` enthalten ausschließlich den fachlichen Artikel. Planung, Bewertung, Confidence, Quellen-IDs und Rechercheprotokolle werden separat unter `BRAIN_DATA_DIR/article-metadata/` gespeichert.
## Grounded Knowledge Synthesis
Verwandtes Wissen wird nicht direkt als Bewertungsbericht gespeichert. Die aktive Pipeline arbeitet nach **Research → Generate → Review**: SearXNG sammelt offene deutsch- und englischsprachige Volltexte ohne `site:`-Filter, ein konfigurierbares Autor-Modell (z. B. Gemma) erzeugt daraus zusammen mit den internen KB-Quellen einen vollständigen Artikel und ein getrenntes Reviewer-Modell prüft erst danach den sichtbaren Text Claim für Claim. Vorab erkannte `critical_gaps` oder `ready_for_article=false` blockieren den Draft nicht mehr. Findet der Reviewer unbelegte Aussagen, erzeugt er präzise Nachrecherche-Queries; nur diese Punkte werden recherchiert, der Autor überarbeitet den Artikel und der Reviewer prüft erneut. Im Audit-Sidecar wird zwischen dem gesamten Research-Material und den vom Reviewer tatsächlich als Claim-Beleg verwendeten Quellen unterschieden; nur letztere erhalten am Artikel eine `grounded_by`-Verknüpfung. Konzept-, Referenz- und Entscheidungsartikel behalten ihre artikeltypgerechte Struktur statt künstlich erzeugter Schrittfolgen.
Details: [`KNOWLEDGE-SYNTHESIS.md`](KNOWLEDGE-SYNTHESIS.md) und [`GENERATE-THEN-REVIEW.md`](GENERATE-THEN-REVIEW.md).
## Schnellstart
```bash
cp .env.example .env
# Pfade, Ollama-Pool und optional GLPI-Zugangsdaten anpassen.
set -a; . ./.env; set +a
go run ./cmd/brain
```
Oberfläche: `http://localhost:8090`
Technisches Analyse-Dashboard: `http://localhost:8090/analysis.html`
Das Analyse-Dashboard ist von der animierten Gehirnansicht getrennt. Es bewertet Läufe als positives Ergebnis, Aktualisierung, Bereinigung, Prüfung ohne Übernahme oder Fehler und zeigt die konkret betroffenen Node-, Edge- und Vektor-IDs. Die Historie wird in `graph.db` aufgezeichnet und beginnt ab Installation dieser Version. Details: [`ANALYSIS-DASHBOARD.md`](ANALYSIS-DASHBOARD.md).
Docker:
```bash
docker compose up -d --build
```
## Mehrere Ollama-Instanzen
`OLLAMA_URLS` hat Vorrang vor dem weiterhin unterstützten `OLLAMA_URL`.
```env
OLLAMA_URLS=http://10.20.30.21:11434,http://10.20.30.22:11434,http://10.20.30.23:11434
OLLAMA_NODE_NAMES=gpu-01,gpu-02,gpu-03
OLLAMA_NODE_WEIGHTS=1,1,4
OLLAMA_ROUTING_MODE=least_inflight
OLLAMA_NODE_MAX_INFLIGHT=1
OLLAMA_FAILOVER_ENABLED=true
OLLAMA_FAILOVER_ATTEMPTS=0
OLLAMA_REQUIRE_SAME_MODEL_DIGEST=true
OLLAMA_REQUIRE_EMBEDDING_MODEL=true
```
Unterstützte Routing-Modi:
- `least_inflight` bevorzugt den aktuell am wenigsten belasteten Node;
- `round_robin` zyklische Verteilung;
- `weighted` Verteilung entsprechend `OLLAMA_NODE_WEIGHTS`;
- `fastest_recent` bevorzugt die zuletzt schnellsten Nodes.
Jeder Node muss das Chatmodell besitzen. Mit `OLLAMA_REQUIRE_EMBEDDING_MODEL=true` muss außerdem jeder Node das Embeddingmodell besitzen. Bei aktivierter Digest-Prüfung wird ein Pool mit unterschiedlichen Modellständen fail-closed behandelt.
Mehr Details: [`OLLAMA-POOL.md`](OLLAMA-POOL.md).
## GLPI-Knowledgebase einbeziehen
Die Integration verwendet denselben read-only OAuth-/OpenAPI-Ansatz wie der Agent. GLPI entscheidet anhand des Service-Accounts, welche Beiträge sichtbar sind.
```env
GLPI_KB_ENABLED=true
GLPI_URL=https://glpi.example.org
GLPI_API_VERSION=v2.3
GLPI_CLIENT_ID=...
GLPI_CLIENT_SECRET=...
GLPI_USERNAME=...
GLPI_PASSWORD=...
GLPI_KB_PATH=auto
GLPI_KB_LIMIT=500
GLPI_KB_SYNC_INTERVAL=10m
GLPI_KB_SOURCE=GLPI Knowledge Base
```
Bei `GLPI_KB_PATH=auto` sucht das Brain im GLPI-OpenAPI-Dokument die lesbare `KnowbaseItem`-Collection. Die Beiträge werden als produktive Wissens-Nodes mit `glpi://KnowbaseItem/<id>`-URI aufgenommen. Kategorien und Quelle erzeugen verifizierte Edges. Es gibt keine GLPI-Schreiboperation.
Manueller Sync:
```bash
curl -X POST http://localhost:8090/api/glpi-kb/sync
```
Mehr Details: [`GLPI-KB.md`](GLPI-KB.md).
## SQLite/WAL-Persistenz und Vorberechnung
```env
BRAIN_PERSIST_INTERVAL=5m
```
Der Live-Graph liegt im Arbeitsspeicher. Dauerhaft gespeichert werden nur geänderte Zeilen in `BRAIN_DATA_DIR/graph.db`:
1. AI-THINK-, Metadaten- und Cache-Dateien werden atomar geschrieben;
2. danach folgen geänderte Nodes, Edges und Vektoren in einer SQLite-Transaktion;
3. Embeddings liegen binär als `float32`-BLOBs vor;
4. unveränderte KB-Scans verursachen keine erneuten Graphwrites.
Manueller Flush:
```bash
curl -X POST http://localhost:8090/api/flush
```
Ein auf einem leistungsfähigen System vorberechneter Graph kann kompakt exportiert und auf ein System mit identischen Dokument-IDs und demselben Embedding-Modell kopiert werden:
```bash
curl -fsS http://localhost:8090/api/state/export -o graph.db
```
Mehr Details: [`PERSISTENCE.md`](PERSISTENCE.md) und [`SQLITE-STORAGE.md`](SQLITE-STORAGE.md).
## Laufzeitsteuerung, Visualisierungen und Performance
Die untere Steuerleiste enthält direkte Schalter für **LEARNING**, **THINKING**, **NEURAL**, **HONEYCOMB**, **CONSTELLATION** und **ECO**. Sind Learning und Thinking deaktiviert, bleibt das System im Living-Modus; eingehende Agent- oder KB-Anfragen können weiterhin die tatsächlich verwendeten Notes aktivieren.
Über **FILTER** werden ausschließlich die exakten Werte des JSON-Feldes `source` ausgewählt. Es gibt keine Kategoriefilter, keine technische `origin`-Aliasauflösung und keine Schnittmenge aus Environment und WebUI mehr.
- **Lernen**: Nur Nodes mit exakt passendem `source` erhalten neue Embeddings und dürfen bei semantischen Abfragen verwendet werden.
- **Anzeige**: Nur Nodes mit exakt passendem `source` werden gerendert; direkt verbundene Kategorie-, Quellen- und Konzept-Nodes bleiben als visuelle Taxonomie sichtbar.
- **Thinking**: Nur Nodes und explizit mit einer Quelle versehene Webbelege mit exakt passendem `source` dürfen neue Relationen und Artikel speisen.
Mehrere ausgewählte Quellen verwenden ODER-Semantik. Eine leere Liste bedeutet „alle Quellen“. Der Vergleich ist nach dem Entfernen äußerer Leerzeichen **case-sensitiv und exakt**:
```text
source: "internal-category" passt zu internal-category
source: "internal-category" passt nicht zu Internal-Category
source: "GLPI Knowledge Base" passt nicht zu glpi-kb
```
Der GLPI-Quellenname stammt ausschließlich aus:
```env
GLPI_KB_SOURCE=GLPI Knowledge Base
```
Dieser Wert wird in der WebUI immer als Auswahl angeboten, auch wenn GLPI noch nicht synchronisiert wurde oder aktuell 0 Beiträge vorhanden sind.
Die folgenden Environment-Variablen sind nur Startwerte, wenn noch keine neue versionierte `runtime-settings.json` existiert. Danach ist die WebUI-Auswahl die einzige aktive Konfiguration; es gibt keine zusätzliche Environment-Obergrenze:
```env
BRAIN_LEARNING_ENABLED=true
BRAIN_THINKING_ENABLED=true
# Exakte Werte des KB-JSON-Feldes source; leer = alle
BRAIN_LEARNING_SOURCES=
BRAIN_DISPLAY_SOURCES=
BRAIN_THINKING_SOURCES=
BRAIN_DEFAULT_VIEW=neural # neural | honeycomb | constellation
BRAIN_MAX_DISPLAY_NODES=0 # 0 = unbegrenzt; alternativ z. B. 5000
BRAIN_LOW_POWER_MODE=false
```
Alte `learning_categories`, `display_categories`, `thinking_categories` und frühere unversionierte Source-Filter werden beim ersten Start dieser Version bewusst ignoriert. Schalter, Ansicht und Performancewerte bleiben erhalten. Beim nächsten Speichern schreibt die WebUI `source_filter_version: 1`. `graph.db` muss dafür nicht gelöscht werden.
Die Ansichten erfüllen unterschiedliche Aufgaben:
- **Neural** zeigt das lebende semantische Netz mit LOD, Cortex, Synapsen und Partikeln.
- **Honeycomb** rendert `knowledge`, `ai-think` und `external` gleichmäßig in einer 3D-Gehirnwabe. Reguläre Edges und Cortex-Flächen bleiben dort unsichtbar.
- **Constellation** ordnet Wissenselemente als Themensterne um semantische Zentren an. Dezente Bahnen und aggregierte Themenverbindungen machen Fachgebiete und Übergänge leichter lesbar als ein dichtes Gesamtnetz.
Der **ECO**-Schalter begrenzt die Ausgabe auf ungefähr 30 FPS, reduziert die Device-Pixel-Ratio, teure Gradienten, Hintergrundsterne, gleichzeitig sichtbare inaktive Edges, Partikel und Wolken. Aktivierte Nodes, SearXNG-Animationen, Themenzentren und Übergänge bleiben sichtbar. Das ist zusätzlich zum GPU-Node-Limit; der ECO-Modus entfernt keine Wissenselemente.
Graphupdates verändern vorhandene Node-Objekte und Positionen in-place. Neue Elemente blenden ein, entfernte Elemente blenden aus, Ansichtswechsel morphen zwischen den Koordinatenräumen. Unveränderte Snapshots werden übersprungen und reine Edgeupdates lösen keinen vollständigen Layout-Neuaufbau aus.
Mehr Details: [`SOURCE-ONLY-FILTERS.md`](SOURCE-ONLY-FILTERS.md), [`VISUALIZATION-PERFORMANCE.md`](VISUALIZATION-PERFORMANCE.md) und [`RUNTIME-CONTROLS-HONEYCOMB.md`](RUNTIME-CONTROLS-HONEYCOMB.md).
## Autonomous Research: selbstständige Wissensanreicherung
Die Webrecherche ist nicht mehr an einen einzelnen AI-THINK-Artikelversuch gebunden. Ein eigener Opportunity-Scanner bewertet den Graphen regelmäßig auf Widersprüche, fehlende externe Evidenz, Alter, Zentralität und schwache Verknüpfung. Qwen zerlegt geeignete Kandidaten in konkrete Forschungsfragen sowie deutsche und englische SearXNG-Queries.
Aufgaben landen zuerst persistent in `graph.db`. Ein Low-Priority-Worker least genau eine Aufgabe, prüft Leerlauf und Tagesbudget und verwendet danach die bestehende iterative SearXNG-/Volltext-/Evidenzpipeline. SearXNG-Suchen, Volltextabrufe und Ollama-Aufrufe teilen jetzt zusätzlich eine gemeinsame begrenzte Work-Queue. Semantisch äquivalente Research-Intents werden über Embeddings erkannt: läuft bereits eine gleichbedeutende Recherche, wartet der zweite Auftrag auf ihr Ergebnis; kürzlich abgeschlossene Evidenz kann ohne erneuten Webabruf wiederverwendet werden. Deutsche und englische Query-Varianten innerhalb derselben Forschungsfrage bleiben ausdrücklich erhalten.
```env
BRAIN_AUTONOMOUS_RESEARCH_ENABLED=false
BRAIN_AUTONOMOUS_RESEARCH_IDLE_ONLY=true
BRAIN_AUTONOMOUS_RESEARCH_INTERVAL=30m
BRAIN_AUTONOMOUS_RESEARCH_TASKS_PER_CYCLE=1
BRAIN_AUTONOMOUS_RESEARCH_MAX_TASKS_PER_DAY=12
BRAIN_AUTONOMOUS_RESEARCH_MAX_QUERIES_PER_TASK=6
BRAIN_AUTONOMOUS_RESEARCH_MAX_PAGES_PER_TASK=8
BRAIN_AUTONOMOUS_RESEARCH_MAX_ROUNDS=3
BRAIN_AUTONOMOUS_RESEARCH_MIN_PRIORITY=0.65
BRAIN_AUTONOMOUS_RESEARCH_COOLDOWN=168h
BRAIN_AUTONOMOUS_RESEARCH_LEASE=45m
BRAIN_AUTONOMOUS_RESEARCH_MAX_ATTEMPTS=3
BRAIN_AUTONOMOUS_RESEARCH_QUERY_TRIGGERS=true
BRAIN_AUTONOMOUS_RESEARCH_OPPORTUNITY_LIMIT=8
```
Der Agent oder andere Systeme können über `POST /api/research/tasks` explizit Aufgaben einreihen. Die Eventtypen `knowledge.answer_insufficient`, `knowledge.search.empty` und `agent.answer.uncertain` erzeugen über `/api/events` ebenfalls eine priorisierte Aufgabe. Die WebUI zeigt Queue, Status, Evidenzzahl und Versuche und bietet manuelles Einreihen, Graphanalyse, Queue-Wakeup sowie Abbruch wartender Aufgaben.
Die aktualisierten Integrationspatches unter `integrations/agent/` und `integrations/knowledgebase/` senden bei einer Suche ohne Treffer automatisch `knowledge.search.empty`; die Telemetrie bleibt asynchron und fail-open.
Akzeptierte Webbelege werden automatisch gelernt und verknüpft. Neue oder überarbeitete Artikel bleiben weiterhin ausschließlich im AI-Staging und benötigen eine manuelle Freigabe.
Details: [`AUTONOMOUS-RESEARCH.md`](AUTONOMOUS-RESEARCH.md).
## Autonome Anreicherung
Der Worker arbeitet bewusst sequenziell, trennt aber jetzt zwei Aufgaben:
1. Kandidatenpaar aus bestehenden Vektoren auswählen;
2. **Relation Thinking** bewertet ausschließlich die Beziehung und erzeugt eine Edge oder verwirft sie;
3. bei einer bestätigten Relation werden drei bis acht verwandte interne Quellen gesammelt;
4. ein Planungsaufruf entscheidet `create`, `update`, `merge` oder `skip` und formuliert Research-Themen;
5. SearXNG sammelt passende Volltexte als Materialpool, ohne vor dem Draft jede Quelle durch ein weiteres LLM freigeben zu lassen;
6. `BRAIN_ARTICLE_SYNTHESIS_MODEL` schreibt den vollständigen Artikel;
7. `BRAIN_ARTICLE_REVIEW_MODEL` prüft den fertigen Text Claim für Claim und kann eine gezielte Research-/Rewrite-Runde auslösen;
8. nur der akzeptierte Artikel landet als `AI-THINK` / `AI-Staging` / `AI-Synthesis` im Staging;
9. der In-Memory-Graph sieht den Entwurf sofort, die Datei wird beim nächsten gebündelten Persistenz-Flush atomar geschrieben.
Qualitätsregeln verhindern reine AI-THINK-Ketten: standardmäßig mindestens drei produktive Quellen, mindestens 70 Prozent Produktionswissen und maximal Generierungstiefe zwei.
```env
BRAIN_AUTO_ENRICH=true
BRAIN_ENRICH_INTERVAL=90s
BRAIN_ENRICH_BATCH_SIZE=3
BRAIN_ENRICH_STEP_DELAY=3s
BRAIN_ARTICLE_SYNTHESIS_ENABLED=true
BRAIN_ARTICLE_LANGUAGE=de-DE
BRAIN_ARTICLE_SYNTHESIS_MODEL=gemma3:12b
BRAIN_ARTICLE_REVIEW_MODEL=qwen3:8b
BRAIN_ARTICLE_REVIEW_REPAIR_ROUNDS=1
BRAIN_ARTICLE_MIN_SOURCES=3
BRAIN_ARTICLE_MAX_SOURCES=8
BRAIN_ARTICLE_MIN_PRODUCTION_RATIO=0.70
BRAIN_ARTICLE_MAX_GENERATION_DEPTH=2
BRAIN_ARTICLE_MIN_CONFIDENCE=0.74
# offene, recall-orientierte Recherche
BRAIN_ARTICLE_RESEARCH_RESULTS=12
BRAIN_ARTICLE_RESEARCH_FETCH_RESULTS=6
BRAIN_ARTICLE_RESEARCH_EXPLORATION_RESULTS=3
BRAIN_ARTICLE_RESEARCH_PREFETCH_MIN_RELEVANCE=0.25
BRAIN_ARTICLE_RESEARCH_MIN_RELEVANCE=0.55
BRAIN_ARTICLE_RESEARCH_MIN_QUALITY=0.35
# gemeinsame Research/Ollama-Queue und semantische Deduplizierung
BRAIN_RESEARCH_OLLAMA_MAX_INFLIGHT=2
BRAIN_RESEARCH_OLLAMA_QUEUE_SIZE=64
BRAIN_RESEARCH_DEDUPE_THRESHOLD=0.92
BRAIN_RESEARCH_DEDUPE_TTL=45m
```
Details: [`KNOWLEDGE-SYNTHESIS.md`](KNOWLEDGE-SYNTHESIS.md).
Der manuelle AI-THINK-Button bleibt vorhanden. Alternativ:
```bash
curl -X POST 'http://localhost:8090/api/enrich?async=1'
```
## HTTP-Endpunkte
| Methode | Pfad | Zweck |
|---|---|---|
| `GET` | `/api/status` | Gesamtstatus inklusive Ollama-Pool, GLPI-KB und Persistenzqueue |
| `GET` | `/api/graph` | vollständiger aktueller In-Memory-Graph |
| `GET` | `/api/analysis` | strukturelle Graphanalyse |
| `GET` | `/api/analysis/dashboard` | detaillierte aktuelle Analyse, Laufhistorie, Zeitreihe und konkretes Änderungsjournal |
| `GET` | `/api/analysis/export` | vollständige Analyse als formatiertes JSON exportieren |
| `GET` | `/api/runtime-settings` | aktuelle Learning-, Thinking-, exakte Source- und View-Einstellungen |
| `PUT` | `/api/runtime-settings` | Laufzeiteinstellungen ändern und gebündelt persistieren |
| `GET` | `/api/sources` | exakte `source`-Werte mit Anzahl; enthält immer `GLPI_KB_SOURCE` |
| `GET` | `/api/stream` | SSE-Aktivitätsstrom |
| `POST` | `/api/query` | programmatische Wissensanfrage; in der Fullscreen-UI verborgen |
| `POST` | `/api/events` | optionale Agent-/KB-Telemetrie |
| `POST` | `/api/reindex` | lokaler Scan und Embedding-Abgleich |
| `POST` | `/api/enrich` | AI-THINK-Zyklus einplanen/ausführen |
| `POST` | `/api/glpi-kb/sync` | GLPI-KB manuell synchronisieren |
| `POST` | `/api/flush` | ausstehende Dateien und geänderte SQLite-Zeilen sofort persistieren |
| `GET` | `/api/state/export` | kompakte, konsistente `graph.db` exportieren |
| `GET` | `/api/research/tasks` | persistente autonome Research-Queue und Workerstatus |
| `POST` | `/api/research/tasks` | externe oder manuelle Rechercheaufgabe asynchron einreihen |
| `POST` | `/api/research/tasks/{id}/cancel` | wartende, zurückgestellte oder reservierte Aufgabe abbrechen |
| `POST` | `/api/research/autonomous/scan` | Graph sofort nach Wissenslücken analysieren |
| `POST` | `/api/research/autonomous/run` | wartende Queue ohne Umgehung der Kapazitätsregeln wecken |
Mit `BRAIN_API_KEY` werden POST-Endpunkte über `Authorization: Bearer …` oder `X-Brain-Key` geschützt.
## Statusdiagnose
```bash
curl http://localhost:8090/api/status | jq
```
Wichtige Bereiche:
- `ollama_pool.nodes[]`: Health, Kompatibilität, Inflight, Requests, Fehler und mittlere Laufzeit;
- `glpi_kb`: letzter Sync, Dokumentanzahl, Pfad und Fehler;
- `persistence`: ausstehende Dateien, Dirty-Status, letzter Flush und Flush-Fehler;
- `graph_storage`: SQLite-/WAL-Größe, Vector-Bytes, Row-Anzahl und ausstehende Änderungen;
- `enrich_*`: Zustand des AI-THINK-Workers;
- `autonomous_research`: Queue-Zähler, laufende Aufgabe, Budgetparameter, letzte Fehler sowie gelernte Evidenz und erzeugte Staging-Artikel;
- `relations_created`, `articles_created`, `articles_skipped`: getrennte Relation- und Artikelergebnisse.
## Validierung
```bash
go test ./...
go vet ./...
node --check internal/web/static/app.js
node --check internal/web/static/analysis.js
```
## Sichtbare SearXNG-Recherche
SearXNG-Suchen werden als eigenständige Aktivität visualisiert. Scanringe markieren die laufende Suche, gefundene Quellen erscheinen als externe Quellenpunkte und fließen anschließend in die neu erzeugten Forschungs-Nodes. Die Animation bleibt bei der Aktualisierung des Graphen bestehen und läuft nach dem Einblenden der neuen Nodes mindestens zwei Sekunden weiter.
Unter **FILTER → SearXNG-Diagnose** kann eine direkte Testsuche ausgeführt werden. Diese umgeht die fachliche Qwen-Entscheidung, verändert den Graphen nicht und zeigt eindeutig:
- die tatsächlich verwendete Basis-URL,
- HTTP-Status und Content-Type,
- Trefferzahl und Laufzeit,
- DNS-, Netzwerk-, TLS-, HTTP- und JSON-Fehler,
- bei Fehlern den Antwortausschnitt von SearXNG oder Reverse Proxy.
Die automatische Artikelrecherche sammelt deutsch/englisches Volltextmaterial ohne `site:`-Filter. Ein separates Autor-Modell erzeugt daraus den Artikel; erst danach prüft das Reviewer-Modell den sichtbaren Text Claim für Claim und kann gezielte Nachrecherche auslösen. Im Analyse-Center zeigt der Ollama-Status außerdem aktive/wartende Einträge der gemeinsamen Research/Ollama-Queue sowie die Verfügbarkeit von Autor- und Reviewer-Modell. Die API-Endpunkte sind `GET /api/research/status` und `POST /api/research/test`. Details stehen in `SEARXNG-VISUALIZATION.md` und `GENERATE-THEN-REVIEW.md`.
## Cluster/Fast-Verarbeitungsmodus
Für große Wissensgraphen kann neben dem bisherigen präzisen Vollscan der Modus `BRAIN_PROCESSING_MODE=clustered` verwendet werden. Er nutzt Semantic Hashing zur Kandidatenvorsortierung, berechnet exakte Cosine-Nähe nur für eine kleine Top-K-Shortlist, reduziert die Artikelquellenauswahl und verkleinert den Reviewer-Kontext. Der finale Claim-Review bleibt erhalten. Details: `CLUSTER-FAST-MODE.md`.