e2c74fd243
CI / detect-changes (pull_request) Successful in 12s
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 1m1s
CI / build-sha-integrity (pull_request) Successful in 6s
CI / validate-canonical-controls (pull_request) Successful in 3s
CI / loc-budget (pull_request) Successful in 18s
CI / go-lint (pull_request) Successful in 52s
CI / python-lint (pull_request) Failing after 15s
CI / nodejs-lint (pull_request) Failing after 1m12s
CI / nodejs-build (pull_request) Successful in 3m4s
CI / test-go (pull_request) Successful in 1m2s
CI / iace-gt-coverage (pull_request) Successful in 19s
CI / test-python-backend (pull_request) Successful in 27s
CI / test-python-document-crawler (pull_request) Successful in 19s
CI / test-python-dsms-gateway (pull_request) Successful in 15s
Additiv (KEIN CE-Ersatz): faellt eine Query in den KB-2026.1-Scope (DP/CRA/MaschVO/ NIS2/DataAct/DORA/AIAct + EDPB/DSK-Guidance), wird die hochwertige Slice-Collection `kb_2026_1_build` abgefragt; sonst bleibt der breite Default `bp_compliance_ce`. Damit werden die Guidance-Intent- + Multi-Reg-Fixes (PR #42/#43) fuer den Slice LIVE, Broad-Corpus (OWASP/NIST/ENISA/IFRS/ISO) unangetastet -> 0 Regressionen by construction. - resolveCollection(query, requested): explizit angefragte Collection unveraendert; Default-Request -> Slice bei inKBScope, sonst CE. Env RAG_KB_SCOPE_ROUTING=false = Rollback ohne Redeploy; RAG_KB_SLICE_COLLECTION ueberschreibt den Slice-Namen. - inKBScope: detectRegulations (in-Slice-Regelwerke) + DP-Guidance-Marker (edpb/dsk/wp/gl) + DP/Compliance-Topics. Bewusst NICHT die generischen Verben aus guidanceIntentSignals (sagt/laut) und NICHT enisa/bsi/nist/owasp (die liegen in CE) -> konservativ, in-scope->Slice. Validierung: Unit (Scoping + resolveCollection); dev-e2e (RUN_E2E, geroutetes Search() gegen dev): WP248/MaschVO/CRA+MaschVO -> Slice (Treffer da, fehlen in dev-ce); NIST -> CE (NIST-Treffer). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
53 lines
2.4 KiB
Go
53 lines
2.4 KiB
Go
package ucca
|
|
|
|
import "strings"
|
|
|
|
// kbScopeTopics are high-precision data-protection / compliance topic markers that place a query in
|
|
// the KB-2026.1 authoritative slice even when it does NOT name a regulation. Conservative by design:
|
|
// an unmatched query falls back to the broad CE default (no regression) — the slice is only used when
|
|
// the query is confidently in-scope.
|
|
var kbScopeTopics = []string{
|
|
// DP-Guidance-Marker, die IN der Slice liegen (EDPB/DSK/WP/GL) — bewusst NICHT die generischen
|
|
// Verben aus guidanceIntentSignals (sagt/laut/empfiehlt/auslegung) und NICHT enisa/bsi/nist/owasp
|
|
// (die liegen im breiten CE-Pool, nicht in der Slice).
|
|
"edpb", "dsk", "datenschutzausschuss", "orientierungshilfe",
|
|
"wp2", "wp 2", "wp29", "working paper", "gl 0",
|
|
"datenschutz", "dsgvo", "gdpr", "dsfa", "folgenabschätzung", "folgenabschaetzung",
|
|
"einwilligung", "auftragsverarbeit", "betroffenenrecht", "auskunftsrecht",
|
|
"verarbeitungsverzeichnis", "datenschutzbeauftragt", "verzeichnis von verarbeitung",
|
|
"cookie", "tracking", "transparenzpflicht", "datenpanne", "meldepflicht",
|
|
"technische und organisatorische maßnahmen",
|
|
"cyber resilience", "schwachstelle", "vulnerability", "sicherheitsupdate",
|
|
"maschinensicherheit", "wesentliche veränderung", "wesentliche veraenderung",
|
|
"konformitätsbewertung", "konformitaetsbewertung", "ce-kennzeichnung",
|
|
}
|
|
|
|
// inKBScope reports whether the query belongs to the KB-2026.1 authoritative slice. True when it
|
|
// names an in-slice regulation (detectRegulations), asks for guidance (EDPB/DSK/WP/GL), or hits a
|
|
// data-protection / compliance topic marker.
|
|
func inKBScope(query string) bool {
|
|
if len(detectRegulations(query)) > 0 {
|
|
return true
|
|
}
|
|
q := strings.ToLower(query)
|
|
for _, t := range kbScopeTopics {
|
|
if strings.Contains(q, t) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// resolveCollection applies the Blue-Green „authoritative slice promotion" routing. An explicitly
|
|
// requested collection is honoured unchanged; the DEFAULT (empty) request is routed to the KB-2026.1
|
|
// slice when the query is in-scope, else to the broad CE default. Disable via RAG_KB_SCOPE_ROUTING=false.
|
|
func (c *LegalRAGClient) resolveCollection(query, requested string) string {
|
|
if requested != "" {
|
|
return requested
|
|
}
|
|
if c.kbScopeRoutingEnabled && c.kbSliceCollection != "" && inKBScope(query) {
|
|
return c.kbSliceCollection
|
|
}
|
|
return c.collection
|
|
}
|