---
name: methode_mapping
description: "Phase-2-Skill (T-30-5) für TUV-Phase-6-Methode → Aufgaben-Type-Mapping. Eingabe: free-form Methodenname (z. B. 'Quellenanalyse', 'Fallbewertung', 'Tabellen-Vergleich') + Niveau (n1/n2/n3) + optional erwartete Mindest-Argumente/Quellen/etc. Ausgabe: methode_klasse (analyse/bewertung/ordnung/recherche/handeln/kommunikation) + recommended_formate (gegen niveaustufen.json gefiltert) + Bewertungs-Pattern-Template. Universal-Schicht über fach-spezifische Methoden-Kataloge (`core/fach/<id>/methoden.yaml`). Triggert aus `aufgabe.formulieren` (T-30-1b) zur Antwortformat-Vorauswahl ODER aus `generate.py` (T-30-7) für `bewertungs_hinweis()`-Generation. Ersetzt String-Match-Heuristik in `baue_lsg_aufgaben` (`generate.py:264-298`)."
domain_scope: universal
schema_pin: tuv_v2
phase: phase_2
mode: cowork-first
skill_typ: atomar
adr_refs: [ADR_0008, ADR_0017, ADR_0023, ADR_0026, ADR_0031, ADR_0032]
---

## Reasoning-Anleitung (Cowork-Mode, ADR 0032 Phase-3)

Skill ist deterministisch (Pure Lookup gegen YAML-Config) — Claude muss kein Reasoning machen, nur Helper-Skript aufrufen.

**Eingabe-Erwartung:** Pipeline-Skill ruft mit `methode` + `niveau` + optional `mindest`-Substitutionen.

**Ausführung:** Claude ruft `core/skills/methode_mapping/mapper.py::resolve_methode()` via Bash und parsed das JSON-Ergebnis. Im Cowork-Mode: Claude liest `methode_zu_antwortformat.yaml` direkt + macht Lookup (alternativ).

**Output:** strukturiertes Dict mit `methode_klasse / recommended_format_primary / bewertungs_pattern / warnings`.

**Anti-Pattern:** Methoden-Klassifikation per Reasoning erfinden statt Lookup nutzen — Konfig-Drift.

# Skill `methode_mapping` (Phase-2)

Aufgabe: Free-form Methoden-Namen aus TUV-Phase-6 in eine universale Methoden-Klasse + niveau-konforme Antwortformat-Vorauswahl überführen.

## Pflicht-Kontextdateien

1. `core/config/methode_zu_antwortformat.yaml` — Universal-Mapping (Klassen + Methoden-Zuordnung + Bewertungs-Patterns)
2. `core/config/niveaustufen.json` — Antwortformat-Pool je Niveau (Whitelist-Filter)
3. `core/fach/<id>/methoden.yaml` (optional) — Fach-spezifischer Methoden-Katalog mit `methode-klasse`-Override

## Eingabeparameter

```yaml
methode: "Quellenanalyse"      # Pflicht — TUV-Phase-6-Methode (free-form)
niveau: n2                      # Pflicht — n1 | n2 | n3
fach_methoden_yaml: <Pfad>      # optional — fach-Override
mindest:                        # optional — Bewertungs-Pattern-Substitutionen
  argumente: 3
  quellen: 2
  kategorien: 4
  eintraege: 3
  handlungsschritte: 5
  reflexion_punkte: 2
  aussagen: 3
  perspektiven: 2
  analyse_objekt: "Merkmale"
```

## Output-Schema

```yaml
methode: "Quellenanalyse"
methode_klasse: analyse
beschreibung: "Geleitete Auseinandersetzung mit Material/Quelle/Daten zur Erkenntnisgewinnung."
afb_schwerpunkt: [I, II]
recommended_formate:
  - kurze_begruendung
  - tabelle
  - strukturierte_freiformulierung
recommended_format_primary: kurze_begruendung
bewertungs_pattern: "Niveau n2 erreicht, wenn 3 Merkmale-Bestandteile benannt + sinngemäß korrekt eingeordnet sind."
warnings: []
unknown: false
```

Wenn `methode` keiner Klasse zugeordnet werden kann (oder fach-Override fehlt):
- `unknown: true`
- `methode_klasse: null`
- `recommended_formate: []`
- `warnings: ["Methode 'X' nicht im Universal-Mapping. Pre-Flight: Methoden-YAML erweitern."]`

