From 7d9ba76cc5680e46fe03db9d60de92674559bbf5 Mon Sep 17 00:00:00 2001 From: dctouch Date: Fri, 24 Apr 2026 15:36:04 +0300 Subject: [PATCH] =?UTF-8?q?Post-F:=20=D0=B7=D0=B0=D0=BA=D1=80=D0=B5=D0=BF?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=BD=D1=8B=D0=B9=20=D0=BF=D1=80=D0=B8=D0=BE=D1=80=D0=B8?= =?UTF-8?q?=D1=82=D0=B5=D1=82=20=D0=BD=D0=B0=D0=B4=20bank=20cue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dist/services/addressIntentResolver.js | 3 +++ .../src/services/addressIntentResolver.ts | 8 ++++++++ .../tests/addressQueryRuntimeM23.test.ts | 18 ++++++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/llm_normalizer/backend/dist/services/addressIntentResolver.js b/llm_normalizer/backend/dist/services/addressIntentResolver.js index 911bd3b..0ede5ed 100644 --- a/llm_normalizer/backend/dist/services/addressIntentResolver.js +++ b/llm_normalizer/backend/dist/services/addressIntentResolver.js @@ -1645,6 +1645,9 @@ function resolveUnicodeAddressIntentBridge(text) { /(?:хвост|задержк|проблем|систематическ)/iu.test(normalized)) { return unicodeBridgeResolution("list_payables_counterparties", "high", "supplier_tail_risk_signal_detected"); } + if (hasDocumentCue && (hasCounterpartyCue || hasLooseCounterpartyByAnchor) && !hasContractCue) { + return unicodeBridgeResolution("list_documents_by_counterparty", "high", "unicode_documents_by_counterparty_bridge_signal_detected"); + } if (hasBankCue && (hasCounterpartyCue || hasLooseCounterpartyByAnchor) && !hasContractCue) { return unicodeBridgeResolution("bank_operations_by_counterparty", "high", "unicode_bank_ops_by_counterparty_bridge_signal_detected"); } diff --git a/llm_normalizer/backend/src/services/addressIntentResolver.ts b/llm_normalizer/backend/src/services/addressIntentResolver.ts index 43d12f5..4da36ec 100644 --- a/llm_normalizer/backend/src/services/addressIntentResolver.ts +++ b/llm_normalizer/backend/src/services/addressIntentResolver.ts @@ -2140,6 +2140,14 @@ function resolveUnicodeAddressIntentBridge(text: string): AddressIntentResolutio ); } + if (hasDocumentCue && (hasCounterpartyCue || hasLooseCounterpartyByAnchor) && !hasContractCue) { + return unicodeBridgeResolution( + "list_documents_by_counterparty", + "high", + "unicode_documents_by_counterparty_bridge_signal_detected" + ); + } + if (hasBankCue && (hasCounterpartyCue || hasLooseCounterpartyByAnchor) && !hasContractCue) { return unicodeBridgeResolution( "bank_operations_by_counterparty", diff --git a/llm_normalizer/backend/tests/addressQueryRuntimeM23.test.ts b/llm_normalizer/backend/tests/addressQueryRuntimeM23.test.ts index 72b8201..e8b2cce 100644 --- a/llm_normalizer/backend/tests/addressQueryRuntimeM23.test.ts +++ b/llm_normalizer/backend/tests/addressQueryRuntimeM23.test.ts @@ -2195,6 +2195,13 @@ describe("address intent resolver expansion (M2.3a)", () => { expect(result.intent).toBe("list_documents_by_counterparty"); }); + it("keeps document asks with numeric counterparty suffix out of bank operations", () => { + const result = resolveAddressIntent( + "\u041f\u043e\u043a\u0430\u0436\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u043f\u043e \u0416\u0443\u043a\u043e\u0432\u043a\u0435 51." + ); + expect(result.intent).toBe("list_documents_by_counterparty"); + }); + it("resolves transliterated docy slang as documents by counterparty intent", () => { const result = resolveAddressIntent("svk poka docy za 2020"); expect(result.intent).toBe("list_documents_by_counterparty"); @@ -3168,6 +3175,17 @@ describe("address filter extraction for balance drilldown", () => { expect(result.warnings).toContain("counterparty_anchor_derived_from_loose_by_phrase"); }); + it("extracts document counterparty anchor with numeric suffix without account leakage", () => { + const result = extractAddressFilters( + "\u041f\u043e\u043a\u0430\u0436\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u043f\u043e \u0416\u0443\u043a\u043e\u0432\u043a\u0435 51.", + "list_documents_by_counterparty" + ); + expect(result.extracted_filters.counterparty).toBe("\u0416\u0443\u043a\u043e\u0432\u043a\u0435 51"); + expect(result.extracted_filters.account).toBeUndefined(); + expect(result.missing_required_filters).toEqual([]); + expect(result.warnings).toContain("counterparty_anchor_derived_from_loose_by_phrase"); + }); + it("cuts trailing as-of date from contract anchor", () => { const result = extractAddressFilters( "Покажи документы по договору 1-ПМ/2020 на дату 31.07.2020",