feat(ai-sdk): control-intent result diversity + standard-name classifier override
CI / detect-changes (push) Successful in 7s
CI / branch-name (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / secret-scan (push) Has been skipped
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / build-sha-integrity (push) Successful in 5s
CI / validate-canonical-controls (push) Successful in 8s
CI / loc-budget (push) Successful in 19s
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / nodejs-build (push) Has been skipped
CI / test-go (push) Successful in 58s
CI / iace-gt-coverage (push) Successful in 17s
CI / test-python-backend (push) Has been skipped
CI / test-python-document-crawler (push) Has been skipped
CI / test-python-dsms-gateway (push) Has been skipped
CI / detect-changes (push) Successful in 7s
CI / branch-name (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / secret-scan (push) Has been skipped
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / build-sha-integrity (push) Successful in 5s
CI / validate-canonical-controls (push) Successful in 8s
CI / loc-budget (push) Successful in 19s
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / nodejs-build (push) Has been skipped
CI / test-go (push) Successful in 58s
CI / iace-gt-coverage (push) Successful in 17s
CI / test-python-backend (push) Has been skipped
CI / test-python-document-crawler (push) Has been skipped
CI / test-python-dsms-gateway (push) Has been skipped
On an implementation question impl_guidance (ENISA) keeps its earned semantic Top-1, but the top-K now surfaces the best operational_requirement and control_standard from the pool (ensureControlDiversity) — so different source roles are visible instead of one role flooding the list, without forcing the binding sources to Top-1. A recognised standard NAME (NIST/OWASP/ISO 27001/CIS/CSA CCM/Grundschutz) now overrides a mis-applied supervisory_guidance source_class in classifyAuthority, so those standards classify and rank as technical_standard (control_standard role). The corpus tags many standards as guidance (weight 70); the name wins. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -121,3 +121,54 @@ func controlRoleOf(payload map[string]interface{}) string {
|
||||
IsRecital: getBool(payload, "is_recital"),
|
||||
})
|
||||
}
|
||||
|
||||
// ensureControlDiversity guarantees that the returned top-K of a control question surfaces at
|
||||
// least one operational_requirement and one control_standard WHEN the pool contains them —
|
||||
// without forcing them to Top-1. implementation_guidance (e.g. ENISA good practices) keeps its
|
||||
// earned semantic lead; the rule only promotes the best hit of a missing control role into the
|
||||
// top-K by overwriting the lowest-ranked redundant guidance slot. So an implementation question
|
||||
// shows the relevant source ROLES (binding requirement + standard + guidance) side by side
|
||||
// instead of one role flooding the list. The promoted hit's original (now duplicate) position
|
||||
// stays in the tail and is dropped by the caller's truncation to topK.
|
||||
func ensureControlDiversity(results []LegalSearchResult, topK int) []LegalSearchResult {
|
||||
if topK <= 0 || topK >= len(results) {
|
||||
return results // everything is already returned — nothing to promote
|
||||
}
|
||||
roleAt := make([]string, len(results))
|
||||
for i := range results {
|
||||
roleAt[i] = classifyRole(results[i])
|
||||
}
|
||||
present := make(map[string]bool, topK)
|
||||
for i := 0; i < topK; i++ {
|
||||
present[roleAt[i]] = true
|
||||
}
|
||||
for _, want := range []string{roleOperationalReq, roleControlStandard} {
|
||||
if present[want] {
|
||||
continue
|
||||
}
|
||||
src := -1
|
||||
for i := topK; i < len(results); i++ {
|
||||
if roleAt[i] == want {
|
||||
src = i
|
||||
break
|
||||
}
|
||||
}
|
||||
if src < 0 {
|
||||
continue // role absent from the whole pool — nothing to promote
|
||||
}
|
||||
dst := -1
|
||||
for j := topK - 1; j >= 0; j-- {
|
||||
if roleAt[j] == roleImplGuidance {
|
||||
dst = j
|
||||
break
|
||||
}
|
||||
}
|
||||
if dst < 0 {
|
||||
continue // no redundant guidance to sacrifice — leave the head untouched
|
||||
}
|
||||
results[dst] = results[src]
|
||||
roleAt[dst] = want
|
||||
present[want] = true
|
||||
}
|
||||
return results
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user