Files
breakpilot-core/control-pipeline/INSTRUCTION-session-handover.md
T
Benjamin Admin 118be3540d feat(pipeline): D6 citation backfill + E2/E3 law ingestion scripts
- 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>
2026-05-03 13:19:27 +02:00

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_RE erweitert: NIST CSF 2.0, NIST Enhancements, OWASP Top 10
  • _SECTION_NUMBER_RE erweitert: 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.py Safety Fix: Upload → Verify → Delete old (mit must_not Filter)
  • reingest_nist.py (NEU): Sicheres Re-Ingest-Script
  • reupload_legal_strategy.py (NEU): Re-Upload mit chunk_strategy="legal"
  • extract_and_upload_nist.py (NEU): Lokale PDF-Extraktion fuer grosse Dateien
  • scripts/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:

  1. Fuer jeden Control: source_citation.source → regulation_code ermitteln
  2. In Qdrant nach Chunks mit diesem regulation_code + passender section suchen
  3. Wenn Match: source_citation.article und source_citation.paragraph aktualisieren
  4. 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:

  1. PDF lokal auf Mac Mini extrahieren (pdfplumber ist dort installiert)
  2. _normalize_pdf_text() anwenden
  3. 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 Memories
  • project_structural_chunking.md — Architektur-Entscheidung
  • project_control_pipeline_masterplan.md — Gesamtplan A-G
  • feedback_batch_api_safety.md — NIEMALS curl-Retry fuer Batch-Submits
  • feedback_legal_source_licensing.md — Rule 1/2/3 Lizenzregeln
  • feedback_no_hardcoded_knowledge.md — Kein hartkodiertes Rechtswissen
  • project_missing_legal_sources.md — Fehlende Gesetze + 20 Urteile
  • project_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.