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:
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,
Screenshot, Export = Evidence-Feld. KEIN eigenes Control daraus machen.
FALSCH: "SBOM fuehren" + "SBOM dokumentieren" = 2 Controls
RICHTIG: "SBOM fuehren" = 1 Control, Dokumentation im Evidence-Feld.
2. EVIDENCE ≠ CONTROL: Dokumentation, Nachweis, Protokollierung = Evidence-Feld.
KEIN eigenes Control wenn die Haupthandlung "dokumentieren" oder "nachweisen" ist
und sich auf eine andere Handlung bezieht.
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.
FALSCH als atomares Control: "Sichere Sitzungsverwaltung", "Token-Schutz",
"Sorgfaltspflicht Drittkomponenten", "Umfassendes Risikomanagement".
Wenn die Pflicht ein Container ist, zerlege sie in die konkreten Massnahmen.
FALSCH: "Sichere Sitzungsverwaltung", "Token-Schutz", "Sorgfaltspflicht".
Wenn die Pflicht ein Container ist, zerlege sie in konkrete Massnahmen.
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
Gegenstand = 1 Control mit mehreren Requirements/Evidence.
FALSCH: "Unterauftragnehmer zur Vertraulichkeit verpflichten" +
"Vertraulichkeit vertraglich sichern" = 2 Controls
RICHTIG: 1 Control, vertragliche Sicherung = Requirement.
5. PFLICHT VS. PROZESS NICHT TRENNEN: Wenn eine Pflicht ("Behoerden informieren")
und der Prozess dafuer ("Benachrichtigungsverfahren etablieren") inhaltlich
identisch sind, erzeuge NUR EIN Control. Der Prozess ist die Umsetzung
der Pflicht, nicht ein separates Control.
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
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
dem Format: "action_type:normalized_object:control_phase"
Beispiele:
- "implement:api_rate_limiting:technical"
- "define:access_control_policy:governance"
- "monitor:third_party_vulnerabilities:operations"
- "test:authentication_mechanism:verification"
- "implement:api_rate_limiting:implementation"
- "define:access_control_policy:definition"
- "monitor:third_party_vulnerabilities:monitoring"
- "test:authentication_mechanism:testing"
- "report:supervisory_authority:reporting"
Das Control muss UMSETZBAR sein — keine Gesetzesparaphrase.
Antworte NUR als JSON. Keine Erklaerungen."""
@@ -2937,6 +2951,10 @@ class DecompositionPass:
),
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.obligation_candidate_id = obl["candidate_id"]