feat(ucca): Multi-Regulation-Retrieval (Cross-Regulation-Fragen) #43

Merged
Benjamin_Boenisch merged 1 commits from fix/multi-regulation-retrieval into main 2026-06-30 06:46:24 +00:00
Owner

Was & Warum

Adds scoped multi-regulation retrieval — it activates only when a query explicitly references ≥2 regulations ("Wie greifen CRA und Maschinenverordnung ineinander?"). Then searchInternal retrieves per regulation separately (filter on regulation_code/regulation_id) and merges, so a cross-regulation question returns both domains in the prompt instead of only the keyword-dominant one. No effect on single-regulation queries — they take the unchanged single-domain path.

Generic (Query → regulations, no doc-specific logic), gated on ≥2 detected regulations.

Behebt den Cross-Regulation-Defekt (GQ-0070)

  • Vorher: CRA ×8, null MaschVO → das Modell halluzinierte MaschVO = 2019/2144 + falsche „CRA ausgenommen"-Konklusion.
  • Nachher: CRA + MaschVO im Prompt → korrekt „beide gleichzeitig anwendbar" + Art. 20 Abs. 9 Konformitätsvermutung, gegroundet.

Änderung (4 Dateien)

  • multi_regulation.go (neu): regulationCatalog + detectRegulations (deterministisch, alias-basiert) + searchMultiRegulation (per-reg Retrieval + Merge + authority-rerank) + hitsToResults (Refactor, von searchInternal geteilt).
  • legal_rag_client.go: Hook in searchInternal (best-effort, fällt bei leerem Multi-Ergebnis auf Standardsuche zurück) + Mapping → hitsToResults.
  • legal_rag_http.go: Per-Regulation-Filter auf regulation_id UND regulation_code (rückwärtskompatibel, aktiviert die re-ingestierte Build-Collection).
  • multi_regulation_test.go (neu): Unit (Scoping) + opt-in e2e (5 Cross-Reg-Paare).

Validierung (Build-Collection, echtes SearchCollection)

  • Unit detectRegulations: ≥2 → multi, 1/0 → single.
  • 5 Cross-Reg-Paare (0070 CRA+MaschVO · DSGVO+TDDDG · CRA+NIS2 · DORA+NIS2 · AI Act+DSGVO): beide Regelwerke in Top-8.
  • CB-100 Freeze-Regression: 98/100 unverändert (byte-identisch), 2/100 verbessert — nur GQ-0070 + GQ-0095 (beide echte Cross-Reg, MaschVO jetzt 4/8 statt 0/8 bzw. 2/8).
  • 10 Hard Cases: 9 Single-Domain unverändert, 0070 behält CRA Rang 1 + MaschVO dazu.
  • go build · go vet · gofmt · Bestandstests grün.

Deploy

Merge/Deploy erst nach separatem Go. Volle Wirkung auf der Build-Collection (KB v2). Auf dev ce voraussichtlich inert (per-reg-Filter matcht den alten Korpus evtl. nicht → Best-effort-Fallback auf Standardsuche) — kein Effekt, keine Regression.

🤖 Generated with Claude Code

