From ba6f1bd1f63f9b00af2e0472b839dd6bc3d46be9 Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Wed, 24 Jun 2026 21:39:28 +0200 Subject: [PATCH] Document obligation aggregation validation results MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hält den bewiesenen Shadow-Stand fest: vier Schichten (Obligation Aggregation, Applicability, Recall-limited Segregation, Targeted LLM Fix) + Zahlen. - 7-Firmen-Shadow: 136 legacy control-findings → 29 obligation findings = 4,7× (23 echte Lücken, 6 recall_limited in nur 2/7 Firmen, 46 MET, 2 N/A) - LLM-Fix validiert: teamviewer 5→0, safetykon 7→4 (echte Portability-Lücke bleibt, legitimate_interest→NA); recall_limited 3→0 bei beiden - Modell: Haiku 4.5 (fest verdrahteter Sufficiency-Judge), NICHT OVH-Kaskade/Opus → Deploy-Gate ist ein gültiger Anthropic-Key auf dev, nicht der OVH-Pfad Kein Deploy, kein Live-Schalten. Co-Authored-By: Claude Opus 4.7 --- .../obligation_aggregation_validation.md | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 docs-src/development/obligation_aggregation_validation.md diff --git a/docs-src/development/obligation_aggregation_validation.md b/docs-src/development/obligation_aggregation_validation.md new file mode 100644 index 00000000..d6c9ad74 --- /dev/null +++ b/docs-src/development/obligation_aggregation_validation.md @@ -0,0 +1,89 @@ +# Obligation Aggregation — Validated Shadow Results (2026-06-24) + +Status: **bewiesen im Shadow auf macmini**, NICHT deployt, NICHT live geschaltet. +Code auf Branch `feat/obligation-aggregation`; das LLM-Tiering der recipients/transfer- +Controls liegt als DB-Marker nur auf macmini. + +Dieser Stand validiert die Ausführung des [Legal Obligation Layer v1](legal_obligation_layer_v1.md) +über vier ineinandergreifende Schichten. + +## Die vier Schichten + +1. **Obligation Aggregation** — `compliance/services/obligation_aggregation.py`. + Aggregiert Kriterium-/Control-Bewertungen zu Findings auf OBLIGATION-Ebene + (Regulation → Obligation → Control → Criterion). Redundanz kollabiert per OR pro + `legal_basis`-Anforderung; fail-safe Status (MET/PARTIAL/FAILED/NA/UNDETERMINED/OPEN). +2. **Applicability** — `compliance/services/obligation_applicability.py`. + Prädikate (`has_third_country_transfer`, `uses_legitimate_interest`, `direct_marketing`, + `legitimate_interest_or_public_task`) entscheiden bedingte Obligations → True/False/None + (unbekannt → anwendbar, nie stille NA). +3. **Recall-limited Segregation** — `compliance/services/obligation_taxonomy.py` + + `specialist_agents/dse/_obligation_shadow.py`. + `decision_method_required=LLM` trennt FAILED ehrlich in `failed_by_current_checker` + (echte Lücke) vs `recall_limited` (Prüfer kann mit aktueller Methode nicht verifizieren). +4. **Targeted LLM Fix** — recipients/transfer-Controls mit `tiered_criteria` + (decision_method=LLM) → Layer 3 nutzt den **Haiku-Sufficiency-Judge** statt Keyword/Embedding. + +## Shadow-Zahlen (7 Firmen, Live-Engine, Keyword/Embedding) + +| | Wert | +|---|---| +| legacy control-findings | 136 | +| obligation findings | 29 | +| **Kollaps** | **4,7×** | +| davon echte Lücken | 23 | +| davon recall_limited | 6 (nur 2/7 Firmen, nur Drittland/Garantien) | +| MET (FP-Korrektur) | 46 | +| N/A (Applicability) | 2 | + +`recall_limited` ist klein + konzentriert: ausschließlich `third_country_transfer_disclosed` / +`safeguards_disclosed` / `safeguards_accessible`, je 2/7 Firmen. `recipients_disclosed` +manifestierte nie als recall_limited (Keyword/Embedding trägt dort). + +## Targeted LLM Fix — Validierung (teamviewer + safetykon) + +Recall-Defekt-Diagnose (teamviewer): die Drittland-/Garantien-Offenlegung steht dicht in +einem Absatz („…außerhalb EU/EWR … Standardvertragsklauseln/Schutzmaßnahmen"), aber +**0/22 Controls** trafen — Keyword (Vokabular-Mismatch) und Embedding (cos 0.49–0.57, teils +falscher Chunk) versagen. Kein Schwellen-Fix → CONTENT/LLM-Klasse. + +Nach LLM-Tiering (Haiku-Judge): + +| | vorher (kw+emb) | nachher (LLM) | +|---|---|---| +| teamviewer findings | 5 | **0** | +| teamviewer recall_limited | 3 | **0** | +| safetykon findings | 7 | **4** | +| safetykon recall_limited | 3 | **0** | + +- **teamviewer → 0 Findings:** DSE auf diesen Pflichten real konform; die 5 alten Findings + waren Falsch-Positive des Keyword/Embedding-Prüfers. +- **safetykon → 4 (keine Über-Korrektur):** Drittland/Garantien → MET, aber + `art20_right_exists_core` + `art20_machine_readable_format` bleiben **FAILED** (echte + Portability-Lücke), `legitimate_interest_disclosed` → **NA** (Applicability). + +## Eingesetztes Modell + +Der Tiered-/Sufficiency-Pfad ist **fest auf Claude Haiku 4.5 verdrahtet** +(`checkers/router.py:build_spec` setzt für CONTENT/LLM `extra.judge="haiku"` → +`llm_checker._haiku` → `_call_anthropic`; validierter Judge P0.89/R0.91, Entscheidung +2026-06-22). **Nicht** die OVH-Kaskade (35b/120b), **nicht** Opus. Konsequenz: der Fix +reproduziert sich überall identisch, braucht aber einen gültigen Anthropic-Key für den +Haiku-Judge — auch auf dev. + +## Nächster operativer Block (gegated, NICHT ausgeführt) + +``` +Deploy-Fenster frei (andere Session fertig) + ↓ +dev-DB-Tiering replizieren (die 22 recipients/transfer-Controls) + ↓ +Haiku-Judge auf dev bestätigen (gültiger Anthropic-Key — NICHT der OVH-Pfad) + ↓ +Shadow aktiv lassen (Telemetrie), Produktverhalten unverändert + ↓ +erst dann Umschalten planen +``` + +Folge-Cleanup: sobald LLM-Tiering Standard ist, wird die `recall_limited`-Segregation für +diese 4 Obligations obsolet (dann ist FAILED = echte Lücke, nicht Reichweitenproblem).