Phase-2/3-Skill (T-30-1b) für Aufgaben-Formulierung aus Mager-Quartett. Eingabe: Teilziel (Operator+Inhalt+Bedingung+Indikator) + Niveau (n1/n2/n3) + AFB-Stufe + optional Recherche-Kontext + optional TUV-Phase-6-Methode. Ausgabe: niveau-konforme, mager-konjugierte SuS-Aufgabe mit Aufgabentext + Erwartungshorizont + Operator-Konformitäts-Check. Cowork-Mode (Default): Claude reasont via diesem Skill. CLI-Mode: nutzt `from llm import complete` (ADR 0031). Triggert auf 'Aufgabe formulieren für Lernziel <X> Niveau <n>' / 'Plane Aufgabe zu Lernziel <X>' / aus Pipeline-Skills wie `material.generieren`.
How this skill is triggered — by the user, by Claude, or both
Slash command
/unterrichtsplanung-core:aufgabe.formulierenThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Aufgabe: Aus einem Teilziel (Mager-Triplett) + Niveau-Konfig + Recherche-Kontext eine SuS-konforme, didaktisch fundierte Aufgabe formulieren — inklusive Erwartungshorizont und Operator-Konformitäts-Check.
aufgabe.formulieren (Phase-2 / Phase-3-Cowork)Aufgabe: Aus einem Teilziel (Mager-Triplett) + Niveau-Konfig + Recherche-Kontext eine SuS-konforme, didaktisch fundierte Aufgabe formulieren — inklusive Erwartungshorizont und Operator-Konformitäts-Check.
In Cowork-Sessions reasont Claude diesen Skill SELBST — ohne Plugin-API-Call.
CLI-Mode nutzt core/skills/aufgabe.formulieren/generate.py (Phase-2-Implementation).
Lehrkraft schreibt: "Formuliere mir eine Aufgabe zu Lernziel <X> Niveau <n>"
ODER Pipeline-Skill (material.generieren) ruft mit strukturiertem Input.
operatoren.yaml-Pool)niveaustufen.json[niveau] (satzlaenge_max_woerter, antwortformate, hilfen)aufgabe:
titel: <kurzer Titel>
text: |
<Aufgabentext, S-Perspektive, Schauseite-konform>
hinweise: [<max 3 Bearbeitungs-Hinweise>]
format: <antwortformat aus niveaustufen.json>
operator_verwendet: <Operator>
operator_afb_match: true | false
erwartungshorizont:
argumente: [<Erwartungspunkt 1>, <2>, <3>]
mindest_argumente: <int>
bewertungs_hinweis: |
<Bewertungs-Pattern substituiert>
bewertungs_hinweis wenn methode_klasse bekanntcore/skills/aufgabe.formulieren/generate.py — Stdlib-only Validate (Operator-Pool, YAML-Parse, Skelett-Fallback)from llm import complete (raises LlmCoworkModeError im Cowork-Mode)core/config/niveaustufen.json — n1/n2/n3 Limitscore/config/operatoren.yaml — AFB-I/II/III Operator-Poolsdecisions/0008-schauseite-vs-formalstruktur.md — Schauseite-Trennungdecisions/0031-llm-provider-abstraction.md — Provider-Layer-Vertragcore/skills/text.niveau_anpassen/SKILL.md — 5-Achsen-Heuristik (Post-Validierung)teilziel:
operator: "erläutern" # AFB-Pool-konform (operatoren.yaml)
inhalt: "ob ein Ferienjob für 14-Jährige rechtlich zulässig ist"
bedingung: "anhand JArbSchG-Auszug"
indikator: "drei Argumente unter Verweis auf Paragrafen-Bezug"
niveau: n2 # n1 | n2 | n3
afb_stufe: II # I | II | III
recherche_kontext: |
Optional: 1-3 Absätze aus Wikipedia/BERUFENET/JArbSchG.
Wird LLM als Quellen-Material angeboten, NICHT zwingend übernommen.
methode: "Quellenanalyse" # Optional aus TUV-Phase-6
modus: alltag # alltag | lehrprobe | buv | projekt
tuv_meta: # Pflicht für DSGVO-Hard-Block + Override-Reasons
metadata: { enthaelt_schueler_bezug: false }
_meta: { llm_override_reason: null, dsgvo_override_reason: null }
aufgabe:
titel: "Begründen: Darf Anna im Café arbeiten?"
text: |
Lies den JArbSchG-Auszug (M2). Prüfe, ob Anna (14 J.) am Wochenende 5h im Café
arbeiten darf. Begründe mit drei Argumenten und nenne die jeweiligen Paragrafen.
hinweise: ["Fachbegriffe: Beschäftigungsverbot, Arbeitszeit", "Tabelle für Argumente nutzbar"]
format: "fall_analyse" # aus niveaustufen.json antwortformate
operator_verwendet: "erläutern"
operator_afb_match: true
niveau: n2
satzlaenge_max: 20
erwartungshorizont:
# T-30-10b Klasse-A RA6-HIGH-4: Beispiele juristisch korrigiert auf JArbSchG i.d.F. 2025/26
argumente:
- "Anna (14 J., vollzeitschulpflichtig) gilt nach JArbSchG als 'Kind' (§ 2 Abs. 1) — nicht als Jugendlicher (§ 2 Abs. 2). Damit greifen § 5 Abs. 4 und § 7 (Kinderarbeit) statt § 8."
- "§ 5 Abs. 4 JArbSchG erlaubt 13- bis 14-Jährigen leichte Tätigkeiten max. 2h/Tag mit Eltern-Einwilligung — 5h/Tag NICHT zulässig."
- "Sonn-/Feiertagsruhe (§ 17 Abs. 1) verbietet Wochenend-Arbeit für Kinder; Ausnahmen (§ 17 Abs. 2) gelten nur für Jugendliche, nicht für Kinder."
mindest_argumente: 3
bewertungs_hinweis: "Niveau n2 erreicht bei 3 Argumenten mit Paragrafen-Bezug + korrekter Status-Zuordnung (Kind vs. Jugendlicher). Lehrkraft prüft JArbSchG-Versionsstand bei Aktualisierungen."
bewertungs_hinweis: |
Niveau n2 erreicht, wenn drei Argumente mit jeweils einem Paragrafen-Bezug genannt sind.
qualitaets_meta:
provider_id: "mock | anthropic"
cache_hit: false
degraded_mode: false
tokens_in: 312
tokens_out: 178
warnings: []
niveaustufen.json[niveau])niveau.afb-Whitelist prüfenteilziel.operator muss in operatoren.yaml[afb_<stufe>].operatoren seintuv_meta durchgereicht an llm.complete() (ADR 0022 + 0031)System-Prompt:
Du bist Didaktik-Assistent für die Mittelschule (Bayern, R7).
Formuliere Aufgaben streng schauseitig (keine AFB-Tags, keine Mager-Notation im Text).
Halte das Niveau ein: max {satzlaenge_max} Wörter pro Satz, Operator-Pool {pool}.
Antwortformat strikt YAML gemäß Output-Schema.
User-Message (strukturiert):
teilziel: { operator, inhalt, bedingung, indikator }
niveau_limits: { satzlaenge_max, antwortformate, hilfen }
recherche_kontext: <optional>
methode: <optional>
modus: alltag|lehrprobe|buv|projekt
from llm import complete, CompletionRequest, Message
req = CompletionRequest(
system=SYSTEM_PROMPT.format(...),
messages=(Message(role="user", content=yaml.safe_dump(payload)),),
max_tokens=1024,
temperature=0.4, # niedrig: Determinismus + Reproduzierbarkeit
)
result = complete(req, tuv_meta=tuv_meta)
degraded_mode=True + Skelett-Antworttext.niveau_anpassen-Skill (5-Achsen): wenn Verletzung → Re-Prompt mit konkreter Niveau-Korrektur (max 2 Iterationen)pre_render_disclaimer-Hook)pre_llm_call: Token-Budget-Gate (default 50.000/UE)post_llm_response: Manifest-Loggingpost_render_niveau_check: Sprachniveau-Validatebaue_lsg_aufgaben (generate.py:264-298) — wird durch diesen Skill ersetzt (T-30-7)mager.konjugieren (T-30-2) greift parallelfrom llm import complete — bricht ADR 0031 Provider-Abstraction_meta.dsgvo_override_reason — DSGVO-Hard-Block raised LlmDsgvoBlockErroroperator_afb_match=trueafb_stufe=I → Validation-Error vor LLM-Calltuv_meta.metadata.enthaelt_schueler_bezug=true + AnthropicProvider → LlmDsgvoBlockError_meta.llm_override_reason="..." → MockProvider erzwungen (auch wenn Anthropic verfügbar)Skill liefert KEINE Files direkt zurück — Output ist dict an Aufrufer (artefakt-arbeitsblatt oder generate.py-Pipeline). Persistierung übernimmt der aufrufende Skill / baue_ab_config().
aufgabe.formulieren wird in T-30-7 in generate.py so eingebunden:
from llm import complete # noqa
from core.skills.aufgabe_formulieren.generate import formuliere_aufgabe # via SKILL-Wrapper
aufgaben = []
for teilziel in tuv.teilziele:
for n in ["n1", "n2", "n3"]:
a = formuliere_aufgabe(
teilziel=teilziel,
niveau=n,
afb_stufe=teilziel.afb,
recherche_kontext=briefing.zusammenfassung_pro_teilziel(teilziel),
methode=tuv.phasen[5].methode, # Phase 6 = idx 5
modus=tuv.modus,
tuv_meta=tuv.frontmatter_dict,
)
aufgaben.append(a)
Dies ersetzt baue_lsg_aufgaben-Skelett-Logik vollständig.
degraded_mode=Truepre_llm_call + post_llm_response + post_render_niveau_checknpx claudepluginhub snflsknfkldnfs/unterrichtsplanung-core --plugin unterrichtsplanung-coreCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.