Files
breakpilot-core/control-pipeline/docs/LICENSE_RULES.md
T
Benjamin Admin 93687a32fe docs(licenses): freeze 3-rule license mapping + audit script
Defines the authoritative mapping from license_type to license_rule
in docs/LICENSE_RULES.md, and adds scripts/audit_license_classification.py
to surface classification gaps in registry/canonical_controls/Qdrant.

Key finding from first audit run against bp-core-postgres + Qdrant:

- regulation_registry: 232 rows, 224 rule=1, 8 rule=2, 0 rule=3;
  36 rows without license_type (need backfill)
- canonical_controls: 314,811 rows, 279,384 (89%) have NULL
  license_rule (target of Task #22 reclassification)
- Qdrant atomic_controls_dedup: 100% of sampled points lack both
  license and license_rule payload fields
- Qdrant bp_compliance_gesetze: 80.6% lack both fields
- Qdrant bp_compliance_ce + bp_compliance: nearly clean

Rule definitions clarified (was loosely remembered as
"law / cite / rewrite"):
- Rule 1 = verbatim, sovereign law (EU/DE/AT/CH/US, TRBS/TRGS/ASR,
  OSHA, NIST, EU guidelines, DGUV UVV)
- Rule 2 = verbatim with attribution (CC-BY, Apache, OWASP,
  OECD AI Principles, ENISA)
- Rule 3 = identifier citation only, no full text (DIN/EN/ISO,
  ANSI/UL/IEC, DGUV Regeln/Informationen/Grundsaetze, BSI,
  proprietary standards). Pipeline drops chunk_text when rule=3
  in pipeline_adapter.py:147.

The 4th category I had proposed ("R1-A") turned out to be already
implemented as rule=2; the mapping doc reflects the actual code
behaviour rather than the original 3-name verbal model.

No schema change. No data migration in this commit — reclassification
of the 279k controls is staged as Task #22 and will be cluster-based
by source/regulation_id.
2026-05-21 11:29:38 +02:00

5.3 KiB

Lizenzregeln der Control-Pipeline

Stand: 2026-05-21 — Mapping festgezurrt nach DB-Inspektion und IACE-Audit.

Die Pipeline klassifiziert jede Regulation (und damit jedes daraus extrahierte Chunk und jeden atomic_control) in eine von drei Lizenzregeln. Die Regel entscheidet, ob der Volltext aufbewahrt werden darf und welche Attribution im Ausgabe-Renderer Pflicht ist.

Die drei Regeln

Regel Bedeutung Volltext speichern? Attribution Pflicht? Beispiele
1 Wörtlich — Hoheitsrecht / Public Domain nein (empfohlen für Audit) EU-Recht (EUR-Lex), Bundesrecht, Satzungsrecht (DGUV UVV), TRBS, TRGS, ASR, US Federal Code (OSHA), NIST SP, EU-Leitfäden
2 Wörtlich mit Attribution — freie Lizenzen ja OWASP (CC-BY-SA-4.0), OECD AI Principles (OECD_PUBLIC), ENISA-Dokumente (CC-BY-4.0), Apache-2.0 Werke
3 Nur zitieren — proprietäre Standards nicht anwendbar (kein Volltext) DIN, EN, ISO, ANSI, UL, IEC, IEEE, DGUV Regeln/Informationen/Grundsätze, Bitkom-Leitfäden, BSI-Bausteine (urheberrechtlich)

Wichtige Klarstellung: Regel 3 = "nur Identifier/Abschnitt zitieren", nicht "umformulieren". Die ursprüngliche Bezeichnung "neu formulieren" war irreführend. Korrekt: Bei Regel-3-Quellen darf die Pipeline den Volltext nicht speichern; sie bewahrt nur die Quellenreferenz (regulation_id + article/paragraph), und der Output-Renderer zeigt diese Referenz im Frontend/PDF.

Mapping license_typelicense_rule

license_type license_rule Erklärung
EU_LAW, EU_PUBLIC 1 EU-Verordnungen, Richtlinien, OJ-Veröffentlichungen, EU-Leitfäden
DE_LAW, DE_PUBLIC 1 Bundesgesetze, TRBS, TRGS, ASR, DGUV-UVV (Satzungsrecht)
AT_LAW, CH_LAW, FR_LAW, IT_LAW, ES_LAW, NL_LAW, HU_LAW 1 Andere EU-Mitgliedsstaaten-Recht
US_GOV_PUBLIC, NIST_PUBLIC_DOMAIN, OSHA_PUBLIC 1 US Federal Code (17 U.S.C. §105 Public Domain)
CC-BY-4.0, CC-BY-SA-4.0, CC-BY-3.0, CC-BY-SA-3.0 2 Creative-Commons mit Attribution-Pflicht
Apache-2.0, MIT 2 Permissive OSS-Lizenzen, NOTICE-Pflicht
OECD_PUBLIC, ENISA_CC_BY_4.0 2 Behörden-Publikationen mit Attribution-Auflage
DIN_COPYRIGHT, ISO_COPYRIGHT, ANSI_COPYRIGHT, UL_COPYRIGHT, IEC_COPYRIGHT 3 Normungsorganisationen — nur Identifier-Zitat
DGUV_COPYRIGHT 3 DGUV Regeln/Informationen/Grundsätze (nicht UVV)
BITKOM_COPYRIGHT, BSI_COPYRIGHT, VDMA_COPYRIGHT 3 Verbands-/Behörden-Publikationen mit eigenständigem Urheberrecht
OWN_WORK 3 BreakPilot-Eigentexte (Templates, eigene Patterns) — kein externes Lizenzrisiko, aber auch kein Public-Domain-Status

Sonderfall DGUV: Die Klasse trennt sich nach Publikationstyp:

  • DGUV Vorschriften / UVVDE_LAW → Regel 1
  • DGUV Regeln, Informationen, GrundsätzeDGUV_COPYRIGHT → Regel 3

Auswirkung pro Pipeline-Stage

Stage Verhalten bei Regel 1 Regel 2 Regel 3
Stage 6 ControlCompose (pipeline_adapter.py:147) speichert chunk_text speichert chunk_text speichert chunk_text = None
Atomic-Control-Bildung Volltext als Quelle Volltext + Attribution-Vermerk nur regulation_id + article
Output-Renderer (Frontend/PDF) optionaler Quellen-Hinweis Pflicht-Attribution in Footer + Inline nur Identifier rendern
Tech-File-Anhang Quelle nennen Quelle + Lizenz-URL Identifier-Liste

Quellen ohne Klassifikation

Aktuell sind in regulation_registry 232 Regulationen klassifiziert (Stand 2026-05-21). Die folgenden müssen noch ergänzt werden (Task #20 deckt den DGUV-Ingest):

Quelle Regel Begründung
TRBS-Familie (24 PDFs im RAG) 1 Technische Regeln Betriebssicherheit — BAuA Bundesarbeitsblatt
TRGS-Familie (alle Volltext-Chunks) 1 Technische Regeln Gefahrstoffe — BAuA
ASR-Familie (17 PDFs) 1 Arbeitsstättenregeln — BAuA
OSHA 29 CFR 1910 Subpart O + Technical Manual 1 US Federal Public Domain (17 U.S.C. §105)
DGUV Vorschrift 1 + UVV-Familie (sobald ingest) 1 Satzungsrecht der BG
DGUV Regel 100-500 + Information 209-072/074/073 3 DGUV-Copyright, nur Identifier
DIN-Identifier-Tabelle (ohne Volltext) 3 DIN-Beuth-Copyright
ANSI B11.0 + RIA R15.06 + UL 508A Identifier 3 ANSI/UL-Copyright
ISO 12100/13849/13857 Identifier 3 ISO-Copyright

Audit-Pflicht

Vor jedem Ingest neuer Quellen:

  1. Lizenz prüfen (publikationen.dguv.de, EUR-Lex, etc.)
  2. license_type aus obiger Tabelle wählen — wenn nicht vorhanden, hier ergänzen
  3. license_rule wird daraus deterministisch abgeleitet
  4. Attribution-Text bei Regel 2 ist Pflichtfeld

Vor jedem Output:

  • Wenn ein atomic_control aus einer Regel-3-Quelle stammt: prüfen dass NUR Identifier gezeigt wird, niemals Volltext
  • Wenn aus Regel-2-Quelle: Attribution muss im PDF-Footer und im Frontend-Tooltip vorhanden sein
  • Wenn aus Regel-1-Quelle: empfohlen Quelle nennen für Auditierbarkeit

Verweise

  • Schema: migrations/002_regulation_registry.sql
  • Code: services/regulation_registry.py, services/pipeline_adapter.py
  • Seed-Script: scripts/f1_migrate_regulation_registry.py
  • Tests: tests/test_regulation_registry.py (assert: rule IN (1,2,3))