---
name: cowork.synchronisiere_kalender
description: "Pipeline-Skill (Track-α-Y, Layer-9 Calendar-Sync) für RFC 5545 ICS-Generation aus Schulkalender + TUV-Files. Trigger: 'Aktualisiere Kalender', 'Synchronisiere ICS', 'Generiere Unterrichtsplan-ICS', 'Calendar-Sync für <klasse>', 'ICS-File für <schuljahr>'. Eingabe: schulkalender_ref + klasse + optional tuv_files. Output: <project>/<schul-jahr>/<klasse>/unterrichtsplan_<klasse>_<schuljahr>.ics. Komposition: Schulkalender-Load + TUV-Files-Discovery + Stundenplan-Match + ICS-Writer-Aufruf + Validator-Pass + Auto-Hook in cowork.audit_pre_commit. NICHT triggern für TUV-Erstellung selbst (siehe cowork.plane_naechste_stunde) oder Schulkalender-Erstellung (siehe cowork.erstelle_schulkalender)."
schema_pin: tuv_v2.1
domain_scope: universal
phase: phase_3_6_track_alpha_Y
mode: cowork-first
skill_typ: pipeline
adr_refs: [ADR_0017, ADR_0022, ADR_0032, ADR_0034, ADR_0061]
---

# Pipeline-Skill `cowork.synchronisiere_kalender` (Track-α-Y Layer-9)

## Trigger-Beispiele

- "Aktualisiere Kalender für GPG7c"
- "Synchronisiere ICS für Schuljahr 2025/26"
- "Generiere Unterrichtsplan-ICS für meine Klassen"
- "Calendar-Sync mit Apple Kalender"
- "ICS-File für GPG7b 2025/26"

NICHT triggern:
- TUV-Erstellung (siehe `cowork.plane_naechste_stunde`)
- Schulkalender-Erstellung (siehe `cowork.erstelle_schulkalender`)
- Direkt-Sync mit Google Calendar / CalDAV (Phase-2/3 deferred)

## Auto-Update-Trigger-Punkte

Skill triggert auch automatisch via Auto-Hook in `cowork.audit_pre_commit`:

1. **Post-TUV-Persist** (`cowork.plane_naechste_stunde` Closure): incremental rebuild_ics für betroffene UE
2. **Post-Schulkalender-Change** (`cowork.erstelle_schulkalender` Closure): full rebuild für alle Klassen
3. **Post-Sequenz-Update** (`cowork.fortschreibe_sequenz`): incremental
4. **Post-Verlauf-Log** (`cowork.dokumentiere_stunde`): UPDATE Status:COMPLETED

## Pflicht-Kontext (ADR_0061 Dual-Pfad-Konvention)

**Schulkalender-Layer (Pflicht):**
1. `<project>/<schul-jahr>/<klasse>/unterrichtskalender_<schuljahr>.yaml` ODER `core/fach/_project_skeletons_klassen/unterrichtskalender_<schuljahr>_<bundesland>.yaml`

**TUV-Layer (Optional):**
2. `<project>/<schul-jahr>/<klasse>/<KW>_<datum>_<slug>_TUV.md` Files für UE-Events

**Lib-Konsumption:**
3. `core/lib/ics_writer.py` (RFC 5545 Stdlib-only Pure-Python Generator)
4. `core/lib/ics_mapping.py` (Schulkalender + TUV → VEVENT Mapping)

**Konfig:**
5. `lehrkraft_project_instructions.md` (Klassen + Stundenplan)

## Reasoning-Schritte

1. **Trigger-Parsing:** klasse + schuljahr + optional tuv_filter
2. **Schulkalender-Load:** schulkalender_<schuljahr>.yaml → dict
3. **TUV-Discovery:** rglob `*_TUV.md` Files in <klasse>/ (optional)
4. **TUV-Frontmatter-Parse:** tuv_id + thema + datum_geplant aus Frontmatter
5. **Mapping:** ics_mapping.build_full_calendar_events(schulkalender, tuv_list, klasse)
6. **ICS-Writer:** ics_writer.write_ics(events, output_path)
7. **Validation:** validate_ics_consistency.py post-Generation
8. **Output-Bericht:** Anzahl VEVENTs + Klasse + Pfad

