mindnet/docs/05_Development/05_WP26_Manual_Testing.md
Lars 509efc9393 Implement WP-26 v1.3 (Phase 3): Enhance graph schema validation and edge handling
- Introduced a new function `load_graph_schema_full` to parse and cache both typical and prohibited edge types from the graph schema.
- Updated `load_graph_schema` to utilize the full schema for improved edge type extraction.
- Added `get_topology_info` to retrieve typical and prohibited edges for source/target pairs.
- Implemented `validate_intra_note_edge` and `validate_edge_against_schema` for schema validation of intra-note edges.
- Enhanced logging for schema validation outcomes and edge handling.
- Updated documentation to reflect new validation features and testing procedures.
2026-01-26 10:18:31 +01:00

9.0 KiB

WP-26 Manuelle Testszenarien

Version: 1.3
Datum: 25. Januar 2026
Status: Alle Phasen (Phase 1-3) implementiert


1. Überblick

Dieses Dokument beschreibt die manuellen Testszenarien für WP-26 Phase 1: Section-Types und Intra-Note-Edges.


2. Voraussetzungen

  1. Python-Umgebung mit allen Dependencies aus requirements.txt
  2. Qdrant-Instanz erreichbar (lokal oder Docker)
  3. Vault mit Test-Note (siehe Abschnitt 3)

3. Test-Note erstellen

Erstelle eine neue Markdown-Datei im Vault mit folgendem Inhalt:

---
id: wp26-test-experience
title: WP-26 Test Experience
type: experience
tags: [test, wp26]
---

# WP-26 Test Experience

## Situation ^sit
> [!section] experience

Am 25. Januar 2026 testete ich das neue Section-Type Feature.
Dies ist der Experience-Teil der Note.

## Meine Reaktion ^react
> [!section] experience

