fix: validate cognitive interpretation boundary

This commit is contained in:
m
2026-08-21 01:19:10 +03:00
parent 8448e95257
commit ed67fd7ba9
2 changed files with 60 additions and 0 deletions
+27
View File
@@ -112,6 +112,9 @@ func parseInterpretationCandidate(text string) (cognitive.GatewayInterpretationC
if candidate.SecondarySpeechAct != "" && !validSpeechAct(candidate.SecondarySpeechAct) {
return cognitive.GatewayInterpretationCandidate{}, false
}
if candidate.SecondarySpeechAct == "" {
candidate.SecondarySpeechAct = "UNKNOWN"
}
switch candidate.Applicability {
case cognitive.InterpretationApplicable, cognitive.InterpretationLowConfidence, cognitive.InterpretationMixedIntent, cognitive.InterpretationNeedsBroader, cognitive.InterpretationClarificationRequired:
default:
@@ -120,6 +123,11 @@ func parseInterpretationCandidate(text string) (cognitive.GatewayInterpretationC
if candidate.Clarification != "NOT_REQUIRED" && candidate.Clarification != "REQUIRED" {
return cognitive.GatewayInterpretationCandidate{}, false
}
for _, hint := range candidate.CapabilityHints {
if !validCapabilityKind(hint) {
return cognitive.GatewayInterpretationCandidate{}, false
}
}
return candidate, true
}
@@ -131,6 +139,25 @@ func validSpeechAct(value string) bool {
return false
}
func validCapabilityKind(value capability.CapabilityKind) bool {
switch value {
case capability.CapabilityKindReadEmail,
capability.CapabilityKindSendEmail,
capability.CapabilityKindReadDatabase,
capability.CapabilityKindQueryLogs,
capability.CapabilityKindInspectProject,
capability.CapabilityKindModifyCode,
capability.CapabilityKindRunTests,
capability.CapabilityKindWebResearch,
capability.CapabilityKindCognitiveReasoning,
capability.CapabilityKindScheduleReminder,
capability.CapabilityKindVerifyFact:
return true
default:
return false
}
}
func writeInterpretationResponse(w http.ResponseWriter, response cognitive.GatewayInterpretationResponse) {
w.Header().Set("Content-Type", "application/json")
_ = json.NewEncoder(w).Encode(response)
@@ -0,0 +1,33 @@
package main
import (
"testing"
"git.cin.su/m/Assistant/contracts/capability"
)
func TestParseInterpretationCandidateNormalizesOmittedSecondarySpeechAct(t *testing.T) {
candidate, ok := parseInterpretationCandidate(`{"primary_speech_act":"QUESTION","confidence_millis":800,"applicability":"APPLICABLE","clarification":"NOT_REQUIRED"}`)
if !ok {
t.Fatal("expected valid candidate")
}
if candidate.SecondarySpeechAct != "UNKNOWN" {
t.Fatalf("expected omitted secondary speech act to normalize to UNKNOWN, got %q", candidate.SecondarySpeechAct)
}
}
func TestParseInterpretationCandidateRejectsUnknownCapabilityHint(t *testing.T) {
_, ok := parseInterpretationCandidate(`{"primary_speech_act":"QUESTION","confidence_millis":800,"applicability":"APPLICABLE","clarification":"NOT_REQUIRED","capability_hints":["INVENTED_CAPABILITY"]}`)
if ok {
t.Fatal("expected unknown capability hint to be rejected")
}
}
func TestValidCapabilityKindMatchesContractEnum(t *testing.T) {
if !validCapabilityKind(capability.CapabilityKindCognitiveReasoning) {
t.Fatal("expected cognitive reasoning capability to be valid")
}
if validCapabilityKind(capability.CapabilityKind("INVENTED_CAPABILITY")) {
t.Fatal("invented capability must be invalid")
}
}