mindnet_obsidian/docs/CHAIN_INSPECTOR_V0_REPORT.md
Lars b0efa32c66
Some checks are pending
Node.js build / build (20.x) (push) Waiting to run
Node.js build / build (22.x) (push) Waiting to run
Implement chain roles and templates management in Mindnet plugin
- Added support for loading and reloading chain roles and templates from specified YAML configuration files, enhancing the plugin's flexibility.
- Introduced new settings for defining paths to chain roles and templates, improving user configurability.
- Implemented commands for debugging loaded chain roles and templates, providing users with insights into their configurations.
- Enhanced the Mindnet settings interface to include options for managing chain roles and templates paths, improving user experience with clear descriptions and validation features.
2026-01-18 14:50:17 +01:00

10 KiB
Raw Permalink Blame History

Chain Inspector v0 - Implementierungsbericht

Status: Vollständig implementiert und getestet
Datum: 2025-01-XX
Version: v0.1.0


Übersicht

Chain Inspector v0 ist die erste sichtbare Feature-Implementierung der "Phase 2 Chain Intelligence". Die Funktion analysiert Beziehungen, Ketten, Lücken und Rückwärtspfade auf SECTION/ZONE-Ebene innerhalb eines Obsidian-Vaults.

Hauptfunktionen

1. Section Context Resolver

  • Zweck: Identifiziert den aktuellen Editor-Kontext
  • Funktionalität:
    • Bestimmt aktuelle Datei und aktuelle Heading-Section (SectionRef)
    • Erkennt zoneKind: content | note_links | candidates | root
    • Unterstützt spezielle H2-Zonen:
      • ## Note-Verbindungen → note-scope edges (global zur Note)
      • ## Kandidaten → candidate edges (LLM-vorgeschlagen, standardmäßig ausgeschlossen)

2. Section/Note Scoped Graph Index

  • Zweck: Erstellt einen In-Memory-Index für die aktuelle Datei und direkte Nachbarn
  • Funktionalität:
    • Parst explizite Edges aus dem Edge-Callout/Mapping-Format des Plugins
    • Erfasst für jeden Edge:
      • rawEdgeType (String wie im Vault)
      • source: { file, sectionHeading? } (section scope) oder { file } (note scope)
      • target: { file, sectionHeading? } aus [[file]] oder [[file#Heading]]
      • scope: "section" | "note" | "candidate"
      • evidence: { file, sectionHeading, lineRange? }
    • Lädt Nachbarnotizen lazy bei Bedarf (nur für outgoing targets und incoming links)

3. Chain Inspector v0 Analyse

A) Neighbors (Nachbarn)

  • Incoming Edges: Alle Edges, die auf die aktuelle Section zeigen
  • Outgoing Edges: Alle Edges, die von der aktuellen Section ausgehen
  • Filter:
    • includeNoteLinks (Standard: true) → schließt note-scope edges ein/aus
    • includeCandidates (Standard: false) → schließt candidate edges ein/aus

B) Forward/Backward Paths (Vorwärts/Rückwärtspfade)

  • Bounded Traversal: Durchsucht den Graphen bis zu Tiefe N (Standard: 3)
  • Richtung: forward, backward, both (Standard: both)
  • Output: Liste von Pfaden mit Knoten und Edges
  • Deterministische Sortierung: Alle Elemente werden konsistent sortiert

C) Gap Heuristics (Lücken-Heuristiken)

  • missing_edges: Section hat nicht-trivialen Textinhalt (>200 Zeichen) aber 0 explizite Edges
  • one_sided_connectivity: Nur incoming ODER nur outgoing edges vorhanden
  • only_candidates: Nur candidate edges existieren, keine expliziten Edges
  • dangling_target: (Noch nicht implementiert) Unaufgelöste Link-Ziele
  • no_causal_roles: (Optional) Keine Edges entsprechen "causal-ish" Rollen (basierend auf chain_roles.yaml)

4. Obsidian Command

  • Command-ID: "Mindnet: Inspect Chains (Current Section)"
  • Output:
    • Strukturierter JSON-Report (in Console)
    • Pretty-printed Summary (in Console)
    • Deterministische Ausgabe für zukünftige Golden Tests

Technische Implementierung

Dateistruktur

