feat: Pass 0b prompt v3 — compound action ban, evidence-of-action rule, pflicht-vs-prozess merge

Fixes from v2 evaluation (7.9/10 avg, 28 controls):
1. COMPOUND BAN: "durchführen UND Maßnahmen ergreifen" → pick primary action only
2. EVIDENCE-OF-ACTION: "Tests dokumentieren" → evidence field, not own control
3. PFLICHT=PROZESS: "Behörden informieren" + "Verfahren etablieren" = 1 control
4. MERGE-KEY BUG: merge_key from LLM output now stored in generation_metadata

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-04-26 00:25:38 +02:00
parent fbeb93046d
commit 3a100fa1f1

View File

@@ -396,25 +396,38 @@ ANALYSE-SCHRITTE (intern durchfuehren, NICHT im Output!):
WICHTIGE REGELN: WICHTIGE REGELN:
1. ATOMARITAET: Ein Control = EINE pruefbare Handlung. Nicht mehrere mischen. 1. ATOMARITAET: Ein Control = EINE pruefbare Handlung. Nicht mehrere mischen.
COMPOUND-VERBOT: Wenn die Pflicht zwei verschiedene Handlungen enthaelt
(z.B. "durchfuehren UND Massnahmen ergreifen", "unterbinden UND dokumentieren",
"pruefen UND anpassen"), waehle NUR die primaere Handlung.
Die sekundaere Handlung gehoert in Requirements oder Evidence.
FALSCH: "Risikobewertung durchfuehren und Massnahmen ergreifen" = 1 Control
RICHTIG: "Risikobewertung durchfuehren" = Control, "Massnahmen ergreifen" = separates Control
2. EVIDENCE ≠ CONTROL: Dokumentation, Nachweis, Auditbericht, Zertifizierung, 2. EVIDENCE ≠ CONTROL: Dokumentation, Nachweis, Protokollierung = Evidence-Feld.
Screenshot, Export = Evidence-Feld. KEIN eigenes Control daraus machen. KEIN eigenes Control wenn die Haupthandlung "dokumentieren" oder "nachweisen" ist
FALSCH: "SBOM fuehren" + "SBOM dokumentieren" = 2 Controls und sich auf eine andere Handlung bezieht.
RICHTIG: "SBOM fuehren" = 1 Control, Dokumentation im Evidence-Feld. FALSCH: "Tests dokumentieren" als eigenes Control
RICHTIG: Die Dokumentation gehoert ins Evidence-Feld des Test-Controls.
FALSCH: "Massnahmen dokumentieren und Verhaeltnismaessigkeit pruefen" = 1 Control
RICHTIG: "Verhaeltnismaessigkeit der Massnahmen pruefen" = Control,
Dokumentation = Evidence.
AUSNAHME: Wenn die Pflicht selbst eine Dokumentationspflicht IST
(z.B. "Verarbeitungsverzeichnis fuehren"), dann ist es ein eigenstaendiges Control.
3. CONTAINER ≠ ATOMAR: Abstrakte Oberbegriffe sind KEINE atomaren Controls. 3. CONTAINER ≠ ATOMAR: Abstrakte Oberbegriffe sind KEINE atomaren Controls.
FALSCH als atomares Control: "Sichere Sitzungsverwaltung", "Token-Schutz", FALSCH: "Sichere Sitzungsverwaltung", "Token-Schutz", "Sorgfaltspflicht".
"Sorgfaltspflicht Drittkomponenten", "Umfassendes Risikomanagement". Wenn die Pflicht ein Container ist, zerlege sie in konkrete Massnahmen.
Wenn die Pflicht ein Container ist, zerlege sie in die konkreten Massnahmen.
4. LIFECYCLE TRENNEN: identifizieren, bewerten, beheben, ueberwachen 4. LIFECYCLE TRENNEN: identifizieren, bewerten, beheben, ueberwachen
sind je EIGENE Controls (verschiedene Handlungen, verschiedene Verantwortliche). sind je EIGENE Controls (verschiedene Verantwortliche).
5. GLEICHER GEGENSTAND MERGEN: Gleicher Akteur + gleiche Handlung + gleicher 5. PFLICHT VS. PROZESS NICHT TRENNEN: Wenn eine Pflicht ("Behoerden informieren")
Gegenstand = 1 Control mit mehreren Requirements/Evidence. und der Prozess dafuer ("Benachrichtigungsverfahren etablieren") inhaltlich
FALSCH: "Unterauftragnehmer zur Vertraulichkeit verpflichten" + identisch sind, erzeuge NUR EIN Control. Der Prozess ist die Umsetzung
"Vertraulichkeit vertraglich sichern" = 2 Controls der Pflicht, nicht ein separates Control.
RICHTIG: 1 Control, vertragliche Sicherung = Requirement. FALSCH: "EBA informieren" + "Verfahren zur EBA-Information etablieren" = 2 Controls
RICHTIG: "EBA vor Kooperationsvereinbarungen informieren" = 1 Control,
Verfahren = Requirement.
6. TITEL = SUCHANFRAGE: Der Titel wird als Suchanfrage gegen Kundendokumente 6. TITEL = SUCHANFRAGE: Der Titel wird als Suchanfrage gegen Kundendokumente
und Quellcode verwendet. Er muss die HANDLUNG enthalten. und Quellcode verwendet. Er muss die HANDLUNG enthalten.
@@ -424,10 +437,11 @@ WICHTIGE REGELN:
7. MERGE-KEY: Erzeuge im JSON-Output ein zusaetzliches Feld "merge_key" mit 7. MERGE-KEY: Erzeuge im JSON-Output ein zusaetzliches Feld "merge_key" mit
dem Format: "action_type:normalized_object:control_phase" dem Format: "action_type:normalized_object:control_phase"
Beispiele: Beispiele:
- "implement:api_rate_limiting:technical" - "implement:api_rate_limiting:implementation"
- "define:access_control_policy:governance" - "define:access_control_policy:definition"
- "monitor:third_party_vulnerabilities:operations" - "monitor:third_party_vulnerabilities:monitoring"
- "test:authentication_mechanism:verification" - "test:authentication_mechanism:testing"
- "report:supervisory_authority:reporting"
Das Control muss UMSETZBAR sein — keine Gesetzesparaphrase. Das Control muss UMSETZBAR sein — keine Gesetzesparaphrase.
Antworte NUR als JSON. Keine Erklaerungen.""" Antworte NUR als JSON. Keine Erklaerungen."""
@@ -2937,6 +2951,10 @@ class DecompositionPass:
), ),
category=parsed.get("category", obl["parent_category"]), category=parsed.get("category", obl["parent_category"]),
) )
# Store merge_key from LLM output in metadata
llm_merge_key = parsed.get("merge_key", "")
if llm_merge_key:
atomic.merge_group_hint = llm_merge_key
atomic.parent_control_uuid = obl["parent_uuid"] atomic.parent_control_uuid = obl["parent_uuid"]
atomic.obligation_candidate_id = obl["candidate_id"] atomic.obligation_candidate_id = obl["candidate_id"]