vector drift

vector drift listet jede Entität, die im Graph-Index existiert, aber im Vektor-Index entweder fehlt oder veraltet ist. „Veraltet" heißt: die persistierten content_hash-Werte stimmen nicht mehr mit dem überein, was der Chunker für die aktuelle Datei produzieren würde — die Datei wurde geändert, das Embedding hat den Sprung nicht mitgemacht. Reine Lese-Operation; weder Graph noch Vektor-Index werden angefasst.

Wofür ist das?

Aufruf

apparat vector drift --vault=recherche
apparat vector drift --vault=recherche --all
apparat vector drift --vault=recherche --no-stale     # nur fehlende, kein Inhalts-Scan
Option Bedeutung
`--vault=<name path
--all Druckt jede gemeldete Entität pro Kategorie, statt der ersten 25. Sinnvoll bei großen Backlogs für Skripte oder Logs.
--no-stale Überspringt den Inhalts-Drift-Scan (Chunker-Re-Pass) und meldet nur Entitäten, die ganz fehlen. Schneller bei großen Vaults — vor allem dann hilfreich, wenn der Watcher nachweislich gesund war.

Was kostet der Stale-Scan?

Stale-Detection läuft den Chunker einmal pro indizierter Entität an und vergleicht die Hashes gegen die persistierten Werte. Keine Ollama-Aufrufe — der Scan ist rein CPU/Disk. Auf einem 1000-Entity-Vault sind das wenige Sekunden, auf einem 10k-Vault einige Zehner-Sekunden. Wer den Scan in einem Skript häufig laufen lässt und auf Geschwindigkeit drückt, nutzt --no-stale; für die normale Diagnose ist der Default-Pfad richtig.

Beispielausgabe

Mit Drift in beiden Kategorien:

Vault "recherche" — vector index drift:

  Missing (no chunks in the index):
    WWaWQ2ze  Tollwerk GmbH
    V1StGXRa  Maria Beispiel

  Stale (persisted chunks no longer match the file body):
    Qw9pLm2n  Beispiel-Organisation

(2 missing, 1 stale, of 1000 entities total.)

Mit vielen fehlenden, ohne --all:

Vault "recherche" — vector index drift:

  Missing (no chunks in the index):
    abc12345  Erste Entität
    def67890  Zweite Entität
    …
    … 117 more (use --all to list every entity).

(142 missing, 0 stale, of 1000 entities total.)

Index vollständig und aktuell:

✅ Vault "recherche" — vector index in sync (1000 entities, all embedded and current).

Exit-Codes

Code Bedeutung
0 Jede Entität hat mindestens einen Chunk im Index, und alle Hashes stimmen mit der Datei überein — keine Drift.
1 Vault konnte nicht aufgelöst werden, oder die Vektor-Datenbank ist nicht öffenbar (z. B. fehlende sqlite-vec-Extension auf dem Host).
2 Mindestens eine Entität fehlt im Index oder ist veraltet. Die Liste in der Ausgabe nennt sie nach Kategorie.

Die Trennung 0/2 ist mit Absicht so geschnitten wie bei vault validate: Code 1 ist „Kommando hat nicht funktioniert", Code 2 ist „Kommando hat funktioniert und einen meldewürdigen Befund geliefert". Monitoring-Skripte können Drift damit von Infrastruktur-Fehlern unterscheiden.

Verwandte Aufgaben

vector drift ist reine Diagnose. Wer den Backlog abarbeiten will, ruft anschließend vector rebuild auf. Ein Aufruf gegen einen leeren Index ist kein Fehler — er liefert dann schlicht „N of N missing", was den Anstoß zum ersten Index-Aufbau gibt. Der Embedding-Dienst wird nicht angefragt; die Erkennung läuft rein lokal über einen Datei-Vergleich.