## Was & Warum Adds **scoped multi-regulation retrieval** — it activates **only when a query explicitly references ≥2 regulations** ("Wie greifen CRA und Maschinenverordnung ineinander?"). Then `searchInternal` retrieves **per regulation separately** (filter on `regulation_code`/`regulation_id`) and merges, so a cross-regulation question returns **both domains** in the prompt instead of only the keyword-dominant one. **No effect on single-regulation queries** — they take the unchanged single-domain path. Generic (Query → regulations, **no doc-specific logic**), gated on ≥2 detected regulations. ### Behebt den Cross-Regulation-Defekt (GQ-0070) - **Vorher:** `CRA ×8`, null MaschVO → das Modell halluzinierte `MaschVO = 2019/2144` + falsche „CRA ausgenommen"-Konklusion. - **Nachher:** CRA + MaschVO im Prompt → korrekt **„beide gleichzeitig anwendbar"** + Art. 20 Abs. 9 Konformitätsvermutung, gegroundet. ## Änderung (4 Dateien) - `multi_regulation.go` (neu): `regulationCatalog` + `detectRegulations` (deterministisch, alias-basiert) + `searchMultiRegulation` (per-reg Retrieval + Merge + authority-rerank) + `hitsToResults` (Refactor, von `searchInternal` geteilt). - `legal_rag_client.go`: Hook in `searchInternal` (best-effort, fällt bei leerem Multi-Ergebnis auf Standardsuche zurück) + Mapping → `hitsToResults`. - `legal_rag_http.go`: Per-Regulation-Filter auf `regulation_id` **UND** `regulation_code` (rückwärtskompatibel, aktiviert die re-ingestierte Build-Collection). - `multi_regulation_test.go` (neu): Unit (Scoping) + opt-in e2e (5 Cross-Reg-Paare). ## Validierung (Build-Collection, echtes `SearchCollection`) - **Unit** `detectRegulations`: ≥2 → multi, 1/0 → single. - **5 Cross-Reg-Paare** (0070 CRA+MaschVO · DSGVO+TDDDG · CRA+NIS2 · DORA+NIS2 · AI Act+DSGVO): beide Regelwerke in Top-8. - **CB-100 Freeze-Regression:** **98/100 unverändert (byte-identisch), 2/100 verbessert** — nur GQ-0070 + GQ-0095 (beide echte Cross-Reg, MaschVO jetzt 4/8 statt 0/8 bzw. 2/8). - **10 Hard Cases:** 9 Single-Domain unverändert, 0070 behält CRA Rang 1 + MaschVO dazu. - `go build` · `go vet` · `gofmt` · Bestandstests grün. ## Deploy **Merge/Deploy erst nach separatem Go.** Volle Wirkung auf der Build-Collection (KB v2). Auf dev `ce` voraussichtlich **inert** (per-reg-Filter matcht den alten Korpus evtl. nicht → Best-effort-Fallback auf Standardsuche) — kein Effekt, **keine Regression**. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Benjamin_Boenisch added 1 commit 2026-06-30 06:26:30 +00:00
feat(ucca): Multi-Regulation-Retrieval für Cross-Regulation-Fragen
CI / detect-changes (pull_request) Successful in 10s
CI / branch-name (pull_request) Successful in 1s
CI / guardrail-integrity (pull_request) Successful in 8s
CI / secret-scan (pull_request) Successful in 9s
CI / dep-audit (pull_request) Failing after 56s
CI / sbom-scan (pull_request) Failing after 58s
CI / build-sha-integrity (pull_request) Successful in 9s
CI / validate-canonical-controls (pull_request) Successful in 7s
CI / loc-budget (pull_request) Successful in 24s
CI / go-lint (pull_request) Successful in 54s
CI / python-lint (pull_request) Failing after 16s
CI / nodejs-lint (pull_request) Failing after 1m9s
CI / nodejs-build (pull_request) Successful in 3m6s
CI / test-go (pull_request) Successful in 1m3s
CI / iace-gt-coverage (pull_request) Successful in 19s
CI / test-python-backend (pull_request) Successful in 26s
CI / test-python-document-crawler (pull_request) Successful in 15s
CI / test-python-dsms-gateway (pull_request) Successful in 12s
9760dca443
Nennt eine Query EXPLIZIT >=2 Regelwerke ("Wie greifen CRA und Maschinen-
verordnung ineinander?"), retrievt searchInternal pro Regelwerk separat
(regulation_code/regulation_id-Filter) und merged — damit BEIDE Domänen im
Prompt landen statt nur der keyword-dominanten. Generisch (Query->Regelwerke,
KEINE doc-spezifische Logik), gegated auf >=2 erkannte Regelwerke; sonst
unveränderter Single-Domain-Pfad.

Behebt GQ-0070: vorher CRA x8 / null MaschVO -> Modell halluzinierte
MaschVO=2019/2144 + falsche "CRA ausgenommen"-Konklusion. Nachher CRA + MaschVO
im Prompt -> korrekt "beide gleichzeitig anwendbar" + Art. 20(9)
Konformitätsvermutung, gegroundet.

Validierung (Build-Collection, echtes SearchCollection):
- Unit: detectRegulations-Scoping (>=2 -> multi, 1/0 -> single)
- 5 Cross-Reg-Fälle (0070 + DSGVO+TDDDG/CRA+NIS2/DORA+NIS2/AI Act+DSGVO):
  beide Regelwerke in Top-8
- CB-100 Freeze-Regression: NUR GQ-0070 + GQ-0095 geändert (beide echte
  Cross-Reg, beide verbessert), 98/100 byte-identisch
- 10 Hard Cases: 9 Single-Domain unverändert, 0070 behält CRA Rang 1

Filter erweitert auf regulation_id UND regulation_code (rückwärtskompatibel,
aktiviert die re-ingestierte Build-Collection).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Benjamin_Boenisch merged commit 866889b453 into main 2026-06-30 06:46:24 +00:00
Sign in to join this conversation.