From 3a100fa1f1e0981a7af3686bd45fda924d25bb0a Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Sun, 26 Apr 2026 00:25:38 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20Pass=200b=20prompt=20v3=20=E2=80=94=20c?= =?UTF-8?q?ompound=20action=20ban,=20evidence-of-action=20rule,=20pflicht-?= =?UTF-8?q?vs-prozess=20merge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- .../services/decomposition_pass.py | 52 +++++++++++++------ 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/control-pipeline/services/decomposition_pass.py b/control-pipeline/services/decomposition_pass.py index e47cee7..f765ed9 100644 --- a/control-pipeline/services/decomposition_pass.py +++ b/control-pipeline/services/decomposition_pass.py @@ -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"]