src/
├── analysis/
│   ├── chainInspector.ts          # Kern-Business-Logik
│   ├── graphIndex.ts              # Graph-Index-Builder
│   └── sectionContext.ts          # Section Context Resolver
├── commands/
│   └── inspectChainsCommand.ts   # Obsidian Command Handler
└── dictionary/
    └── types.ts                   # ChainRolesConfig (wird verwendet)

Wichtige Komponenten

inspectChains(app, context, options, chainRoles)

  • Hauptfunktion für die Chain-Analyse
  • Verwendet app.metadataCache.getBacklinksForFile() für performante incoming edge Erkennung
  • Lädt Nachbarnotizen lazy (nur wenn benötigt)
  • Gibt ChainInspectorReport zurück

getNeighbors(edges, context, options)

  • Findet incoming/outgoing edges für aktuelle Section
  • Unterstützt flexible File-Matching (full path, basename, basename ohne Extension)
  • Unterstützt note-level links (heading === null)

traverseForward() / traverseBackward()

  • Depth-First Search mit begrenzter Tiefe
  • Verhindert Zyklen durch visited Set
  • Deterministische Pfad-Sortierung

computeFindings(edges, context, sections, content, chainRoles, options)

  • Analysiert Gap Heuristics
  • Verwendet allEdges für incoming edge Erkennung
  • Verwendet currentEdges für outgoing edge Erkennung
  • Generiert Findings mit Severity-Levels

Performance-Optimierungen

  1. Efficient Incoming Edge Detection:

    • Verwendet app.metadataCache.getBacklinksForFile() statt manueller Vault-Scans
    • Lädt nur Notizen, die tatsächlich auf die aktuelle Note verlinken
  2. Lazy Loading:

    • Lädt Nachbarnotizen nur bei Bedarf
    • Begrenzt auf one-hop neighbors (aktuelle Note + direkte Nachbarn)
  3. Deterministische Sortierung:

    • Alle Edges werden nach (rawEdgeType, target file, target heading) sortiert
    • Alle Knoten werden nach (file, heading) sortiert
    • Findings werden nach (severity desc, code asc) sortiert

Konfiguration

Options (Standardwerte)

{
  includeNoteLinks: true,      // Note-scope edges einbeziehen
  includeCandidates: false,     // Candidate edges ausschließen
  maxDepth: 3,                 // Maximale Traversal-Tiefe
  direction: "both"            // "forward" | "backward" | "both"
}

Abhängigkeiten

  • chain_roles.yaml: Optional, wird für no_causal_roles Finding verwendet
  • chain_templates.yaml: Noch nicht verwendet (für zukünftige Features)

Test-Ergebnisse

Erfolgreiche Tests

Incoming Edges Erkennung:

  • 5 incoming edges korrekt erkannt
  • Flexible File-Matching funktioniert (basename vs. full path)
  • Note-level links werden korrekt behandelt

Outgoing Edges Erkennung:

  • 2 outgoing edges korrekt erkannt
  • Section-scope edges werden korrekt identifiziert

Path Traversal:

  • Forward paths: 2 Pfade korrekt gefunden
  • Backward paths: 5 Pfade korrekt gefunden
  • Maximale Tiefe wird respektiert

Gap Heuristics:

  • one_sided_connectivity wird korrekt erkannt/ausgeschlossen
  • Findings werden nur generiert, wenn tatsächlich Lücken vorhanden sind

Beispiel-Output

=== Chain Inspector Report ===

Context: 03_Experiences/Events/Krebserkrankung von Sushi.md
Section: 📖 Kontext
Zone: content

Settings:
  - Include Note Links: true
  - Include Candidates: false
  - Max Depth: 3
  - Direction: both

Neighbors:
  Incoming: 5
    - caused_by -> 00_Leitbild/prozess/2025/Warum Ebene/Protokoll Session 0 - Kontext & Leitbild-Scope 2025.md#Fokus-Projekt: Vater-Sohn (Rohan) [section]
    - derived_from -> 01_Identity/Principles/Aus jeder Krise das Beste machen.md#Kontext & Anwendung [section]
    - references -> 03_Experiences/Clusters/Wendepunkte/Wendepunkte Familie und Beziehungen.md#07.12.2019 Krebserkrankung von Sushi [section]
    - ursache_ist -> 01_Identity/Boundaries/Angst vor dem Alleinsein.md#Heutige Ängste basieren eher auf der Angst vor Einsamkeit [section]
    - wegen -> 03_Experiences/Clusters/Wendepunkte/Ereignisse die mein Leben verändert haben.md#07.12.2019 Krebserkrankung von Sushi [section]
  Outgoing: 2
    - ausgelöst_durch -> Notfall von Sushi am 07.12.2019 [section]
    - resulted_in -> Angst vor dem Alleinsein [section]