## Workflow

### 1. Konfig-Laden
- Universal-Mapping aus `methode_zu_antwortformat.yaml` (`methode_klassen` + `methode_zu_klasse`)
- Niveaustufen-Konfig aus `niveaustufen.json` (für Antwortformat-Whitelist-Filter)
- Optional fach-spezifischer Methoden-Katalog (Override hat Vorrang)

### 2. Resolution
- Lookup: `methode_zu_klasse[methode]` (case-sensitive)
- Falls Miss: case-insensitive + Trim-Match versuchen
- Falls weiterhin Miss: `unknown=True`

### 3. Format-Filterung
- `methode_klassen[klasse].formate_je_niveau[niveau]` als Initial-Liste
- Schnitt mit `niveaustufen[niveau].antwortformate` (Whitelist gegen niveaustufen.json)
- Ergebnis = `recommended_formate`
- `recommended_format_primary` = erstes Element der gefilterten Liste

### 4. Bewertungs-Pattern-Substitution
- `bewertungs_pattern` aus Klasse mit `mindest`-Werten substituiert
- Fehlende Substitutions-Werte → Default-Marker `<n>`
- Bei `unknown=True`: Pattern leer

## Anti-Pattern (verboten)

- **Skelett-Templates** wie `baue_lsg_aufgaben`-String-Match — wird durch dieses Skill ersetzt (T-30-7)
- **Fach-spezifische Hardcoded-Mappings** — gehört in `core/fach/<id>/methoden.yaml`-Override
- **Antwortformate ohne Niveau-Whitelist-Filter** — kann zu Niveau-Drift führen (z. B. `argumentation` in n1)
- **Bewertungs-Pattern ohne `niveau`-Substitution** — Pattern muss explizit Niveau dokumentieren

## Test-Cases (Pflicht für T-30-5-Closure)

1. PASS Standard: `methode="Quellenanalyse"` + `niveau=n2` → klasse=analyse, primary=kurze_begruendung
2. PASS Bewertung: `methode="Fallbewertung"` + `niveau=n3` → klasse=bewertung, primary=stellungnahme
3. PASS Ordnung: `methode="Tabellen-Vergleich"` + `niveau=n2` → klasse=ordnung, primary=tabelle
4. PASS Recherche n1: `methode="Erkundungsbogen"` + `niveau=n1` → klasse=recherche, primary=kurzantwort
5. EDGE Unknown: `methode="Marsmännchen-Methode"` → unknown=True, warnings non-empty
6. EDGE Niveau-Drift-Schutz: methode liefert n3-Format, aber niveau=n1 → Whitelist-Filter entfernt
7. EDGE Mindest-Substitution: `mindest.argumente=5` → Bewertungs-Pattern enthält "5"
8. EDGE Case-insensitive: `methode="quellenanalyse"` → klasse=analyse (lowercase-fallback)
9. EDGE Trim: `methode="  Quellenanalyse  "` → klasse=analyse

## Integration

`aufgabe.formulieren` (T-30-1b) konsumiert in T-30-7-Refactor:

```python
from skills.methode_mapping import resolve_methode

mapping = resolve_methode(
    methode=tuv.phasen[5].methode,    # Phase 6 = idx 5
    niveau="n2",
    mindest={"argumente": 3, "analyse_objekt": "Merkmale"},
)
# mapping.recommended_format_primary → an aufgabe.formulieren als format-Hint
# mapping.bewertungs_pattern → in erwartungshorizont.bewertungs_hinweis
```

## ADR-Cross-Refs

- **ADR 0008:** Schauseite — recommended_formate gilt für Aufgabentexte (Schauseite); Bewertungs-Pattern für Lösungsblatt-Manifest
- **ADR 0017:** Plugin-System — Skill universal in `core/skills/`, fach-Overrides in `core/fach/<id>/`
- **ADR 0023:** Hook-Coverage — kein eigener Hook, läuft als Pure-Function
- **ADR 0026:** Cross-Project-Lesson — Klasse-2-Pattern (Methoden-Klassen-Klassifikation aus escape-game-generator-Empirie)
- **ADR 0031:** LLM-Provider-Abstraction — Skill ist Stdlib-only, kein LLM-Aufruf
