# Sprint-Zusammenfassung: Elli-GT-Coverage (Stand 2026-06-06) ## TL;DR Engine erkennt jetzt **5 GT-Lücken zusätzlich**, die im Elli-Audit (`zeroclaw/docs/ground-truth/elli_eco_2026-06-06.json`) als "muss-detect" markiert waren. Plus ein P0-Bug-Fix, der jeden Compliance-Check still auf "failed" umschlagen ließ. **Test-Status:** 72/72 grün (5 neue Unit-Test-Suites + 1 GT-Coverage- Integration-Suite). **Deploy:** alle 6 Commits auf `main`, Production-Container healthy (`https://api-dev.breakpilot.ai/health` + `https://sdk-dev.breakpilot.ai/health`). ## Was wurde gebaut ### 0. Bug-Fix Orchestrator (P0, blocking) | Commit | Inhalt | |--------|--------| | `11c7e14` | `_orchestrator.py`: fehlende Imports `run_b12` + `run_phase_c2` ergänzt. Ohne Fix: NameError → try/except → jeder Check auf "failed". | ### 1. B13 — Widerrufsbelehrung-Reachability (GT WIDERRUFSBELEHRUNG-001) | Datei | Zweck | |-------|-------| | `services/widerrufsbelehrung_reachability_check.py` | Check + B2C-Scope-Detection | | `api/agent_check/_b13_wiring.py` | Orchestrator-Anschluss + HTML-Block | | `services/mail_render_v2/_compose.py` | `widerruf_reach_html` in V2-Layout | | `tests/test_widerrufsbelehrung_reachability_check.py` | 13 Tests | **Logik:** Wenn doc_type `widerruf` discovery_attempted=True, kein ausreichend langer Text, kein Footer-Link **und** B2C-Scope erkannt (Warenkorb / Wallbox / MwSt) → HIGH Finding. B2B-only-Override schützt vor False-Positives. **Norm:** Art. 246a § 1 Abs. 2 Nr. 1 EGBGB i.V.m. § 312d BGB. ### 2. B9 Cleanup — Per-Entity USt-IdNr (GT IMPRESSUM-001) | Datei | Zweck | |-------|-------| | `services/impressum_multi_entity_check.py` | Entity-Namen-Cleanup | | `tests/test_impressum_multi_entity_check.py` | 11 neue Tests | **Problem:** Multi-Entity-Check fand die fehlende USt-IdNr bei VW Group Charging GmbH bereits, aber Entity-Namen waren mit Header-Müll verunreinigt (`'Impressum\n\nVolkswagen ...'`). **Fix:** `_ENTITY_PAT` lässt nur Space im Namen zu (kein `\s`); `_clean_entity_name()` strippt Header-Worte und nimmt nur die letzte Zeile vor Legal-Form-Suffix. ### 3. B14 — Widersprüchliche Speicherdauer (GT TH-RETENTION-001) | Datei | Zweck | |-------|-------| | `services/retention_conflict_check.py` | Satz-Boundary-Scan + Cluster-Logik | | `api/agent_check/_b14_wiring.py` | Wiring + HTML-Block | | `tests/test_retention_conflict_check.py` | 11 Tests | **Logik:** Sätze splitten, pro Satz: Kategorie-Anker (logfile, contact_form, application, newsletter, invoice, session_cookie) + Retention-Werte beide drin? Tage-Cluster mit ±20% Toleranz: `30 Tage` und `1 Monat` = 1 Cluster, `7 Tage` und `30 Tage` = 2 Cluster → MEDIUM Finding. **Anti-Pattern vermieden:** Frühe Version nutzte ±300-Zeichen-Fenster und produzierte Cross-Category-Leakage — Satz-Boundary fixt das. **Norm:** DSGVO Art. 5 Abs. 1 lit. a + Art. 13 Abs. 2 lit. a. ### 4. B15 — AI-Act Rechtsgrundlage (GT AI-ACT-RISK-001) | Datei | Zweck | |-------|-------| | `services/ai_legal_basis_check.py` | LLM-Vendor-Erkennung + lit.f-Pattern | | `api/agent_check/_b15_wiring.py` | Wiring + HTML-Block | | `tests/test_ai_legal_basis_check.py` | 17 Tests | **Logik:** Aus KB (`chat_providers.json`) nur Echte-LLM-Vendors filtern (Vertex AI, OpenAI/GPT, Anthropic/Claude). Absatz-Split, pro Absatz: LLM-Mention **und** lit. f / berechtigtes Interesse → MEDIUM Finding. Negativ-Filter: wenn auch lit. a / Einwilligung im Absatz, skip (Side-Purpose). **Norm:** DSGVO Art. 6 Abs. 1 lit. a vs lit. f + AI Act Art. 50 + 51. ### 5. B16 — Footer-Label-vs-URL-Slug-Drift (GT URL-STRUCTURE-001) | Datei | Zweck | |-------|-------| | `services/url_slug_drift_check.py` | Aktive HEAD-Probes | | `api/agent_check/_b16_wiring.py` | Wiring + HTML-Block | | `tests/test_url_slug_drift_check.py` | 13 Tests | **Logik:** Aus auto-discovered URLs Origin + Sprach-Prefix extrahieren, pro doc_type 2-4 kanonische Standard-Slugs probieren (ThreadPoolExecutor, 2s Timeout, HEAD → GET-Fallback bei 405). Wenn alternativer Slug 404/410 → LOW Finding. Cap 18 Probes total, abschaltbar via `URL_SLUG_PROBE_DISABLED=1`. **Severity:** LOW — kein juristisches Hardfail, aber SEO/Bookmark- Bruch. ### 6. GT-Coverage-Integration-Test `tests/test_elli_gt_coverage.py` — 7 Tests, die einen synthetischen Elli-State konstruieren und sicherstellen, dass jeder der 5 neuen Detektoren genau die erwartete GT-ID fängt. Charakterisierungstest gegen Regressions. ## GT-Coverage-Bilanz Vor dem Sprint (12/13): | GT-ID | Status | |-------|--------| | COOKIE-CONSENT-UX-001 | ❌ blockiert auf #7 Mobile Playwright | | TH-RETENTION-001 | ❌ Engine sah nur Single-Value | | AI-ACT-RISK-001 | ❌ Lit. f vs LLM-Vendor nicht korreliert | | IMPRESSUM-001 | ⚠️ erkannt, aber Entity-Namen verunreinigt | | WIDERRUFSBELEHRUNG-001 | ❌ kein B2C-Reachability-Check | | URL-STRUCTURE-001 | ❌ keine aktiven Slug-Probes | | Rest (7 IDs) | ✅ | Nach dem Sprint (12/13 voll + 1 partial): | GT-ID | Status | Check | |-------|--------|-------| | COOKIE-CONSENT-UX-001 | ⏳ wartet auf #7 | (Mobile Playwright) | | COOKIE-CONSENT-UX-002 | ✅ | B9 CMP-Provider | | TH-RETENTION-001 | ✅ NEU | B14 | | TH-RETENTION-002 | ✅ | B12 | | VENDOR-CONSISTENCY-001 | ✅ | B4 | | AI-ACT-TRANSPARENCY-001 | ✅ | B5 | | AI-ACT-RISK-001 | ✅ NEU | B15 | | IMPRESSUM-001 | ✅ NEU (clean) | B9 | | IMPRESSUM-002 | ✅ | B6 DPO-Cross-Doc | | WIDERRUFSBELEHRUNG-001 | ✅ NEU | B13 | | TERMS-STALENESS-001 | ✅ | B7 | | TRANSFER-001 | ✅ | B10 | | URL-STRUCTURE-001 | ✅ NEU | B16 | **Endstand: 12/13 vollständig erkannt, 1/13 blockiert auf #7 Mobile-Playwright-Sprint.** ## Commit-Liste ``` 65e8bb9 feat(b16): Footer-Label-vs-URL-Slug-Drift-Check b0b7f80 feat(b15): AI-Act Rechtsgrundlage-Check 6aad774 feat(b14): widersprüchliche Speicherdauer im selben Doc 8b9cad8 fix(b9): clean entity names in multi-entity-impressum b9baa8c feat(b13): Widerrufsbelehrung-Reachability-Check 11c7e14 fix(orchestrator): add missing run_b12 + run_phase_c2 imports ``` ## Was offen ist (Morgen-Agenda-Kandidaten) 1. **#7 — B1 Mobile-Playwright-Sprint.** Letzte offene GT-Lücke (COOKIE-CONSENT-UX-001 — Mobile-Reachability für Consent-Reopen). Pflicht-Trigger für 13/13. 2. **#18 — Specialist-Agents Phase 2 (LLM-gestützt).** Bisher nur Pattern-Match-Impressum-Agent (`specialist_agents/impressum_agent.py`), nicht im Orchestrator integriert. Phase 2 sollte denselben Output produzieren, aber LLM-basiert + Cross-Customer-KB. 3. **Plausibility-LLM-Empty-Response.** Bekannter Bug, non-blocking, aber Quality-Improvement-Ziel — `_phase_d2b_plausibility.py` liefert gelegentlich leere LLM-Antworten. 4. **Browser-Matrix Stage 1.b (consent_scanner-Refactor proper).** Aktuell via Workaround `cookie_behavior_per_browser.py` umgangen; `consent_scanner.py` 567 LOC ist in `loc-exceptions.txt` getragen. 5. **Real-World-Smoke gegen Elli.** Den vollen Compliance-Check gegen `www.elli.eco` triggern und prüfen, wieviele der 5 neuen Findings tatsächlich emittiert werden (Test war synthetisch). ## Test-Bilanz ``` test_widerrufsbelehrung_reachability_check.py 13/13 test_impressum_multi_entity_check.py 11/11 test_retention_conflict_check.py 11/11 test_ai_legal_basis_check.py 17/17 test_url_slug_drift_check.py 13/13 test_elli_gt_coverage.py 7/7 ──── Sprint-Tests gesamt 72/72 ``` ## URLs - Admin: https://admin-dev.breakpilot.ai - Backend Health: https://api-dev.breakpilot.ai/health - SDK Health: https://sdk-dev.breakpilot.ai/health - GT-Quelle: `zeroclaw/docs/ground-truth/elli_eco_2026-06-06.json`