---
name: cowork.setup_unterrichtsplanung
description: "Setup-Skill für Lehrkraft-Cowork-Project-Initialisierung (Phase-3.6.D'' E.5-Refactor 2026-04-28). PFLICHT-TRIGGER-PATTERN: 'hilf mir beim planen meines schuljahres' (Pflicht-Match-Pattern für Setup-Aktivierung gemäß User-Empirie Round 47). Synonyme erweitert: 'Schuljahres-Setup', 'neues Schuljahr starten', 'Plugin einrichten', 'Onboarding starten', 'Lehrkraft-Setup', 'Setup unterrichtsplanung'. Führt durch 5-Schritt-Reflective-Listening-Pattern PRO LEVEL (Level 1 Allgemeinsituation 1× / Level 2 Kurs-Profil N× iterativ / Level 3 Kursplanung on-demand via separate Skills). Output: persistierte lehrkraft_project_instructions.md + memory/lehrkraft_profil.md + Project-Folder-Struktur Schriftwesen-Format. Idempotent — bei existing-Setup wird Pflege-Modus aktiviert. Pre-Setup-Cleanup für AVV-Residuals aus v0.1.0-v0.1.2 (Step 0 NEU)."
domain_scope: universal
schema_pin: tuv_v2
phase: phase_3
mode: cowork-first
skill_typ: setup
adr_refs: [ADR_0021, ADR_0022, ADR_0030, ADR_0032, ADR_0033, ADR_0034, ADR_0036]
---

# Skill `cowork.setup_unterrichtsplanung` (Phase-3 Setup)

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

Setup-Skill für Lehrkraft-Cowork-Project-Initialisierung. Folgt advisor's Round-2-Pattern A (Multi-Step + Verifikation pro Schritt) + Pattern B (UI-Min via Elicitation-Form) + Pattern C (Self-Validation als Empirie).

### Trigger-Erwartung

Lehrkraft schreibt im Chat:
- "Plugin einrichten" / "Plugin setup"
- "neues Project anlegen" / "neues Cowork-Project"
- "Lehrkraft-Setup" / "Setup für meine Klasse"
- "Setup unterrichtsplanung" / "Plugin initialisieren"

### Idempotenz-Check (Schritt 0)

Pre-Flight: prüfe ob `<repo>/lehrkraft_project_instructions.md` existiert.
- Falls **nein**: Vollständiges Setup (Schritte 1-8)
- Falls **ja**: Pflege-Modus aktivieren (Update einzelner Sektionen, kein Recreate)

### 5 User-Validierungs-Punkte blockierend (Phase-3.6.D'' E.4-Refactor 2026-04-28)

User-Validierung blockierend an 5 Stellen — User MUSS klicken bevor Plugin weitermacht:

| # | Punkt | Validierungs-Frage | Bei "korrigieren" |
|---|---|---|---|
| **V.1** | Level-1-Closure | "Allgemeinsituation bestätigt? [ja / korrigieren]" | Re-Iteration Level-1 mit User-Edit |
| **V.2** | Level-2-pro-Kurs | "Kurs-Profil <kurs> bestätigt? [ja / korrigieren]" | Re-Iteration Level-2 für diesen Kurs |
| **V.3** | Jahresplan post-Generation | "Jahresplan <kurs> stimmt? [ja / korrigieren]" | Re-Generation mit User-Edit |
| **V.4** | Sequenz post-Generation | "Sequenz <Lernbereich> stimmt? [ja / korrigieren]" | Re-Generation mit User-Edit |
| **V.5** | UE post-Generation | "TUV erste UE stimmt? [ja / korrigieren]" | Re-Generation mit User-Edit |

**Pattern-Eigenschaften:**
- Blockierend (User MUSS klicken, kein Auto-Skip)
- Klar-sichtbarer Korrigieren-Button
- Bei Korrigieren: Re-Iteration desselben Level-Schritts (kein Re-Setup-from-zero)
- Memory-persistierte Bestätigungen (für Re-Use bei späterem Plugin-Trigger)

**Skip-Option Power-User-Mode (Phase-3.6.D'' E.4-CH):**

User kann via lehrkraft_project_instructions.md `power_user_mode: true` setzen:
```yaml
# In lehrkraft_project_instructions.md
config:
  power_user_mode: true   # Default: false
  validation_skip:
    v1_level1: false       # Default Pflicht-Validierung
    v2_kurs_profil: false
    v3_jahresplan: false
    v4_sequenz: false
    v5_ue: false
```

