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.
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_type → license_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 / UVV →
DE_LAW→ Regel 1 - DGUV Regeln, Informationen, Grundsätze →
DGUV_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:
- Lizenz prüfen (publikationen.dguv.de, EUR-Lex, etc.)
- license_type aus obiger Tabelle wählen — wenn nicht vorhanden, hier ergänzen
- license_rule wird daraus deterministisch abgeleitet
- 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))