mindnet_obsidian/docs/Interview_Config_Guide.md

858 lines
24 KiB
Markdown
Raw Permalink Normal View History

# Interview Config Guide - Vollständige Anleitung für `interview_config.yaml`
> **Version:** 1.0.0
> **Stand:** 2025-01-25
> **Zielgruppe:** Administratoren, GenAI-Assistenten, Plugin-Entwickler
> **Zweck:** Vollständige Dokumentation zur Erstellung von Interview-Profilen für verschiedene Note-Typen
---
## Inhaltsverzeichnis
1. [Überblick](#überblick)
2. [Grundstruktur](#grundstruktur)
3. [Root-Level Felder](#root-level-felder)
4. [Profile-Definition](#profile-definition)
5. [Step-Typen](#step-typen)
6. [WP-26 Features (Section Types & Block-IDs)](#wp-26-features-section-types--block-ids)
7. [Beispiele für verschiedene Note-Typen](#beispiele-für-verschiedene-note-typen)
8. [Best Practices & Patterns](#best-practices--patterns)
9. [Validierung & Fehlerbehandlung](#validierung--fehlerbehandlung)
---
## Überblick
Die `interview_config.yaml` definiert **Interview-Profile** für die strukturierte Erstellung von Notes im Obsidian Vault. Jedes Profil beschreibt einen **Wizard-Flow** mit mehreren **Steps**, die nacheinander durchlaufen werden, um eine Note zu erstellen.
### Wichtige Konzepte
- **Profile:** Ein Interview-Profil entspricht einem Note-Typ (z.B. `experience`, `insight`, `decision`)
- **Steps:** Einzelne Schritte im Interview-Wizard (z.B. Text-Eingabe, Frontmatter-Feld, Loop)
- **Loops:** Wiederholbare Steps für Listen von Items
- **Section Types (WP-26):** Typisierung von Abschnitten innerhalb einer Note
- **Block-IDs (WP-26):** Eindeutige Referenzpunkte für Intra-Note-Verlinkungen
---
## Grundstruktur
```yaml
version: 3
frontmatter_whitelist:
- id
- title
- type
- status
# ... weitere erlaubte Frontmatter-Keys
ui_defaults:
modal:
width: "clamp(720px, 88vw, 1100px)"
height: "clamp(640px, 86vh, 920px)"
editor:
preview_toggle: true
toolbar: true
full_width_inputs: true
profiles:
- key: profile_key
label: "Anzeige-Name"
note_type: experience
# ... Profile-Definition
```
---
## Root-Level Felder
### `version` (string, optional)
**Standard:** `3`
Die Versionsnummer der Config-Datei. Aktuell wird Version `3` verwendet.
### `frontmatter_whitelist` (array of strings, optional)
Liste von Frontmatter-Keys, die im Wizard bearbeitet werden können.
**Standard-Keys (immer verfügbar):**
- `id`
- `title`
- `type`
- `status`
- `retriever_weight`
- `chunking_profile`
- `tags`
- `aliases`
- `created`
- `interview_profile`
**Beispiel:**
```yaml
frontmatter_whitelist:
- custom_field
- priority
```
### `ui_defaults` (object, optional)
Standard-UI-Einstellungen für den Interview-Wizard.
**Felder:**
- `modal.width` (string): CSS-Width für das Modal
- `modal.height` (string): CSS-Height für das Modal
- `editor.preview_toggle` (boolean): Preview-Toggle anzeigen
- `editor.toolbar` (boolean): Toolbar anzeigen
- `editor.full_width_inputs` (boolean): Volle Breite für Inputs
### `profiles` (array, **required**)
Liste von Interview-Profilen. Siehe [Profile-Definition](#profile-definition).
---
## Profile-Definition
Jedes Profil definiert einen vollständigen Interview-Wizard für einen Note-Typ.
### Pflichtfelder
- **`key`** (string, required): Eindeutiger Schlüssel für das Profil (z.B. `experience_cluster`)
- **`label`** (string, required): Anzeige-Name im UI
- **`note_type`** (string, required): Note-Typ (muss mit `types.yaml` übereinstimmen, z.B. `experience`, `insight`, `decision`)
- **`steps`** (array, required): Liste von Steps (mindestens ein Step)
### Optionale Felder
- **`group`** (string, optional): Gruppierung für UI (z.B. `experience`, `insight`)
- **`defaults`** (object, optional): Standardwerte für Frontmatter
- `status` (string): Standard-Status (z.B. `active`, `stable`)
- `folder` (string): Standard-Ordner für neue Notes
- `chunking_profile` (string): Standard-Chunking-Profil
- `retriever_weight` (number): Standard-Retriever-Weight
- `tags` (array of strings): Standard-Tags
- **`edging`** (object, optional): Semantic Mapping Konfiguration
- `mode` (string): `"none"` | `"post_run"` | `"inline_micro"` | `"both"` (Standard: `"none"`)
- `wrapperCalloutType` (string, optional): Override für Wrapper-Callout-Typ
- `wrapperTitle` (string, optional): Override für Wrapper-Titel
- `wrapperFolded` (boolean, optional): Override für Wrapper-Folded-State
**Beispiel:**
```yaml
profiles:
- key: experience_basic
group: experience
label: "Erfahrung (Basis)"
note_type: experience
defaults:
status: active
folder: "03_experience"
chunking_profile: timeline
edging:
mode: both
steps:
# ... Steps
```
---
## Step-Typen
### 1. `capture_frontmatter` - Frontmatter-Feld erfassen
Erfasst ein einzelnes Frontmatter-Feld.
**Felder:**
- `id` (string, required): Eindeutige Step-ID
- `kind` (string, required): `"capture_frontmatter"`
- `field` (string, required): Frontmatter-Feld-Name (muss in `frontmatter_whitelist` sein)
- `label` (string, optional): Anzeige-Name (Standard: `field`)
- `required` (boolean, optional): Ob erforderlich (Standard: `false`)
- `prompt` (string, optional): Prompt-Text für den Benutzer
- `input.kind` (string, optional): Input-Typ (`text_line`, `number`, `select`, etc.)
- `input.min` (number, optional): Min-Wert für `number`
- `input.max` (number, optional): Max-Wert für `number`
- `input.step` (number, optional): Step-Wert für `number`
- `input.options` (array, optional): Optionen für `select`
**Beispiel:**
```yaml
- id: title
kind: capture_frontmatter
field: title
label: "Titel"
required: true
prompt: "Gib einen Titel für die Note ein"
- id: retriever_weight
kind: capture_frontmatter
field: retriever_weight
label: "Retriever Weight"
required: false
input:
kind: number
min: -3
max: 3
step: 1
```
### 2. `capture_text` - Mehrzeiligen Text erfassen
Erfasst mehrzeiligen Text und erzeugt eine Section in der Note.
**Felder:**
- `id` (string, required): Eindeutige Step-ID
- `kind` (string, required): `"capture_text"`
- `label` (string, optional): Anzeige-Name
- `required` (boolean, optional): Ob erforderlich (Standard: `false`)
- `prompt` (string, optional): Prompt-Text für den Benutzer
- `section` (string, optional): Markdown-Section-Header (z.B. `"## 📖 Kontext"`)
- Wenn leer (`""`), wird kein Section-Header erzeugt (z.B. in Loops)
- **WP-26 Felder:** Siehe [WP-26 Features](#wp-26-features-section-types--block-ids)
**Beispiel:**
```yaml
- id: context
kind: capture_text
section: "## 📖 Kontext"
label: "Kontext"
required: true
prompt: "Beschreibe den Kontext der Erfahrung"
section_type: experience
generate_block_id: true
```
### 3. `capture_text_line` - Einzeiligen Text erfassen
Erfasst einzeiligen Text, optional mit Heading-Level.
**Felder:**
- `id` (string, required): Eindeutige Step-ID
- `kind` (string, required): `"capture_text_line"`
- `label` (string, optional): Anzeige-Name
- `required` (boolean, optional): Ob erforderlich (Standard: `false`)
- `prompt` (string, optional): Prompt-Text für den Benutzer
- `heading_level.enabled` (boolean, optional): Heading-Level-Selector anzeigen (Standard: `false`)
- `heading_level.default` (number, optional): Standard-Heading-Level 1-6 (Standard: `2`)
- **WP-26 Felder:** Siehe [WP-26 Features](#wp-26-features-section-types--block-ids)
**Beispiel:**
```yaml
- id: subtitle
kind: capture_text_line
label: "Untertitel"
heading_level:
enabled: true
default: 1
prompt: "Kurzer Untertitel"
section_type: experience
generate_block_id: true
```
### 4. `loop` - Wiederholbare Steps
Erzeugt eine Liste von Items, die durch wiederholte Ausführung der Sub-Steps erzeugt werden.
**Felder:**
- `id` (string, required): Eindeutige Step-ID
- `kind` (string, required): `"loop"`
- `label` (string, optional): Anzeige-Name für die Loop
- `item_label` (string, optional): Anzeige-Name für einzelne Items (z.B. `"Erlebnis"`)
- `min_items` (number, optional): Minimale Anzahl Items (Standard: `0`)
- `max_items` (number, optional): Maximale Anzahl Items (kein Limit, wenn nicht gesetzt)
- `steps` (array, required): Liste von Sub-Steps (werden für jedes Item ausgeführt)
- `output.join` (string, optional): String zum Verbinden der Items (Standard: `"\n\n"`)
- `ui.mode` (string, optional): UI-Modus (`subwizard` | `inline`, Standard: `inline`)
- `ui.commit` (string, optional): Commit-Modus (`explicit_add` | `on_next`, Standard: `explicit_add`)
- `ui.allow_edit` (boolean, optional): Bearbeitung erlauben (Standard: `false`)
- `ui.allow_delete` (boolean, optional): Löschen erlauben (Standard: `false`)
- `ui.allow_reorder` (boolean, optional): Neuordnen erlauben (Standard: `false`)
- `ui.show_item_overview` (boolean, optional): Item-Übersicht anzeigen (Standard: `false`)
**Beispiel:**
```yaml
- id: actions
kind: loop
label: "Handlungen"
item_label: "Handlung"
min_items: 1
steps:
- id: action_heading
kind: capture_text_line
label: "Handlungsüberschrift"
required: true
heading_level:
enabled: true
default: 3
section_type: decision
generate_block_id: true
- id: action_description
kind: capture_text
section: ""
label: "Beschreibung"
required: true
```
**Verschachtelte Loops:**
```yaml
- id: groups
kind: loop
label: "Erlebnis-Gruppen"
steps:
- id: group_heading
kind: capture_text_line
label: "Überschrift"
- id: entries
kind: loop
label: "Einträge"
steps:
- id: entry
kind: capture_text_line
label: "Listeneintrag"
```
### 5. `review` - Review & Apply Step
Zeigt eine Vorschau der generierten Note und ermöglicht abschließende Checks.
**Felder:**
- `id` (string, required): Eindeutige Step-ID
- `kind` (string, required): `"review"`
- `label` (string, optional): Anzeige-Name (Standard: `"Review & Apply"`)
- `checks` (array of strings, optional): Liste von Checks
- `lint_current_note`: Lint-Check für die generierte Note
- `missing_targets`: Prüft auf fehlende Link-Targets
- `missing_frontmatter_id`: Prüft auf fehlende Frontmatter-ID
**Beispiel:**
```yaml
- id: review
kind: review
label: "Review & Apply"
checks:
- lint_current_note
- missing_targets
- missing_frontmatter_id
```
### 6. `instruction` - Anweisung anzeigen
Zeigt eine reine Anweisung ohne Input.
**Felder:**
- `id` (string, required): Eindeutige Step-ID
- `kind` (string, required): `"instruction"`
- `label` (string, optional): Anzeige-Name
- `content` (string, required): Markdown-Inhalt der Anweisung
**Beispiel:**
```yaml
- id: intro
kind: instruction
label: "Einführung"
content: |
# Willkommen zum Interview
Dieses Interview hilft dir, eine strukturierte Note zu erstellen.
```
### 7. `llm_dialog` - LLM-Dialog (experimentell)
Öffnet einen LLM-Dialog für Text-Generierung oder -Verdichtung.
**Felder:**
- `id` (string, required): Eindeutige Step-ID
- `kind` (string, required): `"llm_dialog"`
- `label` (string, optional): Anzeige-Name
- `mode` (string, optional): `"manual"` | `"auto"` (Standard: `"manual"`)
- `prompt_template` (string, required): Prompt-Template für den LLM
- `output_target.kind` (string, required): Output-Ziel (`section_append` | `replace`)
- `output_target.section` (string, optional): Section für `section_append`
**Beispiel:**
```yaml
- id: llm_refine
kind: llm_dialog
label: "LLM – Verdichtung"
mode: manual
prompt_template: |
Verdichte die bisherigen Inhalte zu 3-5 Bulletpoints.
Erfinde keine Fakten.
output_target:
kind: section_append
section: "## 🧠 Verdichtung (LLM Vorschlag)"
```
### 8. `entity_picker` - Entity-Auswahl (experimentell)
Ermöglicht die Auswahl einer bestehenden Note aus dem Vault.
**Felder:**
- `id` (string, required): Eindeutige Step-ID
- `kind` (string, required): `"entity_picker"`
- `label` (string, optional): Anzeige-Name
- `prompt` (string, optional): Prompt-Text
- `required` (boolean, optional): Ob erforderlich (Standard: `false`)
- `labelField` (string, optional): Feld-Key für Wikilink-Label
---
## WP-26 Features (Section Types & Block-IDs)
**Wichtig:** Diese Features sind nur für `capture_text` und `capture_text_line` Steps verfügbar.
### `section_type` (string, optional)
Definiert den **Section-Type** für diese Section. Überschreibt den `note_type` für diese Section.
**Verwendung:**
- Für **Edge-Type-Vorschläge** basierend auf `graph_schema.md`
- Für **Type-Boost-Scoring** im Retriever
- Für **Agentic Validation** (Phase 3)
**Beispiel:**
```yaml
- id: insight
kind: capture_text
section: "## 💡 Einsicht"
section_type: insight # Typ-Wechsel: experience -> insight
```
**Fallback-Logik:**
- Wenn `section_type` nicht gesetzt ist, wird der `note_type` des Profils verwendet
- Bei verschachtelten Sections wird der Section-Type der übergeordneten Section verwendet (basierend auf Heading-Level)
### `block_id` (string, optional)
Definiert eine **explizite Block-ID** für diese Section. Die Block-ID wird als `^block-id` am Ende der Überschrift erzeugt.
**Beispiel:**
```yaml
- id: situation
kind: capture_text
section: "## ⚡ Situation"
block_id: "sit" # Erzeugt: ## ⚡ Situation ^sit
```
**Wichtig:** Block-IDs müssen **eindeutig** sein. In Loops werden automatisch Nummerierungen angehängt (z.B. `action_heading-1`, `action_heading-2`).
### `generate_block_id` (boolean, optional)
Wenn `true`, wird automatisch eine Block-ID aus der Step-ID generiert (slugified).
**Beispiel:**
```yaml
- id: context
kind: capture_text
section: "## 📖 Kontext"
generate_block_id: true # Erzeugt: ## 📖 Kontext ^context
```
**Regeln:**
- Wenn sowohl `block_id` als auch `generate_block_id: true` gesetzt sind, hat `block_id` Priorität
- In Loops wird automatisch eine Nummerierung angehängt (z.B. `context-1`, `context-2`)
### `references` (array, optional)
Definiert **explizite Referenzen** zu vorherigen Sections (Block-IDs).
**Struktur:**
```yaml
references:
- block_id: <block_id_der_referenzierten_section>
edge_type: <optional_vorgeschlagener_edge_type>
```
**Beispiel:**
```yaml
- id: situation
kind: capture_text
section: "## ⚡ Situation"
section_type: experience
block_id: "sit"
references:
- block_id: context
edge_type: derived_from # Explizite Referenz zu vorheriger Section
```
**Verhalten:**
- Referenzen werden als **Intra-Note-Edges** erzeugt (`is_internal: true`)
- Der `edge_type` wird als **Vorschlag** verwendet (kann im `SectionEdgesOverviewModal` geändert werden)
- Wenn kein `edge_type` angegeben ist, wird ein Typ aus `graph_schema.md` vorgeschlagen
- **Automatische Rückwärts-Edges** werden in der Ziel-Section erzeugt (basierend auf dem inversen Edge-Type)
**Wichtig:** `block_id` muss auf eine **vorherige Section** verweisen (nicht auf zukünftige Sections).
---
## Beispiele für verschiedene Note-Typen
### Experience (Erfahrung)
```yaml
- key: experience_single
group: experience
label: "Experience – Einzelereignis"
note_type: experience
defaults:
status: active
chunking_profile: timeline
edging:
mode: both
steps:
- id: title
kind: capture_frontmatter
field: title
label: "Titel"
required: true
- id: context
kind: capture_text
section: "## 📖 Kontext"
label: "Kontext"
required: true
prompt: "In welchem Rahmen ist es passiert?"
section_type: experience
generate_block_id: true
- id: trigger
kind: capture_text
section: "## ⚡ Auslöser"
label: "Auslöser"
required: false
prompt: "Was hat es ausgelöst?"
section_type: experience
generate_block_id: true
references:
- block_id: context
edge_type: derived_from
- id: transformation
kind: capture_text
section: "## 🧠 Innere Transformation"
label: "Innere Transformation"
required: false
prompt: "Was hat sich innerlich verändert?"
section_type: insight # Typ-Wechsel
generate_block_id: true
- id: review
kind: review
label: "Review & Apply"
checks:
- lint_current_note
- missing_targets
```
### Insight (Einsicht)
```yaml
- key: insight_basic
group: insight
label: "Insight – Basis"
note_type: insight
defaults:
status: active
folder: "04_insight"
edging:
mode: both
steps:
- id: title
kind: capture_frontmatter
field: title
label: "Titel"
required: true
- id: insight
kind: capture_text
section: "## 💡 Einsicht"
label: "Einsicht"
required: true
prompt: "Beschreibe die Einsicht"
section_type: insight
generate_block_id: true
- id: source
kind: capture_text
section: "## 📚 Quelle"
label: "Quelle"
required: false
prompt: "Woher stammt diese Einsicht?"
section_type: insight
generate_block_id: true
references:
- block_id: insight
edge_type: source_of
- id: application
kind: capture_text
section: "## 🎯 Anwendung"
label: "Anwendung"
required: false
prompt: "Wie wird diese Einsicht angewendet?"
section_type: decision # Typ-Wechsel
generate_block_id: true
references:
- block_id: insight
edge_type: foundation_for
- id: review
kind: review
label: "Review & Apply"
checks:
- lint_current_note
```
### Decision (Entscheidung)
```yaml
- key: decision_basic
group: decision
label: "Decision – Basis"
note_type: decision
defaults:
status: active
folder: "05_decision"
edging:
mode: both
steps:
- id: title
kind: capture_frontmatter
field: title
label: "Titel"
required: true
- id: context
kind: capture_text
section: "## 📖 Kontext"
label: "Kontext"
required: true
prompt: "In welchem Kontext wurde die Entscheidung getroffen?"
section_type: experience
generate_block_id: true
- id: options
kind: loop
label: "Optionen"
item_label: "Option"
min_items: 2
steps:
- id: option_text
kind: capture_text
section: ""
label: "Option"
required: true
prompt: "Beschreibe eine Option"
- id: decision
kind: capture_text
section: "## 🎯 Entscheidung"
label: "Entscheidung"
required: true
prompt: "Welche Entscheidung wurde getroffen?"
section_type: decision
generate_block_id: true
references:
- block_id: context
edge_type: derived_from
- id: rationale
kind: capture_text
section: "## 🧠 Begründung"
label: "Begründung"
required: false
prompt: "Warum wurde diese Entscheidung getroffen?"
section_type: insight
generate_block_id: true
references:
- block_id: decision
edge_type: based_on
- id: review
kind: review
label: "Review & Apply"
checks:
- lint_current_note
- missing_targets
```
### Principle (Prinzip)
```yaml
- key: principle_basic
group: principle
label: "Principle – Basis"
note_type: principle
defaults:
status: stable
chunking_profile: principle_dense
retriever_weight: 2
steps:
- id: title
kind: capture_frontmatter
field: title
label: "Titel"
required: true
- id: statement
kind: capture_text
section: "## 🧭 Prinzip"
label: "Prinzip"
required: true
prompt: "Formuliere das Prinzip als klaren Satz."
section_type: principle
generate_block_id: true
- id: retriever_weight
kind: capture_frontmatter
field: retriever_weight
label: "Retriever Weight"
required: false
input:
kind: number
min: -3
max: 3
step: 1
- id: review
kind: review
label: "Review & Apply"
checks:
- lint_current_note
```
---
## Best Practices & Patterns
### 1. Section-Type-Wechsel dokumentieren
Wenn ein Section-Type-Wechsel stattfindet, sollte dies im Kommentar dokumentiert werden:
```yaml
- id: transformation
kind: capture_text
section: "## 🧠 Innere Transformation"
section_type: insight # Typ-Wechsel: experience -> insight
generate_block_id: true
```
### 2. Block-IDs konsistent benennen
- Verwende **kurze, aussagekräftige** Block-IDs (z.B. `sit`, `ctx`, `ins`)
- In Loops werden automatisch Nummerierungen angehängt
- Vermeide **kollidierende** Block-IDs innerhalb eines Profils
### 3. Referenzen zu vorherigen Sections
- Referenzen müssen auf **vorherige Sections** verweisen (nicht zukünftige)
- Verwende **explizite `edge_type`-Vorschläge**, wenn die Beziehung klar ist
- Lasse `edge_type` weg, wenn das System aus `graph_schema.md` vorschlagen soll
### 4. Loops für Listen verwenden
- Verwende `loop` für **wiederholbare Items** (z.B. Handlungen, Optionen, Erlebnisse)
- Setze `min_items` für **erforderliche Listen**
- Verwende `section: ""` für Steps innerhalb von Loops, die keine eigene Section erzeugen sollen
### 5. Review-Step immer am Ende
- Jedes Profil sollte mit einem `review` Step enden
- Aktiviere relevante Checks (`lint_current_note`, `missing_targets`, etc.)
### 6. Edging-Mode konfigurieren
- `mode: "both"` für vollständige Edge-Unterstützung (inline + post-run)
- `mode: "inline_micro"` für nur Inline-Edge-Vorschläge
- `mode: "post_run"` für nur Post-Run-Edge-Abfrage
- `mode: "none"` für keine Edge-Unterstützung
### 7. Frontmatter-Felder dokumentieren
- Dokumentiere **Custom-Frontmatter-Felder** in `frontmatter_whitelist`
- Verwende **sinnvolle Defaults** in `defaults` für bessere UX
---
## Validierung & Fehlerbehandlung
### YAML-Syntax-Fehler
- **Syntax-Fehler** werden beim Laden erkannt und geloggt
- **Last-Known-Good:** Letzte gültige Config wird bei Fehlern verwendet
- **Warnings:** Ungültige Felder werden als Warnings geloggt, nicht als Fehler
### Step-Validierung
- **Fehlende Pflichtfelder:** Werden als Fehler erkannt
- **Ungültige Step-Kinds:** Werden als Warnings geloggt
- **Ungültige Block-ID-Referenzen:** Werden zur Laufzeit erkannt (keine Validierung zur Config-Zeit)
### Live-Reload
- **Debounced:** 200ms Delay für Performance
- **Automatisch:** Bei Dateiänderungen
- **Manuell:** Über Commands möglich
---
## GenAI-Prompt-Template
Wenn du ein GenAI-Assistent bist und ein neues Interview-Profil erstellen sollst, verwende folgendes Template:
```
Erstelle ein Interview-Profil für den Note-Typ "{note_type}" mit folgenden Anforderungen:
1. **Profil-Informationen:**
- Key: {profile_key}
- Label: {display_name}
- Group: {group}
- Note-Type: {note_type}
2. **Default-Werte:**
- Status: {status}
- Folder: {folder}
- Chunking-Profile: {chunking_profile} (optional)
- Retriever-Weight: {retriever_weight} (optional)
3. **Steps:**
{step_descriptions}
4. **WP-26 Features:**
- Section-Types: {section_types}
- Block-IDs: {block_ids}
- Referenzen: {references}
5. **Edging:**
- Mode: {edging_mode}
6. **Review:**
- Checks: {review_checks}
Nutze die Beispiele aus der Dokumentation als Vorlage und stelle sicher, dass:
- Alle Pflichtfelder gesetzt sind
- Block-IDs eindeutig sind
- Referenzen auf vorherige Sections verweisen
- Section-Types konsistent mit graph_schema.md sind
- Ein Review-Step am Ende steht
```
---
## Zusammenfassung
Die `interview_config.yaml` ist eine mächtige Konfigurationsdatei für die strukturierte Erstellung von Notes. Mit WP-26 Features können Sections typisiert und referenziert werden, was zu besseren Edge-Vorschlägen und Retrieval-Ergebnissen führt.
**Wichtigste Punkte:**
1. Jedes Profil benötigt `key`, `label`, `note_type` und `steps`
2. WP-26 Features (`section_type`, `block_id`, `generate_block_id`, `references`) sind nur für `capture_text` und `capture_text_line` verfügbar
3. Block-IDs müssen eindeutig sein (automatische Nummerierung in Loops)
4. Referenzen müssen auf vorherige Sections verweisen
5. Ein Review-Step sollte immer am Ende stehen
---
**Ende der Interview Config Guide**