Bei `power_user_mode: true` UND `validation_skip.<v_id>: true` → Plugin überspringt Validierung. Default für Erst-Setup: alle blockierend. Power-User können nach 2-3 Setups einzelne Validierungen abschalten.

## Spec-Source (ADR 0037, verbindlich)

**Master-Fragebogen:** `core/state/schemas/onboarding_fragebogen.yaml` (Phase-3.6.D''' Round 51).

Dieser Skill MUSS die Spec verbatim umsetzen. Drift-Detection via `core/tools/audit_onboarding_compliance.py` (6 Pflicht-Tests). Audit-Pflicht-Step in `cowork.audit_pre_commit` bei Setup-Closure.

### Initial-Begrüßung (verbatim aus YAML, AP.6 verboten Variation)

Plugin gibt als erste Nachricht aus (verbatim aus `onboarding_fragebogen.yaml:initial_begruessung_verbatim`):

```
Hallo! Erzähle mir bitte über deine Situation.

Zum Beispiel kannst du auf diese Fragen eingehen:

- In welchem Bundesland und an welcher Schulart unterrichtest du?
- Welches Schuljahr soll geplant werden?
- Welche Stundenplanstruktur hast du? (Beginn, Pausen, Ende)
- Welche Kurse (Fach + Klasse) unterrichtest du dieses Schuljahr?

Du kannst frei antworten — auch per Diktat. Ich werde deine Angaben
strukturieren und nur dort itemweise nachfragen, wo Informationen fehlen.
```

### FORBIDDEN-Sektion: Anti-Patterns AP.1-AP.7 (verbatim aus YAML)

| ID | Titel | Beschreibung |
|---|---|---|
| **AP.1** | Form-Widget vor Inventar-Anzeige | Plugin darf KEIN show_widget aufrufen, bevor User-Freitext geparst und Inventar als Markdown gespiegelt wurde. |
| **AP.2** | Zusammenhängender Markdown-Fragebogen für Restabfrage | Offene Items werden ITEMWEISE im Chat-Verlauf gefragt (1 Chat-Nachricht = 1 Frage), NICHT als zusammenhängender Fragebogen-Block. |
| **AP.3** | Default-Vorschlag für B.7 Slot-Zuweisung | Plugin darf KEINEN Default-Vorschlag für Stundenplan-Slots pro Kurs machen — User wählt explizit. B.7 hat NULL Default. |
| **AP.4** | Slider vor Freitext | Slider erscheinen NACH Freitext-Erfassung, NUR für noch nicht erfasste Items. |
| **AP.5** | Klassengröße als Slider | B.2 Klassengröße ist Integer-Eingabe-Widget, NICHT Slider. |
| **AP.6** | Begrüßungs-Text-Variation | Initial-Begrüßung MUSS verbatim aus YAML. Keine Paraphrasierung. |
| **AP.7** | AVV-Erfassung | Plugin verarbeitet by-design KEINE personenbezogenen Daten. Schul-Name/Träger/AVV-Status werden NICHT erfragt (ADR 0022 Amendment). |

### Erhebungs-Sequenzierung Block A (Level 1 Allgemeinsituation, 1×)

7-Steps verbindlich aus `onboarding_fragebogen.yaml:erhebungs_sequenzierung.level_1_block_a`:

| Step | Aktion |
|---|---|
| 1.1 | Begrüßung verbatim ausgeben (siehe oben) |
| 1.2 | User-Freitext-Antwort akzeptieren (Diktat möglich) |
| 1.3 | Plugin parsed Freitext + extrahiert strukturierte Daten in `onboarding_state.yaml` |
| 1.4 | Plugin zeigt Inventar in Markdown-Tabelle (Spiegelung an User) |
| 1.5 | Plugin fragt offene Items **ITEMWEISE im Chat-Verlauf** (NICHT zusammenhängender Markdown-Fragebogen — AP.2 verboten) |
| 1.6 | Stundenplan-Struktur (A.4+A.5+A.6): Click-by-Click-Widget falls nicht via Freitext erfasst |
| 1.7 | Closure-Validierung verbatim: `"Allgemeinsituation bestätigt? [ja / korrigieren]"` |

### Erhebungs-Sequenzierung Block B (Level 2 Kurs-Profil, N× pro Kurs aus A.8)

7-Steps verbindlich aus `onboarding_fragebogen.yaml:erhebungs_sequenzierung.level_2_block_b_pro_kurs`:

| Step | Aktion |
|---|---|
| 2.N.0 | Plugin Auto-Mapping B.1 (Lehrplan-Pfad) ohne User-Eingabe |
| 2.N.1 | Plugin fragt User-Freitext zu Kurs `<N>`: "Erzähl mir kurz über `<kurs>`: Klassengröße, Verteilung (DaZ/LRS/ADHS), welche Stundenplan-Slots" |
| 2.N.2 | Plugin parsed Freitext + extrahiert |
| 2.N.3 | Plugin zeigt Inventar in Markdown-Tabelle für Kurs `<N>` |
| 2.N.4 | Plugin fragt offene Items **ITEMWEISE im Chat** (AP.2) |
| 2.N.5 | Slider-Widget für DaZ/LRS/ADHS bei Pflicht-Item (NUR wenn nicht via Freitext erfasst — AP.4) |
| 2.N.6 | Slot-Zuweisung B.7: Multi-Select über A.4-A.6-Slots — **KEIN Default-Vorschlag** (AP.3 verboten) |
| 2.N.7 | Closure-Validierung verbatim: `"Kurs-Profil <kurs> bestätigt? [ja / korrigieren]"` |

### Speicher-Format (Zwei-Format-Persistierung Pflicht)

| Format | Pfad | Zweck |
|---|---|---|
| Markdown | `<project>/lehrkraft_project_instructions.md` | User-lesbare Spiegelung + ALWAYS-READ-FIRST |
| YAML | `<project>/.unterrichtsplanung/onboarding_state.yaml` | Strukturierte Plugin-internal-Daten, KEINE personenbezogenen Daten |

### Validation-Tests-Reference

`core/tools/audit_onboarding_compliance.py` (6 Pflicht-Tests, ADR 0037):
1. `begruessung_verbatim` — initial_begruessung_verbatim wortgleich in SKILL.md
2. `kein_form_widget_vor_inventar` — AP.1-FORBIDDEN
3. `itemweise_chat_restabfrage` — AP.2-FORBIDDEN
4. `kein_default_slot_vorschlag` — AP.3-FORBIDDEN
5. `klassengroesse_integer` — AP.5-FORBIDDEN + B.2 widget_typ=integer_eingabe
6. `speicher_zwei_formate` — Markdown + YAML beide

Audit-Skript-Run: `python3 core/tools/audit_onboarding_compliance.py` muss alle 6 Tests PASS bevor Setup-Closure persistiert wird (cowork.audit_pre_commit-Pflicht-Step).

### Onboarding-Hierarchie-Pattern (Phase-3.6.D'' E.0-Refactor 2026-04-28)

User-Empirie Round 47 hat Hierarchie-Lücke in einmaligem Reflective-Listening detected. Setup nutzt jetzt **5-Schritt-Pattern PRO LEVEL** mit klaren Closure-Punkten.

#### Section A — Trigger-Erkennung (Pflicht-Pattern)

**Pflicht-Match-Pattern:** `"hilf mir beim planen meines schuljahres"` + Synonyme (Phase-3.6.D'' E.5):
- "Schuljahres-Setup", "neues Schuljahr starten", "Plugin einrichten", "Onboarding starten"

#### Section B — Level 1: Allgemeinsituation (1× pro Schuljahr-Setup)

5-Schritt-Pattern für Level 1:

| Schritt | Inhalt |
|---|---|
| **A** | Plugin präsentiert Frage-Liste (Markdown) für Level 1: Bundesland / Schulart / Schuljahr / Stundenplanstruktur / Kurse |
| **B** | User-Freitext-Antwort (Diktat möglich) |
| **C** | Plugin parsed + extrahiert via Pattern-Parser-Regex `[A-Z][a-z]?\d+[a-z]+?` (Fach+Jahrgang+Parallelklasse) + Domain-Whitelist |
| **D** | Form-Widget mit extrahierten Werten vor-ausgefüllt: Bundesland-Dropdown / Schulart / Schuljahr-Default-aktuell / **Stundenplan-Click-by-Click** / Kurse-Liste |
| **E** | Level-1-Closure-Validierung: "Allgemeinsituation bestätigt? [ja / korrigieren]" — V.1-Validierungs-Punkt aus E.4 |

**Level-1-Felder:**
- 1.1 Bundesland (Pflicht für LehrplanPLUS-Bezug)
- 1.2 Schulart (Mittelschule / Gymnasium / Realschule)
- 1.3 Schuljahr (Default aus Datum: aktuelles oder kommendes)
- 1.4 Stundenplanstruktur (Click-by-Click 6-9 Stunden + 1-3 Pausen)
- 1.5 Kurse-Liste (Pattern-Parser oder Manuell)

**Skip-Option Phase-3.6.D'' E.0-CH:** "Apply-to-all-similar"-Hint bei wiederholten Kursen — Plugin frägt User-Mitte-Setup: "GPG7c+GPG8b haben gleiche DaZ/LRS-Verteilung übernehmen? [ja / einzeln konfigurieren]"

#### Section C — Level 2: Kurs-Profil (N× iterativ pro Kurs)

5-Schritt-Pattern PRO Kurs:

| Schritt | Inhalt |
|---|---|
| A | Plugin präsentiert Frage-Liste für Kurs `<X>`: Lehrplan / Klassengröße / Klassenzusammensetzung / Slots |
| B | User-Freitext-Antwort |
| C | Plugin parsed + extrahiert |
| D | Form-Widget pro Kurs vor-ausgefüllt mit: |
|   | • 2.1 Lehrplan: **Auto-Mapping** (Phase-3.6.D'' E.1, kein User-Eingabe — siehe Schritt 6a) |
|   | • 2.2 Klassengröße: **Integer-Eingabe** (NICHT Slider, Phase-3.6.D'' E.2), Default 22 |
|   | • 2.3 Klassenzusammensetzung: 3 Slider (DaZ / LRS / ADHS) mit statistischen Defaults + Tooltip-Quellen |
|   | • 2.4 Stundenplan-Slots: **Multi-Select** über Level-1.4-Slots (Phase-3.6.D'' E.3), Default-Vorschlag basierend auf Wochenstunden-Kontingent |
| E | Kurs-Closure-Validierung: "Kurs-Profil <kurs> bestätigt? [ja / korrigieren]" — V.2-Validierungs-Punkt |

#### Slot-Zuweisung-Spec (Phase-3.6.D'' E.3)

**Multi-Select über Level-1.4-Stundenplan-Slots:**

User-Setup-Beispiel Level 1.4:
```
8 Stunden 08:00-15:00, 2 Pausen (nach 2./4. Stunde, je 15 Min)
Slots: Mo 1-8 / Di 1-8 / Mi 1-8 / Do 1-8 / Fr 1-8 (40 Slots/Woche)
```

User-Setup-Beispiel Level 2.4 für GPG7c:
```
Wochenstunden-Kontingent GPG7c (aus LehrplanPLUS): 2 WS
Default-Vorschlag (Plugin): "Mo 1.-2. Stunde + Fr 5.-6. Stunde"
User-Override: Multi-Select-Widget mit allen 40 Slots, GPG7c-vorausgewählt 2 Slots
```

**Konsistenz-Check (Pflicht):**
- Jeder Kurs muss ≥ 1 Slot haben (sonst Validation-Block)
- Kein Slot zweimal vergeben für identische Klasse (z.B. GPG7c kann nicht 2× im selben Slot sein)
- Cross-Kurs-Doppelbelegung erlaubt (z.B. GPG7c und WiB7c können denselben Slot haben falls Lehrkraft beides parallel-blockiert)
- Bei Inkonsistenz: User-Hinweis mit Korrektur-Vorschlag

**Default-Algorithmus:**
```python
def vorschlag_slots(wochenstunden, kursname, alle_slots):
    # Gleichmäßig über Wochentage verteilen
    if wochenstunden == 1:
        return [alle_slots[0]]  # erste Stunde Mo
    elif wochenstunden == 2:
        return [alle_slots[0], alle_slots[20]]  # Mo 1. + Mi 1.
    elif wochenstunden == 4:
        return [s for i, s in enumerate(alle_slots) if i % 10 == 0]  # Mo/Mi/Fr-Doppel
    # ... etc
```

#### Section D — Level 3: Kursplanung-Inhalt (on-demand, separate Skills)

Auto-Suggest nach Level-1+2-Closure:

```
✓ Allgemeinsituation + N Kurs-Profile bestätigt.

Soll mit Jahresplanung begonnen werden? Welches Fach?
[Kurs-1 | Kurs-2 | ... | Kurs-N | später]
```

User wählt → triggert pro Fach:
- 3.1 `cowork.erstelle_jahresplan` + V.3-Validierung
- 3.2 `cowork.erstelle_sequenz_initial` (per Lernbereich, Auto-Suggest nach 3.1) + V.4-Validierung
- 3.3 `cowork.plane_naechste_stunde` (Auto-Suggest nach 3.2) + V.5-Validierung

### Reflective-Listening-Onboarding-Pattern (Phase-3.6.D.2-D.8) — DEPRECATED durch E.0-Refactor

Pre-D''-Refactor 2-Step-Pattern wird durch 5-Schritt-PRO-Level-Pattern ersetzt. Folgende Sektion historisch:

**Step A — Frage-Liste-Generation:**
Plugin erzeugt initiale Frage-Markdown:
```
Erzähle mir von deinem Schuljahr-Setup:
- Welche Fächer + Klassen unterrichtest du? (z.B. "GPG7c, M5b, Sm8abc")
- Welche typische Klassengröße + Verteilung (DaZ / LRS / ADHS)?
- Wann findet welcher Kurs im Stundenplan statt?
- Welches Equipment hast du standardmäßig (Tafel/Beamer/Tische/Sport-Halle/Labor)?
```

**Step B — User antwortet via Freitext/Diktat.**

**Step C — Plugin parst Freitext** mit Pattern-Parser (Regex `[A-Z][a-z]?\d+[a-z]+?` für Fach+Jahrgang+Parallelklasse) + Domain-Whitelist (Fach-Pool aus LehrplanPLUS-Files).

**Step D — Form-Widget-Spiegelung** via show_widget mit ausgewerteten Werten:
- Kurs-Matrix (Spalten: Fächer, Zeilen: Jahrgang × Parallelklasse als Ankreuz)
- Klassengröße: **Integer-Eingabe** (Phase-3.6.D'' E.2-Refactor, NICHT Slider — User-Empirie Round 47), Range 5-35, Default 22 (KMK-Bildungsbericht 2024)
- DaZ-Slider (0-100%, Default 12% — Statistisches Bundesamt 2024 Bayern)
- LRS-Slider (0-100%, Default 5% — KMK-Diagnose-Quote 2024)
- ADHS-Slider (0-100%, Default 5% — RKI-Studie 2024)
- Stundenplan-Click-Sequence (Default 8 Stunden + 2 Pausen, Range 6-9 Stunden / 1-3 Pausen, 45-Min-Block-Default)
- Equipment-Multiselect (Default `["Tafel","Beamer","Einzeltische"]`, pro Fach Override z.B. Sport `["Halle","Bad"]`, Bio `["Labor"]`)
- Pattern-Parser-Fallback: Form-Widget mit leeren Feldern wenn Parser-Match <30%

**Step E — User bestätigt / korrigiert** → Persistierung.

**Pre-Setup Daten-Schutz-Banner (D.8, blockierend einmalig):**
```
⚠️ DATENSCHUTZ: Plugin verarbeitet KEINE personenbezogenen Daten.
Nur Gruppen-Verteilungen erfassen — keine SuS-Klarnamen, keine
Diagnose-Listen, keine Schul-Namen. [ ] Verstanden
```
"Verstanden"-Klick einmalig (Memory-persistiert mit Timestamp), kein Re-Setup-Re-Klick.

### Step 0 NEU (Phase-3.6.D' Round 43): Pre-Setup-Cleanup für AVV-Residuals

Setup-Skill detected pre-existing AVV-Konfiguration aus Plugin-Versionen v0.1.0-v0.1.2 und räumt sie auf:

```python
# Pre-Setup-Cleanup-Check
avv_residuals = [
    pathlib.Path(project_root) / ".unterrichtsplanung" / "AVV.json",
    pathlib.Path.home() / ".unterrichtsplanung" / "AVV.json",
]
import time
ts = int(time.time())

cleanup_log = []
for avv_path in avv_residuals:
    if avv_path.exists():
        deprecated = avv_path.with_suffix(f".deprecated_{ts}")
        avv_path.rename(deprecated)
        cleanup_log.append(f"Renamed {avv_path} -> {deprecated.name}")
```

User-Hinweis im Setup-Output bei Detection:

```
ℹ️ Migration-Hinweis: Veraltete AVV-Konfiguration aus Plugin v0.1.0-v0.1.2 detected.
Files umbenannt auf .deprecated_<timestamp> (kein direkter Delete für User-Sicherheit).
Plugin v0.1.3+ verarbeitet by-design KEINE personenbezogenen Daten — siehe ADR 0022 Amendment.
Manueller Delete der .deprecated-Files möglich nach Verifikation.
```

**Anti-Pattern (Phase-3.6.D' Round 43 worker-Self-Flag):**
- Direkter Delete ohne User-Confirm = Daten-Verlust-Risiko
- Skip ohne Migration-Hinweis = User wundert sich über entfernte Files

### 8-Schritte-UX (Pflicht-Sequenz, Phase-3.6.D-Refactor: Schritt 5 entfernt, 7 Schritte verbleibend)

**Schritt 1: Pre-Flight-Checks**
- Cowork-Mode aktiv? (`core/runtime/cowork_detection.py:is_cowork_session()`)
- Plugin installiert? (`.claude-plugin/plugin.json` existiert)
- Repo schreibbar? (Test via Stub-Write)
- Bei FAIL: klare Diagnose + Abbruch

**Schritt 2: Schul-Setting elicit (Phase-3.6.D-Refactor: KEINE personenbezogenen Daten)**
Via elicitation-Form (Reflective-Listening-Pattern, siehe Schritt 2-Dialog unten):
- Bundesland (Pflicht für LehrplanPLUS-Bezug)
- Schulart (Mittelschule / Gymnasium / Realschule / …)
- Jahrgang (Pflicht für Lehrplan-Mapping)
- Fächer + Parallelklassen (z. B. "GPG7c, M5b, Sm8abc")

**NICHT erfasst (by-design Daten-Schutz, Phase-3.6.D):**
- Schul-Name (überflüssig, kein Use-Case)
- Schul-Träger (AVV-Marker entfernt)
- Lehrkraft-Name / identifizierende Daten

**Schritt 3: Klassen-Kontext elicit (NUR Gruppen-Verteilungs-Schätzungen)**
Slider-Skalen mit statistisch-erwartetem Default:
- Klassengröße (Integer-Eingabe, Range 5-35, Default 22 — KMK-Bildungsbericht 2024). **NICHT Slider** (Phase-3.6.D'' E.2-Refactor)
- DaZ-Anteil (Prozent, Default 12% — Statistisches Bundesamt 2024 Bayern)
- LRS-Anteil (Prozent, Default 5% — KMK-Diagnose-Quote 2024)
- ADHS-Anteil (Prozent, Default 5% — RKI-Studie 2024)
- Klassen-Dynamiken (frei, NUR Gruppen-Niveau)

**KEINE Einzel-SuS-Daten:** keine BUV-Items, keine Klarnamen, keine Diagnose-Listen. Plugin verarbeitet by-design KEINE personenbezogenen Daten.

**Schritt 4: Sequenz-Stand + Multi-Fach-Bootstrap-Option elicit (Phase-3.6.A9)**
- Aktueller Lernbereich
- Sequenz-Thema
- UE-Stand (i von N)
- Letzte gehaltene UE (KW + Thema)
- Nächste geplante UE (KW + Thema)
- **Multi-Fach-Bootstrap (opt-in, Default 1 Fach):** Lehrkraft kann zusätzliche Fächer/Klassen für Initial-Setup angeben. Bei opt-in: pro zusätzlichem Fach Schritt 4 + 6a + 6b wiederholen.
- **Sequenz-Initial-Vorschlag (opt-in, Default ja):** Plugin schlägt für jedes konfigurierte Fach eine Initial-Sequenz vor (Schritt 6a-6b unten).

**Schritt 5: ENTFERNT (Phase-3.6.D-Refactor 2026-04-28, User-Empirie Round 39)**

AVV-Marker-Setting komplett entfernt. Plugin verarbeitet by-design KEINE personenbezogenen Daten:
- Keine Schul-Träger-Bestätigung erforderlich (kein AVV-Vertrag-Bedarf)
- Keine Pseudonymisierungs-Schema-Wahl (Identifikationsfiguren by-design fiktiv: Mia/Johann/Anna/Peter)
- Keine LLM-Cloud-Erlaubnis-Erfassung (Cloud-Path-Hard-Block bleibt im LLM-Cache als technische Schutzschicht)
- Keine `AVV.json`-Persistierung mehr

ADR 0022 revidiert: by-design-Prinzip statt User-Erfassung.

**Schritt 6: Template generieren mit User-Daten + dynamischen Plugin-Metadaten (Phase-3.6.D.9)**
- `templates/lehrkraft_project_instructions.md` als Vorlage nehmen
- Plugin-Metadaten dynamisch laden (NICHT hardcoded):
  - `{{plugin_version}}` ← `.claude-plugin/plugin.json:version` (read-on-each-trigger, kein Setup-time-Cache)
  - `{{skill_count}}` ← `len(plugin.json:skills)` dynamisch
  - `{{plugin_name}}` ← `.claude-plugin/plugin.json:name`
- Slots mit User-Eingaben + Plugin-Metadaten befüllen
- Persistieren als `<repo>/lehrkraft_project_instructions.md`
- Pflege-Trail-Eintrag: "YYYY-MM-DD | Initial-Setup | setup-skill v{{plugin_version}}"

**Anti-Pattern D.9:** Plugin-Version oder Skill-Count im Template hardcoden — bricht bei Plugin-Update. Mitigation: `read-on-each-trigger` aus plugin.json statt Setup-time-Cache.

**Schritt 6a (Phase-3.6.A9 + Phase-3.6.D'' E.1-Refactor): Lehrplan-Auto-Mapping (kein User-Eingabe)**

**Auto-Mapping aus Level-1+Level-2-Daten (Phase-3.6.D'' E.1):**

```python
# Pfad-Konstruktion automatisch aus User-Setup-Daten
file_path = (
    f"core/lehrplaene/{bundesland.lower()}/"
    f"lehrplan_{schulart.lower()}_{zweig.lower()}{jahrgang}_{fach.lower()}.yaml"
)
```

Beispiel User-Setup `Bundesland=Bayern, Schulart=Mittelschule, Jahrgang=8, Fach=GPG, Zweig=R`:
→ `core/lehrplaene/bayern/lehrplan_mittelschule_r8_gpg.yaml`

**Verfügbare Files in v0.1.4:** R7 + R8 (GPG/M/WiB). R5/R6/R9/R10 deferred Phase-4 (T-33-J).

**Bei nicht-verfügbarem File** (Auto-Empfehlung-Liste analog Test-Run-3-Pattern):

```
Lehrplan-File für <fach>/R<jgs> nicht im Plugin verfügbar.
Optionen:
  a) WebFetch + Generierung (T-33-J Phase-4-Backlog) — aktuell nicht implementiert
  b) Manuell LB-Liste eingeben (ich frage nach LB-Titel + Stundenkontingent pro LB)
  c) Pivot zu vorhandenem Lehrplan (z.B. R7-Pilot als Approximation)
  d) Setup für diesen Kurs pausieren (anderen Kurs zuerst)
```

User wählt Option, Plugin handelt entsprechend.

**Anti-Pattern (Phase-3.6.D'' E.1):** User explizit nach Lehrplan-Pfad fragen — Pfad ist aus Level-1/Level-2-Daten ableitbar, sollte automatisch erfolgen.

**Schritt 6b ENTFERNT (Phase-3.6.D.12-Refactor):** Sequenz-Initial-Erstellung NICHT mehr im Setup-Pflicht-Pfad. `cowork.erstelle_sequenz_initial`-Skill bleibt im Plugin für on-demand-Trigger nach Lernbereich-Folder-Klick (siehe `cowork.erstelle_jahresplan` D.11).

**Schritt 6c (Phase-3.6.D.6 NEU): Project-Folder-Struktur generieren — Schriftwesen-Lehrkraft-Format**

Setup generiert Schuljahr-Folder mit Klassen-Subfolders:

```
<project-root>/
├── 2025-26/                              # Schuljahr-Folder (aktuell)
│   ├── WiB7c/                            # pro Klasse (Schriftwesen-Format)
│   │   ├── 00_Jahresplanung/             # leer initial (gefüllt via D.11 erstelle_jahresplan)
│   │   └── WiB7c_Verlauf.md              # Jahres-Verlauf-Logfile
│   ├── M5b/
│   │   ├── 00_Jahresplanung/
│   │   └── M5b_Verlauf.md
│   └── Sm8abc/
│       ├── 00_Jahresplanung/
│       └── Sm8abc_Verlauf.md
├── lehrkraft_project_instructions.md     # ALWAYS-READ-FIRST (ADR 0033)
└── memory/
    ├── lehrkraft_profil.md
    └── MEMORY.md
```

**Wichtig (Phase-3.6.D.6):**
- KEINE `core/fach/...`-Struktur im User-Project-Folder (das ist Plugin-internal-Datenstruktur, bleibt im Plugin-Repo)
- User-Project-Folder ist Schriftwesen-Lehrkraft-Format (analog WiB7c-Repo)
- Lernbereich-Folders (`01_Lernbereich_<thema>/`) DEFERRED zu `cowork.erstelle_jahresplan`-Skill (D.11)
- Schuljahr-Format `<jahr-1>-<jahr-2>` (z.B. "2025-26") aus Datum + Jahres-Anker

**Schritt 7: Memory-Hook ergänzen (Phase-3.6.D-Refactor: keine personenbezogenen Daten)**
- `memory/lehrkraft_profil.md` schreiben mit Cross-Session-Profil:
  - Bundesland, Schulart, Jahrgang
  - Fächer + Parallelklassen-Liste
  - Differenzierungs-Schwerpunkt (aus DaZ/LRS/ADHS-Anteilen abgeleitet)
  - Material-Präferenz (frei oder Default)
  - **KEIN Schul-Name / Schul-Träger / AVV-Status** (by-design-Daten-Schutz)
- MEMORY.md-Index-Eintrag ergänzen

**Schritt 8: Cowork-UI-Stub erzeugen**
- Minimal-Stub generieren (analog ADR 0030):
  ```markdown
  ## ALWAYS READ FIRST

  `lehrkraft_project_instructions.md` (Repo-Root) — Kontext + Setting.
  Plugin-Skills lesen diese Datei automatisch beim Trigger.
  ```
- User-Anweisung: paste in Cowork-UI-Project-Instructions-Field (1-Aktion)
- Smoke-Test-Vorschlag: erste Test-Session-Frage "wie ist mein Klassen-Setting?"

### Auto-Suggest-Hinweis am Output-Ende (Phase-3.6.D' Track 43.3, Round 43)

Setup-Output schließt MIT Auto-Suggest:

```
✓ Setup abgeschlossen für <kurse>.

Nächster sinnvoller Schritt: 'Erstelle Jahresplan für <kurs>' triggert
`cowork.erstelle_jahresplan` (Lehrplan-basiertes Lernbereich-Folder-Skelett).
```

Auto-Suggest ist Hinweis (User-Control bleibt), kein Auto-Trigger.

### Self-Validation (Pattern C, Post-Setup)

Setup-Skill schließt mit Self-Validation-Test:

```yaml
post_setup_verification:
  prompt: "Erste Test-Session-Frage: 'wie ist mein Klassen-Setting?'"
  expected_keys:
    - "Bundesland: <user-eingabe>"
    - "Klassengröße: <user-eingabe>"
    - "Fächer: <user-eingabe>"
  pass_criteria: alle 3 Keys in Test-Session-Antwort (ohne personenbezogene Daten — Phase-3.6.D-Daten-Schutz-Prinzip)
```

Bei FAIL der Self-Validation:
- Hinweis an Lehrkraft: prüfe Cowork-UI-Stub ist gepasted
- Optional: re-trigger Skill mit Pflege-Modus

### Output-Format

```yaml
setup_status: COMPLETE | PFLEGE_MODUS | FAIL
files_persisted:
  - <repo>/lehrkraft_project_instructions.md
  - ~/.unterrichtsplanung/AVV.json
  - memory/lehrkraft_profil.md
  - memory/MEMORY.md (Index-Update)
cowork_ui_stub: |
  <minimal-stub-für-paste>
self_validation:
  status: PASS | FAIL
  details: <test-output>
naechste_schritte:
  - "1. Cowork-UI-Stub in Project-Instructions-Field pasten"
  - "2. Test-Session-Frage 'wie ist mein Klassen-Setting?'"
  - "3. Erste UE planen via 'cowork.plane_naechste_stunde'"
```

### Anti-Pattern (Cowork-Mode verboten)

- **Sequenzielles Frage-Spam** statt Elicitation-Form (Pattern-B-Verstoß)
- **AVV-Marker-Skip** (DSGVO Art. 22 + ADR 0022-Verstoß)
- **Pseudonymisierungs-Schema nicht setzen** trotz BUV-Items mit Klarnamen-Risiko
- **Cowork-UI-Stub ohne ALWAYS-READ-FIRST** (ADR 0030-Verstoß)
- **Setup-Skip bei Pflege-Modus** (Idempotenz-Verstoß)
- **Memory-Update ohne Index-Eintrag** (Auto-Memory-Drift)

## Helper-Scripts

`core/skills/cowork.setup_unterrichtsplanung/setup.py` — Stdlib-Helper:
- Template-Slot-Substitution
- AVV-File-Persistierung
- Memory-Hook-Schreiben
- Self-Validation-Test-Runner

## ADR-Cross-Refs

- **ADR 0021** Cowork-UX-Persona (Plugin-Use vs. Plugin-Dev)
- **ADR 0022** Datenschutz (AVV-Marker-Pflicht)
- **ADR 0030** ALWAYS-READ-FIRST-Pattern (Cowork-UI-Stub)
- **ADR 0032** Cowork-First-Skill-Pattern (Skill-Anatomie)
- **ADR 0033** Lehrkraft-Project-Instructions-Pattern (Template + 8-Schritte-UX)
