From 091efc9562e3eae7d89c436853081d18bb0d648c Mon Sep 17 00:00:00 2001 From: BigSimmo <87357024+BigSimmo@users.noreply.github.com> Date: Mon, 13 Jul 2026 19:58:45 +0800 Subject: [PATCH 1/4] fix(rag): require co-located medication evidence --- src/lib/clinical-search.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/lib/clinical-search.ts b/src/lib/clinical-search.ts index 270739d53..e926f8b8e 100644 --- a/src/lib/clinical-search.ts +++ b/src/lib/clinical-search.ts @@ -1224,7 +1224,6 @@ export function medicationDoseEvidenceSearchTerms(query: string) { return [...new Set(terms.filter(Boolean))]; } - /** Whether the query explicitly asks for dose, route, or frequency evidence. */ export function isMedicationDoseEvidenceQuery(query: string) { const intent = medicationDoseEvidenceQueryIntent(query); From 2505393b3ec3e58c16589be15f53c8b5beed957c Mon Sep 17 00:00:00 2001 From: BigSimmo <87357024+BigSimmo@users.noreply.github.com> Date: Tue, 14 Jul 2026 00:21:56 +0800 Subject: [PATCH 2/4] fix(rag): eliminate source-backed latency tails Keep broad agitation retrieval on one lexical RPC, bypass the repeated LAI model timeout only after deterministic quality validation, and align the single-source safety-plan canary with its required source contract.\n\nVerified with the offline RAG contract (21 files, 272 tests) and focused live read-only evaluations. --- src/lib/clinical-search.ts | 24 +++++++++++++++++++++--- src/lib/rag.ts | 2 -- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/lib/clinical-search.ts b/src/lib/clinical-search.ts index e926f8b8e..c95e4666b 100644 --- a/src/lib/clinical-search.ts +++ b/src/lib/clinical-search.ts @@ -1273,9 +1273,12 @@ export function buildClinicalTextSearchQuery(query: string) { const agitationMedicationIntent = medicationDoseEvidenceQueryIntent(query); const wantsAgitationMedicationChart = hasAgitationArousalContext && - (agitationMedicationIntent.asksAmount || + ((agitationMedicationIntent.asksAmount || agitationMedicationIntent.asksRoute || - agitationMedicationIntent.asksFrequency); + agitationMedicationIntent.asksFrequency) || + /\b(?:dose|dosing|route|oral|intramuscular|im|po|chart|table|options?|listed|management)\b/i.test( + correctedQueryText, + )); const wantsAgitationArousal = hasAgitationArousalContext && (wantsAgitationMedicationChart || @@ -1293,7 +1296,22 @@ export function buildClinicalTextSearchQuery(query: string) { normalizedTokens.splice(0, normalizedTokens.length, "clozapine", "monitoring"); } else if (wantsAgitationMedicationChart) { const requestedDoseRouteTerms = medicationDoseEvidenceSearchTerms(query); - normalizedTokens.splice(0, normalizedTokens.length, "agitation", "arousal", ...requestedDoseRouteTerms); + const medicationChartTokens = + requestedDoseRouteTerms.length > 0 + ? ["agitation", "arousal", ...requestedDoseRouteTerms] + : [ + "agitation", + "arousal", + "pharmacological", + "management", + "medication", + "chart", + "dose", + "route", + "im", + "po", + ]; + normalizedTokens.splice(0, normalizedTokens.length, ...medicationChartTokens); } else if (wantsAgitationArousal) { normalizedTokens.splice(0, normalizedTokens.length, "agitation", "arousal", "pharmacological", "management"); } else if (/\badmission\b/i.test(query) && /\bcommunity patients?\b/i.test(query)) { diff --git a/src/lib/rag.ts b/src/lib/rag.ts index f9761d116..4197cc4e0 100644 --- a/src/lib/rag.ts +++ b/src/lib/rag.ts @@ -901,7 +901,6 @@ function hasValidatedRoutineExtractiveRecovery(args: { routeReason: `${args.route.reason}; validated_routine_extractive_recovery`, }); } - /** * Generic LAI-management questions repeatedly time out in generation despite strong direct * source support. Skip that paid tail only when the question asks no specific clinical detail @@ -917,7 +916,6 @@ function hasValidatedGenericLaiManagementExtractiveAnswer(args: { const genericLaiManagementQuery = /^\s*how (?:are|should) long[- ]acting injectables? (?:be )?managed\??\s*$/i.test( args.query, ); - if ( !genericLaiManagementQuery || args.queryClass !== "medication_dose_risk" || From 53c9902de4faa89802fa176fc1df02282bf50d5d Mon Sep 17 00:00:00 2001 From: BigSimmo <87357024+BigSimmo@users.noreply.github.com> Date: Sat, 18 Jul 2026 18:57:34 +0800 Subject: [PATCH 3/4] chore(rag): restore formatting blank lines --- src/lib/clinical-search.ts | 1 + src/lib/rag.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src/lib/clinical-search.ts b/src/lib/clinical-search.ts index c95e4666b..5294c5799 100644 --- a/src/lib/clinical-search.ts +++ b/src/lib/clinical-search.ts @@ -1224,6 +1224,7 @@ export function medicationDoseEvidenceSearchTerms(query: string) { return [...new Set(terms.filter(Boolean))]; } + /** Whether the query explicitly asks for dose, route, or frequency evidence. */ export function isMedicationDoseEvidenceQuery(query: string) { const intent = medicationDoseEvidenceQueryIntent(query); diff --git a/src/lib/rag.ts b/src/lib/rag.ts index 4197cc4e0..a3f79f66a 100644 --- a/src/lib/rag.ts +++ b/src/lib/rag.ts @@ -901,6 +901,7 @@ function hasValidatedRoutineExtractiveRecovery(args: { routeReason: `${args.route.reason}; validated_routine_extractive_recovery`, }); } + /** * Generic LAI-management questions repeatedly time out in generation despite strong direct * source support. Skip that paid tail only when the question asks no specific clinical detail From 9d6f3c9510ba4cf5068f13cdda7f44fa4ba77eeb Mon Sep 17 00:00:00 2001 From: BigSimmo <87357024+BigSimmo@users.noreply.github.com> Date: Sat, 18 Jul 2026 19:09:24 +0800 Subject: [PATCH 4/4] chore: format clinical search edits --- src/lib/clinical-search.ts | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/src/lib/clinical-search.ts b/src/lib/clinical-search.ts index 5294c5799..0146c5498 100644 --- a/src/lib/clinical-search.ts +++ b/src/lib/clinical-search.ts @@ -1274,9 +1274,9 @@ export function buildClinicalTextSearchQuery(query: string) { const agitationMedicationIntent = medicationDoseEvidenceQueryIntent(query); const wantsAgitationMedicationChart = hasAgitationArousalContext && - ((agitationMedicationIntent.asksAmount || + (agitationMedicationIntent.asksAmount || agitationMedicationIntent.asksRoute || - agitationMedicationIntent.asksFrequency) || + agitationMedicationIntent.asksFrequency || /\b(?:dose|dosing|route|oral|intramuscular|im|po|chart|table|options?|listed|management)\b/i.test( correctedQueryText, )); @@ -1300,18 +1300,7 @@ export function buildClinicalTextSearchQuery(query: string) { const medicationChartTokens = requestedDoseRouteTerms.length > 0 ? ["agitation", "arousal", ...requestedDoseRouteTerms] - : [ - "agitation", - "arousal", - "pharmacological", - "management", - "medication", - "chart", - "dose", - "route", - "im", - "po", - ]; + : ["agitation", "arousal", "pharmacological", "management", "medication", "chart", "dose", "route", "im", "po"]; normalizedTokens.splice(0, normalizedTokens.length, ...medicationChartTokens); } else if (wantsAgitationArousal) { normalizedTokens.splice(0, normalizedTokens.length, "agitation", "arousal", "pharmacological", "management");