Reine Auswertungslogik in internal/rules, operiert auf rules.Antworten
(geparst aus antrag.antworten) und den drei Regelwerken aus Schritt 1
— ohne DB-/Web-Zugriff, vollständig isoliert testbar.
- EvaluateDatenklasse: "höchste zutreffende Stufe gewinnt" (höherer
Rang). Trifft keine Stufe zu (z. B. B7 fälschlich "nein" trotz keiner
anderen Kategorie), wird konservativ "intern" angenommen statt
"oeffentlich" — im Zweifel mehr Schutz. Nicht fachlich bestätigt,
siehe rules/OPEN.md Punkt 5.
- EvaluateEinstufung: Prüfreihenfolge wie im Regelwerk (verboten zuerst
= K.-o.-Prüfung), erste zutreffende Stufe/Variante gewinnt.
IstVerboten prüft die K.-o.-Bedingung direkt.
- DeriveAnforderungen: Anforderungsprofil aus Datenklasse+Einstufung.
- FilterWerkzeuge/ErfuelltAnforderung: harter Filter gegen einen
Werkzeugkatalog. WerkzeugEigenschaften ist ein eigener, schlanker Typ
statt store.Werkzeug — internal/rules bleibt unabhängig von
internal/store. Nur technische Werkzeug-Eigenschaften
(avv_erforderlich, eu_verarbeitung, kein_training_auf_eingabe) werden
hart gefiltert; Prozess-Anforderungen (menschliche_aufsicht,
kennzeichnungspflicht, dsfa_erforderlich) sortieren kein Werkzeug
aus, sondern werden später als Auflage vermerkt — Annahme, siehe
rules/OPEN.md Punkt 6.
rules/OPEN.md um Punkt 4 (Auswirkung der fehlenden Löschfristen auf den
Filter), Punkt 5 (Datenklasse-Fallback) und Punkt 6 (welche
Anforderungen hart filtern) ergänzt — Annahmen dokumentiert statt
geraten, damit Schritt 3 nicht auf die fachliche Klärung warten musste.
16 neue Tests gegen die ECHTEN rules/*.yaml-Dateien (nicht nur
synthetische Fixtures) — deckt Rang-Konflikte, "Unsicher zählt wie Ja",
alle vier Einstufungsstufen inkl. Auffangregel, Anforderungs-Ableitung
und Werkzeug-Filterung ab. Noch nicht ans Web angebunden (Schritt 4).