> [!edge] followed_by
> [[#^sit]]

Ich war zunächst skeptisch, aber die Implementierung sah solide aus.

## Reflexion ^ref
> [!section] insight

Diese Erfahrung zeigt mir, dass typ-spezifische Sektionen
die semantische Präzision des Retrievals verbessern können.

> [!abstract] Semantic Edges
>> [!edge] derives
>> [[#^sit]]
>> [[#^react]]

## Nächste Schritte ^next
> [!section] decision

Ich werde:
1. Die Tests ausführen
2. Die Ergebnisse dokumentieren

> [!edge] caused_by
> [[#^ref]]

4. Testszenarien

4.1 TS-01: Section-Type-Erkennung

Ziel: Prüfen, ob [!section]-Callouts korrekt erkannt werden.

Schritte:

  1. Importiere die Test-Note via scripts/import_markdown.py
  2. Prüfe die Chunks in Qdrant via API oder Debug-Skript

Prüfkriterien:

Chunk Erwarteter type Erwarteter note_type Erwarteter section
#c00 experience experience Situation
#c01 experience experience Meine Reaktion
#c02 insight experience Reflexion
#c03 decision experience Nächste Schritte

Prüf-Script:

# scripts/check_wp26_chunks.py
from qdrant_client import QdrantClient

client = QdrantClient("http://localhost:6333")
note_id = "wp26-test-experience"

# Hole alle Chunks der Note
result = client.scroll(
    collection_name="mindnet_chunks",
    scroll_filter={"must": [{"key": "note_id", "match": {"value": note_id}}]},
    with_payload=True,
    limit=100
)

for point in result[0]:
    p = point.payload
    print(f"Chunk: {p.get('chunk_id')}")
    print(f"  type: {p.get('type')}")
    print(f"  note_type: {p.get('note_type')}")
    print(f"  section: {p.get('section')}")
    print(f"  section_type: {p.get('section_type')}")
    print(f"  block_id: {p.get('block_id')}")
    print()

4.2 TS-02: Block-ID-Erkennung

Ziel: Prüfen, ob Block-IDs (^id) aus Überschriften korrekt extrahiert werden.

Prüfkriterien:

Chunk Erwartete block_id
#c00 sit
#c01 react
#c02 ref
#c03 next

4.3 TS-03: is_internal Flag für Edges

Ziel: Prüfen, ob Intra-Note-Edges das is_internal: true Flag erhalten.

Schritte:

  1. Importiere die Test-Note
  2. Prüfe die Edges in Qdrant

Prüfkriterien:

Edge is_internal
#c01 → #c00 (followed_by) true
#c02 → #c00 (derives) true
#c02 → #c01 (derives) true
#c03 → #c02 (caused_by) true
Alle structure edges (next/prev) true

Prüf-Script:

# scripts/check_wp26_edges.py
from qdrant_client import QdrantClient

client = QdrantClient("http://localhost:6333")
note_id = "wp26-test-experience"

# Hole alle Edges der Note
result = client.scroll(
    collection_name="mindnet_edges",
    scroll_filter={"must": [{"key": "note_id", "match": {"value": note_id}}]},
    with_payload=True,
    limit=100
)

for point in result[0]:
    p = point.payload
    kind = p.get('kind', 'unknown')
    source = p.get('source_id', '?')
    target = p.get('target_id', '?')
    is_internal = p.get('is_internal', 'MISSING')
    provenance = p.get('provenance', '?')
    source_hint = p.get('source_hint', '-')
    
    print(f"{source} --[{kind}]--> {target}")
    print(f"  is_internal: {is_internal}")
    print(f"  provenance: {provenance}")
    print(f"  source_hint: {source_hint}")
    print()

4.4 TS-04: Provenance-Normalisierung

Ziel: Prüfen, ob Provenance-Werte korrekt normalisiert werden.

Prüfkriterien:

Altes Provenance Neues provenance source_hint
explicit:callout explicit callout
explicit:wikilink explicit wikilink
structure:belongs_to structure belongs_to
structure:order structure order
edge_defaults rule edge_defaults

4.5 TS-05: Automatische Section-Erkennung

Ziel: Prüfen, ob neue Überschriften ohne [!section] automatisch neue Chunks erstellen.

Test-Note:

---
id: wp26-test-auto-section
type: experience
---

# Test Auto Section

## Section A ^a
> [!section] insight

Content A (insight).

## Section B ^b

Content B (sollte experience sein - Fallback).

## Section C ^c
> [!section] decision

Content C (decision).

Prüfkriterien:

Chunk type Grund
Section A insight Explizites [!section]
Section B experience Fallback auf note_type
Section C decision Explizites [!section]

5. Unit-Tests ausführen

# Im Projekt-Root
cd c:\Dev\cursor\mindnet

# Aktiviere virtuelle Umgebung (falls vorhanden)
# .venv\Scripts\activate

# Führe WP-26 Tests aus
python -m pytest tests/test_wp26_section_types.py -v

Erwartetes Ergebnis: Alle Tests grün.


6. Bekannte Einschränkungen

  1. Block-ID-Stability: Obsidian aktualisiert Block-IDs nicht automatisch bei Umbenennung von Überschriften.
  2. Heading-Links: Links wie [[#Section Name]] werden unterstützt, aber Block-References ([[#^id]]) werden bevorzugt.
  3. Nested Callouts: Verschachtelte Callouts (>> [!edge]) werden korrekt verarbeitet.

7. Phase 2: Retriever-Anpassungen

7.1 is_internal-Boost

Konfiguration: config/retriever.yaml

edge_scoring:
  internal_edge_boost: 1.2   # +20% Boost für Intra-Note-Edges
  external_edge_boost: 1.0   # Standard für Inter-Note-Edges

Manuelle Prüfung:

  1. Führe eine Suche durch, die eine Note mit internen Edges trifft
  2. Prüfe im Debug-Log, dass is_internal: True Edges höheres Gewicht erhalten

7.2 Aggregation-Level

Konfiguration: config/retriever.yaml

aggregation:
  level: note                # "note" (default) oder "chunk"
  max_chunks_per_note: 3     # Limit bei "note"-Level

Test mit Chunk-Level:

  1. Setze level: chunk in retriever.yaml
  2. Führe Suche durch
  3. Prüfe, dass mehrere Chunks derselben Note zurückgegeben werden (keine Deduplizierung)

7.3 Unit-Tests Phase 2

python -m pytest tests/test_wp26_phase2_retriever.py -v

8. Phase 3: Schema-Validierung (FA-12)

8.1 get_topology_info()

Die neue Funktion ermittelt typische und verbotene Edge-Types für ein Source/Target-Typ-Paar.

Beispiel:

from app.core.graph.graph_utils import get_topology_info

topology = get_topology_info("experience", "insight")
# Gibt: {"typical": ["resulted_in", ...], "prohibited": [...]}

8.2 validate_intra_note_edge()

Validiert Intra-Note-Edges gegen das graph_schema.md.

Verhalten:

Edge-Typ Ergebnis Confidence
In typical Erlaubt 1.0
Nicht in typical, nicht in prohibited Erlaubt (atypisch) 0.7
In prohibited Abgelehnt 0.0

8.3 Manuelle Prüfung

  1. Erstelle eine Note mit einer verbotenen Edge-Kombination
  2. Führe Ingestion durch
  3. Prüfe, dass die Edge abgelehnt wurde (Log: 🚫 [SCHEMA-VALIDATION])

8.4 Unit-Tests Phase 3

python -m pytest tests/test_wp26_phase3_validation.py -v

9. Alle WP-26 Tests ausführen

# Alle WP-26 Unit-Tests
python -m pytest tests/test_wp26_section_types.py tests/test_wp26_phase2_retriever.py tests/test_wp26_phase3_validation.py -v

# Nur fehlgeschlagene Tests erneut ausführen
python -m pytest --lf -v

10. Bekannte Einschränkungen

  1. Block-ID-Stability: Obsidian aktualisiert Block-IDs nicht automatisch bei Umbenennung von Überschriften.
  2. Heading-Links: Links wie [[#Section Name]] werden unterstützt, aber Block-References ([[#^id]]) werden bevorzugt.
  3. Nested Callouts: Verschachtelte Callouts (>> [!edge]) werden korrekt verarbeitet.
  4. Strict-Mode: strict_mode=True in der Validierung lehnt atypische Edges ab (Standard: False).

11. Zusammenfassung

Phase Status Beschreibung
Phase 1 Section-Types, Block-IDs, Intra-Note-Edges
Phase 2 is_internal-Boost, Aggregation-Level
Phase 3 Schema-Validierung (FA-12)

Ende der Testdokumentation (WP-26 v1.3)