14 KiB
📘 Mindnet Skript-Handbuch (aktualisiert)
Dieses Handbuch dokumentiert die Skripte und Tests für das Projekt mindnet Wissensnetzwerk.
Es beschreibt Zweck, Parameter, typische Aufrufe sowie aktuelle Verhaltensweisen (Hash-Modi, Parser-Robustheit, window/text-Trennung in Chunks, Export-Fixes).
Alle Beispiele sind so formatiert, dass sie direkt kopierbar sind. Code/CLI-Beispiele sind eingerückt, damit die Markdown-Darstellung nicht abbricht.
0) Umgebung & Konfiguration
Wichtige ENV-Variablen
QDRANT_URL– z. B.http://localhost:6333QDRANT_API_KEY– API-Key (falls aktiviert)COLLECTION_PREFIX– Prefix der drei Collections, Standard:mindnet→mindnet_notes,mindnet_chunks,mindnet_edgesVECTOR_DIM– Embedding-Dimension (Chunks), Standard:384
Hash-Vergleich & Änderungserkennung
MINDNET_HASH_COMPARE– steuert, welcher Anteil für „changed“ verglichen wird
Werte:Body(Standard),Frontmatter,FullMINDNET_HASH_SOURCE– Quelle:parsed(Standard),raw,fileMINDNET_HASH_NORMALIZE– Normalisierung:canonical(Standard) odernone
Beispiel (nur Body berücksichtigen, kanonisch, geparst):
export MINDNET_HASH_COMPARE=Body
export MINDNET_HASH_SOURCE=parsed
export MINDNET_HASH_NORMALIZE=canonical
source .venv/bin/activate
Baseline-Signaturen (mehrere Modi):
Der Importer kann Signaturen aller Modi (Body/Frontmatter/Full) vorhalten, damit spätere Moduswechsel deterministisch sind (keine „Mass-Changes“). Siehe --baseline-modes unter Importer.
1) Vault anlegen (für Tests)
scripts/make_test_vault.py
Zweck:
Erstellt einen kleinen, nachvollziehbaren Test-Vault mit Markdown-Dateien.
Szenarien: offene Links, nachträgliche Anlage fehlender Notes, geänderte Chunk-Grenzen.
Parameter:
--out PATH: Zielverzeichnis (Default:./test_vault)--force: Existierenden Ordner löschen und neu anlegen--with-missing: Optional – auch diemissing-notegleich anlegen
Hinweise für Tests
- Erster Import (dry-run oder
--apply): Es gibt einen „leeren“ Link[[missing-note]]. - Lege danach eine Datei für „missing-note“ an (mit gleicher
idim YAML) und importiere erneut:
→ Erwartung: Edges für ehemals leeren Link werden korrekt nachgezogen (references+backlink). - Ändere den Body von
exp-one.mdso, dass andere Chunk-Grenzen entstehen und importiere erneut:
→ Erwartung: Chunks/Edges/Note werden für betroffene Noten aktualisiert.
Kompatibilität:
note.schema.json:created/updatedsind Strings.
Beispiele:
python3 -m scripts.make_test_vault --out ./test_vault --force
python3 -m scripts.make_test_vault --out ./test_vault --force --with-missing
2) Import in Qdrant
scripts/import_markdown.py
Zweck:
Importiert Notes/Chunks/Edges aus einem Vault nach Qdrant.
- validiert Frontmatter
- chunked Inhalte + Embeddings
- erzeugt Edges (
references,references_at,backlink,next,prev,belongs_to) - erkennt geänderte Dateien modusgesteuert (Body/Frontmatter/Full)
- optional: Purge der alten Chunks/Edges pro Note
Parameter:
--vault PATH: (Pflicht) Vault-Verzeichnis--apply: Änderungen wirklich durchführen (ohne: Dry-Run)--purge-before-upsert: Vor Upsert alte Chunks/Edges nur der geänderten Notes löschen--prefix STR: überschreibtCOLLECTION_PREFIX--note-id ID: nur eine bestimmte Note importieren--note-scope-refs: zusätzlich note-weitereferenceserzeugen (nicht nur chunk-weise)--baseline-modes: berechne & speichere Hash-Signaturen für alle Modi (Body,Frontmatter,Full) als Baseline
Erwartetes Verhalten:
- Unveränderte Notes →
"changed": false, Entscheidung:apply-skip-unchanged(bei--apply) - Geänderte Notes →
"changed": true(abhängig vonMINDNET_HASH_COMPARE) - Idempotenz: mehrfacher Lauf ohne Änderungen erzeugt keine neuen Punkte
- Baseline: Bei
--baseline-modeserscheinen Felder wiehash_signature,hash_fulltext, ggf.hash_frontmatterundneeds_baseline_for_mode: falsebei Folgeläufen.
Beispiele:
# Dry-Run (zeigt Änderungen, schreibt NICHT)
python3 -m scripts.import_markdown --vault ./vault --prefix mindnet
# Apply + gezielte Vorreinigung pro geänderter Note
python3 -m scripts.import_markdown --vault ./vault --prefix mindnet --apply --purge-before-upsert
# Baseline-Signaturen aller Modi vorhalten
python3 -m scripts.import_markdown --vault ./vault --apply --baseline-modes
Hash-Modi in der Praxis:
MINDNET_HASH_COMPARE=Body→ Änderungen im Body werden erkannt; reine Frontmatter-Änderungen bleiben ohne Effekt.MINDNET_HASH_COMPARE=Frontmatter→ nur Frontmatter maßgeblich.MINDNET_HASH_COMPARE=Full→ beide Anteile zählen.
3) Konsistenzprüfungen
scripts/audit_vault_vs_qdrant.py
Zweck:
Vergleicht Vault-Inhalte mit Qdrant.
- Zählt Notes/Chunks/Edges
- Verifiziert Anzahl Wikilinks vs. Edges
- Meldet Deltas (z. B.
referencesim Vault vs. in Qdrant)
Parameter:
--vault PATH: Vault-Verzeichnis--prefix STR: Prefix für Qdrant-Collections (Default:mindnet)
Beispiel:
python3 -m scripts.audit_vault_vs_qdrant --vault ./vault --prefix mindnet
scripts/validate_edges.py
Zweck:
Prüft die Edges-Collection in Qdrant.
- Zählt Edges pro Typ (
references,references_at,backlink,next,prev,belongs_to) - Kontrolliert Invarianten (z. B. jede
referenceshat einenbacklink) - Listet
unresolvedEdges auf
Parameter:
--prefix STR: Prefix für Qdrant-Collections--details: Detailausgabe mit Beispielen
Beispiel:
python3 -m scripts.validate_edges --prefix mindnet --details
4) Export Qdrant → Markdown (Vault)
scripts/export_markdown.py
Zweck:
Exportiert Notes + rekonstruierten Body in einen Zielordner.
- Pfade werden relativ aus
note.payload.pathabgeleitet (führende/entfernt, Backslashes → Slashes; Unicode-NFC empfohlen) - Body-Rekonstruktion priorisiert:
fulltext(falls in Note-Payload vorhanden)- sonst Chunks: Sortierung
seq→chunk_index→ Nummer inchunk_id; nurtext(Overlap bereits entfernt)
--prefix(CLI) wird unterstützt (oder ENVCOLLECTION_PREFIX)
Parameter:
--out PATH: Ziel-Root (muss existieren)--overwrite: vorhandene Dateien überschreiben--note-id ID: nur eine bestimmte Note exportieren--prefix STR: überschreibtCOLLECTION_PREFIX--include-edges {none,footer,yaml}(optional, falls aktiviert): Edges als YAML-Liste im Frontmatter oder im Footer beilegen
Beispiele:
export COLLECTION_PREFIX="mindnet"
python3 -m scripts.export_markdown --out ./_exportVault
# Nur eine bestimmte Note:
python3 -m scripts.export_markdown --out ./_exportVault --note-id 20250821-architektur-ki-trainerassistent-761cfe
# Existierende Dateien überschreiben:
python3 -m scripts.export_markdown --out ./_exportVault --overwrite
5) Qdrant zurücksetzen
scripts/reset_qdrant.py
Zweck:
Setzt die Qdrant-Collections zurück.
wipe: löscht Collections komplett (inkl. Schema)truncate: löscht nur Inhalte, behält Collectionstruncate-edges: löscht nur Punkte in*_edges
Parameter:
--mode {wipe,truncate,truncate-edges}--prefix STR: Prefix der Collections (Default:mindnet)--yes: Automatische Bestätigung--dry-run: Nur anzeigen, nicht ausführen
Beispiele:
python3 -m scripts.reset_qdrant --mode truncate-edges --prefix mindnet
python3 -m scripts.reset_qdrant --mode truncate --prefix mindnet --yes
python3 -m scripts.reset_qdrant --mode wipe --prefix mindnet --yes
6) Diagnose & Tools
scripts/diagnose_changed.py
Zweck:
Prüft, ob Datei-Hashes (sha256) mit gespeicherten hash_* in Qdrant übereinstimmen.
Hilft, wenn der Importer zu viele Dateien als „changed“ erkennt oder Moduswechsel geplant sind.
Parameter:
--vault PATH: Vault-Verzeichnis--prefix STR: Prefix (Default:mindnet)--note-id ID: Nur bestimmte Note prüfen--all: Alle Notes prüfen
Beispiel:
python3 -m scripts.diagnose_changed --vault ./vault --prefix mindnet --all
scripts/resolve_unresolved_references.py
Zweck:
Prüft offene Wikilinks (status=unresolved) und fügt Edges nach, wenn inzwischen passende Notizen existieren.
Ersetzt unresolved durch gültige references/backlink.
Parameter:
--prefix STR: Prefix für Qdrant-Collections--apply: Änderungen wirklich ausführen (sonst nur Vorschau)
Beispiele:
python3 -m scripts.resolve_unresolved_references --prefix mindnet
python3 -m scripts.resolve_unresolved_references --prefix mindnet --apply
7) Parser-Verhalten (robust & abwärtskompatibel)
- Der Parser liest Markdown fehlertolerant (UTF-8 mit Fallbacks), extrahiert YAML-Frontmatter und Body.
- Keine harten Abhängigkeiten von alten Regex-Symbolen (
FRONTMATTER_REentfällt zugunsten interner Marker). read_markdown(path)gibt(frontmatter_dict, body_str)zurück.- Sonderfälle aus Fremd-Tools (z. B. Silverbullet-Dateien wie
CONFIG.md,index.md) werden nicht importiert, sofern sie nicht zum Vault gehören.
8) Chunk-Payload (Fenster vs. Kern)
window= kontextualisierter Fenster-Text (mit linkem Overlap)text= Kerntext ohne das vom vorherigen Chunk übernommene Overlap- Felder:
start,end,overlap_left,overlap_right,chunk_index,seq,path,section_title,section_path,token_count(falls vorhanden) - Fallback (synthetisch): Falls der Chunker keinen Overlap-Fenstertext liefert, erzeugt die Payload-Schicht Fenster mit typgerechtem Overlap aus
chunk_config.get_sizes(type)['overlap'](unterer Wert). - Edges werden aus
windowabgeleitet (um Links an Chunk-Grenzen nicht zu verlieren); der Export rekonstruiert den Body austext(Overlap-frei).
9) Edge-Modell & IDs
- Collections:
*_notes(optional Vektor / Nullvektor),*_chunks(384-d Embeddings),*_edges(1-d Dummy-Vektor) - Deterministische IDs (UUIDv5 / stabile Keys):
note_idstabil aus Frontmatter/Slugchunk_idi. d. R.note_id#<n>edge_idstabil aus(kind, source_id, target_id, seq)
- Kantenarten:
references,references_at,backlink,next,prev,belongs_to unresolvedwird gekennzeichnet und kann per Resolver später aufgelöst werden.
10) Tests & Qualitätssicherung
Tests unter tests/
check_chunks_window_vs_text.py– vergleicht je Chunkwindowvs.text, schätzt Overlapcompare_vaults.py– rekursiver Vault-Vergleich (Body/Frontmatter/All, Key: auto/id/title/filename), Unicode-NFC-robustverify_chunks_integrity.py– prüft, ob Rekonstruktion aus Chunks (text) zufulltextbzw. zum Vault-Body passtlist_md_seen_by_importer.py– zeigt, welche.mdder Importer sieht (inkl. Gründe/Filter)inspect_one_note.py– Parser-Diagnose für eine konkrete Dateirun_e2e_roundtrip.sh– End-to-End: Reset → Import → Audit → (optional) Hash-Reporter → Export → Vergleich
Typische Aufrufe:
# Overlap-Qualität (Fenster vs. Kern)
python3 tests/check_chunks_window_vs_text.py --prefix "$COLLECTION_PREFIX"
# Roundtrip-Vergleich (rekursiv)
python3 tests/compare_vaults.py --src ./vault --dst ./_exportVault --focus body
# Chunks-Rekonstruktion (gegen Vault-Body)
python3 tests/verify_chunks_integrity.py --prefix "$COLLECTION_PREFIX" --vault ./vault
11) Typische Workflows
A) Clean-Start mit Test-Vault
python3 -m scripts.make_test_vault --out ./test_vault --force
python3 -m scripts.reset_qdrant --mode truncate --prefix mindnet --yes
python3 -m scripts.import_markdown --vault ./test_vault --prefix mindnet
python3 -m scripts.import_markdown --vault ./test_vault --prefix mindnet --apply --purge-before-upsert
python3 -m scripts.audit_vault_vs_qdrant --vault ./test_vault --prefix mindnet
python3 -m scripts.validate_edges --prefix mindnet --details
export COLLECTION_PREFIX="mindnet"
python3 -m scripts.export_markdown --out ./_exportVault
B) Änderungs-Propagation & Idempotenz
python3 -m scripts.import_markdown --vault ./test_vault --prefix mindnet
python3 -m scripts.import_markdown --vault ./test_vault --prefix mindnet --apply --purge-before-upsert
python3 -m scripts.audit_vault_vs_qdrant --vault ./test_vault --prefix mindnet
python3 -m scripts.validate_edges --prefix mindnet --details
python3 -m scripts.import_markdown --vault ./test_vault --prefix mindnet
C) Unresolved Links lösen
python3 -m scripts.import_markdown --vault ./test_vault --apply --prefix mindnet
python3 -m scripts.resolve_unresolved_references --prefix mindnet --apply
python3 -m scripts.validate_edges --prefix mindnet --details
D) Export & Roundtrip (Produkt-Vault)
export COLLECTION_PREFIX="mindnet"
python3 -m scripts.import_markdown --vault ./vault --apply --purge-before-upsert --prefix "$COLLECTION_PREFIX"
python3 -m scripts.export_markdown --out ./_exportVault --prefix "$COLLECTION_PREFIX"
python3 tests/compare_vaults.py --src ./vault --dst ./_exportVault --focus body
12) Troubleshooting (kurz)
- Importer markiert alle als changed (Moduswechsel):
→--baseline-modeseinmalig laufen lassen; sicherstellen:MINDNET_HASH_COMPAREpasst zum Ziel. - Edges verschwinden / nur 1 Edge sichtbar:
→app/core/qdrant_points.pymuss Edge-Payload normalisieren (Schema Alt/Neu) undedge_ideindeutig bilden. - Export ohne Body / falsches Zielverzeichnis:
→ Exporter nutzt relativierte Pfade und rekonstruiert Body ausfulltextoder Chunks (text). ENV/CLI--prefixbeachten. - Parser-Fehler (UTF-8):
→ Neuer Parser arbeitet mit Fallbacks; mittests/inspect_one_note.pyprüfen, was ankommt. - „Fehlende“ Dateien im Vergleich:
→ Prüfe, ob Dateien wirklich zum Vault gehören (z. B. Silverbullet-ArtefakteCONFIG.md,index.mdausblenden).
13) Hinweise zu Silverbullet-Dateien
- Dateien wie
CONFIG.mdoderindex.md, die nicht zum inhaltlichen Vault gehören, werden nicht importiert und erscheinen daher nicht im Export-Roundtrip. - Diese Dateien bitte vom produktiven Vault trennen oder im Vergleich (`tests/compare_vaults.py