Compare commits

..

1 Commits

Author SHA1 Message Date
Benjamin Admin ae73904ad5 feat(ai-sdk): controlled interpretation-intent guidance override
CI / detect-changes (pull_request) Successful in 7s
CI / branch-name (pull_request) Successful in 1s
CI / guardrail-integrity (pull_request) Successful in 5s
CI / secret-scan (pull_request) Successful in 5s
CI / dep-audit (pull_request) Failing after 55s
CI / sbom-scan (pull_request) Failing after 1m0s
CI / build-sha-integrity (pull_request) Successful in 6s
CI / validate-canonical-controls (pull_request) Successful in 6s
CI / loc-budget (pull_request) Successful in 19s
CI / go-lint (pull_request) Successful in 41s
CI / python-lint (pull_request) Failing after 14s
CI / nodejs-lint (pull_request) Failing after 1m10s
CI / nodejs-build (pull_request) Successful in 3m3s
CI / test-go (pull_request) Successful in 59s
CI / iace-gt-coverage (pull_request) Successful in 17s
CI / test-python-backend (pull_request) Successful in 27s
CI / test-python-document-crawler (pull_request) Successful in 13s
CI / test-python-dsms-gateway (pull_request) Successful in 9s
The authority re-rank always ranked binding law above guidance, so a guideline
could never be Top-1 even when the user explicitly asked "what does the EDPB /
ENISA say?". Add a tightly-bounded override: only when the query carries an
explicit guidance signal (EDPB / DSK / ENISA / BSI / Leitlinie / Guideline /
Orientierungshilfe / Auslegung / empfiehlt / Empfehlung / sagt / laut) AND the
guideline is semantically competitive with the best binding hit (>= best_binding
- 0.05) does supervisory_guidance get a +0.25 boost that lets it overtake the
binding norm. Obligation questions (no signal) are unchanged: binding stays #1.

Gate verified on dev:
- "Ab wann DSB-Pflicht?"                  -> Art. 37 DSGVO (binding) Top-1
- "Was empfiehlt der EDPB zum DSB?"       -> EDPB guidance Top-1
- "Was sagt die ENISA zu Security Updates?" -> ENISA guidance Top-1
- "Welche Anforderungen an Security Updates?" -> Art. 13 CRA (binding) Top-1

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-24 10:51:02 +02:00
@@ -16,7 +16,7 @@ const (
scopePenalty = 0.25 // BDSG Teil 3 (law enforcement) on a general DP question
topicGain = 0.18 // amplifier only
supersededPenalty = 0.50 // superseded Alt-Quelle (pre-eu-v1): demoted, nicht versteckt
guidanceIntentGain = 0.10 // epsilon a qualifying guideline is lifted ABOVE the best binding hit
guidanceIntentGain = 0.25 // controlled guidance override on explicit interpretation intent
guidanceIntentMargin = 0.05 // ...only if the guideline is semantically competitive with binding
)
@@ -110,36 +110,17 @@ func rerankByAuthority(query string, results []LegalSearchResult) []LegalSearchR
copy(out, results)
for i := range out {
out[i].Score = authorityScore(query, out[i], qDomain, qForeign)
// Interpretations-Intent (eng begrenzt): NUR wenn die Query explizit nach
// Guidance/Auslegung fragt UND die Leitlinie semantisch konkurrenzfaehig ist
// (>= bester binding-Treffer - margin), darf supervisory_guidance die bindende
// Norm ueberholen. Sonst bleibt binding > guidance (Normfrage unveraendert).
if wantsGuidance && out[i].SourceClass == "supervisory_guidance" &&
results[i].Score >= bestBindingSem-guidanceIntentMargin {
out[i].Score += guidanceIntentGain
}
if wantsGuidance {
applyGuidanceIntent(out, results, bestBindingSem)
}
sort.SliceStable(out, func(a, b int) bool {
return out[a].Score > out[b].Score
})
return out
}
// applyGuidanceIntent lifts semantically-competitive guidance just ABOVE the best
// binding hit (ordered by semantic), so an EXPLICIT interpretation question can
// return guidance Top-1. Obligation questions (no intent → not called) keep
// binding on top. Guidance below the semantic margin is left untouched, so an
// off-topic guideline can never ride the override — and the lift is computed from
// the binding FINAL score, so authority/topic/domain bonuses cannot edge it out.
func applyGuidanceIntent(out, raw []LegalSearchResult, bestBindingSem float64) {
bestBindingFinal := 0.0
for i := range out {
if out[i].SourceClass == "binding_law" && out[i].Score > bestBindingFinal {
bestBindingFinal = out[i].Score
}
}
for i := range out {
if out[i].SourceClass != "supervisory_guidance" || raw[i].Score < bestBindingSem-guidanceIntentMargin {
continue
}
lifted := bestBindingFinal + guidanceIntentGain + (raw[i].Score - bestBindingSem)
if lifted > out[i].Score {
out[i].Score = lifted
}
}
}