ba6f1bd1f6
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 <noreply@anthropic.com>
90 lines
4.2 KiB
Markdown
90 lines
4.2 KiB
Markdown
# 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).
|