0631a98bdd
Trennt im Shadow drei Kategorien statt eines pauschalen FAILED: - echte Lücke (failed_by_current_checker) - redundanter Control-FP (kollabiert per OR zu MET) - Prüfer-Reichweitenproblem (recall_limited) obligation_taxonomy.py: decision_method_required=LLM für recipients_disclosed, third_country_transfer_disclosed, safeguards_disclosed, safeguards_accessible (versioniertes Registry-Artefakt bis DB-Tabelle, v1-Spec). Empirisch: TeamViewer 0/22 kw+emb trotz erfüllter Pflicht (cos 0.49-0.57) → CONTENT/LLM-Klasse, kein Schwellen-Fix. compute_obligation_shadow segregiert FAILED/PARTIAL über requires_llm(): teamviewer 5 Findings → 2 echte + 3 recall_limited. 9 neue Unit-Tests (41 gesamt grün). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
27 lines
1.4 KiB
Python
27 lines
1.4 KiB
Python
"""Obligation-Taxonomie-Registry — versioniertes Artefakt bis zur DB-Owner-Tabelle
|
||
(Legal Obligation Layer v1, docs-src/development/legal_obligation_layer_v1.md).
|
||
|
||
Hält Metadaten auf OBLIGATION-Ebene, die (noch) keine eigene DB-Tabelle haben.
|
||
|
||
`decision_method_required`: Obligations, deren Erkennung Keyword/Embedding
|
||
NACHWEISLICH nicht zuverlässig leistet (kompakte/synonymreiche Offenlegung) und
|
||
die CONTENT/LLM brauchen. Empirisch belegt am TeamViewer-Recall-Defekt: 0/22
|
||
recipients+international_transfer Controls trafen, obwohl die Pflicht erfüllt war
|
||
(„…außerhalb EU/EWR … Standardvertragsklauseln/Schutzmaßnahmen"); Embedding cos
|
||
0.49–0.57 < 0.62, teils falscher Chunk → kein Schwellen-Fix, sondern LLM-Klasse.
|
||
|
||
Wirkung: der Shadow zählt ein FAILED solcher Obligations NICHT als „echte Lücke",
|
||
sondern als RECALL_LIMITED (Prüfer kann sie mit aktueller Methode nicht verifizieren).
|
||
"""
|
||
OBLIGATION_META: dict[str, dict] = {
|
||
"recipients_disclosed": {"decision_method_required": "LLM"},
|
||
"third_country_transfer_disclosed": {"decision_method_required": "LLM"},
|
||
"safeguards_disclosed": {"decision_method_required": "LLM"},
|
||
"safeguards_accessible": {"decision_method_required": "LLM"},
|
||
}
|
||
|
||
|
||
def requires_llm(obligation_id: str) -> bool:
|
||
"""True, wenn diese Obligation CONTENT/LLM braucht (Keyword/Embedding-Recall belegt unzureichend)."""
|
||
return OBLIGATION_META.get(obligation_id, {}).get("decision_method_required") == "LLM"
|