"""Scope-Klassifikation anwenden (User-Entscheidung 2026-07-01, Option 2 + derived_obligation). Neue `scope`-Attribut-Achse (KEINE neue Objektklasse — Enum-Wert, freeze-safe): in_scope (default/implizit) · out_of_scope · derived_obligation Prinzip (User): Adressat der Norm ⊥ Handlungspflicht des Herstellers. Reine Staats-/ Durchsetzungs-/Institutions-Bestimmungen = out_of_scope. Norm, die primär eine andere Rolle adressiert ABER mittelbar eine Hersteller-Handlungspflicht erzeugt = derived_obligation (bleibt im Hersteller-Set, wird NICHT verworfen — 'im Zweifel nicht zu früh Wissen verwerfen'). """ from __future__ import annotations import glob import json SCOPE = { "sanctions": { "scope": "out_of_scope", "scope_reason": "Adressat = Mitgliedstaaten (legen Sanktionen fest); keine Hersteller-Handlungspflicht. Präzedenz CSIRT/ENISA (CRA-Vuln-Cut).", }, "market_surveillance_safeguard": { "scope": "out_of_scope", "scope_reason": "Adressat = Marktüberwachungsbehörden/Kommission (Schutzmaßnahmen, Schutzklauselverfahren); keine Hersteller-Handlungspflicht. Präzedenz CSIRT/ENISA.", }, "notified_body_requirements": { "scope": "derived_obligation", "scope_reason": "Norm adressiert primär die notifizierte Stelle (Unabhängigkeit/Kompetenz/Unparteilichkeit), erzeugt aber mittelbare Hersteller-Pflichten: notifizierte Stelle einbeziehen, erforderliche Unterlagen bereitstellen, Konformitätsbewertung korrekt durchführen.", "scope_split_candidate": True, "scope_split_note": "Kandidat für spätere Aufspaltung: 'Normadressat' (Anforderungen AN die notifizierte Stelle = institutional/out_of_scope) ↔ 'abgeleitete Herstellerpflicht' (NB einbeziehen + Unterlagen + Konformitätsbewertung = in_scope). NICHT vorzeitig festziehen.", }, } def main() -> None: applied = [] for f in sorted(glob.glob("obligations/cra*.json")): d = json.load(open(f, encoding="utf-8")) changed = False for o in d.get("obligations", []): spec = SCOPE.get(o.get("id")) if spec: o.update(spec) applied.append((o["id"], spec["scope"])) changed = True if changed: json.dump(d, open(f, "w", encoding="utf-8"), ensure_ascii=False, indent=1) for oid, sc in applied: print(f" {oid:32} scope={sc}") print(f"angewendet: {len(applied)} (erwartet 3)") if __name__ == "__main__": main()