Стабилизировать smoke-контракты агентского контура

This commit is contained in:
2026-05-24 11:15:20 +03:00
parent 9957f82c21
commit 801982b66b
10 changed files with 115 additions and 12 deletions
@@ -2425,6 +2425,18 @@ function resolveUnicodeAddressIntentBridge(text: string): AddressIntentResolutio
);
}
if (
/(?:незакрыт|открыт).*договор/iu.test(normalized) &&
/(?:\bна\b|по\s+состоянию|конец|дат)/iu.test(normalized) &&
!/(?:долг|задолж|хвост|висит|расчет|расчёт)/iu.test(normalized)
) {
return unicodeBridgeResolution(
"open_contracts_confirmed_as_of_date",
"high",
"unicode_open_contracts_snapshot_bridge_signal_detected"
);
}
if (/(?:договор[а-я]*.*(?:все|список).*по\s+[\p{L}\d]|(?:покажи|показать).*договор[а-я]*.*по\s+[\p{L}\d])/iu.test(normalized)) {
return unicodeBridgeResolution(
"list_contracts_by_counterparty",
@@ -2456,6 +2468,17 @@ function resolveUnicodeAddressIntentBridge(text: string): AddressIntentResolutio
);
}
if (
/(?:аванс[а-я]*\s+к\s+отгрузк|отгрузк[а-я]*[^\n]{0,80}аванс|аванс[а-я]*[^\n]{0,80}(?:закрыт|завис|перепривяз|спис)|завис[а-я]*\s+аванс)/iu.test(normalized) &&
/(?:давно|пора\s+закрыт|перепровер|подозрев|худш|проблем|завис|перепривяз|спис[а-я]*\s+как\s+нереальн)/iu.test(normalized)
) {
return unicodeBridgeResolution(
"list_open_contracts",
"high",
"unicode_old_advances_to_shipments_bridge_signal_detected"
);
}
if (
/(?:долгожител|долго\s+долж|задолженн(?:ост|остям).*(?:давн|долго)|не\s+плат|не\s+оплат|не\s+оплачен|неоплачен|просроч|сроки\s+давно\s+прошл|слишком\s+длинн.*оплат)/iu.test(
normalized
@@ -3771,6 +3771,14 @@ function hasDeepAnalysisPreferenceSignal(text) {
if (!lower) {
return false;
}
const openContractsListQuestionSignal =
/(?:незакрыт|не\s+закрыт|открыт|завис[а-я]*\s+аванс|аванс[а-я]*[^\n]{0,80}(?:закрыт|перепривяз|спис))/iu.test(lower) &&
/(?:договор|контракт|документ|аванс|отгрузк)/iu.test(lower) &&
/(?:какие|какой|где|покажи|показать|список|проверь|проверить|уточни)/iu.test(lower) &&
!/(?:разложи|разложить|цепочк|механизм|почему|root\s*cause|trace\s*chain|корнев[а-я]*\s+причин)/iu.test(lower);
if (openContractsListQuestionSignal) {
return false;
}
const riskOrAnomalySignal = /(?:\u0440\u0438\u0441\u043a|risk|\u0430\u043d\u043e\u043c\u0430\u043b|anomal|\u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447|\u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442|conflict|deviation|\u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d|\u043d\u0435\u0441\u044b\u043a\u043e\u0432\u043a|\u043d\u0435\u0441\u0445\u043e\u0434|\u043e\u0448\u0438\u0431|error|issue|\u043f\u0440\u043e\u0431\u043b\u0435\u043c)/iu.test(lower);
const chainSignal = /(?:\u0446\u0435\u043f\u043e\u0447\u043a|chain|trace\s*chain|lifecycle|\u0436\u0438\u0437\u043d\u0435\u043d\u043d[\u0430-\u044f]+\s+\u0446\u0438\u043a\u043b|state\s+transition|\u0440\u0430\u0437\u0440\u044b\u0432[\u0430-\u044f]*)/iu.test(lower);
const diagnosticsKeywordSignal = /(?:\u0440\u0430\u0437\u043b\u043e\u0436\u0438|\u0434\u0435\u043a\u043e\u043c\u043f\u043e\u0437|\u0440\u0430\u0437\u0431\u0435\u0440\u0438|\u043f\u043e\u0447\u0435\u043c\u0443|why|audit|scan|\u043a\u043e\u0440\u043d\u0435\u0432[\u0430-\u044f]+\s+\u043f\u0440\u0438\u0447\u0438\u043d|root\s*cause|\u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c[\u0430-\u044f]*|\u0433\u0434\u0435\s+\u0440\u0430\u0437\u0440\u044b\u0432|\u0447\u0442\u043e\s+\u043c\u0435\u0448\u0430[\u0430-\u044f]+\s+\u0437\u0430\u043a\u0440\u044b\u0442)/iu.test(lower);
@@ -3797,7 +3805,18 @@ function hasDirectDeepAnalysisSignal(text) {
if (!normalized) {
return false;
}
return /(?:\u0440\u0430\u0437\u043b\u043e\u0436|\u0446\u0435\u043f\u043e\u0447|lifecycle|\u0440\u0430\u0437\u0440\u044b\u0432|\u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447|\u0430\u043d\u043e\u043c\u0430\u043b|\u043f\u043e\u0447\u0435\u043c\u0443|\u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c|\u0437\u0430\u043a\u0440\u044b\u0442\u0438[\u0435\u044f]\s+\u043f\u0435\u0440\u0438\u043e\u0434|period\s*close|close\s+period|\u0447\u0442\u043e\s+\u043c\u0435\u0448\u0430[\u0430-\u044f]+\s+\u0437\u0430\u043a\u0440\u044b\u0442|state\s+transition|root\s*cause|trace\s*chain)/iu.test(normalized);
const fixedAssetAmortizationCompletenessSignal =
/(?:\u0430\u043c\u043e\u0440\u0442\u0438\u0437|\u043e\u0441\u043d\u043e\u0432\u043d[\u0430-\u044f]*\s+\u0441\u0440\u0435\u0434\u0441\u0442\u0432|fixed\s*asset|depreciat|\b\u043e\u0441\b|\b0?1\s*[/\\]\s*0?2\b|\u0441\u0447[\u0435\u0451]\u0442[^\n]{0,16}\b0?1\b[^\n]{0,16}\b0?2\b)/iu.test(normalized) &&
/(?:\u043f\u043e\u043b\u043d[\u0430-\u044f]*|\u043f\u0440\u043e\u043f\u0443\u0449|\u043d\u0430\u0447\u0438\u0441\u043b|\u043f\u0440\u043e\u0432\u0435\u0440|\u043e\u0431\u044a\u0435\u043a\u0442|coverage|missing|expected|actual)/iu.test(normalized);
const deferredExpenseDeepSignal =
/(?:\b97(?:[.,]\d{1,2})?\b|\u0440\u0431\u043f|\u0440\u0430\u0441\u0445\u043e\u0434[\u044b\u043e\u0432\s]+\u0431\u0443\u0434\u0443\u0449[\u0438\u0445\u0435]\s+\u043f\u0435\u0440\u0438\u043e\u0434|deferred)/iu.test(normalized) &&
/(?:\u0441\u0447[\u0435\u0451]\u0442|\u043f\u0435\u0440\u0438\u043e\u0434|\u0437\u0430\s+20\d{2}|\u0445\u0432\u043e\u0441\u0442|\u0441\u043f\u0438\u0441\u0430\u043d|\u043e\u0441\u0442\u0430\u0442|\u043e\u0442\u0434\u0435\u043b\u044c\u043d|\u043f\u0440\u043e\u0432\u0435\u0440|account|period|writeoff|tail)/iu.test(normalized);
const actualExpectedStateConflictSignal =
/(?:\u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a[\u0430-\u044f]*[^\n]{0,80}\u043e\u0436\u0438\u0434\u0430\u0435\u043c|\u043e\u0436\u0438\u0434\u0430\u0435\u043c[\u0430-\u044f]*[^\n]{0,80}\u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a|actual[^\n]{0,80}expected|expected[^\n]{0,80}actual|\u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442[^\n]{0,80}(?:\u0441\u043e\u0441\u0442\u043e\u044f\u043d|\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442|\u0440\u0435\u0433\u0438\u0441\u0442\u0440|\u043f\u0440\u043e\u0432\u043e\u0434\u043a|\u0432\u0435\u0442\u0432))/iu.test(normalized);
return fixedAssetAmortizationCompletenessSignal ||
deferredExpenseDeepSignal ||
actualExpectedStateConflictSignal ||
/(?:\u0440\u0430\u0437\u043b\u043e\u0436|\u0446\u0435\u043f\u043e\u0447|lifecycle|\u0440\u0430\u0437\u0440\u044b\u0432|\u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447|\u0430\u043d\u043e\u043c\u0430\u043b|\u043f\u043e\u0447\u0435\u043c\u0443|\u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c|\u0437\u0430\u043a\u0440\u044b\u0442\u0438[\u0435\u044f]\s+\u043f\u0435\u0440\u0438\u043e\u0434|period\s*close|close\s+period|\u0447\u0442\u043e\s+\u043c\u0435\u0448\u0430[\u0430-\u044f]+\s+\u0437\u0430\u043a\u0440\u044b\u0442|state\s+transition|root\s*cause|trace\s*chain)/iu.test(normalized);
}
function hasStrictDeepInvestigationCue(text) {
const normalized = compactWhitespace(repairAddressMojibake(String(text ?? "")).toLowerCase());