ГЛОБАЛЬНЫЙ РЕФАКТОРИНГ АРХИТЕКТУРЫ - fix(router): keep llm-first non-domain indexing and prevent followup force into address lane

This commit is contained in:
2026-04-12 17:29:35 +03:00
parent 143cf6efe1
commit a717ea6b26
5 changed files with 358 additions and 44 deletions
@@ -70,6 +70,18 @@ describe("assistant living router mode decision", () => {
expect(decision.mode).toBe("deep_analysis");
expect(decision.reason).toBe("predecompose_unsupported_mode_fallback_to_deep");
});
it("routes ultra-short deictic follow-up ('тут?') to chat mode", () => {
const decision = resolveLivingAssistantModeDecision({
userMessage: "тут?",
addressLaneTriggered: false,
useMock: false,
predecomposeMode: "unsupported",
predecomposeModeConfidence: "low"
});
expect(decision.mode).toBe("chat");
expect(decision.reason).toBe("living_chat_signal_detected");
});
it("routes capability question to chat even when phrase contains 1С", () => {
const decision = resolveLivingAssistantModeDecision({
userMessage: "и 1с можешь настроить?",
@@ -186,6 +198,39 @@ describe("assistant living router mode decision", () => {
});
describe("assistant orchestration contract", () => {
it("routes non-domain emotional follow-up to indexed chat path instead of address lane", () => {
const decision = resolveAssistantOrchestrationDecision({
rawUserMessage: "бля хочу выпилиться от этого ебаного 1с",
effectiveAddressUserMessage: "бля хочу выпилиться от этого ебаного 1с",
followupContext: {
previous_intent: "payables_confirmed_as_of_date",
previous_filters: {
period_from: "2021-05-01",
period_to: "2021-05-31",
as_of_date: "2021-05-31"
}
},
llmPreDecomposeMeta: {
applied: false,
reason: "no_usable_fragment",
predecomposeContract: {
mode: "unsupported",
mode_confidence: "low",
intent: "unknown",
intent_confidence: "low"
}
} as any,
useMock: false
});
expect(decision.runAddressLane).toBe(false);
expect(decision.toolGateDecision).toBe("skip_address_lane");
expect(decision.toolGateReason).toBe("non_domain_query_indexed");
expect(decision.livingMode).toBe("chat");
expect(decision.livingReason).toBe("non_domain_query_indexed");
expect(decision.orchestrationContract?.hard_meta_mode).toBe("non_domain");
});
it("keeps VAT payable forecast query in address lane", () => {
const decision = resolveAssistantOrchestrationDecision({
rawUserMessage: "какой прогноз оплаты ндс за 12 мая 2020",