- d6_citation_backfill.py: 3-tier matching (hash/prefix/overlap), archives old citations, updated 3.651 controls (93.6% coverage) - ingest_de_laws.py: 8 German laws ingested (ArbZG, MuSchG, NachwG, MiLoG, GmbHG, AktG, InsO, BUrlG — 1.629 chunks) - ingest_eu_regulations.py: EUR-Lex ingestion (needs manual HTML due to AWS WAF). CSRD, CSDDD, EU Taxonomy, eIDAS 2.0, Pay Transparency manually ingested (1.057 chunks) - Updated session handover with current state Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
11 KiB
Session-Instruktionen: Pipeline-Qualitaet + Gesetze
Datum: 2026-05-03 Fuer: Naechste Claude-Session Repo: breakpilot-core (~/Projekte/breakpilot-core)
ZUSAMMENFASSUNG: WO STEHEN WIR
Was fertig ist (Bloecke A-D5+)
| Block | Was | Status |
|---|---|---|
| Pass 0b | 151.675 atomare Controls, dedupliziert, mit Dependencies | ✅ |
| Block A | v1 Tag, Healthcheck, Textkorrektur, Dependencies (15.291) | ✅ |
| Block B | Review-Verify (67k Paare, 43.527 DUPLIKAT via Haiku) | ✅ |
| Block C | Adversarial Tests (30), Regression Harness (387 Tests) | ✅ |
| Block D | Strukturelles Chunking End-to-End (D1-D5) | ✅ |
| D5+ | NIST/BSI/ENISA PDF-Qualitaet gefixt | ✅ |
D5+ Details (Session 02-03.05.2026)
Problem geloest: 4 NIST-PDFs hatten 0 Chunks (D5-Script hatte delete-before-upload, Upload scheiterte).
Was gemacht wurde:
_normalize_pdf_text()in embedding-service: Repariert gebrochene Sektionsnummern ("1 . 1"→"1.1", "AC - 1"→"AC-1"), Ligaturen, Soft Hyphens_LEGAL_SECTION_REerweitert: NIST CSF 2.0, NIST Enhancements, OWASP Top 10_SECTION_NUMBER_REerweitert: NIST Control-IDs (AC-1), numbered sections (3.1), OWASP (A01:2021)_SINGLE_NUM_ALLCAPS_RE(case-sensitive): "1. INTRODUCTION" fuer ENISA/BSI-Docs- pdfplumber Toleranzen: x_tolerance=3, y_tolerance=4 (war 2/3)
- Lokale PDF-Extraktion Workaround: Embedding-Service-Container crasht bei PDFs >5 MB (OOM). Fix: pdfplumber lokal auf Mac Mini, dann .txt hochladen.
reingest_d5.pySafety Fix: Upload → Verify → Delete old (mitmust_notFilter)reingest_nist.py(NEU): Sicheres Re-Ingest-Scriptreupload_legal_strategy.py(NEU): Re-Upload mit chunk_strategy="legal"extract_and_upload_nist.py(NEU): Lokale PDF-Extraktion fuer grosse Dateienscripts/qdrant-snapshot.sh(NEU): Backup aller Qdrant-Collections- 2 korrupte PDFs (nistir_8259a, nist_ai_rmf) waren 263-Byte XML-Fehler in MinIO → Neu von nist.gov heruntergeladen und ingestiert
- 99 Embedding-Service-Tests gruen (28 neue NIST-Tests)
- Qdrant-Snapshot erstellt: 14 Collections, ~1 GB unter
backups/qdrant/
Aktuelle Qualitaet (Stand 03.05.2026)
| Dokumenttyp | Section-Rate | Status |
|---|---|---|
| DE Gesetze (TXT) | 79-100% | ✅ Exzellent |
| HTML (EUR-Lex + gesetze-im-internet) | 40-99% | ✅ Gut |
| PDF (EDPB/DSK Leitlinien) | 60-98% | ✅ Gut |
| PDF (NIST SP 800-53/82/160/207) | 27-45% | ✅ Gut (war 0%) |
| PDF (NIST CSF, 800-30, ENISA) | 5-13% | 🟡 Akzeptabel |
| PDF (CISA Secure by Design) | 0% | ⚪ Prose-Dokument, erwartet |
| TXT (OWASP) | 0% | ❌ OFFEN |
| Legal Templates (JSON/MD) | 0% | ⚪ Erwartet |
NIST Section-Rate-Verbesserungen (diese Session):
- NIST SP 800-53: 0% → 45% (2.847 Chunks)
- NIST SP 800-207: 0% → 43% (207 Chunks)
- NIST SP 800-160: 0% → 36% (977 Chunks)
- NIST SP 800-82: 0% → 27% (2.301 Chunks)
- ENISA ICS/SCADA: 0% → 22% (235 Chunks)
- ENISA Supply Chain Good Practices: 2% → 12% (159 Chunks)
- ENISA Supply Chain Security: 0% → 5% (184 Chunks)
Qualitaetsreport (500 Controls Stichprobe, Stand 02.05.):
- 13% vollstaendig korrekt
- 41% Article-nicht-im-Source-Text (Controls aus alten kaputten Chunks)
- 7% kein Article in Citation
- 39% sonstige Matching-Issues
WAS ALS NAECHSTES ZU TUN IST (PRIORISIERT)
PRIO 1: Citation-Backfill (D6 — Block D Abschluss)
Problem: 41% der Controls haben falsche source_citation.article weil sie aus alten (kaputten) Chunks generiert wurden. Die Chunks sind jetzt sauber (mit Section-Metadaten), aber die Controls tragen noch die alten Citations.
Loesung:
- Fuer jeden Control:
source_citation.source→ regulation_code ermitteln - In Qdrant nach Chunks mit diesem regulation_code + passender section suchen
- Wenn Match:
source_citation.articleundsource_citation.paragraphaktualisieren - Wenn kein Match: als "needs_regeneration" markieren
Basis-Script existiert: control-pipeline/scripts/quality_report.py
Muss erweitert werden um UPDATE statt nur Report.
Bestehender Backfill-Service: control-pipeline/services/citation_backfill.py
Hat 3-Tier-Matching: Hash → Regex → LLM. Muss fuer neues Chunk-Format angepasst werden.
Aufwand: ~0.5 Tag
PRIO 2: Fehlende Gesetze ingestieren (Block E)
Neue Gesetze (noch nicht im RAG):
- BEG IV (Viertes Buerokratieentlastungsgesetz, BGBl. 2024 I Nr. 323)
- ArbZG, MuSchG, NachwG, MiLoG, GmbHG, AktG, InsO
- Gesetz fuer faire Verbrauchervertraege
- CSRD, EU Taxonomy, CSDDD, eIDAS 2.0
- CH: OR, DSV, ISG, ArG
- AT: ArbVG, AngG, AZG, GmbHG-AT, NISG
Veraltete Gesetze (aktualisieren):
- TMG → ersetzen durch TDDDG (TMG aufgehoben seit 2024)
- GwG aktualisieren (Aenderungen 2024)
- HGB aktualisieren (MoPeG 2024)
Quellen:
- gesetze-im-internet.de (DE-Gesetze, HTML, charset beachten!)
- eur-lex.europa.eu (EU-Recht, HTML via CELEX-Nummer)
- fedlex.admin.ch (CH-Recht)
- ris.bka.gv.at (AT-Recht)
Lizenzregeln (KRITISCH — immer pruefen!):
- Rule 1 (Gesetze, Urteile): Volltext erlaubt
- Rule 2 (CC-BY): Mit Zitation erlaubt
- Rule 3 (Behoerden-Presse, proprietaer): NUR eigene Formulierungen
- VERBOTEN: ISO, beck-online, juris, DIN
PRIO 3: Frontend 500-Fehler untersuchen
macmini:3007/sdk/control-library zeigt noch 500-Fehler bei API-Aufrufen.
Der requirements.map TypeError ist gefixt (commit fe6764d im compliance-repo).
Die 500er koennten vom Compliance-Backend (Port 8002) kommen — separat pruefen.
GESAMTPLAN (Bloecke A-G)
✅ ERLEDIGT
- Block A: v1 Abschluss (Healthcheck, Dependencies, v1 Tag)
- Block B: Review-Verify (67k Paare)
- Block C: Tests (Adversarial + Regression)
- Block D1-D5: Strukturelles Chunking End-to-End
- Block D5+: NIST/ENISA/BSI PDF-Qualitaet (Text-Normalisierung, Section-Detection, Re-Ingestion)
🔥 NAECHSTER SCHRITT
- Block D6: Citation-Backfill — Controls auf neue Chunks umhaengen (Prio 1)
📋 AUSSTEHEND
Block E: Gesetze aktualisieren + neue ingestieren
- E1: Veraltete Quellen aktualisieren (TMG→TDDDG, GwG, HGB)
- E2: Fehlende DE-Gesetze (ArbZG, MuSchG, NachwG, MiLoG, etc.)
- E3: Fehlende EU-Regulierung (CSRD, EU Taxonomy, CSDDD, eIDAS 2.0)
- E4: Fehlende Standards lizenzgerecht (GoBD, BAIT/VAIT, PCI DSS Rule 3)
- E5: Urteils-Control-Packs (Google Fonts, CNIL, Planet49, Schrems II — 12 Packs)
- E6: CH + AT Gesetze (OR, DSV, ISG, ArG, ArbVG, AngG, etc.)
- E7: Lizenzpruefung bei JEDER neuen Quelle
Block F: Hardcoded Knowledge Migration (bis Juli 2026)
- F1: legal_basis_validator.py → Control Library
- F2: 5 weitere Dateien migrieren (service_registry, mandatory_content_checker, etc.)
- F3: Keyword-Synonyme durch LLM ersetzen
Block G-pre: Master Control Konsolidierung
- G-pre1: Object-Normalisierung (128k → 15-25k Gruppen)
- G-pre2: Control-Ketten als Master Controls
- G-pre3: Master Control API
Block G: Compliance Execution Layer (langfristig)
- G1: Decision Trace
- G2: Compliance Git
- G3: Full Decision Memory
- G4: Pre-Deployment Enforcement
KRITISCHE DATEIEN
Aenderungen Session 03.05.2026 (breakpilot-core)
| Datei | Was |
|---|---|
embedding-service/main.py |
_normalize_pdf_text(), _SECTION_NUMBER_RE NIST-Patterns, _SINGLE_NUM_ALLCAPS_RE, pdfplumber Toleranzen |
embedding-service/test_nist_normalization.py |
41 neue Tests (Normalisierung, Section-Detection, Metadata) |
control-pipeline/scripts/reingest_nist.py |
Sicheres Re-Ingest (upload-before-delete) |
control-pipeline/scripts/reingest_d5.py |
Safety Fix: _delete_old_chunks_safe() mit must_not Filter |
control-pipeline/scripts/reupload_legal_strategy.py |
Re-Upload mit chunk_strategy="legal" |
control-pipeline/scripts/extract_and_upload_nist.py |
Lokale PDF-Extraktion Workaround (Container-OOM) |
scripts/qdrant-snapshot.sh |
Qdrant Backup aller Collections |
Wichtig: Embedding-Service Container-Limit
Der Embedding-Service-Container (8 GB RAM) crasht bei PDFs >5 MB. Workaround:
- PDF lokal auf Mac Mini extrahieren (
pdfplumberist dort installiert) _normalize_pdf_text()anwenden- Als .txt mit
chunk_strategy="legal"hochladen
Wenn das Container-Limit erhoehrt werden soll: docker-compose.yml Zeile ~445:
deploy:
resources:
limits:
memory: 12G # war 8G
DB-STAND
Qdrant (Mac Mini, Port 6333)
| Collection | Chunks | Section-Rate | Aenderung |
|---|---|---|---|
| bp_compliance_ce | ~23.600 | ~50% | NIST/ENISA re-ingestiert |
| bp_compliance_gesetze | ~32.000 | ~86% | Unveraendert |
| bp_compliance_datenschutz | ~13.000 | ~40% | NIST 800-53/207 re-ingestiert |
| bp_dsfa_corpus | ~8.200 | ~60% | Unveraendert |
| bp_legal_templates | ~1.460 | ~7% | Unveraendert |
| Gesamt | ~78.000 | ~65% | Verbessert (war 62%) |
Qdrant-Backup: backups/qdrant/ — 14 Collections, ~1 GB (Stand 03.05.2026 08:21)
PostgreSQL (Mac Mini, Port 5432)
| Tabelle | Anzahl | Schema |
|---|---|---|
| canonical_controls | ~291.000 | compliance |
| obligation_candidates | ~234.000 | compliance |
| control_dependencies | ~15.300 | compliance |
MinIO (Hetzner, nbg1.your-objectstorage.com)
Alle Originaldokumente sind sicher in MinIO, Bucket: breakpilot-rag.
Achtung: 2 Dateien waren korrupt (263-Byte XML statt PDF):
nistir_8259a.pdf— Neu heruntergeladen von nist.gov, re-ingestiert ✅nist_ai_rmf.pdf— Neu heruntergeladen von nist.gov, re-ingestiert ✅ Die neuen PDFs wurden nur in Qdrant ingestiert, NICHT in MinIO ersetzt. Fuer MinIO-Update: Manuell via RAG-Service-Upload oder mc-CLI.
TESTS AUSFUEHREN
# Embedding-Service (99 Tests inkl. 41 NIST-Tests)
cd embedding-service && python3 -m pytest test_chunking.py test_d4_bgb.py test_nist_normalization.py -v
# RAG-Service (32 Tests)
cd rag-service && PYTHONPATH=. python3 -m pytest tests/ -v
# Control-Pipeline (387 Tests)
PYTHONPATH=control-pipeline python3 -m pytest control-pipeline/tests/ -v
# Qualitaetsreport (500 Controls gegen Qdrant)
python3 control-pipeline/scripts/quality_report.py --db-host macmini --sample 500
# Qdrant-Snapshot erstellen
ssh macmini "cd ~/Projekte/breakpilot-core && bash scripts/qdrant-snapshot.sh"
# Qdrant-Snapshots auflisten
ssh macmini "cd ~/Projekte/breakpilot-core && bash scripts/qdrant-snapshot.sh --list"
MEMORY-DATEIEN (LESEN!)
Alle unter /Users/benjaminadmin/.claude/projects/-Users-benjaminadmin-Projekte-breakpilot-core/memory/:
MEMORY.md— Index aller Memoriesproject_structural_chunking.md— Architektur-Entscheidungproject_control_pipeline_masterplan.md— Gesamtplan A-Gfeedback_batch_api_safety.md— NIEMALS curl-Retry fuer Batch-Submitsfeedback_legal_source_licensing.md— Rule 1/2/3 Lizenzregelnfeedback_no_hardcoded_knowledge.md— Kein hartkodiertes Rechtswissenproject_missing_legal_sources.md— Fehlende Gesetze + 20 Urteileproject_test_strategy.md— 4-Ebenen Teststrategie
PLAN-DATEI
Vollstaendiger Masterplan: /Users/benjaminadmin/.claude/plans/jazzy-snacking-creek.md
Enthaelt Bloecke A-G mit allen Details.