feat(control-pipeline): BSI QUAIDAL Clean-Room ingestion (AI Act Art. 10)
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-go-consent (push) Successful in 40s
CI / test-python-voice (push) Successful in 36s
CI / test-bqas (push) Successful in 33s

Clean-Room derivation of 195 controls from BSI QUAIDAL (10 criteria + 15
building blocks + 30 measures + 140 metrics) for EU AI Act Art. 10
training-data quality compliance.

- ingest_bsi_quaidal.py parses YAML frontmatter into a structural index
  (no protected prose stored on disk).
- derive_quaidal_mcs.py rewrites each entry via local LLM (qwen3.5:35b-a3b)
  with a hard 4-gram plagiarism gate < 20%; achieved mean overlap 0.5%.
- Migration 011 adds compliance.derived_controls table with full source
  provenance (framework, section, url, commit SHA, license note).
- apply_quaidal_to_db.py UPSERTs YAML into DB.
- Source repo (legal-sources/bsi-quaidal/) gitignored.

Same pattern as IACE module DIN-reference handling: name the norm and
section, never quote.

Backed by BSI license clarification 2026-05: § 5 UrhG anwendbar,
share:true im Frontmatter; Clean-Room derivation is the safe path.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-05-19 13:02:49 +02:00
parent 9a1ad87acd
commit 7d721a6787
10 changed files with 8376 additions and 0 deletions
+5
View File
@@ -41,6 +41,11 @@ backups/*.backup
*.mp3
*.wav
# Cloned external legal-source repos (gitignored; pulled fresh at ingest time)
legal-sources/bsi-quaidal/
legal-sources/bsi-quaidal-src/
legal-sources/bsi-grundschutz-plus/
# Compiled binaries
billing-service/billing-service
consent-service/server
@@ -0,0 +1,430 @@
source: Derived from BSI QUAIDAL (Clean-Room)
source_url: https://github.com/BSI-Bund/QUAIDAL
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
plagiarism_limit_4gram: 0.2
generated_by_model: qwen3.5:35b-a3b
controls:
- id: AC-AI-DATA-QB-01-syntaktische-genauigkeit
canonical_name: Syntaktische Genauigkeit
description: Das KI-Trainingsset muss syntaktisch konsistent sein, wobei alle definierten
Grammatik- und Strukturregeln strikt einzuhalten sind. Eine fehlerfreie Datenstruktur
ist zwingend erforderlich, um eine korrekte Verarbeitung durch Parser oder Sprachmodelle
zu gewährleisten. Die Validierung der formalen Korrektheit ist vor jedem Training
durchzuführen, um Verarbeitungsfehler auszuschließen.
kind: building_block
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- MA-01
- MA-02
- MA-03
- MA-04
- MA-05
- MA-27
external_refs:
- framework: BSI AIC4
citation: null
- framework: ISO/IEC 25012
citation: null
source:
framework: BSI QUAIDAL
section: QB-01
title_original_de: QB-01 Syntaktische Genauigkeit
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-01_Syntactic%20Accuracy.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: AC-AI-DATA-QB-02-semantische-genauigkeit
canonical_name: Semantische Genauigkeit
description: Die KI-Trainingsdaten müssen inhaltlich korrekt sein, sodass die zugewiesenen
Werte dem tatsächlichen Sachverhalt entsprechen und nicht nur formal valide sind.
Es ist sicherzustellen, dass semantische Zuordnungen keine logischen Fehler aufweisen,
wie beispielsweise die Klassifizierung von Tieren als technische Geräte. Eine
Prüfung muss verifizieren, dass die Bedeutung der Datenpunkte im Kontext der Anwendung
eindeutig und fehlerfrei interpretiert werden kann.
kind: building_block
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- MA-05
- MA-06
- MA-07
- MA-27
external_refs:
- framework: BSI AIC4
citation: null
source:
framework: BSI QUAIDAL
section: QB-02
title_original_de: QB-02 Semantische Genauigkeit
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-02_Semantic%20Accuracy.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: AC-AI-DATA-QB-03-vielfalt
canonical_name: Vielfalt
description: Das KI-Trainingsdatenset muss eine maximale Varianz in den relevanten
Merkmalen aufweisen, um die Heterogenität der Eingabewerte zu gewährleisten. Es
ist sicherzustellen, dass das Spektrum der enthaltenen Werte breit genug ist,
um das Variationspotential der Zielgruppe vollständig abzudecken. Eine Prüfung
der Datenverteilung ist vor dem Training durchzuführen, um eine unzureichende
Diversität auszuschließen.
kind: building_block
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- MA-08
- MA-09
- MA-10
- MA-12
- MA-27
- MA-28
external_refs: []
source:
framework: BSI QUAIDAL
section: QB-03
title_original_de: QB-03 Vielfalt
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-03_Diversity.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0204
- id: AC-AI-DATA-QB-04-ausgewogenheit
canonical_name: Ausgewogenheit
description: Der Trainingsdatensatz ist so zu konzipieren, dass die Verteilung aller
relevanten Klassen proportional zur Zielrealität erfolgt, um eine einseitige Dominanz
einzelner Kategorien zu vermeiden. Es ist sicherzustellen, dass keine Gruppe systematisch
unter- oder überrepräsentiert wird, um Verzerrungen im Modellverhalten auszuschließen.
Die Datenqualität muss durch eine ausgewogene Varianz aller Merkmale gewährleistet
werden, um Overfitting und Bias wirksam zu verhindern.
kind: building_block
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- MA-08
- MA-09
- MA-10
- MA-12
- MA-14
- MA-27
external_refs: []
source:
framework: BSI QUAIDAL
section: QB-04
title_original_de: QB-04 Ausgewogenheit
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-04_Balance.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0182
- id: AC-AI-DATA-QB-05-umfang
canonical_name: Umfang
description: Der Trainingsdatensatz muss eine quantitativ ausreichende Anzahl an
Datenpunkten aufweisen, um statistisch signifikante Muster zu erfassen und das
Risiko von Overfitting zu minimieren. Die Größe der Datenbasis ist so zu dimensionieren,
dass sie eine belastbare Analyse der zugrundeliegenden Verteilungen ermöglicht
und die Generalisierungsfähigkeit des Modells stabilisiert. Eine Prüfung ist durchzuführen,
um sicherzustellen, dass der reine quantitative Umfang die notwendige Basis für
eine robuste Modellbildung bildet.
kind: building_block
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- MA-11
- MA-12
- MA-15
- MA-27
external_refs:
- framework: BSI AIC4
citation: null
source:
framework: BSI QUAIDAL
section: QB-05
title_original_de: QB-05 Umfang
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-05_Size.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0161
- id: AC-AI-DATA-QB-06-verzerrung
canonical_name: Verzerrung
description: Das KI-System muss vor dem produktiven Einsatz auf systematische Verzerrungen
in den Trainingsdaten und den daraus resultierenden Vorhersagen untersucht werden.
Es ist sicherzustellen, dass latente Ungleichbehandlungen quantitativ erfasst
und dokumentiert werden, um eine transparente Bewertung der Fairness zu ermöglichen.
Die Prüfung umfasst die Identifikation von Abweichungen, die auf unausgewogene
Datenverteilungen zurückzuführen sind, bevor das Modell für reale Anwendungen
freigegeben wird.
kind: building_block
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- MA-01
- MA-02
- MA-03
- MA-04
- MA-06
- MA-07
- MA-08
- MA-09
- MA-10
- MA-11
- MA-12
- MA-13
- MA-14
- MA-15
- MA-16
- MA-17
- MA-18
- MA-20
- MA-23
- MA-24
- MA-27
- MA-28
- QB-15
- QM-11
external_refs: []
source:
framework: BSI QUAIDAL
section: QB-06
title_original_de: QB-06 Verzerrung
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-06_Bias-Detektion.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: AC-AI-DATA-QB-07-gesamtheit
canonical_name: Gesamtheit
description: Das Trainingsdatenset muss sämtliche für das spezifische Anwendungsszenario
definierten Attribute und Entitätsinstanzen vollständig enthalten, um die Anforderung
der Gesamtheit zu erfüllen. Diese Vollständigkeit ist auf der Ebene des gesamten
Datensatzes, einzelner Spalten oder einzelner Datenpunkte nachweisbar zu prüfen.
Die Bewertung der Datenqualität erfolgt stets kontextbezogen unter Berücksichtigung
der jeweiligen Nutzungszwecke.
kind: building_block
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- MA-12
- MA-13
- MA-27
external_refs: []
source:
framework: BSI QUAIDAL
section: QB-07
title_original_de: QB-07 Gesamtheit
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-07_Totality.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: AC-AI-DATA-QB-08-konsistenzsicherung
canonical_name: Konsistenzsicherung
description: Die Konsistenz der KI-Trainingsdaten ist durch standardisierte Datentypen
und formatierte Attribute über den gesamten Lebenszyklus sicherzustellen. Automatisierte
Prüfmechanismen müssen Abweichungen in den Datenwerten sowie zeitlichen Verläufen
frühzeitig identifizieren, um nachvollziehbare Transformations- oder Imputationsmaßnahmen
einzuleiten. Eine einheitliche Datenstruktur ist zwingend erforderlich, um die
Integrität der Trainingsbasis für valide Modellentscheidungen zu gewährleisten.
kind: building_block
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- MA-01
- MA-02
- MA-03
external_refs:
- framework: ISO/IEC 25012
citation: null
- framework: BSI AIC4
citation: null
source:
framework: BSI QUAIDAL
section: QB-08
title_original_de: QB-08 Konsistenzsicherung
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-08_ConsistencyAssurance.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: AC-AI-DATA-QB-09-quellenmanagement
canonical_name: Quellenmanagement
description: Die Organisation muss einen durchgängigen Mechanismus implementieren,
der die Herkunft und den Verarbeitungsweg jeder Trainingsdaten-Einheit lückenlos
dokumentiert. Es ist sicherzustellen, dass jeder Datenpunkt mit seinem Ursprung
sowie allen nachfolgenden Transformationsschritten verknüpft bleibt, um die Integrität
der KI-Datenbasis zu gewährleisten. Zusätzlich sind alle Zugriffe und Modifikationen
in einem unveränderlichen Protokoll chronologisch festzuhalten, um einen vollständigen
Audit-Trail für Compliance-Prüfungen zu schaffen.
kind: building_block
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- MA-18
- MA-19
- MA-20
- MA-22
external_refs:
- framework: BSI AIC4
citation: null
- framework: AI Act
citation: null
source:
framework: BSI QUAIDAL
section: QB-09
title_original_de: QB-09 Quellenmanagement
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-09_Sourcemanagement.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0167
- id: AC-AI-DATA-QB-10-datenpruefung
canonical_name: _Datenprüfung
description: Vor der Initialisierung des Trainingsprozesses ist eine systematische
Validierung der Eingangsdaten auf Vollständigkeit, Konsistenz und Integrität durchzuführen.
Dabei sind Unregelmäßigkeiten wie fehlende Werte, formatinkonsistenzen oder statistische
Ausreißer zu identifizieren und zu bereinigen. Das System muss sicherstellen,
dass keine verzerrten oder fehlerhaften Datensätze das Modelltraining beeinträchtigen
und die Datenqualität den definierten Qualitätsstandards entspricht.
kind: building_block
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- MA-05
- MA-20
- MA-26
external_refs: []
source:
framework: BSI QUAIDAL
section: QB-10
title_original_de: QB-10_Datenprüfung
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-10_DataChecks.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0204
- id: AC-AI-DATA-QB-11-prozesse
canonical_name: Prozesse
description: Es ist sicherzustellen, dass jeder Schritt der Datenvorbereitung und
-verarbeitung für KI-Trainingszwecke lückenlos protokolliert wird, um die vollständige
Nachvollziehbarkeit der Datenherkunft und aller Transformationen zu gewährleisten.
Diese Dokumentation muss so strukturiert sein, dass sie eine valide Reproduzierbarkeit
der Modelle sowie eine fundierte Qualitätssicherung der zugrundeliegenden Datensätze
ermöglicht. Durch die Erfassung aller Änderungsereignisse wird die Integrität
der Trainingsdaten über den gesamten Lebenszyklus hinweg verifiziert.
kind: building_block
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- MA-18
- MA-21
external_refs:
- framework: BSI Grundschutz
citation: null
- framework: ISO/IEC 23894
citation: null
- framework: ISO/IEC 42001
citation: null
- framework: AI Act
citation: null
source:
framework: BSI QUAIDAL
section: QB-11
title_original_de: QB-11 Prozesse
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-11_Processes.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: AC-AI-DATA-QB-12-merkmalsentwicklung
canonical_name: Merkmalsentwicklung
description: Die Erstellung und Auswahl von Eingangsmerkmalen für KI-Modelle ist
so zu gestalten, dass sie signifikante Korrelationen zur Zielgröße aufweisen und
redundante Informationen eliminieren. Es ist sicherzustellen, dass die transformierten
Daten generalisierbar sind und eine hohe Informationsdichte für neue, unbekannte
Datensätze bieten. Eine Validierung muss nachweisen, dass die abgeleiteten Merkmale
die Interpretierbarkeit des Modells unterstützen und keine unnötige Komplexität
verursachen.
kind: building_block
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- MA-01
- MA-02
- MA-03
- MA-06
- MA-12
- MA-14
- MA-17
- MA-23
- MA-24
- MA-27
external_refs: []
source:
framework: BSI QUAIDAL
section: QB-12
title_original_de: QB-12 Merkmalsentwicklung
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-12_FeatureEngineering.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: AC-AI-DATA-QB-13-datenvorbereitung
canonical_name: Datenvorbereitung
description: Vor der Initialisierung des Trainingsprozesses sind alle Rohdaten durch
definierte Transformationen in eine qualitätsgeprüfte und für das Modell verarbeitbare
Struktur zu überführen. Es ist sicherzustellen, dass jede angewandte Datenaufbereitung
die Integrität der Trainingsmenge gewährleistet und keine nicht validierten Artefakte
in das Lernsystem einfließen. Die Durchführbarkeit dieser Schritte ist vor dem
Start der Modellkonvergenz durch systematische Prüfverfahren nachzuweisen.
kind: building_block
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- MA-02
- MA-03
- MA-04
- MA-13
- MA-14
- MA-16
- MA-17
- MA-23
- MA-24
- MA-25
- MA-27
- MA-29
external_refs: []
source:
framework: BSI QUAIDAL
section: QB-13
title_original_de: QB-13 Datenvorbereitung
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-13_DataPreparation.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: AC-AI-DATA-QB-14-expertanalysis
canonical_name: _Expertanalysis
description: Die Qualität der KI-Trainingsdaten ist durch eine unabhängige, manuelle
Begutachtung durch qualifiziertes Fachpersonal zu validieren. Dabei sind mehrere
Prüfer eigenständig einzusetzen, um subjektive Verzerrungen und Gruppenkonformitätseffekte
bei der Bewertung auszuschließen. Die Ergebnisse dieser fachlichen Analyse müssen
anonymisiert zusammengeführt werden, um eine objektive Beurteilung der Datensatzqualität
zu gewährleisten.
kind: building_block
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- MA-06
- MA-10
- MA-14
- MA-15
- MA-21
- MA-22
external_refs: []
source:
framework: BSI QUAIDAL
section: QB-14
title_original_de: QB-14_Expertanalysis
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-14_Expertanalysis.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: AC-AI-DATA-QB-15-bias-mitigation
canonical_name: Bias-Mitigation
description: Das System muss technische Mechanismen implementieren, um systematische
Verzerrungen in den Trainingsdaten oder während des Lernprozesses zu identifizieren
und zu kompensieren. Diese Maßnahmen sind unabhängig vom Entwicklungsstadium anzuwenden,
wobei Datenanpassungen vor dem Training, Regularisierungsverfahren während des
Lernens oder Korrekturen der Ausgabeergebnisse nach dem Training möglich sind.
Eine Prüfung der Fairness-Kriterien ist vor der Freigabe des Modells durchzuführen,
um sicherzustellen, dass keine diskriminierenden Muster in den Ergebnissen verbleiben.
kind: building_block
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- MA-30
- QM-57
external_refs: []
source:
framework: BSI QUAIDAL
section: QB-15
title_original_de: QB-15 Bias-Mitigation
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0001_Qualitätsbausteine/QB-15_Bias-Mitigation.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
@@ -0,0 +1,280 @@
source: Derived from BSI QUAIDAL (Clean-Room)
source_url: https://github.com/BSI-Bund/QUAIDAL
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
plagiarism_limit_4gram: 0.2
generated_by_model: qwen3.5:35b-a3b
controls:
- id: MC-AI-DATA-QKB-01-repraesentativitaet
canonical_name: Repräsentativität
description: Der Trainingsdatensatz muss die statistische Verteilung der Zielpopulation
exakt abbilden, um systematische Verzerrungen im Modell zu vermeiden. Es ist sicherzustellen,
dass alle relevanten Merkmalsausprägungen in ausreichender Häufigkeit und ohne
Über- oder Unterrepräsentation vorliegen. Die Datenmenge ist so zu dimensionieren,
dass eine robuste Generalisierungsfähigkeit für alle Subgruppen der Gesamtpopulation
gewährleistet wird. Eine Prüfung auf Stichprobenqualität ist vor dem Training
durchzuführen.
kind: criterion
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QB-03
- QB-04
- QB-05
- QB-06
- QB-15
external_refs:
- framework: AI Act
citation: Artikel 10
- framework: ISO/IEC 25012
citation: null
source:
framework: BSI QUAIDAL
section: QKB-01
title_original_de: QKB-01 Repräsentativität
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0000_Qualitätskriterien/QKB-01_Representativity.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MC-AI-DATA-QKB-02-vollstaendigkeit
canonical_name: Vollständigkeit
description: Der Datensatz muss sämtliche für das spezifische KI-Modell erwarteten
Attribute und Merkmalsausprägungen lückenlos beinhalten. Es ist sicherzustellen,
dass keine Entitätsinstanzen fehlen und alle definierten Merkmale mit Werten belegt
sind. Eine Prüfung auf fehlende Werte oder unvollständige Attributmengen ist vor
dem Training zwingend durchzuführen, um Verzerrungen zu vermeiden.
kind: criterion
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QB-07
- QB-09
external_refs:
- framework: AI Act
citation: Artikel 10
- framework: BSI AIC4
citation: null
- framework: ISO/IEC 25012
citation: null
- framework: ISO/IEC 25024
citation: null
source:
framework: BSI QUAIDAL
section: QKB-02
title_original_de: QKB-02 Vollständigkeit
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0000_Qualitätskriterien/QKB-02_Completeness.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MC-AI-DATA-QKB-03-genauigkeit
canonical_name: Genauigkeit
description: Die Integrität der KI-Trainingsdaten erfordert, dass jeder einzelne
Datenelementwert eine definierte numerische oder symbolische Übereinstimmung mit
dem referenzierten Sollwert aufweist. Es ist sicherzustellen, dass Abweichungen
innerhalb festgelegter Toleranzgrenzen bezüglich Rundung, Formatierung und Messauflösung
bleiben. Die Einhaltung dieser Spezifikation ist durch automatisierte Prüfverfahren
vor jedem Trainingslauf zu verifizieren.
kind: criterion
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QB-01
- QB-02
external_refs:
- framework: ISO/IEC 25012
citation: null
source:
framework: BSI QUAIDAL
section: QKB-03
title_original_de: QKB-03 Genauigkeit
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0000_Qualitätskriterien/QKB-03_Accuracy.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MC-AI-DATA-QKB-04-konsistenz
canonical_name: Konsistenz
description: Das System muss sicherstellen, dass alle Eingabedaten für das KI-Training
logisch kohärent und frei von internen Widersprüchen sind. Einheitliche Kodierungen
für Kategorien sowie konsistente Formatierungen sind zwingend erforderlich, um
eine fehlerfreie Generalisierung durch das Modell zu ermöglichen. Jede Abweichung
von den definierten Datenstandards ist durch automatische Prüfmechanismen zu identifizieren
und zu unterbinden.
kind: criterion
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QB-02
- QB-07
- QB-08
- QB-10
- QB-11
- QB-12
external_refs:
- framework: ISO/IEC 25012
citation: null
source:
framework: BSI QUAIDAL
section: QKB-04
title_original_de: QKB-04 Konsistenz
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0000_Qualitätskriterien/QKB-04_Consistency.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MC-AI-DATA-QKB-05-korrektheit
canonical_name: Korrektheit
description: Das KI-Modell muss ausschließlich auf Datensätzen trainiert werden,
die inhaltlich frei von Fehlern sind und den tatsächlichen Gegebenheiten oder
definierten Referenzstandards exakt entsprechen. Es ist sicherzustellen, dass
jede annotierte Information den als wahr geltenden Zustand im Anwendungskontext
fehlerfrei abbildet. Die Validierung der Trainingsdaten ist vor Beginn des Lernprozesses
durchzuführen, um sicherzustellen, dass keine inkorrekten Werte die Modellleistung
beeinträchtigen.
kind: criterion
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QB-09
- QB-10
- QB-12
- QB-14
external_refs:
- framework: ISO/IEC 25012
citation: null
- framework: BSI AIC4
citation: null
- framework: AI Act
citation: Artikel 10
source:
framework: BSI QUAIDAL
section: QKB-05
title_original_de: QKB-05 Korrektheit
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0000_Qualitätskriterien/QKB-05_Correctness.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MC-AI-DATA-QKB-06-einheitlichkeit
canonical_name: Einheitlichkeit
description: Die Konsistenz der KI-Trainingsdaten ist durch die strikte Einhaltung
definierter Syntaxregeln und Datenstrukturen sicherzustellen. Jedes Datenelement
muss vor der Verarbeitung gemäß festgelegten Standards formatiert werden, um strukturelle
Abweichungen auszuschließen. Eine Prüfung der formalen Einheitlichkeit ist unabhängig
von der inhaltlichen Richtigkeit der Werte durchzuführen.
kind: criterion
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QB-02
- QB-08
- QB-10
- QB-12
- QB-14
external_refs:
- framework: ISO/IEC 25012
citation: null
source:
framework: BSI QUAIDAL
section: QKB-06
title_original_de: QKB-06 Einheitlichkeit
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0000_Qualitätskriterien/QKB-06_Uniformity.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MC-AI-DATA-QKB-07-gueltigkeit
canonical_name: Gültigkeit
description: Das System muss sicherstellen, dass die für das KI-Training verwendeten
Daten inhaltlich exakt das intendierte Zielkonstrukt abbilden und nicht nur oberflächliche
Korrelationen erfassen. Es ist zu prüfen, ob die erfassten Merkmale den theoretischen
Anforderungen an den Messgegenstand entsprechen, um eine valide Grundlage für
Ableitungen zu gewährleisten. Eine Abweichung zwischen dem gemessenen Inhalt und
dem definierten Zielkonzept ist als Fehlerzustand zu klassifizieren und muss ausgeschlossen
werden.
kind: criterion
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QB-02
- QB-05
- QB-09
- QB-10
- QB-14
external_refs:
- framework: ISO/IEC 25012
citation: null
source:
framework: BSI QUAIDAL
section: QKB-07
title_original_de: QKB-07 Gültigkeit
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0000_Qualitätskriterien/QKB-07_Validity.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MC-AI-DATA-QKB-08-eindeutigkeit
canonical_name: Eindeutigkeit
description: Jeder Datensatz im Trainingskorpus muss eine eindeutige Identität besitzen,
um die Entstehung redundanter Instanzen auszuschließen. Es ist sicherzustellen,
dass keine doppelten oder mehrdeutigen Einträge vorliegen, da diese die Modellgeneralisierung
beeinträchtigen und zu Overfitting führen können. Die Validierung muss nachweisen,
dass jede Dateneinheit eindeutig identifizierbar ist und logisch von anderen unterscheidbar
bleibt.
kind: criterion
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QB-05
- QB-10
- QB-13
external_refs:
- framework: ISO/IEC 25012
citation: null
source:
framework: BSI QUAIDAL
section: QKB-08
title_original_de: QKB-08 Eindeutigkeit
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0000_Qualitätskriterien/QKB-08_Uniqueness.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MC-AI-DATA-QKB-09-sichere-quellen
canonical_name: Sichere Quellen
description: Für KI-Trainingsdaten muss eine lückenlose Provenienz-Dokumentation
etabliert werden, die jeden Verarbeitungsschritt von der Erfassung bis zur finalen
Nutzung nachvollziehbar macht. Es ist sicherzustellen, dass alle Transformationen
und Herkunftsinformationen vollständig erfasst sind, um die Datenintegrität und
-qualität kontinuierlich verifizieren zu können. Die Nachprüfbarkeit dieser Metadaten
ist zwingend erforderlich, um potenzielle Qualitätsmängel oder Manipulationen
in den Trainingsbeständen frühzeitig zu identifizieren.
kind: criterion
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QB-09
- QB-11
external_refs:
- framework: ISO/IEC 25012
citation: null
- framework: BSI AIC4
citation: null
source:
framework: BSI QUAIDAL
section: QKB-09
title_original_de: QKB-09 Sichere Quellen
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0000_Qualitätskriterien/QKB-09_SecureSource.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MC-AI-DATA-QKB-10-daten-mit-personenbezug
canonical_name: Daten mit Personenbezug
description: Das System muss vor der Nutzung von Trainingsdaten eine automatisierte
Prüfung durchführen, um personenbezogene Informationen zu identifizieren. Ist
derartige Datenbestandteil der Eingabedaten, ist deren vollständige und nachweisbare
Entfernung sicherzustellen, bevor ein Modelltraining initiiert wird. Die Integrität
der verbleibenden Datensätze ist durch technische Maßnahmen gegen unbeabsichtigte
Wiederverwendung zu gewährleisten.
kind: criterion
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QB-09
- QB-10
- QB-11
- QB-14
external_refs:
- framework: EU GDPR
citation: null
source:
framework: BSI QUAIDAL
section: QKB-10
title_original_de: QKB-10 Daten mit Personenbezug
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0000_Qualitätskriterien/QKB-10_PersonalDataCheck.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,753 @@
source: Derived from BSI QUAIDAL (Clean-Room)
source_url: https://github.com/BSI-Bund/QUAIDAL
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
plagiarism_limit_4gram: 0.2
generated_by_model: qwen3.5:35b-a3b
controls:
- id: MIT-AI-DATA-MA-01-datentyp-validierung
canonical_name: Datentyp Validierung
description: Es ist sicherzustellen, dass alle Eingabedaten und Trainingsdatensätze
vor der Verarbeitung auf Konformität mit den definierten Schemata und Datentypen
des Modells geprüft werden. Abweichungen von den erwarteten Formaten sind automatisch
zu identifizieren und müssen entweder bereinigt oder ausgeschlossen werden, um
Inferenzfehler zu verhindern. Diese Validierung ist als automatisierter Schritt
in den Datenpipelines zu implementieren, um die Integrität der KI-Systeme zu gewährleisten.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QM-32
- QM-34
external_refs: []
source:
framework: BSI QUAIDAL
section: MA-01
title_original_de: MA-01 Datentyp Validierung
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-01_Datatype%20Validation.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MIT-AI-DATA-MA-02-format-pruefung
canonical_name: Format Prüfung
description: Die Eingabedaten für KI-Trainingszwecke sind vor der Verarbeitung auf
strukturelle Korrektheit zu validieren, wobei Datentypen wie Zeitstempel oder
Textfelder exakt den definierten Schemata entsprechen müssen. Durch die erzwingung
einer einheitlichen Formatierung wird verhindert, dass regionale Abweichungen
oder inkonsistente Darstellungen zu Fehlinterpretationen im Modell führen. Die
Konformität ist automatisiert zu prüfen, um sicherzustellen, dass keine nicht
konformen Datensätze in den Lernprozess eingehen.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QM-32
- QM-34
- QM-43
external_refs: []
source:
framework: BSI QUAIDAL
section: MA-02
title_original_de: MA-02 Format Prüfung
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-02_Format%20Check.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MIT-AI-DATA-MA-03-bereichspruefung
canonical_name: Bereichsprüfung
description: Das System muss vor dem KI-Training eine automatische Validierung aller
Eingangsmerkmale durchführen, um Werte außerhalb definierter physikalischer oder
logischer Grenzen zu identifizieren. Dabei sind insbesondere inkonsistente Datentypen,
fehlerhafte Maßeinheiten und statistisch unplausible Ausreißer zu detektieren
und zu isolieren. Die Integrität des Trainingsdatensatzes ist erst dann gewährleistet,
wenn alle nicht konformen Einträge ausgeschlossen oder korrigiert wurden, bevor
der Lernprozess initiiert wird.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QM-51
- QM-52
external_refs: []
source:
framework: BSI QUAIDAL
section: MA-03
title_original_de: MA-03 Bereichsprüfung
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-03_Range%20Check.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MIT-AI-DATA-MA-04-over-undersampling
canonical_name: Over-Undersampling
description: Das Daten-Set für das KI-Training ist auf ein ausgewogenes Klassenverhältnis
zu prüfen, wobei eine künstliche Aufstockung seltener Kategorien durch synthetische
Generierung oder Duplizierung zulässig ist. Alternativ ist eine Reduktion der
Datenpunkte der Mehrheitsklasse nach definierten Kriterien durchzuführen, um eine
Verzerrung des Modells zu vermeiden. Die angewandte Methode zur Erreichung dieses
Gleichgewichts ist dokumentiert und muss reproduzierbar sein.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QM-34
- QM-38
- QM-57
external_refs: []
source:
framework: BSI QUAIDAL
section: MA-04
title_original_de: MA-04 Over-Undersampling
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-04_Over-Undersampling.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MIT-AI-DATA-MA-05-automatisierte-aufgaben
canonical_name: Automatisierte Aufgaben
description: Wiederkehrende Prozesse der Datenvorverarbeitung und Qualitätsprüfung
im KI-Lebenszyklus sind durch automatisierte Mechanismen zu implementieren. Die
Ausführung dieser Aufgaben muss so konfiguriert sein, dass eine konsistente Ergebnisqualität
über alle Durchläufe hinweg sichergestellt wird. Es ist zu prüfen, dass die eingesetzten
Automatisierungswerkzeuge spezifische Validierungsregeln für Trainingsdaten zuverlässig
anwenden.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- MA-02
- MA-03
- QM-10
- QM-34
- QM-64
external_refs:
- framework: AI Act
citation: null
source:
framework: BSI QUAIDAL
section: MA-05
title_original_de: MA-05 Automatisierte Aufgaben
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-05_Automated%20Tasks.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MIT-AI-DATA-MA-06-experten-auswertung
canonical_name: Experten Auswertung
description: Für die Validierung von KI-Trainingsdaten ist eine manuelle Prüfung
durch qualifizierte Fachexperten zwingend erforderlich. Diese Experten müssen
die inhaltliche Gültigkeit, Relevanz und Korrektheit der Datensätze auf Basis
domänenspezifischen Wissens systematisch evaluieren. Das Ergebnis dieser Begutachtung
dient dazu, methodische Fehler oder qualitative Mängel frühzeitig zu identifizieren
und konkrete Maßnahmen zur Datenbereinigung abzuleiten.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QM-16
- QM-30
- QM-43
- QM-45
- QM-59
- QM-70
external_refs:
- framework: ISO/IEC 25012
citation: null
- framework: ISO/IEC 25024
citation: null
source:
framework: BSI QUAIDAL
section: MA-06
title_original_de: MA-06 Experten Auswertung
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-06_Expert%20Evaluation.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0204
- id: MIT-AI-DATA-MA-07-massenbeteiligung
canonical_name: Massenbeteiligung
description: Das System muss Mechanismen implementieren, um die Qualität von Trainingsdaten
durch dezentrale Validierung durch eine heterogene Gruppe externer Prüfer sicherzustellen.
Es ist zwingend erforderlich, dass die Ergebnisse dieser kollektiven Überprüfung
mit internen Qualitätsstandards abgeglichen werden, um systematische Fehler in
den annotierten Datensätzen zu identifizieren. Die Integrität der KI-Modelle ist
nur gewährleistet, wenn diese skalierbare Prüfprozedur für kritische Datenmengen
routinemäßig angewendet wird.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- MA-06
- QM-03
- QM-16
- QM-43
external_refs: []
source:
framework: BSI QUAIDAL
section: MA-07
title_original_de: MA-07 Massenbeteiligung
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-07_Crowdsourcing.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MIT-AI-DATA-MA-08-verteilungsanalyse
canonical_name: Verteilungsanalyse
description: Es ist sicherzustellen, dass die Verteilung der Trainingsdaten über
alle relevanten Klassen und Merkmalsbereiche systematisch auf statistische Verzerrungen
und Anomalien geprüft wird. Diese Analyse muss nachweisen, dass das Modell auf
einer repräsentativen und ausgewogenen Datenbasis trainiert wurde, um die Generalisierungsfähigkeit
der Vorhersagen zu gewährleisten. Die Ergebnisse der Verteilungsprüfung sind vor
Beginn des Trainings zu dokumentieren und bei signifikanten Abweichungen sind
Korrekturmaßnahmen einzuleiten.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- MA-06
- QM-10
- QM-11
- QM-51
external_refs: []
source:
framework: BSI QUAIDAL
section: MA-08
title_original_de: MA-08 Verteilungsanalyse
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-08_DistributionAnalysis.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0339
- id: MIT-AI-DATA-MA-09-vergleichgrundgesamtheit
canonical_name: VergleichGrundgesamtheit
description: Das System muss eine repräsentative Referenzstichprobe aus der Zielverteilung
bereitstellen, um die Validität von KI-Trainingsdaten zu verifizieren. Es ist
sicherzustellen, dass diese Referenzdaten als Goldstandard dienen, um Abweichungen
zwischen dem Trainingsset und der tatsächlichen Grundgesamtheit zu quantifizieren.
Die Übereinstimmung ist durch einen automatisierten Abgleich mit den vorab definierten
Verteilungsparametern zu prüfen.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- MA-9
- QM-51
- QM-52
external_refs: []
source:
framework: BSI QUAIDAL
section: MA-09
title_original_de: MA-09 VergleichGrundgesamtheit
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-09_CompareGroundtruth.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MIT-AI-DATA-MA-10-gewichtung-der-daten
canonical_name: Gewichtung der Daten
description: Für KI-Trainingsdatensätze ist eine manuelle Gewichtung der einzelnen
Merkmale zwingend erforderlich, um systematische Verzerrungen zu minimieren. Diese
Maßnahme dient der Sicherstellung einer ausgewogenen Datenrepräsentation und verbessert
die Generalisierungsfähigkeit des Modells auf spezifische Anwendungsfälle. Die
Zuordnung der Gewichtungsfaktoren ist vor dem Training durchzuführen und muss
dokumentiert werden, um die Nachvollziehbarkeit der Datenqualität zu gewährleisten.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QM-10
- QM-18
- QM-28
- QM-29
- QM-37
- QM-38
- QM-39
external_refs: []
source:
framework: BSI QUAIDAL
section: MA-10
title_original_de: MA-10 Gewichtung der Daten
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-10_ManualWeights.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MIT-AI-DATA-MA-11-stichprobengroesse
canonical_name: Stichprobengröße
description: Die Menge der für das Training verwendeten Daten ist so zu dimensionieren,
dass statistisch signifikante Ergebnisse bei definiertem Konfidenzniveau und akzeptabler
Fehlervarianz gewährleistet sind. Die Datengröße muss iterativ angepasst werden,
wobei sowohl die Gesamtgröße der zugrundeliegenden Population als auch die spezifische
Art der Datenerweiterung systematisch zu berücksichtigen sind. Eine Validierung
der Datenqualität ist zwingend erforderlich, um Verzerrungen durch unterschiedliche
Skalierungsmethoden auszuschließen.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QM-08
- QM-09
- QM-39
- QM-41
external_refs: []
source:
framework: BSI QUAIDAL
section: MA-11
title_original_de: MA-11 Stichprobengröße
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-11_Trainingsdataset%20Size.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MIT-AI-DATA-MA-12-abdeckung-relevanter-merkmale
canonical_name: Abdeckung relevanter Merkmale
description: Das Trainingsdatenset muss vollständig alle für die spezifische Problemstellung
essenziellen Eingangsvariablen enthalten, um eine lückenlose Merkmalsabdeckung
zu gewährleisten. Es ist sicherzustellen, dass keine kritischen Einflussgrößen
fehlen, da sonst das Modell keine verlässlichen Korrelationen erlernen kann. Die
Vollständigkeit des Merkmalsraums ist vor Beginn des Trainingsprozesses durch
eine formale Prüfung zu verifizieren.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- MA-06
- MA-14
- QM-10
- QM-11
- QM-13
- QM-25
- QM-26
- QM-27
- QM-28
- QM-29
external_refs: []
source:
framework: BSI QUAIDAL
section: MA-12
title_original_de: MA-12 Abdeckung relevanter Merkmale
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-12_RelevantFeatureCoverage.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MIT-AI-DATA-MA-13-vollstaendige-information-in-datensaetze
canonical_name: Vollständige Information in Datensätzen
description: Für die Validierung von KI-Trainingsdaten ist sicherzustellen, dass
alle für die Analyse erforderlichen Attribute vollständig vorliegen und keine
unbeabsichtigten Lücken existieren. Bei festgestellten Datenfehlern ist zwingend
die Ursache zu ermitteln, um das passende Imputationsverfahren basierend auf dem
spezifischen Fehlerschema auszuwählen. Eine unzureichende Datenbasis darf nicht
zur Modellierung genutzt werden, solange die Integrität der relevanten Information
nicht durch geeignete Maßnahmen wiederhergestellt wurde.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QM-12
- QM-40
- QM-53
external_refs: []
source:
framework: BSI QUAIDAL
section: MA-13
title_original_de: MA-13 Vollständige Information in Datensätzen
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-13_CompleteInformation.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MIT-AI-DATA-MA-14-eda-explorative-daten-analyse
canonical_name: EDA-Explorative Daten Analyse
description: Vor Beginn des Modelltrainings ist eine explorative Datenanalyse durchzuführen,
um Datenverteilungen, Korrelationen sowie Ausreißer und strukturelle Anomalien
ohne vorab definierte Hypothesen zu identifizieren. Die gewonnenen Erkenntnisse
sind systematisch zu dokumentieren, um die Qualität der Trainingsdaten zu validieren
und fundierte Entscheidungen über notwendige Bereinigungs- oder Erweiterungsschritte
abzuleiten. Auf Basis dieser Analyse ist der Datensatz so anzupassen, dass er
die für die Zielfunktion erforderliche Repräsentativität und Integrität gewährleistet.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QM-10
- QM-12
- QM-24
- QM-25
- QM-26
- QM-27
- QM-28
- QM-29
- QM-36
- QM-42
- QM-54
- QM-57
- QM-61
external_refs: []
source:
framework: BSI QUAIDAL
section: MA-14
title_original_de: MA-14 EDA-Explorative Daten Analyse
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-14_EDA-ExplorativeDataAnalysis.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MIT-AI-DATA-MA-15-empirische-evidenz
canonical_name: Empirische Evidenz
description: Es ist sicherzustellen, dass die Wirksamkeit von Schutzmaßnahmen gegen
KI-gestützte Angriffe durch den systematischen Vergleich mit historischen Einsatzszenarien
empirisch validiert wird. Dabei sind Leistungsdaten aus vergleichbaren Anwendungsfällen
heranzuziehen, um die Angemessenheit der eingesetzten Trainingsdatensätze und
Methoden für den spezifischen Kontext nachzuweisen. Die Analyse muss belegen,
dass die gewählten Maßnahmen die identifizierten Risiken in der Praxis effektiv
reduzieren und die Datenqualität den aktuellen Bedrohungsmodellen entspricht.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QM-16
- QM-30
- QM-61
external_refs: []
source:
framework: BSI QUAIDAL
section: MA-15
title_original_de: MA-15 Empirische Evidenz
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-15_EmpiricEvidence.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MIT-AI-DATA-MA-16-daten-imputation
canonical_name: Daten Imputation
description: Für KI-Trainingsdatensätze ist eine systematische Analyse der Ursachen
für fehlende Werte zwingend erforderlich, bevor eine Rekonstruktion erfolgt. Das
gewählte Verfahren zur Datenergänzung muss sich strikt an den identifizierten
Entstehungsgründen orientieren, um die statistische Integrität des Modells zu
wahren. Eine unkritische Imputation ohne Ursachenanalyse ist unzulässig, da sie
das Lernverhalten des Algorithmus verfälschen kann.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- MA-13
- QM-10
- QM-22
- QM-44
- QM-53
external_refs: []
source:
framework: BSI QUAIDAL
section: MA-16
title_original_de: MA-16 Daten Imputation
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-16_DataImputation.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MIT-AI-DATA-MA-17-metadatenverwaltung
canonical_name: Metadatenverwaltung
description: Für den KI-Trainingsprozess ist eine vollständige Dokumentation der
Datenherkunft, der Qualitätsmetriken sowie der rechtlichen Klassifizierung jeder
einzelnen Trainingsinstanz sicherzustellen. Diese strukturellen Begleitinformationen
müssen maschinenlesbar vorliegen, um eine automatisierte Validierung der Datenintegrität
und eine nachvollziehbare Auditierung des Datensatzes zu ermöglichen. Die Erfassung
dieser Attribute ist zwingend erforderlich, um die Eignung der Daten für den spezifischen
Trainingszweck zu gewährleisten und regulatorische Vorgaben einzuhalten.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QM-59
external_refs: []
source:
framework: BSI QUAIDAL
section: MA-17
title_original_de: MA-17 Metadatenverwaltung
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-17_MetadataManagement.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MIT-AI-DATA-MA-18-provenienztracking
canonical_name: ProvenienzTracking
description: Die Herkunft und der Verarbeitungsweg von KI-Trainingsdaten sind lückenlos
zu dokumentieren, um deren Integrität und Nachvollziehbarkeit sicherzustellen.
Für jeden Datensatz ist eine eindeutige Identifikation des Ursprungs sowie aller
Transformationsschritte im Lebenszyklus zu führen. Diese Metadaten müssen so strukturiert
sein, dass eine Rückverfolgung zur ursprünglichen Quelle jederzeit möglich ist,
ohne dass Datenverluste oder Manipulationen unentdeckt bleiben.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QM-59
- QM-60
- QM-61
- QM-65
- QM-67
- QM-70
external_refs: []
source:
framework: BSI QUAIDAL
section: MA-18
title_original_de: MA-18 ProvenienzTracking
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-18_ProvenienzTracking.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MIT-AI-DATA-MA-19-audit-trails
canonical_name: Audit Trails
description: Für die Nachvollziehbarkeit von KI-Trainingsprozessen ist ein lückenloses
Protokollierungssystem zu implementieren, das alle Datenmanipulationen und Modellupdates
zeitgestempelt erfasst. Jeder Zugriff auf Trainingsdatensätze sowie jede Änderung
der Modellparameter muss mit eindeutigen Benutzeridentitäten verknüpft werden.
Die gespeicherten Logs müssen so strukturiert sein, dass sie eine vollständige
Rekonstruktion des Datenflusses und eine Rückführung auf frühere Datenqualitätszustände
ermöglichen.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- MA-22
external_refs: []
source:
framework: BSI QUAIDAL
section: MA-19
title_original_de: MA-19 Audit Trails
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-19_AuditTrails.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MIT-AI-DATA-MA-20-prozess-dokumentation
canonical_name: Prozess Dokumentation
description: Für die Sicherstellung der Datenqualität im KI-Trainingsprozess ist
eine vollständige Dokumentation aller Phasen der Datenerstellung und -aufbereitung
zwingend erforderlich. Diese Spezifikation muss verbindlich festlegen, welche
Aktivitäten auszuführen sind, wer hierfür verantwortlich zeichnet, welche Ressourcen
notwendig sind und welche qualitativen Ergebnisse zu erzielen sind. Insbesondere
ist die Nachverfolgbarkeit der Datenherkunft innerhalb des Dokumentationsprozesses
lückenlos zu gewährleisten, um die Integrität der Trainingsdaten zu validieren.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QM-15
- QM-31
- QM-62
- QM-65
external_refs:
- framework: ISO/IEC 42001
citation: null
source:
framework: BSI QUAIDAL
section: MA-20
title_original_de: MA-20 Prozess Dokumentation
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-20_ProcessDocumentation.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MIT-AI-DATA-MA-21-compliance
canonical_name: Compliance
description: Der Einsatz von KI-Modellen erfordert eine zwingende Prüfung der Trainingsdatensätze
auf rechtliche Konformität und ethische Integrität, bevor diese zur Modellgenerierung
verwendet werden. Es ist sicherzustellen, dass alle verarbeiteten Informationen
die Vorgaben der DSGVO sowie branchenspezifische Regularien vollständig erfüllen
und keine unrechtmäßig beschafften oder personenbezogenen Daten ohne explizite
Einwilligung enthalten. Die Validierung dieser Datenqualität muss vor jedem Trainingslauf
durch einen automatisierten oder manuellen Compliance-Check nachgewiesen werden.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QM-12
- QM-15
external_refs:
- framework: EU GDPR
citation: null
- framework: AI Act
citation: null
source:
framework: BSI QUAIDAL
section: MA-21
title_original_de: MA-21 Compliance
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-21_Compliance.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MIT-AI-DATA-MA-22-vertrauenswuerdigkeit
canonical_name: Vertrauenswürdigkeit
description: Die Integrität und Zuverlässigkeit der für das KI-Training verwendeten
Datensätze ist im jeweiligen Anwendungskontext nachweislich zu verifizieren. Es
ist sicherzustellen, dass potenzielle Manipulationen oder unbeabsichtigte Korruptionen
des Datenflusses durch technische Prüfmechanismen ausgeschlossen werden. Bei der
Anwendung von Korrekturverfahren zur Datenbereinigung muss die ursprüngliche Glaubwürdigkeit
der Informationen gewahrt bleiben und darf nicht durch die Maßnahme beeinträchtigt
werden.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QM-15
- QM-43
- QM-65
external_refs: []
source:
framework: BSI QUAIDAL
section: MA-22
title_original_de: MA-22 Vertrauenswürdigkeit
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-22_Credibility.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MIT-AI-DATA-MA-23-merkmalsskalierung
canonical_name: Merkmalsskalierung
description: Für KI-Trainingsdatensätze ist eine Normalisierung der Merkmalswerte
auf einen einheitlichen Wertebereich zwingend erforderlich, um Dominanzeffekte
durch unterschiedliche Größenordnungen zu vermeiden. Diese Maßnahme stellt sicher,
dass Algorithmen, die auf Distanzberechnungen oder Gradientenverfahren basieren,
nicht durch skalenbedingte Verzerrungen beeinträchtigt werden. Die Wirksamkeit
der Skalierung ist vor dem Training systematisch zu prüfen, um die Vorhersagegenauigkeit
des Modells zu garantieren.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QM-10
- QM-56
external_refs: []
source:
framework: BSI QUAIDAL
section: MA-23
title_original_de: MA-23 Merkmalsskalierung
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-23_FeatureScaling.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MIT-AI-DATA-MA-24-merkmalserstellung
canonical_name: Merkmalserstellung
description: Es ist sicherzustellen, dass bei der Erstellung neuer Eingangsmerkmale
für KI-Modelle ausschließlich validierte Transformationsverfahren angewendet werden,
um die Datenqualität zu gewährleisten. Die Generierung neuer Features muss auf
nachvollziehbaren Algorithmen basieren, die eine signifikante Verbesserung der
Modellleistung gegenüber den Rohdaten nachweisen. Jede angewandte Methode zur
Datenanreicherung oder -bereinigung ist vor dem Training auf ihre Eignung zur
Mustererkennung und Vorhersagegenauigkeit zu prüfen.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QM-11
- QM-25
- QM-26
- QM-27
- QM-28
- QM-51
- QM-71
external_refs: []
source:
framework: BSI QUAIDAL
section: MA-24
title_original_de: MA-24 Merkmalserstellung
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-24_FeatureCreation.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MIT-AI-DATA-MA-25-differential-privacy
canonical_name: Differential Privacy
description: Das System muss bei der Verarbeitung von KI-Trainingsdaten differenzielle
Privatsphäre implementieren, indem statistisch signifikante, zufällige Störgrößen
zu den Ergebnissen hinzugefügt werden. Es ist sicherzustellen, dass die An- oder
Abwesenheit einzelner Datensätze im Trainingsset das Ausgabeergebnis nur marginal
beeinflusst. Durch diese Maßnahme ist zu prüfen, ob keine Rückschlüsse auf spezifische
Personen aus den generierten Analysen gezogen werden können, während die allgemeine
Datenqualität für das Modelltraining erhalten bleibt.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QM-58
external_refs: []
source:
framework: BSI QUAIDAL
section: MA-25
title_original_de: MA-25 Differential Privacy
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-25_Differential%20Privacy.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0625
- id: MIT-AI-DATA-MA-26-federated-learning
canonical_name: Federated Learning
description: Für KI-Systeme, die auf verteilten Datenquellen basieren, ist ein Federated-Learning-Ansatz
zwingend vorzusehen, um die Rohdaten dezentral zu belassen. Die lokalen Modelle
müssen ausschließlich aggregierte Parameter an eine zentrale Instanz übermitteln,
während die ursprünglichen Trainingsdaten niemals die lokale Umgebung verlassen.
Eine Prüfung ist sicherzustellen, dass durch diese Architektur keine sensiblen
Informationen während des Lernprozesses zentralisiert oder übertragen werden.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QM-63
external_refs: []
source:
framework: BSI QUAIDAL
section: MA-26
title_original_de: MA-26 Federated Learning
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-26_Federated%20Learning%20Approach.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MIT-AI-DATA-MA-27-statistische-grundlagenthemen
canonical_name: Statistische Grundlagenthemen
description: Für die Sicherstellung der Datenqualität im KI-Lebenszyklus sind statistische
Basisverfahren systematisch zu implementieren und kontinuierlich zu validieren.
Es ist sicherzustellen, dass alle relevanten Metriken zur Verteilungsanalyse und
Datenintegrität konsistent in die Berechnungspipelines integriert werden. Diese
fundamentalen Analysen müssen unabhängig von spezifischen Bausteinen als übergeordnete
Prüfkriterien für die Modellgüte dienen.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QM-01
- QM-02
- QM-03
- QM-04
- QM-06
- QM-07
- QM-09
- QM-23
- QM-51
external_refs: []
source:
framework: BSI QUAIDAL
section: MA-27
title_original_de: MA-27 Statistische Grundlagenthemen
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-27_StatisticalBasis.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0213
- id: MIT-AI-DATA-MA-28-diversitaetsindizes
canonical_name: Diversitätsindizes
description: Das System muss quantitative Metriken zur Erfassung der Heterogenität
von KI-Trainingsdaten implementieren, um die Verteilung verschiedener Kategorien
zu messen. Es ist sicherzustellen, dass diese Kennzahlen sowohl die Anzahl vorhandener
Klassen als auch deren Gleichverteilung abbilden. Die Validierung der Datenqualität
erfolgt durch die Berechnung von Diversitätsindizes, die statistische Unsicherheit
oder Kollisionswahrscheinlichkeiten quantifizieren.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QM-68
external_refs: []
source:
framework: BSI QUAIDAL
section: MA-28
title_original_de: MA-28 Diversitätsindizes
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-28_Diversity-Indices.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MIT-AI-DATA-MA-29-data-splitting
canonical_name: Data-Splitting
description: Die Aufteilung von KI-Trainingsdaten in disjunkte Teilmengen ist zwingend
erforderlich, um eine unvoreingenommene Validierung der Modellgüte zu gewährleisten.
Dabei müssen mindestens drei voneinander getrennte Bereiche für das Training,
die Hyperparameter-Optimierung sowie die abschließende Leistungsbewertung definiert
werden. Eine zufällige oder stratifizierte Trennung ist sicherzustellen, um Datenlecks
zwischen den Phasen auszuschließen und die Generalisierungsfähigkeit des Systems
nachweisbar zu prüfen.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QM-69
external_refs: []
source:
framework: BSI QUAIDAL
section: MA-29
title_original_de: MA-29 Data-Splitting
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-29_Data%20Splitting.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
- id: MIT-AI-DATA-MA-30-fairness
canonical_name: Fairness
description: Das System muss sicherstellen, dass KI-Trainingsdaten keine systematischen
Verzerrungen bezüglich sensibler demografischer Merkmale aufweisen, um diskriminierende
Vorhersagen zu vermeiden. Bei unzureichender Repräsentation von Teilgruppen sind
präventive Aufbereitungsverfahren oder algorithmische Transformationsmethoden
zur Bias-Korrektur zwingend anzuwenden. Die Wirksamkeit dieser Maßnahmen ist vor
der Modellbereitstellung durch quantitative Prüfverfahren auf Gleichbehandlungsgrundsätze
zu validieren.
kind: measure
regulation_anchor: EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)
related_quaidal_ids:
- QM-57
external_refs: []
source:
framework: BSI QUAIDAL
section: MA-30
title_original_de: MA-30 Fairness
url: https://github.com/BSI-Bund/QUAIDAL/blob/main/0000_Markdown/0001_Criteria,Measurements,Metrics/0002_Maßnahmen/MA-30_Fairness.md
commit_sha: c39b75369841b359c6bf56d6588e3768c722842f
license_note: § 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.
plagiarism_score_at_generation: 0.0
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,58 @@
-- Migration 011: Derived Controls Library (Clean-Room MCs from external sources)
-- Schema: compliance
--
-- Holds Master Controls + atomic controls + mitigations + metrics that were
-- derived Clean-Room from external regulatory sources (BSI QUAIDAL today,
-- Grundschutz++/CRA/NIST AI RMF next). Kept separate from the gpre2
-- master_controls table because:
-- 1) The shape is different (no object_group/phase concepts).
-- 2) Source-Layer-Trennung: derivations from external IP must be cleanly
-- separable from internally-generated artifacts.
-- 3) Each row carries the licence + provenance for due diligence.
--
-- Run: ssh macmini "docker exec -i bp-core-postgres psql -U breakpilot -d breakpilot_db" \
-- < control-pipeline/migrations/011_derived_controls.sql
SET search_path TO compliance, public;
CREATE TABLE IF NOT EXISTS derived_controls (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
derived_id VARCHAR(200) UNIQUE NOT NULL, -- e.g. MC-AI-DATA-QKB-01-repraesentativitaet
kind VARCHAR(30) NOT NULL, -- criterion | building_block | measure | metric
canonical_name VARCHAR(300) NOT NULL,
description TEXT NOT NULL, -- our own wording, never the original
regulation_anchor TEXT, -- e.g. "EU AI Act Art. 10"
related_quaidal_ids JSONB NOT NULL DEFAULT '[]', -- ["QB-03", "QB-04", ...]
external_refs JSONB NOT NULL DEFAULT '[]', -- [{framework, citation}, ...]
source_framework VARCHAR(80) NOT NULL, -- "BSI QUAIDAL"
source_section VARCHAR(80) NOT NULL, -- "QKB-01"
source_url TEXT,
source_commit_sha VARCHAR(80),
source_title_original TEXT, -- original title (label, not protected)
source_license_note TEXT,
plagiarism_score_at_generation NUMERIC(5,4), -- 0..1; gate was 0.20
generated_by_model VARCHAR(80),
yaml_path TEXT, -- pointer back to source YAML
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_derived_controls_kind ON derived_controls(kind);
CREATE INDEX IF NOT EXISTS idx_derived_controls_source_framework ON derived_controls(source_framework);
CREATE INDEX IF NOT EXISTS idx_derived_controls_source_section ON derived_controls(source_section);
CREATE INDEX IF NOT EXISTS idx_derived_controls_related_quaidal_gin
ON derived_controls USING GIN(related_quaidal_ids);
-- Trigger to keep updated_at fresh
CREATE OR REPLACE FUNCTION trg_derived_controls_set_updated_at()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
DROP TRIGGER IF EXISTS derived_controls_updated_at ON derived_controls;
CREATE TRIGGER derived_controls_updated_at
BEFORE UPDATE ON derived_controls
FOR EACH ROW EXECUTE FUNCTION trg_derived_controls_set_updated_at();
@@ -0,0 +1,170 @@
#!/usr/bin/env python3
"""Upsert derived QUAIDAL controls from YAML into compliance.derived_controls.
Reads:
control-pipeline/data/quaidal/master_controls.yaml
control-pipeline/data/quaidal/atomic_controls.yaml
control-pipeline/data/quaidal/mitigations.yaml
control-pipeline/data/quaidal/metrics.yaml
Writes: compliance.derived_controls (idempotent UPSERT by derived_id)
Usage:
# Mac Mini direct:
python3 control-pipeline/scripts/apply_quaidal_to_db.py
# Via SSH (locally, against macmini DB):
DB_HOST=macmini python3 control-pipeline/scripts/apply_quaidal_to_db.py
"""
from __future__ import annotations
import argparse
import json
import os
import sys
from pathlib import Path
try:
import psycopg
import yaml
except ImportError as e:
print(f"ERROR: missing dependency {e.name}. Install with: pip install psycopg[binary] pyyaml", file=sys.stderr)
sys.exit(2)
REPO_ROOT = Path(__file__).resolve().parents[2]
DATA_DIR = REPO_ROOT / "control-pipeline" / "data" / "quaidal"
KIND_FILES = {
"criterion": "master_controls.yaml",
"building_block": "atomic_controls.yaml",
"measure": "mitigations.yaml",
"metric": "metrics.yaml",
}
UPSERT_SQL = """
INSERT INTO compliance.derived_controls (
derived_id, kind, canonical_name, description, regulation_anchor,
related_quaidal_ids, external_refs,
source_framework, source_section, source_url, source_commit_sha,
source_title_original, source_license_note,
plagiarism_score_at_generation, generated_by_model, yaml_path
) VALUES (
%(derived_id)s, %(kind)s, %(canonical_name)s, %(description)s, %(regulation_anchor)s,
%(related_quaidal_ids)s::jsonb, %(external_refs)s::jsonb,
%(source_framework)s, %(source_section)s, %(source_url)s, %(source_commit_sha)s,
%(source_title_original)s, %(source_license_note)s,
%(plagiarism_score)s, %(generated_by_model)s, %(yaml_path)s
)
ON CONFLICT (derived_id) DO UPDATE SET
kind = EXCLUDED.kind,
canonical_name = EXCLUDED.canonical_name,
description = EXCLUDED.description,
regulation_anchor = EXCLUDED.regulation_anchor,
related_quaidal_ids = EXCLUDED.related_quaidal_ids,
external_refs = EXCLUDED.external_refs,
source_framework = EXCLUDED.source_framework,
source_section = EXCLUDED.source_section,
source_url = EXCLUDED.source_url,
source_commit_sha = EXCLUDED.source_commit_sha,
source_title_original = EXCLUDED.source_title_original,
source_license_note = EXCLUDED.source_license_note,
plagiarism_score_at_generation = EXCLUDED.plagiarism_score_at_generation,
generated_by_model = EXCLUDED.generated_by_model,
yaml_path = EXCLUDED.yaml_path
"""
def load_yaml_records(yaml_path: Path) -> tuple[list[dict], str | None, str | None]:
if not yaml_path.exists():
return [], None, None
data = yaml.safe_load(yaml_path.read_text(encoding="utf-8"))
return data.get("controls", []), data.get("commit_sha"), data.get("generated_by_model")
def to_row(ctrl: dict, yaml_path: Path, default_model: str | None, default_commit: str | None) -> dict:
source = ctrl.get("source") or {}
return {
"derived_id": ctrl["id"],
"kind": ctrl["kind"],
"canonical_name": ctrl["canonical_name"],
"description": ctrl["description"],
"regulation_anchor": ctrl.get("regulation_anchor"),
"related_quaidal_ids": json.dumps(ctrl.get("related_quaidal_ids", []), ensure_ascii=False),
"external_refs": json.dumps(ctrl.get("external_refs", []), ensure_ascii=False),
"source_framework": source.get("framework", "BSI QUAIDAL"),
"source_section": source.get("section", ""),
"source_url": source.get("url"),
"source_commit_sha": source.get("commit_sha") or default_commit,
"source_title_original": source.get("title_original_de"),
"source_license_note": source.get("license_note"),
"plagiarism_score": ctrl.get("plagiarism_score_at_generation"),
"generated_by_model": default_model,
"yaml_path": str(yaml_path.relative_to(REPO_ROOT)),
}
def build_dsn(args: argparse.Namespace) -> str:
if args.dsn:
return args.dsn
return (
f"host={args.db_host} port={args.db_port} "
f"dbname={args.db_name} user={args.db_user} password={args.db_password}"
)
def main() -> int:
ap = argparse.ArgumentParser(description=__doc__)
ap.add_argument("--dsn", help="Full DSN; overrides individual flags")
ap.add_argument("--db-host", default=os.environ.get("DB_HOST", "localhost"))
ap.add_argument("--db-port", default=os.environ.get("DB_PORT", "5432"))
ap.add_argument("--db-name", default=os.environ.get("DB_NAME", "breakpilot_db"))
ap.add_argument("--db-user", default=os.environ.get("DB_USER", "breakpilot"))
ap.add_argument("--db-password", default=os.environ.get("DB_PASSWORD", "breakpilot"))
ap.add_argument("--dry-run", action="store_true")
args = ap.parse_args()
total = 0
rows: list[dict] = []
for kind, fname in KIND_FILES.items():
path = DATA_DIR / fname
records, commit, model = load_yaml_records(path)
for rec in records:
rows.append(to_row(rec, path, model, commit))
if records:
print(f" {fname}: {len(records)} entries", file=sys.stderr)
total += len(records)
if not rows:
print("ERROR: no YAML records found; run derive_quaidal_mcs.py first", file=sys.stderr)
return 2
print(f"Total rows: {total}", file=sys.stderr)
if args.dry_run:
print("Dry run — sample row:", file=sys.stderr)
print(json.dumps({k: (v[:200] if isinstance(v, str) else v) for k, v in rows[0].items()}, indent=2, ensure_ascii=False))
return 0
dsn = build_dsn(args)
print(f"Connecting to {args.db_host}:{args.db_port}/{args.db_name}", file=sys.stderr)
inserted = updated = 0
with psycopg.connect(dsn) as conn:
with conn.cursor() as cur:
for row in rows:
cur.execute(
"SELECT 1 FROM compliance.derived_controls WHERE derived_id = %s",
(row["derived_id"],),
)
existed = cur.fetchone() is not None
cur.execute(UPSERT_SQL, row)
if existed:
updated += 1
else:
inserted += 1
conn.commit()
print(f"Inserted: {inserted}, Updated: {updated}", file=sys.stderr)
return 0
if __name__ == "__main__":
sys.exit(main())
@@ -0,0 +1,400 @@
#!/usr/bin/env python3
"""Clean-Room MC derivation from BSI QUAIDAL.
For each QUAIDAL entry in the parsed index, ask a local LLM to produce our own
wording for a Master Control / atomic control / mitigation / metric. Reject any
output whose 4-gram overlap with the BSI source text exceeds PLAGIARISM_LIMIT.
We never store the BSI prose; only our own derived wording plus structural
references (BSI section ID + URL + commit SHA).
Usage:
# Single entry, prints to stdout for review:
python3 control-pipeline/scripts/derive_quaidal_mcs.py --only QKB-01 --dry-run
# Full run, writes YAML:
python3 control-pipeline/scripts/derive_quaidal_mcs.py --ollama-host macmini
Output: control-pipeline/data/quaidal/{master_controls,atomic_controls,mitigations,metrics}.yaml
"""
from __future__ import annotations
import argparse
import json
import re
import sys
import time
from dataclasses import dataclass
from pathlib import Path
try:
import httpx
import yaml
except ImportError as e:
print(f"ERROR: missing dependency {e.name}. Install with: pip install httpx pyyaml", file=sys.stderr)
sys.exit(2)
REPO_ROOT = Path(__file__).resolve().parents[2]
SOURCE_ROOT = REPO_ROOT / "legal-sources" / "bsi-quaidal"
INDEX_FILE = REPO_ROOT / "control-pipeline" / "data" / "quaidal" / "quaidal_index.json"
OUTPUT_DIR = REPO_ROOT / "control-pipeline" / "data" / "quaidal"
PLAGIARISM_LIMIT = 0.20 # max share of 4-grams that may appear in BSI source
N_GRAM = 4
MAX_RETRIES = 3
DEFAULT_OLLAMA_URL = "http://macmini:11434"
OLLAMA_MODEL = "qwen3.5:35b-a3b"
QUAIDAL_REPO_URL = "https://github.com/BSI-Bund/QUAIDAL"
KIND_TO_PROMPT_ROLE = {
"criterion": "Master Control",
"building_block": "atomarer technischer Control",
"measure": "Schutzmaßnahme",
"metric": "messbarer Qualitäts-Indikator",
}
KIND_TO_OUTPUT_FILE = {
"criterion": "master_controls.yaml",
"building_block": "atomic_controls.yaml",
"measure": "mitigations.yaml",
"metric": "metrics.yaml",
}
# ---------------------------------------------------------------------------
# Source-side extraction (kept in memory, never written to disk)
# ---------------------------------------------------------------------------
FRONTMATTER_RE = re.compile(r"^---\s*\n.*?\n---\s*\n", re.DOTALL)
SECTION_RE = re.compile(r"^###?\s+(.+?)\s*$", re.MULTILINE)
def load_source_extract(rel_path: str) -> dict:
"""Load BSI source text for ONE entry. Used only for prompt + plagiarism check."""
path = SOURCE_ROOT / rel_path
text = path.read_text(encoding="utf-8")
# Strip frontmatter; capture shortdesc separately for the prompt.
fm_match = re.match(r"^---\s*\n(.*?)\n---\s*\n", text, re.DOTALL)
shortdesc = ""
if fm_match:
for line in fm_match.group(1).splitlines():
if line.lower().startswith("shortdesc:"):
shortdesc = line.split(":", 1)[1].strip()
break
body = FRONTMATTER_RE.sub("", text, count=1)
# Pull the first 1-2 paragraphs under "Beschreibung" (or whole body if none)
desc_match = re.search(r"###?\s+Beschreibung\s*\n+(.+?)(?:\n###?\s|\Z)", body, re.DOTALL)
description_excerpt = desc_match.group(1).strip() if desc_match else body[:1500].strip()
paragraphs = [p.strip() for p in description_excerpt.split("\n\n") if p.strip()]
description_excerpt = "\n\n".join(paragraphs[:2])
return {
"shortdesc": shortdesc,
"description_excerpt": description_excerpt,
"full_body": body,
}
# ---------------------------------------------------------------------------
# Plagiarism gate
# ---------------------------------------------------------------------------
WORD_RE = re.compile(r"\b[\wäöüÄÖÜß]+\b", re.UNICODE)
def _tokenize(text: str) -> list[str]:
return [w.lower() for w in WORD_RE.findall(text)]
def ngram_overlap(produced: str, source: str, n: int = N_GRAM) -> float:
"""Share of produced n-grams that also appear in source."""
p_tokens = _tokenize(produced)
s_tokens = _tokenize(source)
if len(p_tokens) < n:
return 0.0
s_grams = {tuple(s_tokens[i : i + n]) for i in range(len(s_tokens) - n + 1)}
if not s_grams:
return 0.0
p_grams = [tuple(p_tokens[i : i + n]) for i in range(len(p_tokens) - n + 1)]
hits = sum(1 for g in p_grams if g in s_grams)
return hits / len(p_grams)
# ---------------------------------------------------------------------------
# LLM prompt + call
# ---------------------------------------------------------------------------
PROMPT_TEMPLATE = """Du bist Compliance-Engineer bei BreakPilot. Schreibe eine eigenständige Anforderung im Stil einer technischen Kontroll-Spezifikation.
Quelle: BSI QUAIDAL Sektion {entry_id} ("{title_de}"). Die Quelle steht unter unklarer Lizenz (BSI-Veröffentlichung, § 5 UrhG anwendbar) wir dürfen die Idee aufgreifen, aber NICHT abschreiben.
Aufgabe: Formuliere eine eigenständige Anforderung im Stil eines {role}. Anforderungen:
- Eigene Formulierung in deutscher Sprache. Kein Satz darf aus der Quelle übernommen werden, auch nicht teilweise. Synonyme verwenden, Satzbau ändern, Inhalt strukturell anders aufbauen.
- 2-4 Sätze (max 80 Wörter).
- Sprachstil: nüchtern, technisch, normativ ("muss", "ist sicherzustellen", "ist zu prüfen").
- Bezug auf KI-Trainingsdaten oder KI-Datenqualität, je nach Quelle.
- Nicht die wörtlichen BSI-Beispiele kopieren.
Quellauszug (NUR zur Orientierung, NICHT abschreiben):
---
shortdesc: {shortdesc}
{description_excerpt}
---
Antwort: Liefere AUSSCHLIESSLICH die fertige Beschreibung als reinen Text kein JSON, keine Überschriften, keine Anführungszeichen, keine Quellenangabe."""
def call_ollama(prompt: str, ollama_url: str, model: str, retries: int = 2) -> str:
last_err = None
for attempt in range(retries + 1):
try:
resp = httpx.post(
f"{ollama_url}/api/chat",
json={
"model": model,
"messages": [{"role": "user", "content": prompt}],
"stream": False,
"options": {"temperature": 0.4},
"think": False,
},
timeout=180.0,
)
resp.raise_for_status()
return resp.json()["message"]["content"].strip()
except (httpx.HTTPError, KeyError, ValueError) as e:
last_err = e
if attempt < retries:
time.sleep(2 ** attempt)
raise RuntimeError(f"Ollama call failed after {retries+1} attempts: {last_err}")
def strip_llm_artifacts(text: str) -> str:
"""Clean leading/trailing markdown and quotes from LLM output."""
text = text.strip()
# Strip surrounding code fences
if text.startswith("```"):
text = re.sub(r"^```[a-zA-Z]*\n?", "", text)
text = re.sub(r"\n?```\s*$", "", text)
# Strip surrounding quotes
text = text.strip('""”„')
# Drop a leading "Beschreibung:" or similar label
text = re.sub(r"^(Beschreibung|Description|Anforderung|Control):\s*", "", text, flags=re.IGNORECASE)
return text.strip()
# ---------------------------------------------------------------------------
# Derivation
# ---------------------------------------------------------------------------
@dataclass
class DerivedControl:
derived_id: str
source_id: str
kind: str
canonical_name: str
description: str
plagiarism_score: float
related_quaidal_ids: list[str]
external_refs: list[dict]
source: dict
_ASCII_FOLD = str.maketrans({"ä": "ae", "ö": "oe", "ü": "ue", "Ä": "ae", "Ö": "oe", "Ü": "ue", "ß": "ss"})
def slug(text: str) -> str:
text = text.translate(_ASCII_FOLD).lower()
text = re.sub(r"[^a-z0-9]+", "-", text)
return text.strip("-")
def derived_id_for(entry: dict) -> str:
prefix = {
"criterion": "MC-AI-DATA",
"building_block": "AC-AI-DATA",
"measure": "MIT-AI-DATA",
"metric": "MET-AI-DATA",
}.get(entry["kind"], "X-AI-DATA")
title = entry["title_de"]
title = re.sub(r"^\s*(QKB|QB|MA|QM)-\d+[a-zA-Z]?\s*", "", title)
return f"{prefix}-{entry['id']}-{slug(title)[:40]}".rstrip("-")
def derive_one(entry: dict, source_extract: dict, ollama_url: str, model: str, *, verbose: bool = False) -> DerivedControl:
role = KIND_TO_PROMPT_ROLE.get(entry["kind"], "Control")
prompt = PROMPT_TEMPLATE.format(
entry_id=entry["id"],
title_de=entry["title_de"],
role=role,
shortdesc=source_extract["shortdesc"] or "(keiner)",
description_excerpt=source_extract["description_excerpt"] or "(keine Beschreibung)",
)
source_corpus = "\n\n".join(filter(None, [source_extract["shortdesc"], source_extract["description_excerpt"]]))
best: tuple[str, float] | None = None
for attempt in range(1, MAX_RETRIES + 1):
output = call_ollama(prompt, ollama_url, model)
output = strip_llm_artifacts(output)
score = ngram_overlap(output, source_corpus)
if verbose:
print(f" attempt {attempt}: overlap={score:.2%} len={len(output)}", file=sys.stderr)
if score < PLAGIARISM_LIMIT:
best = (output, score)
break
if best is None or score < best[1]:
best = (output, score)
# Strengthen the next prompt by appending a reject notice
prompt += f"\n\n(Vorheriger Versuch hatte {score:.0%} Wortdeckung mit der Quelle. Verwende völlig andere Begriffe und Satzstruktur.)"
if best is None:
raise RuntimeError(f"Could not derive {entry['id']}: no output")
output, score = best
if score >= PLAGIARISM_LIMIT:
raise RuntimeError(
f"Plagiarism gate failed for {entry['id']}: best overlap {score:.2%} >= limit {PLAGIARISM_LIMIT:.0%}.\n"
f"Output:\n{output}"
)
title_de_clean = re.sub(r"^\s*(QKB|QB|MA|QM)-\d+[a-zA-Z]?\s*", "", entry["title_de"]).strip()
return DerivedControl(
derived_id=derived_id_for(entry),
source_id=entry["id"],
kind=entry["kind"],
canonical_name=title_de_clean or entry["title_de"],
description=output,
plagiarism_score=round(score, 4),
related_quaidal_ids=entry["referenced_ids"],
external_refs=entry["external_refs"],
source={
"framework": "BSI QUAIDAL",
"section": entry["id"],
"title_original_de": entry["title_de"],
"url": f"{QUAIDAL_REPO_URL}/blob/main/{entry['source_path'].replace(' ', '%20')}",
"commit_sha": None, # filled in by main()
"license_note": "§ 5 UrhG anwendbar; share:true im Frontmatter; Clean-Room-Ableitung.",
},
)
# ---------------------------------------------------------------------------
# Output writers
# ---------------------------------------------------------------------------
def control_to_dict(c: DerivedControl) -> dict:
d = {
"id": c.derived_id,
"canonical_name": c.canonical_name,
"description": c.description,
"kind": c.kind,
"regulation_anchor": "EU AI Act Art. 10 (Datenqualität für Hochrisiko-KI)",
"related_quaidal_ids": c.related_quaidal_ids,
"external_refs": c.external_refs,
"source": c.source,
"plagiarism_score_at_generation": c.plagiarism_score,
}
return d
def write_yaml_per_kind(controls: list[DerivedControl], commit_sha: str | None) -> dict[str, Path]:
out: dict[str, list[dict]] = {}
for c in controls:
c.source["commit_sha"] = commit_sha
fname = KIND_TO_OUTPUT_FILE.get(c.kind, "other.yaml")
out.setdefault(fname, []).append(control_to_dict(c))
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
written: dict[str, Path] = {}
for fname, items in out.items():
path = OUTPUT_DIR / fname
payload = {
"source": "Derived from BSI QUAIDAL (Clean-Room)",
"source_url": QUAIDAL_REPO_URL,
"commit_sha": commit_sha,
"plagiarism_limit_4gram": PLAGIARISM_LIMIT,
"generated_by_model": OLLAMA_MODEL,
"controls": items,
}
path.write_text(yaml.safe_dump(payload, allow_unicode=True, sort_keys=False), encoding="utf-8")
written[fname] = path
return written
# ---------------------------------------------------------------------------
# CLI
# ---------------------------------------------------------------------------
def main() -> int:
ap = argparse.ArgumentParser(description=__doc__)
ap.add_argument("--only", help="Derive only this QUAIDAL ID (e.g. QKB-01)")
ap.add_argument("--kind", help="Derive only entries of this kind (criterion/building_block/measure/metric)")
ap.add_argument("--limit", type=int, help="Process at most N entries")
ap.add_argument("--dry-run", action="store_true", help="Print derived controls instead of writing YAML")
ap.add_argument("--ollama-host", default="macmini", help="Ollama host (default: macmini)")
ap.add_argument("--model", default=OLLAMA_MODEL)
ap.add_argument("--verbose", action="store_true")
args = ap.parse_args()
if not INDEX_FILE.exists():
print(f"ERROR: missing index. Run ingest_bsi_quaidal.py first ({INDEX_FILE})", file=sys.stderr)
return 2
index = json.loads(INDEX_FILE.read_text(encoding="utf-8"))
entries = index["entries"]
if args.only:
entries = [e for e in entries if e["id"].upper() == args.only.upper()]
if args.kind:
entries = [e for e in entries if e["kind"] == args.kind]
if args.limit:
entries = entries[: args.limit]
if not entries:
print("No entries match the filter.", file=sys.stderr)
return 1
ollama_url = args.ollama_host if "://" in args.ollama_host else f"http://{args.ollama_host}:11434"
print(f"Derivation: {len(entries)} entries, model={args.model}, ollama={ollama_url}, limit={PLAGIARISM_LIMIT:.0%}", file=sys.stderr)
derived: list[DerivedControl] = []
failed: list[tuple[str, str]] = []
for i, entry in enumerate(entries, 1):
if args.verbose:
print(f"[{i}/{len(entries)}] {entry['id']} ({entry['kind']}): {entry['title_de']}", file=sys.stderr)
try:
extract = load_source_extract(entry["source_path"])
ctrl = derive_one(entry, extract, ollama_url, args.model, verbose=args.verbose)
derived.append(ctrl)
except Exception as exc: # noqa: BLE001
failed.append((entry["id"], str(exc)))
print(f" FAILED {entry['id']}: {exc}", file=sys.stderr)
print(f"\nDerived: {len(derived)} | Failed: {len(failed)}", file=sys.stderr)
if args.dry_run:
for c in derived:
c.source["commit_sha"] = index.get("commit_sha")
print(yaml.safe_dump(control_to_dict(c), allow_unicode=True, sort_keys=False))
print("---")
return 0 if not failed else 1
written = write_yaml_per_kind(derived, index.get("commit_sha"))
for fname, path in written.items():
print(f"Wrote {path.relative_to(REPO_ROOT)} ({sum(1 for c in derived if KIND_TO_OUTPUT_FILE[c.kind] == fname)} entries)", file=sys.stderr)
if failed:
print("\nFailures:", file=sys.stderr)
for fid, msg in failed:
print(f" - {fid}: {msg.splitlines()[0]}", file=sys.stderr)
return 1
return 0
if __name__ == "__main__":
sys.exit(main())
@@ -0,0 +1,242 @@
#!/usr/bin/env python3
"""Parse BSI QUAIDAL Markdown catalog into a structural index.
Clean-Room principle: this script does NOT persist any QUAIDAL prose to disk.
It only extracts non-protectable structural facts (IDs, type, file paths,
cross-references to other QUAIDAL entries, references to external norms).
The derivation step (derive_quaidal_mcs.py) reads the index plus the original
.md files from the gitignored clone and asks the LLM to produce our own
wordings, never copying the BSI prose into our own controls/database.
Input: legal-sources/bsi-quaidal/0000_Markdown/**/*.md (gitignored clone)
Output: control-pipeline/data/quaidal/quaidal_index.json (structural only)
Usage:
python3 control-pipeline/scripts/ingest_bsi_quaidal.py
python3 control-pipeline/scripts/ingest_bsi_quaidal.py --check # validate only
"""
from __future__ import annotations
import argparse
import json
import re
import subprocess
import sys
from dataclasses import asdict, dataclass, field
from pathlib import Path
try:
import yaml
except ImportError:
print("ERROR: PyYAML missing. Install with: pip install pyyaml", file=sys.stderr)
sys.exit(2)
REPO_ROOT = Path(__file__).resolve().parents[2]
SOURCE_ROOT = REPO_ROOT / "legal-sources" / "bsi-quaidal"
MARKDOWN_ROOT = SOURCE_ROOT / "0000_Markdown"
OUTPUT_DIR = REPO_ROOT / "control-pipeline" / "data" / "quaidal"
OUTPUT_FILE = OUTPUT_DIR / "quaidal_index.json"
# Map folder name -> our internal kind. Sub-folders inside the Methoden tree
# (e.g. "QM-10_Dimension Reduction") are treated as method variants of their
# parent QM.
KIND_BY_PARENT_DIR = {
"0000_Qualitätskriterien": "criterion", # QKB → Master Control candidates
"0001_Qualitätsbausteine": "building_block", # QB → atomic controls
"0002_Maßnahmen": "measure", # M → mitigations
"0003_Qualitätsmetriken_methoden": "metric", # QM → runtime check / metric
"0002_Referenz-Matrizen": "matrix", # cross-walk matrix
"9998_CustomTemplates": "template",
}
FRONTMATTER_RE = re.compile(r"^---\s*\n(.*?)\n---\s*\n", re.DOTALL)
ID_RE = re.compile(r"\b((?:QKB|QB|MA|QM)-\d+[a-zA-Z]?)", re.IGNORECASE)
@dataclass
class IndexEntry:
id: str # Canonical ID: QKB-01, QB-03, M-12, QM-07
kind: str # criterion / building_block / measure / metric / matrix / template
title_de: str
title_en: str
source_path: str # relative to SOURCE_ROOT
referenced_ids: list[str] = field(default_factory=list) # other QUAIDAL IDs linked in this file
external_refs: list[dict] = field(default_factory=list) # {framework, citation, ref_id}
tags: list[str] = field(default_factory=list)
share: bool | None = None
def parse_frontmatter(text: str) -> dict:
m = FRONTMATTER_RE.match(text)
if not m:
return {}
try:
return yaml.safe_load(m.group(1)) or {}
except yaml.YAMLError:
return {}
def canonical_id(raw_id: str | list | None, filename: str) -> str | None:
"""QUAIDAL files sometimes list multiple IDs or odd casing — normalise."""
candidates: list[str] = []
if isinstance(raw_id, list):
candidates.extend(str(x) for x in raw_id)
elif isinstance(raw_id, str):
candidates.append(raw_id)
# Fallback: derive from filename
candidates.append(filename)
for c in candidates:
m = ID_RE.search(c)
if m:
return m.group(1).upper().replace(" ", "-")
return None
def determine_kind(path: Path) -> str:
for parent in path.parents:
if parent.name in KIND_BY_PARENT_DIR:
return KIND_BY_PARENT_DIR[parent.name]
return "unknown"
def collect_referenced_ids(body: str, own_id: str) -> list[str]:
found = {m.group(1).upper() for m in ID_RE.finditer(body)}
found.discard(own_id)
return sorted(found)
REF_FRAMEWORKS = [
("AI Act", ["AI-Act", "AI Act", "Verordnung (EU) 2024/1689", "KI-VO"]),
("EU GDPR", ["DSGVO", "Verordnung (EU) 2016/679", "GDPR"]),
("ISO/IEC 25012", ["ISO/IEC 25012", "ISO 25012"]),
("ISO/IEC 25024", ["ISO/IEC 25024", "ISO 25024"]),
("ISO/IEC 23894", ["ISO/IEC 23894", "ISO 23894"]),
("ISO/IEC 42001", ["ISO/IEC 42001", "ISO 42001"]),
("NIST AI RMF", ["NIST AI RMF", "AI Risk Management Framework"]),
("BSI Grundschutz", ["IT-Grundschutz", "Grundschutz"]),
("BSI AIC4", ["AIC4", "AI Cloud Service Compliance Criteria"]),
]
def detect_external_refs(body: str) -> list[dict]:
refs: list[dict] = []
seen: set[tuple[str, str]] = set()
# Section "Referenzen" tables — pick up first column ref-id and first
# textual hit of the framework. We do NOT store the BSI "Kurzbeschr."
# column to avoid copying their prose.
for line in body.splitlines():
for framework, patterns in REF_FRAMEWORKS:
for pat in patterns:
if pat.lower() in line.lower():
# Try to grab an article/section nearby (e.g. "Artikel 10")
art = re.search(r"(Artikel|Art\.?|Section|§)\s*([0-9]+[a-z]?)", line, re.IGNORECASE)
citation = f"{art.group(1)} {art.group(2)}" if art else None
key = (framework, citation or "")
if key in seen:
continue
seen.add(key)
refs.append({"framework": framework, "citation": citation})
break
return refs
def parse_file(path: Path) -> IndexEntry | None:
text = path.read_text(encoding="utf-8")
fm = parse_frontmatter(text)
body = text[text.find("---", 3) + 3 :] if text.startswith("---") else text
own_id = canonical_id(fm.get("ID"), path.stem)
if not own_id:
return None
title_de = str(fm.get("TitleGer") or fm.get("Title") or path.stem).strip()
title_en = str(fm.get("Title") or "").strip()
tags_raw = fm.get("tags") or []
if isinstance(tags_raw, str):
tags_raw = [tags_raw]
tags = [str(t).strip() for t in tags_raw if t]
share_val = fm.get("share")
share = bool(share_val) if share_val is not None else None
return IndexEntry(
id=own_id,
kind=determine_kind(path),
title_de=title_de,
title_en=title_en,
source_path=str(path.relative_to(SOURCE_ROOT)),
referenced_ids=collect_referenced_ids(body, own_id),
external_refs=detect_external_refs(body),
tags=tags,
share=share,
)
def get_commit_sha() -> str | None:
try:
out = subprocess.run(
["git", "-C", str(SOURCE_ROOT), "rev-parse", "HEAD"],
capture_output=True,
text=True,
check=True,
)
return out.stdout.strip()
except (subprocess.CalledProcessError, FileNotFoundError):
return None
def main() -> int:
ap = argparse.ArgumentParser(description=__doc__)
ap.add_argument("--check", action="store_true", help="Parse + validate, do not write output")
args = ap.parse_args()
if not MARKDOWN_ROOT.exists():
print(f"ERROR: clone not found at {SOURCE_ROOT}", file=sys.stderr)
print("Run: git clone --depth=1 https://github.com/BSI-Bund/QUAIDAL.git legal-sources/bsi-quaidal", file=sys.stderr)
return 2
entries: list[IndexEntry] = []
skipped: list[Path] = []
for path in sorted(MARKDOWN_ROOT.rglob("*.md")):
entry = parse_file(path)
if entry is None:
skipped.append(path)
continue
entries.append(entry)
by_kind: dict[str, int] = {}
for e in entries:
by_kind[e.kind] = by_kind.get(e.kind, 0) + 1
print(f"Parsed {len(entries)} entries (skipped {len(skipped)} without ID):")
for kind, count in sorted(by_kind.items()):
print(f" {kind:18s} {count}")
if args.check:
return 0
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
payload = {
"source": "BSI QUAIDAL",
"source_url": "https://github.com/BSI-Bund/QUAIDAL",
"commit_sha": get_commit_sha(),
"license_note": (
"BSI-Veroeffentlichung. Repo enthaelt keine SPDX-Lizenzdatei. "
"Frontmatter share:true. Veroeffentlichung durch Bundesbehoerde, "
"§ 5 UrhG (amtliche Werke) anwendbar. BSI hat 05/2026 die Annahme "
"CC-BY-SA-4.0 in unserer Anfrage nicht widersprochen, aber auch "
"nicht aktiv bestaetigt. Wir derivieren Clean-Room (eigene "
"Formulierungen, nur Referenz auf BSI QUAIDAL Sektion)."
),
"entries": [asdict(e) for e in entries],
}
OUTPUT_FILE.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8")
print(f"\nWrote index: {OUTPUT_FILE.relative_to(REPO_ROOT)}")
print(f"Commit SHA: {payload['commit_sha']}")
return 0
if __name__ == "__main__":
sys.exit(main())