# Planungs-KI — Katalog-Snippets für modulare Prompts **Stand:** 2026-05-22 **Status:** Spezifikation (Phase **H1** — Umsetzung offen) **Bezüge:** `PLANNING_PROGRESSION_GRAPH_KI.md` §4.4 · `AI_PROMPT_TARGET_ARCHITECTURE.md` §2.4 · `planning_catalog_context.py` --- ## 1. Problem Seit **F13 (0.8.233)** fließen Primärfokus, Trainingsstil, Zielgruppe und Stilrichtung als `planning_catalog_context` in **Retrieval und Scoring** (`PlanningTargetProfile`). Die **LLM-Prompts** (Roadmap, Stufen-Spec, Pfad-QS, Gap-Fill) erhalten diese Dimensionen **nicht** als differenzierte Bewertungs- und Planungslogik — höchstens indirekt über Freitext oder JSON-Kataloglisten in Intent-Prompts. **Folge:** Ein Breitensport-Pfad kann mit Leistungsgruppen-Kriterien bewertet werden; Gewaltschutz wird wie Technik-Curriculum behandelt; QS-Hinweise und Rematch-Vorschläge passen fachlich nicht zum gewählten Kontext. **Ziel:** Gleiche **Prompt-Basis**, aber **kaskadierte Snippet-Blöcke** pro Katalog-Ausprägung — keine Matrix aus Voll-Prompt-Kopien. --- ## 2. Priorität der Dimensionen (absteigend) Verbindliche Reihenfolge bei Konflikten und beim Rollout: | Rang | Dimension | DB-Tabelle | Snippet-Rolle | |------|-----------|------------|----------------| | **1** | **Primärfokus** | `focus_areas` | Definiert *worüber* geplant und bewertet wird (Technik-Curriculum vs. Gewaltschutz vs. Fitness …). **Dominant.** | | **2** | **Trainingsstil** | `training_types` | Definiert *wie* trainiert wird (Methodik, Belastungsaufbau, Wettkampf vs. Breitenansatz im Training). | | **3** | **Zielgruppe** | `target_groups` | Definiert *für wen* (Kinder, Breitensport, Leistungsgruppe) — Tempo, Komplexität, Sicherheit. | | **4** | **Stilrichtung** | `style_directions` | Vereins-/Stil-Linie (Shotokan, WKF …) — **Nuancen**, kein neuer Planungstyp. | **Kaskaden-Regel:** Bei widersprüchlichen Snippet-Aussagen gilt: Primärfokus → Trainingsstil → Zielgruppe → Stilrichtung. --- ## 3. Architektur — drei Schichten (Erinnerung) | Schicht | Heute | Mit H1 | |---------|-------|--------| | **Retrieval** | Katalog-Gewichte in `merge_catalog_context_into_target` | unverändert | | **Technik-Gates** | `planning_exercise_semantics.py`, nur `topic_type=technique` | unverändert | | **LLM-Prompts** | kaum Katalog-spezifisch | **`catalog_guidance_block`** pro Aufruf | Snippets **ersetzen** keine Technik-Disambiguierung und **duplizieren** keine Retrieval-Gewichte — sie steuern **Didaktik, Bewertungsmaßstäbe und Formulierung** für das Modell. --- ## 4. Snippet-Modell ### 4.1 Lookup-Schlüssel Pro Katalog-Eintrag ein stabiler **`snippet_key`** (nicht nur numerische ID — IDs können sich in Dev/Import unterscheiden): ``` focus:{slug} z. B. focus:gewaltschutz training_type:{slug} z. B. training_type:kumite target_group:{slug} z. B. target_group:breitensport style:{slug} z. B. style:shotokan ``` **Primär** aus `slug` der DB-Zeile; Fallback normalisierter `name` (ASCII, lower, `_`). Mehrfachauswahl im UI: pro Dimension **höchstens ein Snippet** — die Zeile mit `is_primary: true`, sonst erste Zeile, sonst höchste `weight`. ### 4.2 Snippet-Inhalt (Struktur) Jedes Snippet liefert strukturierte Textbausteine (Deutsch, für LLM): | Feld | Pflicht | Inhalt | |------|---------|--------| | `planning_lens` | ja | 2–4 Sätze: Was ist das Planungsziel in dieser Dimension? | | `qa_criteria` | ja | Bullet-artige Kriterien für Pfad-QS (was ist „gut“, was ist kein Mangel) | | `roadmap_hints` | empfohlen | Stufenlogik, typische Phasen, was vermeiden | | `anti_patterns` | optional | Explizite Fehlbewertungen vermeiden (z. B. „keine Wettkampf-Tiefe verlangen“) | | `rematch_guard` | optional | Wann **kein** Auto-Rematch sinnvoll (Breitensport: keine Perfektions-Slots erzwingen) | Phase **H1:** flache Markdown-Strings im Code-Modul. Phase **H2 (optional):** Tabelle `planning_catalog_prompt_snippets` oder JSONB an Katalog-Zeilen, Admin-editierbar. ### 4.3 Platzhalter in `ai_prompts` Neue **gemeinsame** Platzhalter (Mustache), in alle betroffenen Prompts einfügen: | Platzhalter | Bedeutung | |-------------|-----------| | `{{catalog_guidance_block}}` | Gerenderter Gesamttext (alle aktiven Snippets, kaskadiert) | | `{{catalog_context_json}}` | Kompakte JSON-Zusammenfassung der gewählten IDs/Namen (Audit) | | `{{#has_catalog_guidance}}` … `{{/has_catalog_guidance}}` | Block nur wenn mindestens ein Snippet aktiv | **Optional fein (später):** `{{catalog_focus_snippet}}`, `{{catalog_training_type_snippet}}`, … — Phase H1 nur `_block` + JSON. ### 4.4 Betroffene Prompt-Slugs (Reihenfolge Einbindung) | Priorität | Slug | Migration | Wirkung | |-----------|------|-----------|---------| | 1 | `planning_exercise_path_qa` | bestehend | Pfad-QS, `quality_score`, Empfehlungen | | 2 | `planning_progression_roadmap` | 078 | Major Steps, Didaktik | | 3 | `planning_progression_stage_spec` | 079 | Stufen-Gates, Erfolgskriterien | | 4 | `planning_progression_start_target` | 087 | Start/Ziel-Extraktion | | 5 | `planning_progression_goal_analysis` | 078 | Zielanalyse | | 6 | Gap-Fill / Übungs-KI | 085+ | `planning_context` ergänzen | Intent-Prompts (`planning_exercise_search_intent`, …) **optional** Phase H1.5 — dort bereits Katalog-JSON. --- ## 5. Builder (Backend) **Neues Modul:** `backend/planning_catalog_prompt_snippets.py` ```python def build_catalog_guidance_for_prompt( cur, catalog: Optional[ProgressionPlanningCatalogContext], ) -> Dict[str, str]: """ Returns: catalog_guidance_block: str catalog_context_json: str has_catalog_guidance: bool snippet_keys: list[str] # Metadaten für Logs/Tests """ ``` **Ablauf:** 1. `catalog` aus Request oder `planning_roadmap.planning_catalog_context` (wie F13). 2. Pro Dimension aktives Item auflösen → `snippet_key` → Text aus Registry. 3. Snippets in **Prioritätsreihenfolge** §2 zu `_block` zusammenfügen (Überschriften: „Primärfokus“, „Trainingsstil“, …). 4. Fehlende Snippets: Dimension **weglassen** (kein Default-Text) — besser kein Snippet als falscher. **Einbindung:** Orchestratoren rufen Builder auf und mergen in `variables` vor `load_and_render_ai_prompt`: - `planning_exercise_path_qa.py` → `try_llm_qa_progression_path` - `planning_progression_roadmap.py` (Roadmap-/Stage-Pipeline) - `planning_exercise_path_builder.py` (catalog an QA/Match durchreichen) `ProgressionPathSuggestRequest` trägt `planning_catalog_context` bereits — kein neues API-Feld nötig. --- ## 6. Beispiel-Snippets (Review-Entwurf) ### 6.1 Primärfokus — Gewaltschutz (`focus:gewaltschutz`) **planning_lens:** Planung zielt auf Prävention, Deeskalation, Grenzen und sichere Übungsformen — nicht auf Wettkampf-Perfektion oder Technik-Show. **qa_criteria:** Gute Pfade bauen Sicherheit, Kommunikation und Alternativen auf; „Lücken“ sind fehlende Deeskalations- oder Rollenspiel-Stufen, nicht fehlende Kick-Varianten. **anti_patterns:** Nicht nach Kumite-Tiefe, Explosivität oder Wettkampf-Belastung bewerten. ### 6.2 Primärfokus — Technik / Kumite-Beinarbeit (`focus:kumite` o. ä.) **planning_lens:** Curriculum für eine Technik oder Kumite-Teilaspekt; aufeinander aufbauende Belastung und Anwendungsnähe sind erwünscht. **qa_criteria:** Kohärente Progression Grundlagen → Anwendung → Vertiefung; Übergänge ohne Sprünge; themenfremde Kraft-/Ausdauer-Inseln abwerten. ### 6.3 Trainingsstil — Breitensport (`training_type:breitensport` o. Name-Match) **planning_lens:** Partizipation, Verständlichkeit, Freude am Bewegen; weniger maximale Spezialisierung. **qa_criteria:** Hohe OK-Rate bei moderatem Schwierigkeitsanstieg; „Perfektion“-Stufen nur optional, nicht als Pflicht-Lücke. **rematch_guard:** Keine leeren Slots erzwingen, nur um eine Leistungs-Perfektionsstufe zu füllen. ### 6.4 Zielgruppe — Leistungsgruppe (`target_group:leistungsgruppe`) **qa_criteria:** Höhere Anspruchskurven, Belastungs- und Kombinationsprogressionen sind relevant; Lücken in Spezialisierung können echte Hinweise sein. *(Weitere Snippets iterativ ergänzen — nicht alle Katalog-Zeilen sofort.)* --- ## 7. Rollout-Phasen ### H1 — Minimal viable (Progressionsgraph) - [ ] Modul `planning_catalog_prompt_snippets.py` + Registry (5–8 Snippets: 2–3 Foki, 2 Trainingsstile, 2 Zielgruppen) - [ ] Einbindung in **`planning_exercise_path_qa`** + **`planning_progression_roadmap`** + **`planning_progression_stage_spec`** - [ ] Migration Prompt-Templates: Abschnitt `{{#has_catalog_guidance}}…{{/has_catalog_guidance}}` - [ ] Tests: gleicher Pfad + unterschiedlicher Katalog → unterschiedlicher `catalog_guidance_block`; Snapshot QA-Variablen - [ ] Dev-Regression: Gewaltschutz, Breitensport, Kinder — **Hinweistexte** müssen zum Kontext passen (nicht Mae-Geri-Kriterien) ### H1.5 - [ ] Rematch/Refine: `rematch_guard` aus Snippets respektieren (weniger Ping-Pong bei Breitensport) - [ ] Intent-Prompts + Gap-Fill-Kontext ### H2 — Betrieb - [ ] Snippets in DB, Admin-UI oder Markdown-Import - [ ] Versionierung / Audit wie `ai_prompts` ### H3 — Phase G (Trainingsplanung) - [ ] Gleicher Builder, anderer Orchestrator (Abschnitts-QS, Slot-Suggest) --- ## 8. Tests & Akzeptanz | Test | Erwartung | |------|-----------| | `test_catalog_prompt_snippets_priority` | Bei Konflikt gewinnt Fokus-Snippet-Text in `_block`-Reihenfolge | | `test_path_qa_variables_include_guidance` | Mit Gewaltschutz-Kontext enthält gerendeter Prompt „Deeskalation“ o. ä., nicht „Kumite-Perfektion“ | | `test_path_qa_no_snippet_without_catalog` | Ohne Katalog: `has_catalog_guidance=false`, Prompt unverändert wie heute | | Manuell | Mae-Geri-Pfad + Breitensport-Kontext: QS-Highlights ohne Leistungs-Belastungs-Forderungen | **Nicht Ziel von H1:** Retrieval-Gewichte neu kalibrieren; Technik-Tuples externalisieren (separates Backlog **H** in Roadmap). --- ## 9. Abgrenzung zu anderen Fixes | Thema | Dokument / Fix | |-------|----------------| | 88 % vs. 65 % falsche Pipeline | Evaluate-only für Pfad-QS; fairer Compare — Code-Stand 2026-05-22 | | Triviale ID-Tausche im Dialog | `_filter_trivial_slot_diffs` | | Katalog nur im Retrieval | F13 — bleibt, Snippets ergänzen LLM-Schicht | Snippets lösen **fachliche Fehlbewertung** — nicht Pipeline-Inkonsistenz allein. --- ## 10. Changelog | Datum | Änderung | |-------|----------| | 2026-05-22 | Erstfassung — Priorität Primärfokus → Trainingsstil → Zielgruppe → Stilrichtung; H1–H3 Rollout |