fix(ucca): Cross-Reg 0070 — beide Domaenen im Router-Top-K (Known Defects 0) #47

Merged
Benjamin_Boenisch merged 2 commits from fix/multi-reg-0070 into main 2026-06-30 13:42:29 +00:00
Owner

Was & Warum

Der einzige offene Retrieval-Härtefall (Known Defects = 1 → 0): eine Query mit ≥2 explizit genannten Regelwerken („Wie greifen CRA und Maschinenverordnung ineinander?") lieferte nur die keyword-dominante Domäne (CRA), MaschVO fiel komplett aus dem Top-8. Drei zusammenwirkende Ursachen — alle behoben:

  1. CodeValues-Mismatch: MaschVO heißt je Collection anders — Slice MASCHVO · gesetze MVO · ce MACHINERY/MASCHINENVO. Der Catalog hatte nur ["MASCHVO","MaschVO"] → der exakte per-Reg-Filter fand MaschVO nur in der Slice. Jetzt alle Varianten als CodeValues. (CRA/NIS2/DORA/AI ACT/DATA ACT gegen den dev-Korpus auditiert — stimmen überein.)
  2. Per-Collection-Truncation: Router gab perColl=3searchMultiRegulation holte 3+3=6, schnitt auf 3 → konnte eine Domäne je Collection verlieren. Multi-Reg-Queries bekommen jetzt perColl = routerPerCollectionTopK * len(regs).
  3. Router-Score-Merge starvte die nicht-dominante Domäne im finalen Top-K. Neue balanceByRegulation() gruppiert den gemergten Pool per Regelwerk (exakter regulation_code-Match gegen CodeValues) und nimmt round-robin über die genannten Domänen → jede Domäne mit Treffern ist garantiert im Top-K. Generisch über jede genannte Menge; Single-Domain-Pfad unverändert.

Validierung

  • Go-Unit: TestBalanceByRegulation (dominante CRA verdrängt MaschVO NICHT mehr; round-robin-Reihenfolge).
  • 0070-e2e gegen dev (echter Retrieve()): top-8 = [CRA MVO CRA MVO CRA MVO CRA MASCHINENVO] = beide Domänen (vorher nur CRA).
  • CB-100-Stichprobe (stride 5): OLD 11/20 → NEW 15/20, GAIN 4, REGR 0 — Gain-Profil unverändert ggü. dem Router-Baseline.
  • go build/vet/gofmt grün.

Scope / Sicherheit

Nur internal/ucca (multi_regulation.go + authority_router.go + Tests), disjunkt iace/Registry/Obligation/backend. Ändert ausschließlich den Multi-Reg-Pfad (≥2 genannte Regelwerke); Single-Domain-Queries laufen byte-identisch. Folgt auf PR #46 (Authority Router).

🤖 Generated with Claude Code

## Was & Warum Der **einzige offene Retrieval-Härtefall** (Known Defects = 1 → 0): eine Query mit **≥2 explizit genannten Regelwerken** („Wie greifen **CRA** und **Maschinenverordnung** ineinander?") lieferte nur die keyword-dominante Domäne (CRA), MaschVO fiel komplett aus dem Top-8. Drei zusammenwirkende Ursachen — alle behoben: 1. **CodeValues-Mismatch:** MaschVO heißt je Collection anders — Slice `MASCHVO` · gesetze `MVO` · ce `MACHINERY`/`MASCHINENVO`. Der Catalog hatte nur `["MASCHVO","MaschVO"]` → der exakte per-Reg-Filter fand MaschVO **nur in der Slice**. Jetzt alle Varianten als CodeValues. (CRA/NIS2/DORA/AI ACT/DATA ACT gegen den dev-Korpus auditiert — stimmen überein.) 2. **Per-Collection-Truncation:** Router gab `perColl=3` → `searchMultiRegulation` holte 3+3=6, schnitt auf 3 → konnte eine Domäne je Collection verlieren. Multi-Reg-Queries bekommen jetzt `perColl = routerPerCollectionTopK * len(regs)`. 3. **Router-Score-Merge** starvte die nicht-dominante Domäne im finalen Top-K. Neue **`balanceByRegulation()`** gruppiert den gemergten Pool per Regelwerk (exakter `regulation_code`-Match gegen CodeValues) und nimmt **round-robin** über die genannten Domänen → jede Domäne mit Treffern ist garantiert im Top-K. Generisch über jede genannte Menge; **Single-Domain-Pfad unverändert**. ## Validierung - **Go-Unit:** `TestBalanceByRegulation` (dominante CRA verdrängt MaschVO NICHT mehr; round-robin-Reihenfolge). - **0070-e2e gegen dev** (echter `Retrieve()`): `top-8 = [CRA MVO CRA MVO CRA MVO CRA MASCHINENVO]` = **beide Domänen** (vorher nur CRA). - **CB-100-Stichprobe (stride 5):** OLD 11/20 → NEW 15/20, GAIN 4, **REGR 0** — Gain-Profil unverändert ggü. dem Router-Baseline. - `go build`/`vet`/`gofmt` grün. ## Scope / Sicherheit Nur `internal/ucca` (multi_regulation.go + authority_router.go + Tests), disjunkt iace/Registry/Obligation/backend. Ändert ausschließlich den **Multi-Reg-Pfad** (≥2 genannte Regelwerke); Single-Domain-Queries laufen byte-identisch. Folgt auf PR #46 (Authority Router). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Benjamin_Boenisch added 1 commit 2026-06-30 13:09:01 +00:00
fix(ucca): Cross-Reg 0070 — beide Regelwerk-Domaenen im Router-Top-K (Known Defects 0)
CI / detect-changes (pull_request) Successful in 13s
CI / branch-name (pull_request) Successful in 1s
CI / guardrail-integrity (pull_request) Successful in 9s
CI / secret-scan (pull_request) Successful in 10s
CI / dep-audit (pull_request) Failing after 56s
CI / sbom-scan (pull_request) Failing after 59s
CI / build-sha-integrity (pull_request) Successful in 5s
CI / validate-canonical-controls (pull_request) Successful in 3s
CI / test-python-document-crawler (pull_request) Successful in 15s
CI / test-python-dsms-gateway (pull_request) Successful in 13s
CI / loc-budget (pull_request) Successful in 23s
CI / go-lint (pull_request) Failing after 51s
CI / python-lint (pull_request) Failing after 18s
CI / nodejs-lint (pull_request) Failing after 1m8s
CI / nodejs-build (pull_request) Successful in 3m6s
CI / test-go (pull_request) Successful in 1m3s
CI / iace-gt-coverage (pull_request) Successful in 18s
CI / test-python-backend (pull_request) Successful in 28s
f2d445b891
Der einzige offene Retrieval-Haertefall: eine Query mit >=2 genannten Regelwerken
("CRA und Maschinenverordnung") lieferte nur die keyword-dominante Domaene (CRA),
MaschVO fiel raus. Drei zusammenwirkende Ursachen, alle behoben:

1. CodeValues-Mismatch: MaschVO heisst je Collection anders (Slice MASCHVO ·
   gesetze MVO · ce MACHINERY/MASCHINENVO), der Catalog hatte nur ["MASCHVO","MaschVO"]
   → Filter fand MaschVO nur in der Slice. Jetzt alle Varianten als CodeValues.
2. Per-Collection-Truncation: der Router gab perColl=3 → searchMultiRegulation holte
   3+3=6, schnitt auf 3 → konnte eine Domaene je Collection verlieren. Multi-Reg-Queries
   bekommen jetzt perColl = 3*len(regs).
3. Router-Score-Merge starvte die nicht-dominante Domaene. Neue balanceByRegulation()
   gruppiert den gemergten Pool per Regelwerk (exakter regulation_code-Match) und nimmt
   round-robin ueber die genannten Domaenen → jede Domaene mit Treffern ist im Top-K.
   Generisch ueber jede genannte Menge; Single-Domain-Pfad unveraendert.

Validierung: Go-Unit (balanceByRegulation: dominante CRA verdraengt MaschVO NICHT mehr);
0070-e2e gegen dev (Retrieve() → [CRA MVO CRA MVO CRA MVO CRA MASCHINENVO] = beide
Domaenen, vorher nur CRA); CB-100-Stichprobe REGR 0 (Gain-Profil unveraendert).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Benjamin_Boenisch added 1 commit 2026-06-30 13:31:04 +00:00
style(ucca): gocritic equalFold in balanceByRegulation (go-lint gruen)
CI / detect-changes (pull_request) Successful in 14s
CI / branch-name (pull_request) Successful in 2s
CI / guardrail-integrity (pull_request) Successful in 6s
CI / secret-scan (pull_request) Successful in 6s
CI / dep-audit (pull_request) Failing after 54s
CI / sbom-scan (pull_request) Failing after 58s
CI / build-sha-integrity (pull_request) Successful in 5s
CI / validate-canonical-controls (pull_request) Successful in 4s
CI / loc-budget (pull_request) Successful in 20s
CI / go-lint (pull_request) Successful in 43s
CI / python-lint (pull_request) Failing after 18s
CI / nodejs-lint (pull_request) Failing after 1m10s
CI / nodejs-build (pull_request) Successful in 3m1s
CI / test-go (pull_request) Successful in 1m4s
CI / iace-gt-coverage (pull_request) Successful in 16s
CI / test-python-backend (pull_request) Successful in 27s
CI / test-python-document-crawler (pull_request) Successful in 12s
CI / test-python-dsms-gateway (pull_request) Successful in 13s
1d65d99d5f
strings.EqualFold(code, cv) statt code==strings.ToUpper(cv) — behebt den einzigen
gocritic-Befund auf der neuen Zeile (CI go-lint, new-from-merge-base). Verhalten
unveraendert (case-insensitive exakter regulation_code-Match); Unit + 0070-e2e bleiben gruen.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Benjamin_Boenisch merged commit f0120b237e into main 2026-06-30 13:42:29 +00:00
Sign in to join this conversation.