ГЛОБАЛЬНЫЙ РЕФАКТОРИНГ АРХИТЕКТУРЫ - Этап 4.2: унифицирован fallback-ответ в 5-блочный контракт и обновлены регрессии

This commit is contained in:
2026-04-12 01:13:39 +03:00
parent 5a8edfb4f3
commit 522575c7cc
4 changed files with 109 additions and 22 deletions
+36 -8
View File
@@ -1635,6 +1635,13 @@ function buildBoundaryQuickActionLine(capabilities) {
}
return `Что могу сделать сейчас: ${actions.join("; ")}.`;
}
function buildBoundaryQuickActionItems(capabilities) {
const actions = capabilities
.slice(0, 3)
.map((item) => item.replace(/:\s*/u, " — ").trim())
.filter((item) => item.length > 0);
return uniqueStrings(actions, 3);
}
function buildNaturalClarificationHints(input) {
const hints = [];
if (input.missingAnchors.period) {
@@ -1686,16 +1693,27 @@ function shouldUseBoundaryFallbackReply(input) {
function buildBoundaryFallbackReply(input) {
const nearbyCapabilities = pickBoundaryCapabilityLines(input.userMessage, 3);
const quickActionLine = buildBoundaryQuickActionLine(nearbyCapabilities);
const quickActionItems = buildBoundaryQuickActionItems(nearbyCapabilities);
if (input.focusDomain === null) {
const heading = pickDeterministicBoundaryVariant(input.userMessage, [
"По этому запросу у меня нет надежного доменного покрытия, поэтому даю мягкий отказ вместо технического шаблона.",
"Сейчас у меня нет надежного доменного маршрута по этому запросу, поэтому даю мягкий отказ вместо шаблонной технички."
]);
return sanitizeUserFacingReply([
heading,
nearbyCapabilities.length > 0 ? `Что могу сделать рядом по смыслу:\n${formatList(nearbyCapabilities)}` : "",
quickActionLine ?? "",
"Переформулируй вопрос через один из вариантов выше, и я сразу перейду к проверке по данным 1С."
`Коротко: ${ensureSentence(heading)}`,
`Что именно проверено:\n${formatList([
"Проверен доступный контур 1С и возможность маршрутизации запроса.",
"Надежный доменный путь для текущей формулировки не подтвержден."
])}`,
`Что найдено:\n${formatList(nearbyCapabilities.length > 0
? nearbyCapabilities
: ["Близких поддерживаемых сценариев по текущей формулировке не найдено."])}`,
`Что пока не доказано:\n${formatList([
"Запрос не подтвержден в поддерживаемом контуре как надежный бухгалтерский сценарий."
])}`,
`Что могу сделать сейчас:\n${formatList(quickActionItems.length > 0
? quickActionItems
: [quickActionLine ?? "Переформулируйте вопрос через период, счет или объект, и я сразу продолжу проверку."])}`
]
.filter(Boolean)
.join("\n\n"));
@@ -1709,10 +1727,20 @@ function buildBoundaryFallbackReply(input) {
`По сценарию ${formatNarrativeDomainLabel(input.focusDomain)} пока не хватает подтвержденной опоры для надежного вывода.`
]);
return sanitizeUserFacingReply([
domainHeading,
clarificationHints.length > 0 ? `Чтобы сразу перейти к проверке, уточни:\n${formatList(clarificationHints)}` : "",
nearbyCapabilities.length > 0 ? `Если удобнее, могу начать с близкого сценария:\n${formatList(nearbyCapabilities.slice(0, 2))}` : "",
quickActionLine ?? ""
`Коротко: ${ensureSentence(domainHeading)}`,
`Что именно проверено:\n${formatList([
`Проверен сценарий ${formatNarrativeDomainLabel(input.focusDomain)} в текущем контуре 1С.`,
"Оценена достаточность подтвержденной опоры для прямого вывода."
])}`,
`Что найдено:\n${formatList(nearbyCapabilities.length > 0
? nearbyCapabilities.slice(0, 2)
: ["Подтвержденных близких сценариев в текущем проходе не найдено."])}`,
`Что пока не доказано:\n${formatList(clarificationHints.length > 0
? clarificationHints
: ["Без дополнительного ориентира (период, объект или контрагент) вывод останется частичным."])}`,
`Что могу сделать сейчас:\n${formatList(quickActionItems.length > 0
? quickActionItems
: [quickActionLine ?? "Добавьте один уточняющий ориентир, и я продолжу проверку без смены контура."])}`
]
.filter(Boolean)
.join("\n\n"));