From 05cbd8adc7db0896f94e74509e1e1e1fd8809ec1 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Tue, 25 Aug 2026 07:16:41 +0300 Subject: [PATCH] Reject reviewed research answers without evidence --- cmd/core-runtime/cognitive_interpretation_test.go | 10 ++++++++++ cmd/core-runtime/main.go | 12 +++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/cmd/core-runtime/cognitive_interpretation_test.go b/cmd/core-runtime/cognitive_interpretation_test.go index 6d46dbd..1abfd5f 100644 --- a/cmd/core-runtime/cognitive_interpretation_test.go +++ b/cmd/core-runtime/cognitive_interpretation_test.go @@ -40,6 +40,16 @@ func TestReviewResponseUsesCognitiveGatewayAndReturnsOnlyDraftAnswer(t *testing. } } +func TestReviewPreservesResearchEvidence(t *testing.T) { + draft := "Нашёл вариант. Источник: Aviasales (https://www.aviasales.ru/search)" + if reviewPreservesResearchEvidence("Нашёл вариант на Авиасейлс.", draft) { + t.Fatal("review without the direct source must be rejected") + } + if !reviewPreservesResearchEvidence("Нашёл вариант. Источник: Aviasales (https://www.aviasales.ru/search)", draft) { + t.Fatal("review with the direct source must be accepted") + } +} + func TestSimpleQuestionUsesStrictInterpretationForSemanticRouting(t *testing.T) { result := interactiondomain.SemanticResult{ Interpretation: interaction.UtteranceInterpretation{ diff --git a/cmd/core-runtime/main.go b/cmd/core-runtime/main.go index a37dead..aea310a 100644 --- a/cmd/core-runtime/main.go +++ b/cmd/core-runtime/main.go @@ -853,7 +853,7 @@ func main() { stableSemanticReply := identityReply != "" || deterministicSpeechAct == interaction.SpeechActConversational || deterministicSpeechAct == interaction.SpeechActConfirmation || deterministicSpeechAct == interaction.SpeechActRejection if reviewErr != nil { log.Printf("cognitive response review unavailable: %v", reviewErr) - } else if !stableSemanticReply { + } else if !stableSemanticReply && (!researchBacked || reviewPreservesResearchEvidence(reviewedReply, planningReply)) { planningReply = reviewedReply } else if reviewedReply != planningReply { log.Printf("cognitive response review proposed stable semantic rewrite; preserving semantic reply") @@ -1636,6 +1636,16 @@ func renderResearchReply(result epistemics.ResearchResult, researchErr error) (s return strings.Join(lines, "\n"), true } +func reviewPreservesResearchEvidence(reviewed, draft string) bool { + if strings.Contains(draft, "http://") || strings.Contains(draft, "https://") { + return strings.Contains(reviewed, "http://") || strings.Contains(reviewed, "https://") + } + if strings.Contains(draft, "Источник:") { + return strings.Contains(reviewed, "Источник:") + } + return true +} + func researchSourceLabel(finding epistemics.ResearchFinding) string { title := strings.TrimSpace(finding.Source.Title) locator := strings.TrimSpace(finding.Source.Locator) -- 2.54.0