## Workflow-Reihenfolge

```
1. Eingaben klären           (klasse + schuljahr)
2. Schulkalender-Load        (Pflicht-Pre-Bedingung)
3. TUV-Discovery             (Optional, kann leer sein)
4. ICS-Mapping               (Schulkalender-Events + TUV-Events)
5. ICS-Generation            (lib/ics_writer.py)
6. Validation                (lib/ics_writer Self-Test + ics_consistency)
7. Persist                   (atomar, Backup via .bak.YYYYMMDD-HHMMSS)
8. Output-Bericht            (Lehrkraft-Sicht)
```

## Output-Struktur

```
<project>/<schul-jahr>/<klasse>/
└── unterrichtsplan_<klasse>_<schuljahr>.ics
```

Pro Klasse 1 ICS-File mit:
- Alle Schulferien als TRANSPARENT-VEVENT
- Alle Feiertage (kollidierend → CANCELLED, sonst informativ)
- Alle Brückentage (TENTATIVE bei Klärungsbedarf)
- Bewegliche Ferientage als CONFIRMED
- UE-Termine pro Slot in stundenplan.klassen.<klasse>.slots

## Subscribe-Strategie pro Calendar-App

| Strategy | Apple Cal | Google Cal | Outlook | Thunderbird |
|---|---|---|---|---|
| `file:///path/to/.ics` | ja | nein | nein | ja |
| Lokal-HTTP-Server `localhost:PORT` | ja | nein | begrenzt | ja |
| iCloud Drive Sync (auto) | ja | nein | nein | nein |
| GitHub Pages Public-URL | ja | **ja** | ja | ja |

Detaillierte Anleitung: `docs/distribution/calendar_subscribe_guide.md`.

## Auto-Suggest am Output-Ende

```
✓ ICS-Kalender persistiert (<n> VEVENTs):
  Pfad: <output-path>
  Klasse: <klasse>
  Schuljahr: <schuljahr>
  Schulferien: <n>
  Feiertage: <n>
  Brückentage: <n>
  UE-Termine: <n>

Naechster sinnvoller Schritt: Subscribe in Calendar-App (siehe calendar_subscribe_guide.md).
```

## Anti-Patterns

- ❌ ICS ohne Stable-UIDs (jeder Re-Build erzeugt NEU-Events statt Update)
- ❌ DTSTART ohne TZID (Cross-Timezone-Drift Sommer/Winter)
- ❌ Newline-Drift (LF statt CRLF — RFC 5545 §3.1 verletzt)
- ❌ Special-Char-Escape vergessen in SUMMARY mit `,` oder `;`
- ❌ DTEND inclusive statt exclusive bei all-day-Events (ein Tag zu wenig)
- ❌ Direkt-Push zu Google Calendar API ohne User-DSGVO-Bestätigung (Phase-2 deferred)

## DSGVO-Reminder (ADR_0022)

ICS enthält KEINE personenbezogenen Daten:
- Klassen-Bezeichnungen sind R7c-Pattern (kein Klar-Name)
- TUV-Themen sind didaktische Sachstand, kein PII
- Lehrkraft-Name nur in Calendar-Name (X-WR-CALNAME), redacted-fähig
- Keine Schüler-Namen / Schul-Träger / Klarnamen

## Cross-Refs

- ADR_0017 Two-Tier-Architektur
- ADR_0022 Datenschutz by-design
- ADR_0032 Cowork-First-Skill-Pattern
- ADR_0034 Pipeline-Skill-Workflow
- ADR_0061 Lehrplan-Dual-Pfad-Konvention
- core/lib/ics_writer.py (Track-α-Y-1)
- core/lib/ics_mapping.py (Track-α-Y-2)
- core/tools/validate_ics_consistency.py (Track-α-Y-5)
- core/skills/cowork.audit_pre_commit/SKILL.md (Auto-Hook-Trigger Track-α-Y-4)
- core/skills/cowork.erstelle_schulkalender/SKILL.md (Producer)
- docs/distribution/calendar_subscribe_guide.md (Track-α-Y-6)