Paths:
  Forward: 2
    - 03_Experiences/Events/Krebserkrankung von Sushi.md#📖 Kontext -> Notfall von Sushi am 07.12.2019 (1 edges)
    - 03_Experiences/Events/Krebserkrankung von Sushi.md#📖 Kontext -> Angst vor dem Alleinsein (1 edges)
  Backward: 5
    - 00_Leitbild/prozess/2025/Warum Ebene/Protokoll Session 0 - Kontext & Leitbild-Scope 2025.md#Fokus-Projekt: Vater-Sohn (Rohan) -> 03_Experiences/Events/Krebserkrankung von Sushi.md#📖 Kontext (1 edges)
    - 03_Experiences/Clusters/Wendepunkte/Ereignisse die mein Leben verändert haben.md#07.12.2019 Krebserkrankung von Sushi -> 01_Identity/Boundaries/Angst vor dem Alleinsein.md#Heutige Ängste basieren eher auf der Angst vor Einsamkeit -> 03_Experiences/Events/Krebserkrankung von Sushi.md#📖 Kontext (2 edges)
    ... and 3 more

Gap Heuristics (Findings): 0
  ✓ No issues detected

Bekannte Einschränkungen

  1. Vault-Scope: Indexiert nur aktuelle Note + one-hop neighbors (nicht gesamter Vault)
  2. Chunking: Operiert auf SectionRef-Ebene, nicht auf vollständiger Chunk-Extraktion
  3. Edge Alias Normalisierung: Keine Normalisierung von Edge-Aliases im Vault
  4. Dangling Targets: dangling_target Finding ist noch nicht implementiert
  5. LLM Integration: Keine automatische Edge-Vorschläge oder Auto-Writing

Zukünftige Verbesserungen

Phase 2.1 (Geplant)

  • UI-Panel für Chain Inspector (statt nur Console-Output)
  • Interaktive Visualisierung der Pfade
  • Export-Funktion für Reports
  • Erweiterte Filter-Optionen

Phase 2.2 (Geplant)

  • Chunk-basierte Analyse (statt nur Section-basiert)
  • Vollständige Vault-Scans (optional)
  • Edge-Vorschläge basierend auf Gap Heuristics
  • Integration mit Chain Templates

Verwendung

In Obsidian

  1. Öffnen Sie eine Markdown-Datei mit Edges
  2. Positionieren Sie den Cursor in einer Section
  3. Öffnen Sie die Command Palette (Strg+P / Cmd+P)
  4. Wählen Sie: "Mindnet: Inspect Chains (Current Section)"
  5. Prüfen Sie die Console (Strg+Shift+I / Cmd+Option+I) für den Report

Programmatisch

import { executeInspectChains } from "./commands/inspectChainsCommand";

await executeInspectChains(
  app,
  editor,
  filePath,
  chainRoles, // ChainRolesConfig | null
  {
    includeNoteLinks: true,
    includeCandidates: false,
    maxDepth: 3,
    direction: "both"
  }
);

Debug-Logs

Die Implementierung enthält umfangreiche Debug-Logs für Troubleshooting:

  • [Chain Inspector] Found X notes linking to current note via getBacklinksForFile
  • [Chain Inspector] Loaded X edges from [file]
  • [Chain Inspector] ✓ Found X edges from [file] targeting current note
  • [Chain Inspector] computeFindings: incoming=X, outgoing=Y, allEdges=Z

Zusammenfassung

Chain Inspector v0 ist vollständig implementiert und getestet. Die Funktion bietet:

Robuste Edge-Erkennung mit flexibler File-Matching-Logik
Performante Analyse durch Nutzung von Obsidian's Metadata Cache
Deterministische Ausgabe für zukünftige Golden Tests
Umfassende Gap Heuristics für Qualitätsanalyse
Erweiterbare Architektur für zukünftige Features

Die Implementierung bildet die Grundlage für weitere Chain Intelligence Features in Phase 2.


Erstellt: 2025-01-XX
Autor: Cursor AI Agent
Status: Production Ready