АДРЕСНЫЙ РЕЖИМ -ADDRESS: убран ложный factual fallback в open_items при неподтвержденном якоре + добавлен регресс-тест

This commit is contained in:
dctouch 2026-04-02 13:39:08 +03:00
parent 4dff069ae3
commit cc7fcabf05
32 changed files with 72790 additions and 180 deletions

View File

@ -0,0 +1,63 @@
# Global Execution Checklist V1
Дата старта: 2026-04-02
Цель: последовательное закрытие V1 без архитектурного дрейфа и без company-specific хардкода.
## Правило выполнения
- Идем по пунктам сверху вниз.
- Каждый пункт закрываем только после live-прогона и фиксации артефакта в `docs/ADDRESS/runs/...`.
- Критерий качества: `strict_policy=route`, `false_factual_rate=0`, объяснимый debug trace.
## Текущий статус (срез)
- [x] `OPEN_ITEMS` стабилизация (as_of, recovery, fallback) + фокус-прогон `7/7`.
Артефакт: `docs/ADDRESS/runs/2026-04-02_Address_Slang_Live_Stress_2026-04-02_11-54-08/run_summary.json`
- [x] Полный live regression по `address_slang_stress_full_2026-04-02.json` (102 кейса) выполнен.
Артефакт: `docs/ADDRESS/runs/2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-28-31/run_summary.json`
Результат: `route_pass=79/102 (77.45%)`, `factual=74`, `partial=28`.
- [ ] Единый acceptance baseline для релизного gate.
- [ ] Дожать follow-up цепочки (контекстные короткие реплики).
- [ ] Domain expansion без деградации текущих intents.
- [ ] CI/nightly automation для обязательного прогона regression-пака.
## Очередь задач
1. Full regression baseline (102 кейса)
- Прогон полного вопросника в live.
- Сохранение `run_summary.json`, `full_live_results.json`, `failures_only.json`.
- Фиксация pass-rate и топ-ошибок.
- Статус: выполнено, нужна итерация hardening до целевого gate.
2. Follow-up hardening
- Проверка цепей вида: «а теперь ...», «на ту же дату», «по тому же договору».
- Закрытие системных кейсов в tests + live-pack.
3. Resolver hardening (metadata-first)
- Усилить резолв якорей через live-данные, без словарей под конкретную базу.
- Снизить `materialized_but_not_anchor_matched` без ложных factual.
4. Domain expansion
- Расширить покрытие intents по матрице readiness.
- Для каждого нового intent: recipe + tests + live acceptance.
5. Release gate automation
- Закрепить обязательный регресс-порог перед релизом.
- Добавить nightly запуск полного пака и сводный отчет.
## Ближайший шаг
`Step-2`: закрыть кластеры из `failures_only.json` (top: `empty_match` в by-counterparty/by-contract) и поднять `route_pass` до релизного порога.
## Latest Update (2026-04-02)
- Full live stress rerun: `docs/ADDRESS/runs/2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-57-27/run_summary.json`
- Result: `route_pass=102/102 (100%)`, `strict_pass(route)=102/102`, `semantic_pass=102/102`
- Hardening applied:
- safer document-intent recipe filter fallback (avoid zeroing matched rows when registrator labels are noisy)
- contract anchor cleanup for tails like `year 2020` / trailing separated year
- Acceptance baseline for current 102-case pack: reached.
## Next Step
`Step-3`: follow-up context chains and domain expansion under the same release gate (`strict_policy=route`, no blocked routes).

View File

@ -0,0 +1,7 @@
[
"Покажи открытые позиции по договору 15/24",
"Есть ли незакрытые позиции по договору 15/24 на 2020-12",
"Есть ли незакрытые позиции по договору 15/24 на 2020-11",
"Есть ли незакрытые позиции по договору 15/24 на 2022-12",
"Есть ли незакрытые позиции по договору 15/24 на 2014-12-31"
]

View File

@ -0,0 +1,140 @@
[
{
"id": "S001",
"text": "свк доки за 2020 покаж пж",
"expected_intent": "list_documents_by_counterparty",
"expected_mode": "address_query"
},
{
"id": "S004",
"text": "какие у свк есть доки за 2020?",
"expected_intent": "list_documents_by_counterparty",
"expected_mode": "address_query"
},
{
"id": "S009",
"text": "docs by counterparty svk year 2020",
"expected_intent": "list_documents_by_counterparty",
"expected_mode": "address_query"
},
{
"id": "S011",
"text": "плс доки по свк 2020",
"expected_intent": "list_documents_by_counterparty",
"expected_mode": "address_query"
},
{
"id": "S018",
"text": "че у свк по банку за 2020",
"expected_intent": "bank_operations_by_counterparty",
"expected_mode": "address_query"
},
{
"id": "S019",
"text": "свк списания/поступления за 2020",
"expected_intent": "bank_operations_by_counterparty",
"expected_mode": "address_query"
},
{
"id": "S036",
"text": "из чего состоит остаток по счету 60 на 2020.05",
"expected_intent": "documents_forming_balance",
"expected_mode": "address_query"
},
{
"id": "S040",
"text": "бля, какие доки формируют остаток 60.01 на 2020-05-31",
"expected_intent": "documents_forming_balance",
"expected_mode": "address_query"
},
{
"id": "S043",
"text": "покажи документы по договору 15/24 за 2020",
"expected_intent": "list_documents_by_contract",
"expected_mode": "address_query"
},
{
"id": "S046",
"text": "docs by contract 15/24 year 2020",
"expected_intent": "list_documents_by_contract",
"expected_mode": "address_query"
},
{
"id": "S049",
"text": "плс документы РґРѕРіРѕРІРѕСЂ в„15/24",
"expected_intent": "list_documents_by_contract",
"expected_mode": "address_query"
},
{
"id": "S054",
"text": "bank ops by contract 15/24",
"expected_intent": "bank_operations_by_contract",
"expected_mode": "address_query"
},
{
"id": "X001",
"text": "СЃРІРє РґРѕРєРё РєРёРЅСЊ Р·Р° 2020",
"expected_intent": "list_documents_by_counterparty",
"expected_mode": "address_query"
},
{
"id": "X006",
"text": "бля покаж свк документы 2020",
"expected_intent": "list_documents_by_counterparty",
"expected_mode": "address_query"
},
{
"id": "X007",
"text": "свк банк операции за 2020",
"expected_intent": "bank_operations_by_counterparty",
"expected_mode": "address_query"
},
{
"id": "X008",
"text": "по свк выписку банка за 2020 выведи",
"expected_intent": "bank_operations_by_counterparty",
"expected_mode": "address_query"
},
{
"id": "X009",
"text": "свк платежки за 2020",
"expected_intent": "bank_operations_by_counterparty",
"expected_mode": "address_query"
},
{
"id": "X012",
"text": "ёпт по свк че по банку 2020",
"expected_intent": "bank_operations_by_counterparty",
"expected_mode": "address_query"
},
{
"id": "X028",
"text": "бля из чего состоит остаток по 60.01 на 2020-05-31",
"expected_intent": "documents_forming_balance",
"expected_mode": "address_query"
},
{
"id": "X029",
"text": "РґРѕРєРё РїРѕ РґРѕРіРѕРІРѕСЂСѓ 15/24 Р·Р° 2020",
"expected_intent": "list_documents_by_contract",
"expected_mode": "address_query"
},
{
"id": "X033",
"text": "договор 15/24 выведи доки",
"expected_intent": "list_documents_by_contract",
"expected_mode": "address_query"
},
{
"id": "X038",
"text": "bank ops by contract 15/24",
"expected_intent": "bank_operations_by_contract",
"expected_mode": "address_query"
},
{
"id": "X039",
"text": "покажи банк опер по дог 15/24 пж",
"expected_intent": "bank_operations_by_contract",
"expected_mode": "address_query"
}
]

View File

@ -0,0 +1,88 @@
# Assistant conversation export
session_id: wave13-chat20-1775126062978
exported_at: 2026-04-02T10:34:32.613Z
## 1. user
message_id: pending
created_at: pending
reply_type: n/a
Покажи открытые позиции по договору 15/24
## 2. assistant
message_id: msg-BYRQm9nr66
created_at: 2026-04-02T10:34:24.625Z
reply_type: partial_coverage
trace_id: address-_MiEWNRqbX
В live-данных по текущему фильтру записи не найдены.
Причина: по указанному якорю и фильтрам в live-выборке нет строк.
Что нужно уточнить: уточните период или снимите часть фильтров.
## 3. user
message_id: pending
created_at: pending
reply_type: n/a
Есть ли незакрытые позиции по договору 15/24 на 2020-12
## 4. assistant
message_id: msg-Sy2FeXL7BJ
created_at: 2026-04-02T10:34:26.562Z
reply_type: partial_coverage
trace_id: address-7TnGVSBbAN
В live-данных по текущему фильтру записи не найдены.
Причина: по указанному якорю и фильтрам в live-выборке нет строк.
Что нужно уточнить: уточните период или снимите часть фильтров.
## 5. user
message_id: pending
created_at: pending
reply_type: n/a
Есть ли незакрытые позиции по договору 15/24 на 2020-11
## 6. assistant
message_id: msg-7wG-3gqDYn
created_at: 2026-04-02T10:34:28.529Z
reply_type: partial_coverage
trace_id: address-TuD-HTz5gZ
В live-данных по текущему фильтру записи не найдены.
Причина: по указанному якорю и фильтрам в live-выборке нет строк.
Что нужно уточнить: уточните период или снимите часть фильтров.
## 7. user
message_id: pending
created_at: pending
reply_type: n/a
Есть ли незакрытые позиции по договору 15/24 на 2022-12
## 8. assistant
message_id: msg-kDLkjnm1OX
created_at: 2026-04-02T10:34:30.550Z
reply_type: partial_coverage
trace_id: address-gC5K4IEX-M
В live-данных по текущему фильтру записи не найдены.
Причина: по указанному якорю и фильтрам в live-выборке нет строк.
Что нужно уточнить: уточните период или снимите часть фильтров.
## 9. user
message_id: pending
created_at: pending
reply_type: n/a
Есть ли незакрытые позиции по договору 15/24 на 2014-12-31
## 10. assistant
message_id: msg-KZ-gXsKJo2
created_at: 2026-04-02T10:34:32.610Z
reply_type: partial_coverage
trace_id: address-uCS8z5ZCYE
В live-данных по текущему фильтру записи не найдены.
Причина: по указанному якорю и фильтрам в live-выборке нет строк.
Что нужно уточнить: уточните период или снимите часть фильтров.

View File

@ -0,0 +1,589 @@
{
"session_id": "wave13-chat20-1775126062978",
"exported_at": "2026-04-02T10:34:32.613Z",
"cases_total": 5,
"rows": [
{
"case_id": "t01",
"user_message": "Покажи открытые позиции по договору 15/24",
"assistant_reply": "В live-данных по текущему фильтру записи не найдены.\nПричина: по указанному якорю и фильтрам в live-выборке нет строк.\nЧто нужно уточнить: уточните период или снимите часть фильтров.",
"reply_type": "partial_coverage",
"message_id": "msg-BYRQm9nr66",
"created_at": "2026-04-02T10:34:24.625Z",
"trace_id": "address-_MiEWNRqbX",
"http_status": 200,
"debug": {
"trace_id": "address-_MiEWNRqbX",
"prompt_version": "address_query_runtime_v1",
"schema_version": "address_query_runtime_v1",
"fallback_type": "partial",
"route_summary": null,
"fragments": [],
"requirements_extracted": [],
"coverage_report": {
"requirements_total": 0,
"requirements_covered": 0,
"requirements_uncovered": [],
"requirements_partially_covered": [],
"clarification_needed_for": [],
"out_of_scope_requirements": []
},
"routes": [],
"retrieval_status": [],
"retrieval_results": [],
"answer_grounding_check": {
"status": "partial",
"route_subject_match": true,
"missing_requirements": [],
"reasons": [
"address_action_detected",
"address_entity_detected",
"object_signal_detected",
"open_items_signal_detected"
],
"why_included_summary": [],
"selection_reason_summary": []
},
"dropped_intent_segments": [],
"detected_mode": "address_query",
"detected_mode_confidence": "high",
"query_shape": "OBJECT_LOOKUP",
"query_shape_confidence": "medium",
"detected_intent": "open_items_by_counterparty_or_contract",
"detected_intent_confidence": "medium",
"extracted_filters": {
"sort": "period_desc",
"limit": 20,
"contract": "15/24"
},
"missing_required_filters": [],
"selected_recipe": "address_open_items_by_party_or_contract_v1",
"mcp_call_status_legacy": "materialized_but_not_matched",
"account_scope_mode": "preferred",
"account_scope_fallback_applied": true,
"anchor_type": "contract",
"anchor_value_raw": "15/24",
"anchor_value_resolved": "15/24",
"resolver_confidence": "medium",
"ambiguity_count": 0,
"match_failure_stage": "materialized_but_not_anchor_matched",
"match_failure_reason": "contract_anchor_not_matched_in_materialized_rows",
"mcp_call_status": "materialized_but_not_anchor_matched",
"rows_fetched": 20,
"raw_rows_received": 20,
"rows_after_account_scope": 20,
"rows_after_recipe_filter": 0,
"rows_materialized": 20,
"rows_matched": 0,
"raw_row_keys_sample": [
"Период",
"Регистратор",
"СчетДт",
"СчетКт",
"Сумма",
"Period",
"Registrator",
"AccountDt",
"AccountKt",
"Amount"
],
"materialization_drop_reason": "none",
"account_token_raw": null,
"account_token_normalized": null,
"account_scope_fields_checked": [
"account_dt",
"account_kt",
"registrator",
"analytics"
],
"account_scope_match_strategy": "account_code_regex_plus_alias_map_v1",
"account_scope_drop_reason": "not_applicable",
"runtime_readiness": "LIVE_QUERYABLE_WITH_LIMITS",
"limited_reason_category": "empty_match",
"response_type": "LIMITED_WITH_REASON",
"execution_lane": "address_query",
"llm_decomposition_applied": false,
"llm_decomposition_attempted": true,
"llm_provider_used": null,
"llm_decomposition_trace_id": null,
"llm_decomposition_effective_message": "Покажи открытые позиции по договору 15/24",
"llm_decomposition_reason": "error:OpenAI API key is missing.",
"fallback_rule_hit": null,
"sanitized_user_message": "покажи открытые позиции по договору 15/24",
"tool_gate_decision": "run_address_lane",
"tool_gate_reason": "address_mode_classifier_detected",
"answer_structure_v11": null,
"investigation_state_snapshot": null,
"normalized": null,
"normalizer_output": null
}
},
{
"case_id": "t02",
"user_message": "Есть ли незакрытые позиции по договору 15/24 на 2020-12",
"assistant_reply": "В live-данных по текущему фильтру записи не найдены.\nПричина: по указанному якорю и фильтрам в live-выборке нет строк.\nЧто нужно уточнить: уточните период или снимите часть фильтров.",
"reply_type": "partial_coverage",
"message_id": "msg-Sy2FeXL7BJ",
"created_at": "2026-04-02T10:34:26.562Z",
"trace_id": "address-7TnGVSBbAN",
"http_status": 200,
"debug": {
"trace_id": "address-7TnGVSBbAN",
"prompt_version": "address_query_runtime_v1",
"schema_version": "address_query_runtime_v1",
"fallback_type": "partial",
"route_summary": null,
"fragments": [],
"requirements_extracted": [],
"coverage_report": {
"requirements_total": 0,
"requirements_covered": 0,
"requirements_uncovered": [],
"requirements_partially_covered": [],
"clarification_needed_for": [],
"out_of_scope_requirements": []
},
"routes": [],
"retrieval_status": [],
"retrieval_results": [],
"answer_grounding_check": {
"status": "partial",
"route_subject_match": true,
"missing_requirements": [],
"reasons": [
"address_action_detected",
"address_entity_detected",
"verify_signal_detected",
"open_items_signal_detected"
],
"why_included_summary": [],
"selection_reason_summary": []
},
"dropped_intent_segments": [],
"detected_mode": "address_query",
"detected_mode_confidence": "high",
"query_shape": "VERIFY_FACTUAL",
"query_shape_confidence": "medium",
"detected_intent": "open_items_by_counterparty_or_contract",
"detected_intent_confidence": "medium",
"extracted_filters": {
"sort": "period_desc",
"limit": 20,
"contract": "15/24",
"period_from": "2020-12-01",
"period_to": "2020-12-31"
},
"missing_required_filters": [],
"selected_recipe": "address_open_items_by_party_or_contract_v1",
"mcp_call_status_legacy": "materialized_but_not_matched",
"account_scope_mode": "preferred",
"account_scope_fallback_applied": true,
"anchor_type": "contract",
"anchor_value_raw": "15/24",
"anchor_value_resolved": "15/24",
"resolver_confidence": "medium",
"ambiguity_count": 0,
"match_failure_stage": "materialized_but_not_anchor_matched",
"match_failure_reason": "contract_anchor_not_matched_in_materialized_rows",
"mcp_call_status": "materialized_but_not_anchor_matched",
"rows_fetched": 20,
"raw_rows_received": 20,
"rows_after_account_scope": 20,
"rows_after_recipe_filter": 0,
"rows_materialized": 20,
"rows_matched": 0,
"raw_row_keys_sample": [
"Период",
"Регистратор",
"СчетДт",
"СчетКт",
"Сумма",
"Period",
"Registrator",
"AccountDt",
"AccountKt",
"Amount"
],
"materialization_drop_reason": "none",
"account_token_raw": null,
"account_token_normalized": null,
"account_scope_fields_checked": [
"account_dt",
"account_kt",
"registrator",
"analytics"
],
"account_scope_match_strategy": "account_code_regex_plus_alias_map_v1",
"account_scope_drop_reason": "not_applicable",
"runtime_readiness": "LIVE_QUERYABLE_WITH_LIMITS",
"limited_reason_category": "empty_match",
"response_type": "LIMITED_WITH_REASON",
"execution_lane": "address_query",
"llm_decomposition_applied": false,
"llm_decomposition_attempted": true,
"llm_provider_used": null,
"llm_decomposition_trace_id": null,
"llm_decomposition_effective_message": "Есть ли незакрытые позиции по договору 15/24 на 2020-12",
"llm_decomposition_reason": "error:OpenAI API key is missing.",
"fallback_rule_hit": null,
"sanitized_user_message": "есть ли незакрытые позиции по договору 15/24 на 2020-12",
"tool_gate_decision": "run_address_lane",
"tool_gate_reason": "address_mode_classifier_detected",
"answer_structure_v11": null,
"investigation_state_snapshot": null,
"normalized": null,
"normalizer_output": null
}
},
{
"case_id": "t03",
"user_message": "Есть ли незакрытые позиции по договору 15/24 на 2020-11",
"assistant_reply": "В live-данных по текущему фильтру записи не найдены.\nПричина: по указанному якорю и фильтрам в live-выборке нет строк.\nЧто нужно уточнить: уточните период или снимите часть фильтров.",
"reply_type": "partial_coverage",
"message_id": "msg-7wG-3gqDYn",
"created_at": "2026-04-02T10:34:28.529Z",
"trace_id": "address-TuD-HTz5gZ",
"http_status": 200,
"debug": {
"trace_id": "address-TuD-HTz5gZ",
"prompt_version": "address_query_runtime_v1",
"schema_version": "address_query_runtime_v1",
"fallback_type": "partial",
"route_summary": null,
"fragments": [],
"requirements_extracted": [],
"coverage_report": {
"requirements_total": 0,
"requirements_covered": 0,
"requirements_uncovered": [],
"requirements_partially_covered": [],
"clarification_needed_for": [],
"out_of_scope_requirements": []
},
"routes": [],
"retrieval_status": [],
"retrieval_results": [],
"answer_grounding_check": {
"status": "partial",
"route_subject_match": true,
"missing_requirements": [],
"reasons": [
"address_action_detected",
"address_entity_detected",
"verify_signal_detected",
"open_items_signal_detected"
],
"why_included_summary": [],
"selection_reason_summary": []
},
"dropped_intent_segments": [],
"detected_mode": "address_query",
"detected_mode_confidence": "high",
"query_shape": "VERIFY_FACTUAL",
"query_shape_confidence": "medium",
"detected_intent": "open_items_by_counterparty_or_contract",
"detected_intent_confidence": "medium",
"extracted_filters": {
"sort": "period_desc",
"limit": 20,
"contract": "15/24",
"period_from": "2020-11-01",
"period_to": "2020-11-30"
},
"missing_required_filters": [],
"selected_recipe": "address_open_items_by_party_or_contract_v1",
"mcp_call_status_legacy": "materialized_but_not_matched",
"account_scope_mode": "preferred",
"account_scope_fallback_applied": true,
"anchor_type": "contract",
"anchor_value_raw": "15/24",
"anchor_value_resolved": "15/24",
"resolver_confidence": "medium",
"ambiguity_count": 0,
"match_failure_stage": "materialized_but_not_anchor_matched",
"match_failure_reason": "contract_anchor_not_matched_in_materialized_rows",
"mcp_call_status": "materialized_but_not_anchor_matched",
"rows_fetched": 20,
"raw_rows_received": 20,
"rows_after_account_scope": 20,
"rows_after_recipe_filter": 0,
"rows_materialized": 20,
"rows_matched": 0,
"raw_row_keys_sample": [
"Период",
"Регистратор",
"СчетДт",
"СчетКт",
"Сумма",
"Period",
"Registrator",
"AccountDt",
"AccountKt",
"Amount"
],
"materialization_drop_reason": "none",
"account_token_raw": null,
"account_token_normalized": null,
"account_scope_fields_checked": [
"account_dt",
"account_kt",
"registrator",
"analytics"
],
"account_scope_match_strategy": "account_code_regex_plus_alias_map_v1",
"account_scope_drop_reason": "not_applicable",
"runtime_readiness": "LIVE_QUERYABLE_WITH_LIMITS",
"limited_reason_category": "empty_match",
"response_type": "LIMITED_WITH_REASON",
"execution_lane": "address_query",
"llm_decomposition_applied": false,
"llm_decomposition_attempted": true,
"llm_provider_used": null,
"llm_decomposition_trace_id": null,
"llm_decomposition_effective_message": "Есть ли незакрытые позиции по договору 15/24 на 2020-11",
"llm_decomposition_reason": "error:OpenAI API key is missing.",
"fallback_rule_hit": null,
"sanitized_user_message": "есть ли незакрытые позиции по договору 15/24 на 2020-11",
"tool_gate_decision": "run_address_lane",
"tool_gate_reason": "address_mode_classifier_detected",
"answer_structure_v11": null,
"investigation_state_snapshot": null,
"normalized": null,
"normalizer_output": null
}
},
{
"case_id": "t04",
"user_message": "Есть ли незакрытые позиции по договору 15/24 на 2022-12",
"assistant_reply": "В live-данных по текущему фильтру записи не найдены.\nПричина: по указанному якорю и фильтрам в live-выборке нет строк.\nЧто нужно уточнить: уточните период или снимите часть фильтров.",
"reply_type": "partial_coverage",
"message_id": "msg-kDLkjnm1OX",
"created_at": "2026-04-02T10:34:30.550Z",
"trace_id": "address-gC5K4IEX-M",
"http_status": 200,
"debug": {
"trace_id": "address-gC5K4IEX-M",
"prompt_version": "address_query_runtime_v1",
"schema_version": "address_query_runtime_v1",
"fallback_type": "partial",
"route_summary": null,
"fragments": [],
"requirements_extracted": [],
"coverage_report": {
"requirements_total": 0,
"requirements_covered": 0,
"requirements_uncovered": [],
"requirements_partially_covered": [],
"clarification_needed_for": [],
"out_of_scope_requirements": []
},
"routes": [],
"retrieval_status": [],
"retrieval_results": [],
"answer_grounding_check": {
"status": "partial",
"route_subject_match": true,
"missing_requirements": [],
"reasons": [
"address_action_detected",
"address_entity_detected",
"verify_signal_detected",
"open_items_signal_detected"
],
"why_included_summary": [],
"selection_reason_summary": []
},
"dropped_intent_segments": [],
"detected_mode": "address_query",
"detected_mode_confidence": "high",
"query_shape": "VERIFY_FACTUAL",
"query_shape_confidence": "medium",
"detected_intent": "open_items_by_counterparty_or_contract",
"detected_intent_confidence": "medium",
"extracted_filters": {
"sort": "period_desc",
"limit": 20,
"contract": "15/24",
"period_from": "2022-12-01",
"period_to": "2022-12-31"
},
"missing_required_filters": [],
"selected_recipe": "address_open_items_by_party_or_contract_v1",
"mcp_call_status_legacy": "materialized_but_not_matched",
"account_scope_mode": "preferred",
"account_scope_fallback_applied": true,
"anchor_type": "contract",
"anchor_value_raw": "15/24",
"anchor_value_resolved": "15/24",
"resolver_confidence": "medium",
"ambiguity_count": 0,
"match_failure_stage": "materialized_but_not_anchor_matched",
"match_failure_reason": "contract_anchor_not_matched_in_materialized_rows",
"mcp_call_status": "materialized_but_not_anchor_matched",
"rows_fetched": 10,
"raw_rows_received": 10,
"rows_after_account_scope": 10,
"rows_after_recipe_filter": 0,
"rows_materialized": 10,
"rows_matched": 0,
"raw_row_keys_sample": [
"Период",
"Регистратор",
"СчетДт",
"СчетКт",
"Сумма",
"Period",
"Registrator",
"AccountDt",
"AccountKt",
"Amount"
],
"materialization_drop_reason": "none",
"account_token_raw": null,
"account_token_normalized": null,
"account_scope_fields_checked": [
"account_dt",
"account_kt",
"registrator",
"analytics"
],
"account_scope_match_strategy": "account_code_regex_plus_alias_map_v1",
"account_scope_drop_reason": "not_applicable",
"runtime_readiness": "LIVE_QUERYABLE_WITH_LIMITS",
"limited_reason_category": "empty_match",
"response_type": "LIMITED_WITH_REASON",
"execution_lane": "address_query",
"llm_decomposition_applied": false,
"llm_decomposition_attempted": true,
"llm_provider_used": null,
"llm_decomposition_trace_id": null,
"llm_decomposition_effective_message": "Есть ли незакрытые позиции по договору 15/24 на 2022-12",
"llm_decomposition_reason": "error:OpenAI API key is missing.",
"fallback_rule_hit": null,
"sanitized_user_message": "есть ли незакрытые позиции по договору 15/24 на 2022-12",
"tool_gate_decision": "run_address_lane",
"tool_gate_reason": "address_mode_classifier_detected",
"answer_structure_v11": null,
"investigation_state_snapshot": null,
"normalized": null,
"normalizer_output": null
}
},
{
"case_id": "t05",
"user_message": "Есть ли незакрытые позиции по договору 15/24 на 2014-12-31",
"assistant_reply": "В live-данных по текущему фильтру записи не найдены.\nПричина: по указанному якорю и фильтрам в live-выборке нет строк.\nЧто нужно уточнить: уточните период или снимите часть фильтров.",
"reply_type": "partial_coverage",
"message_id": "msg-KZ-gXsKJo2",
"created_at": "2026-04-02T10:34:32.610Z",
"trace_id": "address-uCS8z5ZCYE",
"http_status": 200,
"debug": {
"trace_id": "address-uCS8z5ZCYE",
"prompt_version": "address_query_runtime_v1",
"schema_version": "address_query_runtime_v1",
"fallback_type": "partial",
"route_summary": null,
"fragments": [],
"requirements_extracted": [],
"coverage_report": {
"requirements_total": 0,
"requirements_covered": 0,
"requirements_uncovered": [],
"requirements_partially_covered": [],
"clarification_needed_for": [],
"out_of_scope_requirements": []
},
"routes": [],
"retrieval_status": [],
"retrieval_results": [],
"answer_grounding_check": {
"status": "partial",
"route_subject_match": true,
"missing_requirements": [],
"reasons": [
"address_action_detected",
"address_entity_detected",
"verify_signal_detected",
"open_items_signal_detected"
],
"why_included_summary": [],
"selection_reason_summary": []
},
"dropped_intent_segments": [],
"detected_mode": "address_query",
"detected_mode_confidence": "high",
"query_shape": "VERIFY_FACTUAL",
"query_shape_confidence": "medium",
"detected_intent": "open_items_by_counterparty_or_contract",
"detected_intent_confidence": "medium",
"extracted_filters": {
"sort": "period_desc",
"limit": 20,
"contract": "15/24",
"as_of_date": "2014-12-31"
},
"missing_required_filters": [],
"selected_recipe": "address_open_items_by_party_or_contract_v1",
"mcp_call_status_legacy": "materialized_but_not_matched",
"account_scope_mode": "preferred",
"account_scope_fallback_applied": false,
"anchor_type": "contract",
"anchor_value_raw": "15/24",
"anchor_value_resolved": "15/24",
"resolver_confidence": "medium",
"ambiguity_count": 0,
"match_failure_stage": "materialized_but_not_anchor_matched",
"match_failure_reason": "contract_anchor_not_matched_in_materialized_rows",
"mcp_call_status": "materialized_but_not_anchor_matched",
"rows_fetched": 20,
"raw_rows_received": 20,
"rows_after_account_scope": 2,
"rows_after_recipe_filter": 0,
"rows_materialized": 2,
"rows_matched": 0,
"raw_row_keys_sample": [
"Период",
"Регистратор",
"СчетДт",
"СчетКт",
"Сумма",
"Period",
"Registrator",
"AccountDt",
"AccountKt",
"Amount"
],
"materialization_drop_reason": "none",
"account_token_raw": null,
"account_token_normalized": null,
"account_scope_fields_checked": [
"account_dt",
"account_kt",
"registrator",
"analytics"
],
"account_scope_match_strategy": "account_code_regex_plus_alias_map_v1",
"account_scope_drop_reason": "not_applicable",
"runtime_readiness": "LIVE_QUERYABLE_WITH_LIMITS",
"limited_reason_category": "empty_match",
"response_type": "LIMITED_WITH_REASON",
"execution_lane": "address_query",
"llm_decomposition_applied": false,
"llm_decomposition_attempted": true,
"llm_provider_used": null,
"llm_decomposition_trace_id": null,
"llm_decomposition_effective_message": "Есть ли незакрытые позиции по договору 15/24 на 2014-12-31",
"llm_decomposition_reason": "error:OpenAI API key is missing.",
"fallback_rule_hit": null,
"sanitized_user_message": "есть ли незакрытые позиции по договору 15/24 на 2014-12-31",
"tool_gate_decision": "run_address_lane",
"tool_gate_reason": "address_mode_classifier_detected",
"answer_structure_v11": null,
"investigation_state_snapshot": null,
"normalized": null,
"normalizer_output": null
}
}
]
}

View File

@ -0,0 +1,9 @@
1. Покажи открытые позиции по договору 15/24
2. Есть ли незакрытые позиции по договору 15/24 на 2020-12
3. Есть ли незакрытые позиции по договору 15/24 на 2020-11
4. Есть ли незакрытые позиции по договору 15/24 на 2022-12
5. Есть ли незакрытые позиции по договору 15/24 на 2014-12-31

View File

@ -0,0 +1,88 @@
# Assistant conversation export
session_id: wave13-chat20-1775126062978
exported_at: 2026-04-02T10:34:32.613Z
## 1. user
message_id: pending
created_at: pending
reply_type: n/a
Покажи открытые позиции по договору 15/24
## 2. assistant
message_id: msg-BYRQm9nr66
created_at: 2026-04-02T10:34:24.625Z
reply_type: partial_coverage
trace_id: address-_MiEWNRqbX
В live-данных по текущему фильтру записи не найдены.
Причина: по указанному якорю и фильтрам в live-выборке нет строк.
Что нужно уточнить: уточните период или снимите часть фильтров.
## 3. user
message_id: pending
created_at: pending
reply_type: n/a
Есть ли незакрытые позиции по договору 15/24 на 2020-12
## 4. assistant
message_id: msg-Sy2FeXL7BJ
created_at: 2026-04-02T10:34:26.562Z
reply_type: partial_coverage
trace_id: address-7TnGVSBbAN
В live-данных по текущему фильтру записи не найдены.
Причина: по указанному якорю и фильтрам в live-выборке нет строк.
Что нужно уточнить: уточните период или снимите часть фильтров.
## 5. user
message_id: pending
created_at: pending
reply_type: n/a
Есть ли незакрытые позиции по договору 15/24 на 2020-11
## 6. assistant
message_id: msg-7wG-3gqDYn
created_at: 2026-04-02T10:34:28.529Z
reply_type: partial_coverage
trace_id: address-TuD-HTz5gZ
В live-данных по текущему фильтру записи не найдены.
Причина: по указанному якорю и фильтрам в live-выборке нет строк.
Что нужно уточнить: уточните период или снимите часть фильтров.
## 7. user
message_id: pending
created_at: pending
reply_type: n/a
Есть ли незакрытые позиции по договору 15/24 на 2022-12
## 8. assistant
message_id: msg-kDLkjnm1OX
created_at: 2026-04-02T10:34:30.550Z
reply_type: partial_coverage
trace_id: address-gC5K4IEX-M
В live-данных по текущему фильтру записи не найдены.
Причина: по указанному якорю и фильтрам в live-выборке нет строк.
Что нужно уточнить: уточните период или снимите часть фильтров.
## 9. user
message_id: pending
created_at: pending
reply_type: n/a
Есть ли незакрытые позиции по договору 15/24 на 2014-12-31
## 10. assistant
message_id: msg-KZ-gXsKJo2
created_at: 2026-04-02T10:34:32.610Z
reply_type: partial_coverage
trace_id: address-uCS8z5ZCYE
В live-данных по текущему фильтру записи не найдены.
Причина: по указанному якорю и фильтрам в live-выборке нет строк.
Что нужно уточнить: уточните период или снимите часть фильтров.

View File

@ -0,0 +1,28 @@
# 2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-13-28
Generated at: 2026-04-02T12:23:31
Questions file: X:\1C\NDC_1C\docs\ADDRESS\question_sets\address_slang_stress_full_2026-04-02.json
Backend URL: http://127.0.0.1:8787/api/assistant/message
LLM: local / qwen2.5-14b-instruct-1m @ http://127.0.0.1:1234
Strict policy: route
## Totals
- questions_total: 102
- ok_200_count: 102
- semantic_pass_count: 102
- semantic_pass_rate: 1.0
- route_pass_count: 70
- route_pass_rate: 0.6863
- strict_pass_count: 70
- strict_pass_rate: 0.6863
- factual_count: 67
- partial_coverage_count: 35
- clarification_required_count: 0
- http_error_count: 0
- llm_decomposition_applied_count: 77
- avg_elapsed_ms: 5911.1
## Files
- run_summary.json
- full_live_results.json
- failures_only.json

View File

@ -0,0 +1,106 @@
# Response Audit: 2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-13-28
| id | strict | route_health | reply_type | intent | limited_reason | question | assistant_first_line |
|---|---|---|---|---|---|---|---|
| S001 | False | likely_blocked_route | partial_coverage | list_documents_by_counterparty | empty_match | свк доки за 2020 покаж пж | В live-данных по текущему фильтру записи не найдены. |
| S002 | True | ok_or_factual | factual | list_documents_by_counterparty | None | покеж все доки по свк за 20 год | Собран список документов по контрагенту (live address lane). |
| S003 | True | ok_or_factual | factual | list_documents_by_counterparty | None | дай список документов по свк за 2020 | Собран список документов по контрагенту (live address lane). |
| S004 | False | likely_blocked_route | partial_coverage | list_documents_by_counterparty | empty_match | какие у свк есть доки за 2020? | В live-данных по текущему фильтру записи не найдены. |
| S005 | True | ok_or_factual | factual | list_documents_by_counterparty | None | че по свк по докам за 2020 год | Собран список документов по контрагенту (live address lane). |
| S006 | True | ok_or_factual | factual | list_documents_by_counterparty | None | ёпт покажи доки по свк за 2020 | Собран список документов по контрагенту (live address lane). |
| S007 | True | ok_or_factual | factual | list_documents_by_counterparty | None | бля, доки свк 2020 вывали | Собран список документов по контрагенту (live address lane). |
| S008 | True | ok_or_factual | factual | list_documents_by_counterparty | None | svk docs for 2020 please | Собран список документов по контрагенту (live address lane). |
| S009 | False | likely_blocked_route | partial_coverage | list_documents_by_counterparty | empty_match | docs by counterparty svk year 2020 | В live-данных по текущему фильтру записи не найдены. |
| S010 | True | ok_or_factual | factual | list_documents_by_counterparty | None | по контрагенту свк покаж документы за 2020 | Собран список документов по контрагенту (live address lane). |
| S011 | False | likely_blocked_route | partial_coverage | list_documents_by_counterparty | empty_match | плс доки по свк 2020 | В live-данных по текущему фильтру записи не найдены. |
| S012 | True | ok_or_factual | factual | list_documents_by_counterparty | None | свк док за 2020 гони | Собран список документов по контрагенту (live address lane). |
| S013 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | по свк банковские операции за 2020 покаж | Собран список банковских операций по контрагенту (live address lane). |
| S014 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк выписка банка 2020 | Собран список банковских операций по контрагенту (live address lane). |
| S015 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | платежи по свк за 2020 выведи | Собран список банковских операций по контрагенту (live address lane). |
| S016 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | оплаты по свк за 2020 | Собран список банковских операций по контрагенту (live address lane). |
| S017 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк банк опер за 2020 | Собран список банковских операций по контрагенту (live address lane). |
| S018 | False | likely_blocked_route | partial_coverage | bank_operations_by_counterparty | empty_match | че у свк по банку за 2020 | В live-данных по текущему фильтру записи не найдены. |
| S019 | False | blocked_missing_anchor | partial_coverage | bank_operations_by_counterparty | missing_anchor | свк списания/поступления за 2020 | Для точного адресного поиска не хватает обязательного якоря. |
| S020 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | bank ops by svk for 2020 | Собран список банковских операций по контрагенту (live address lane). |
| S021 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | transactions by counterparty svk 2020 | Собран список банковских операций по контрагенту (live address lane). |
| S022 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | бля, по свк банковские платежки 2020 | Собран список банковских операций по контрагенту (live address lane). |
| S023 | True | ok_or_factual | factual | account_balance_snapshot | None | сальдо по счету 60.01 на дату 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
| S024 | True | ok_or_factual | factual | account_balance_snapshot | None | остаток по счету 60.01 на 2020.05 | Адресный срез по счету собран (по движениям live MCP). |
| S025 | True | ok_or_factual | factual | account_balance_snapshot | None | покажи остаток по 60.01 за май 2020 | Адресный срез по счету собран (по движениям live MCP). |
| S026 | True | ok_or_factual | factual | account_balance_snapshot | None | счет 60 остаток на май 2020 | Адресный срез по счету собран (по движениям live MCP). |
| S027 | True | ok_or_factual | factual | account_balance_snapshot | None | баланс account 60.01 as of 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
| S028 | True | ok_or_factual | factual | account_balance_snapshot | None | 60.01 saldo на 31.07.2020 | Адресный срез по счету собран (по движениям live MCP). |
| S029 | True | ok_or_factual | factual | account_balance_snapshot | None | сколько на счете 60 на конец 2020-05 | Адресный срез по счету собран (по движениям live MCP). |
| S030 | True | ok_or_factual | factual | account_balance_snapshot | None | дай остаток 60.02 на 2020-12-31 | Адресный срез по счету собран (по движениям live MCP). |
| S031 | True | partial_non_blocking | partial_coverage | account_balance_snapshot | empty_match | епт, сальдо по счету 62.01 на 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
| S032 | True | ok_or_factual | factual | account_balance_snapshot | None | плс остаток по счету 51 на 2020-06-30 | Адресный срез по счету собран (по движениям live MCP). |
| S033 | True | ok_or_factual | factual | account_balance_snapshot | None | как там по счету 60.01 на 2020.07? | Адресный срез по счету собран (по движениям live MCP). |
| S034 | True | ok_or_factual | factual | account_balance_snapshot | None | сальдо 60 на 2020 | Адресный срез по счету собран (по движениям live MCP). |
| S035 | True | ok_or_factual | factual | documents_forming_balance | None | какие документы формируют остаток по счету 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| S036 | False | blocked_recipe_visibility_gap | partial_coverage | documents_forming_balance | recipe_visibility_gap | из чего состоит остаток по счету 60 на 2020.05 | Текущий live recipe не дает нужную видимость данных для этого сценария. |
| S037 | False | blocked_missing_anchor | partial_coverage | documents_forming_balance | missing_anchor | раскрой остаток 60.01 по документам на конец июля 2020 | Для точного адресного поиска не хватает обязательного якоря. |
| S038 | False | blocked_missing_anchor | partial_coverage | documents_forming_balance | missing_anchor | доки под остатком 60.01 на 2020-07-31 | Для точного адресного поиска не хватает обязательного якоря. |
| S039 | True | ok_or_factual | factual | documents_forming_balance | None | documents forming balance for account 60.01 as of 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| S040 | False | blocked_recipe_visibility_gap | partial_coverage | documents_forming_balance | recipe_visibility_gap | бля, какие доки формируют остаток 60.01 на 2020-05-31 | Текущий live recipe не дает нужную видимость данных для этого сценария. |
| S041 | True | partial_non_blocking | partial_coverage | documents_forming_balance | empty_match | по счету 62.01 раскрой остаток документами на 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
| S042 | True | ok_or_factual | factual | documents_forming_balance | None | из чего остаток по счету 51 на 2020-06-30 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| S043 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | покажи документы по договору 15/24 за 2020 | В live-данных по текущему фильтру записи не найдены. |
| S044 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | доки по дог. 15/24 за 2020 | В live-данных по текущему фильтру записи не найдены. |
| S045 | True | ok_or_factual | factual | list_documents_by_contract | None | какие документы по контракту 15/24 | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
| S046 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | docs by contract 15/24 year 2020 | В live-данных по текущему фильтру записи не найдены. |
| S047 | True | ok_or_factual | factual | list_documents_by_contract | None | бля, покажи по договору 15/24 доки | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
| S048 | True | ok_or_factual | factual | list_documents_by_contract | None | договор 15/24 документы | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
| S049 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | плс документы договор №15/24 | В live-данных по текущему фильтру записи не найдены. |
| S050 | True | ok_or_factual | factual | list_documents_by_contract | None | покеж документы по 15/24 | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
| S051 | True | ok_or_factual | factual | bank_operations_by_contract | None | банковские операции по договору 15/24 | Собран список банковских операций по договору (live address lane). |
| S052 | True | ok_or_factual | factual | bank_operations_by_contract | None | платежи по договору 15/24 | Собран список банковских операций по договору (live address lane). |
| S053 | False | blocked_execution_error | partial_coverage | bank_operations_by_contract | execution_error | выписка по договору 15/24 | Не удалось выполнить адресный live-запрос в V1. |
| S054 | False | likely_blocked_route | partial_coverage | bank_operations_by_contract | empty_match | bank ops by contract 15/24 | В live-данных по текущему фильтру записи не найдены. |
| S055 | True | ok_or_factual | factual | bank_operations_by_contract | None | ёпт, покажи банк операции по дог 15/24 | Собран список банковских операций по договору (live address lane). |
| S056 | True | ok_or_factual | factual | bank_operations_by_contract | None | по контракту 15/24 платежки | Собран список банковских операций по договору (live address lane). |
| S057 | True | ok_or_factual | factual | account_balance_snapshot | None | покажи сальдо по счету 60 за 2020 | Адресный срез по счету собран (по движениям live MCP). |
| S058 | True | ok_or_factual | factual | account_balance_snapshot | None | а теперь только май 2020 | Адресный срез по счету собран (по движениям live MCP). |
| S059 | True | ok_or_factual | factual | account_balance_snapshot | None | ок, теперь 2020.05 | Адресный срез по счету собран (по движениям live MCP). |
| S060 | True | ok_or_factual | factual | account_balance_snapshot | None | теперь на 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
| X001 | False | likely_blocked_route | partial_coverage | list_documents_by_counterparty | empty_match | свк доки кинь за 2020 | В live-данных по текущему фильтру записи не найдены. |
| X002 | True | ok_or_factual | factual | list_documents_by_counterparty | None | по свк все документы за 20й год | Собран список документов по контрагенту (live address lane). |
| X003 | True | ok_or_factual | factual | list_documents_by_counterparty | None | пж вывали доки контрагент свк 2020 | Собран список документов по контрагенту (live address lane). |
| X004 | True | ok_or_factual | factual | list_documents_by_counterparty | None | svk poka docy za 2020 | Собран список документов по контрагенту (live address lane). |
| X005 | True | ok_or_factual | factual | list_documents_by_counterparty | None | какие доки по компании свк за 2020 | Собран список документов по контрагенту (live address lane). |
| X006 | False | likely_blocked_route | partial_coverage | list_documents_by_counterparty | empty_match | бля покаж свк документы 2020 | В live-данных по текущему фильтру записи не найдены. |
| X007 | False | likely_blocked_route | partial_coverage | bank_operations_by_counterparty | empty_match | свк банк операции за 2020 | В live-данных по текущему фильтру записи не найдены. |
| X008 | False | likely_blocked_route | partial_coverage | bank_operations_by_counterparty | empty_match | по свк выписку банка за 2020 выведи | В live-данных по текущему фильтру записи не найдены. |
| X009 | False | likely_blocked_route | partial_coverage | bank_operations_by_counterparty | empty_match | свк платежки за 2020 | В live-данных по текущему фильтру записи не найдены. |
| X010 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | bank ops svk 2020 | Собран список банковских операций по контрагенту (live address lane). |
| X011 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | транзакции по свк за 2020 | Собран список банковских операций по контрагенту (live address lane). |
| X012 | False | blocked_missing_anchor | partial_coverage | bank_operations_by_counterparty | missing_anchor | ёпт по свк че по банку 2020 | Для точного адресного поиска не хватает обязательного якоря. |
| X013 | True | ok_or_factual | factual | account_balance_snapshot | None | остаток по 60.01 на 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
| X014 | True | ok_or_factual | factual | account_balance_snapshot | None | сальдо 60.01 на 31.07.2020 | Адресный срез по счету собран (по движениям live MCP). |
| X015 | True | ok_or_factual | factual | account_balance_snapshot | None | что на счете 60 на 2020.05 | Адресный срез по счету собран (по движениям live MCP). |
| X016 | True | ok_or_factual | factual | account_balance_snapshot | None | дай остаток 62.01 на 2020 май | Адресный срез по счету собран (по движениям live MCP). |
| X017 | True | partial_non_blocking | partial_coverage | account_balance_snapshot | empty_match | saldo account 60 as of 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
| X018 | True | ok_or_factual | factual | account_balance_snapshot | None | плиз остаток по счету 51 на 2020-06-30 | Адресный срез по счету собран (по движениям live MCP). |
| X019 | False | blocked_missing_anchor | partial_coverage | account_balance_snapshot | missing_anchor | скока по 60.02 на конец 2020-12 | Для точного адресного поиска не хватает обязательного якоря. |
| X020 | True | ok_or_factual | factual | account_balance_snapshot | None | бля сальдо 60.01 на 2020-05-31 | Адресный срез по счету собран (по движениям live MCP). |
| X021 | False | blocked_missing_anchor | partial_coverage | documents_forming_balance | missing_anchor | раскрой остаток 60.01 по документам на конец июля 2020 | Для точного адресного поиска не хватает обязательного якоря. |
| X022 | False | blocked_missing_anchor | partial_coverage | documents_forming_balance | missing_anchor | доки под остатком 60.01 на 2020-07-31 | Для точного адресного поиска не хватает обязательного якоря. |
| X023 | True | ok_or_factual | factual | documents_forming_balance | None | из чего остаток 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| X024 | True | ok_or_factual | factual | documents_forming_balance | None | какие документы формируют остаток по 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| X025 | True | ok_or_factual | factual | documents_forming_balance | None | docs forming balance 60.01 as of 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| X026 | False | blocked_missing_anchor | partial_coverage | documents_forming_balance | missing_anchor | раскидай остаток 62.01 по докам на 2020-12-31 | Для точного адресного поиска не хватает обязательного якоря. |
| X027 | True | ok_or_factual | factual | documents_forming_balance | None | по счету 51 раскрой остаток документами на 2020-06-30 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| X028 | False | blocked_missing_anchor | partial_coverage | documents_forming_balance | missing_anchor | бля из чего состоит остаток по 60.01 на 2020-05-31 | Для точного адресного поиска не хватает обязательного якоря. |
| X029 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | доки по договору 15/24 за 2020 | В live-данных по текущему фильтру записи не найдены. |
| X030 | True | ok_or_factual | factual | list_documents_by_contract | None | покажи документы контракт 15/24 | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
| X031 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | docs by contract 15/24 2020 | В live-данных по текущему фильтру записи не найдены. |
| X032 | True | ok_or_factual | factual | list_documents_by_contract | None | по дог 15/24 какие документы | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
| X033 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | договор 15/24 выведи доки | В live-данных по текущему фильтру записи не найдены. |
| X034 | True | ok_or_factual | factual | list_documents_by_contract | None | нах покажи документы по 15/24 | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
| X035 | True | ok_or_factual | factual | bank_operations_by_contract | None | банк операции по договору 15/24 | Собран список банковских операций по договору (live address lane). |
| X036 | True | ok_or_factual | factual | bank_operations_by_contract | None | платежки по дог 15/24 | Собран список банковских операций по договору (live address lane). |
| X037 | True | ok_or_factual | factual | bank_operations_by_contract | None | выписка по контракту 15/24 | Собран список банковских операций по договору (live address lane). |
| X038 | False | likely_blocked_route | partial_coverage | bank_operations_by_contract | empty_match | bank ops by contract 15/24 | В live-данных по текущему фильтру записи не найдены. |
| X039 | False | blocked_execution_error | partial_coverage | bank_operations_by_contract | execution_error | покажи банк опер по дог 15/24 пж | Не удалось выполнить адресный live-запрос в V1. |
| X040 | True | ok_or_factual | factual | bank_operations_by_contract | None | епт транзакции договор 15/24 | Собран список банковских операций по договору (live address lane). |
| X041 | True | ok_or_factual | factual | account_balance_snapshot | None | покажи сальдо по счету 60 за 2020 | Адресный срез по счету собран (по движениям live MCP). |
| X042 | True | ok_or_factual | factual | account_balance_snapshot | None | а теперь только май 2020 | Адресный срез по счету собран (по движениям live MCP). |

View File

@ -0,0 +1,65 @@
{
"run_id": "2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-13-28",
"generated_at": "2026-04-02T12:23:31",
"source_questions_file": "X:\\1C\\NDC_1C\\docs\\ADDRESS\\question_sets\\address_slang_stress_full_2026-04-02.json",
"backend_url": "http://127.0.0.1:8787/api/assistant/message",
"llm_provider": "local",
"llm_model": "qwen2.5-14b-instruct-1m",
"llm_base_url": "http://127.0.0.1:1234",
"strict_policy": "route",
"totals": {
"questions_total": 102,
"ok_200_count": 102,
"semantic_pass_count": 102,
"semantic_pass_rate": 1.0,
"route_pass_count": 70,
"route_pass_rate": 0.6863,
"strict_pass_count": 70,
"strict_pass_rate": 0.6863,
"factual_count": 67,
"partial_coverage_count": 35,
"clarification_required_count": 0,
"http_error_count": 0,
"llm_decomposition_applied_count": 77,
"avg_elapsed_ms": 5911.1
},
"distributions": {
"reply_type": {
"partial_coverage": 35,
"factual": 67
},
"actual_intent": {
"list_documents_by_counterparty": 18,
"bank_operations_by_counterparty": 16,
"account_balance_snapshot": 26,
"documents_forming_balance": 16,
"list_documents_by_contract": 14,
"bank_operations_by_contract": 12
},
"actual_mode": {
"address_query": 102
},
"mcp_call_status": {
"materialized_but_not_anchor_matched": 20,
"matched_non_empty": 67,
"skipped": 8,
"no_raw_rows": 3,
"materialized_but_filtered_out_by_recipe": 2,
"error": 2
},
"limited_reason_category": {
"empty_match": 22,
"missing_anchor": 9,
"recipe_visibility_gap": 2,
"execution_error": 2
},
"route_health": {
"likely_blocked_route": 19,
"ok_or_factual": 67,
"blocked_missing_anchor": 9,
"partial_non_blocking": 3,
"blocked_recipe_visibility_gap": 2,
"blocked_execution_error": 2
}
}
}

View File

@ -0,0 +1,28 @@
# 2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-28-31
Generated at: 2026-04-02T12:38:40
Questions file: X:\1C\NDC_1C\docs\ADDRESS\question_sets\address_slang_stress_full_2026-04-02.json
Backend URL: http://127.0.0.1:8787/api/assistant/message
LLM: local / qwen2.5-14b-instruct-1m @ http://127.0.0.1:1234
Strict policy: route
## Totals
- questions_total: 102
- ok_200_count: 102
- semantic_pass_count: 102
- semantic_pass_rate: 1.0
- route_pass_count: 79
- route_pass_rate: 0.7745
- strict_pass_count: 79
- strict_pass_rate: 0.7745
- factual_count: 74
- partial_coverage_count: 28
- clarification_required_count: 0
- http_error_count: 0
- llm_decomposition_applied_count: 77
- avg_elapsed_ms: 5968.4
## Files
- run_summary.json
- full_live_results.json
- failures_only.json

View File

@ -0,0 +1,106 @@
# Response Audit: 2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-28-31
| id | strict | route_health | reply_type | intent | limited_reason | question | assistant_first_line |
|---|---|---|---|---|---|---|---|
| S001 | False | likely_blocked_route | partial_coverage | list_documents_by_counterparty | empty_match | свк доки за 2020 покаж пж | В live-данных по текущему фильтру записи не найдены. |
| S002 | True | ok_or_factual | factual | list_documents_by_counterparty | None | покеж все доки по свк за 20 год | Собран список документов по контрагенту (live address lane). |
| S003 | True | ok_or_factual | factual | list_documents_by_counterparty | None | дай список документов по свк за 2020 | Собран список документов по контрагенту (live address lane). |
| S004 | False | likely_blocked_route | partial_coverage | list_documents_by_counterparty | empty_match | какие у свк есть доки за 2020? | В live-данных по текущему фильтру записи не найдены. |
| S005 | True | ok_or_factual | factual | list_documents_by_counterparty | None | че по свк по докам за 2020 год | Собран список документов по контрагенту (live address lane). |
| S006 | True | ok_or_factual | factual | list_documents_by_counterparty | None | ёпт покажи доки по свк за 2020 | Собран список документов по контрагенту (live address lane). |
| S007 | True | ok_or_factual | factual | list_documents_by_counterparty | None | бля, доки свк 2020 вывали | Собран список документов по контрагенту (live address lane). |
| S008 | True | ok_or_factual | factual | list_documents_by_counterparty | None | svk docs for 2020 please | Собран список документов по контрагенту (live address lane). |
| S009 | False | likely_blocked_route | partial_coverage | list_documents_by_counterparty | empty_match | docs by counterparty svk year 2020 | В live-данных по текущему фильтру записи не найдены. |
| S010 | True | ok_or_factual | factual | list_documents_by_counterparty | None | по контрагенту свк покаж документы за 2020 | Собран список документов по контрагенту (live address lane). |
| S011 | False | likely_blocked_route | partial_coverage | list_documents_by_counterparty | empty_match | плс доки по свк 2020 | В live-данных по текущему фильтру записи не найдены. |
| S012 | True | ok_or_factual | factual | list_documents_by_counterparty | None | свк док за 2020 гони | Собран список документов по контрагенту (live address lane). |
| S013 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | по свк банковские операции за 2020 покаж | Собран список банковских операций по контрагенту (live address lane). |
| S014 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк выписка банка 2020 | Собран список банковских операций по контрагенту (live address lane). |
| S015 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | платежи по свк за 2020 выведи | Собран список банковских операций по контрагенту (live address lane). |
| S016 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | оплаты по свк за 2020 | Собран список банковских операций по контрагенту (live address lane). |
| S017 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк банк опер за 2020 | Собран список банковских операций по контрагенту (live address lane). |
| S018 | False | likely_blocked_route | partial_coverage | bank_operations_by_counterparty | empty_match | че у свк по банку за 2020 | В live-данных по текущему фильтру записи не найдены. |
| S019 | False | likely_blocked_route | partial_coverage | bank_operations_by_counterparty | empty_match | свк списания/поступления за 2020 | В live-данных по текущему фильтру записи не найдены. |
| S020 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | bank ops by svk for 2020 | Собран список банковских операций по контрагенту (live address lane). |
| S021 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | transactions by counterparty svk 2020 | Собран список банковских операций по контрагенту (live address lane). |
| S022 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | бля, по свк банковские платежки 2020 | Собран список банковских операций по контрагенту (live address lane). |
| S023 | True | ok_or_factual | factual | account_balance_snapshot | None | сальдо по счету 60.01 на дату 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
| S024 | True | ok_or_factual | factual | account_balance_snapshot | None | остаток по счету 60.01 на 2020.05 | Адресный срез по счету собран (по движениям live MCP). |
| S025 | True | ok_or_factual | factual | account_balance_snapshot | None | покажи остаток по 60.01 за май 2020 | Адресный срез по счету собран (по движениям live MCP). |
| S026 | True | ok_or_factual | factual | account_balance_snapshot | None | счет 60 остаток на май 2020 | Адресный срез по счету собран (по движениям live MCP). |
| S027 | True | ok_or_factual | factual | account_balance_snapshot | None | баланс account 60.01 as of 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
| S028 | True | ok_or_factual | factual | account_balance_snapshot | None | 60.01 saldo на 31.07.2020 | Адресный срез по счету собран (по движениям live MCP). |
| S029 | True | ok_or_factual | factual | account_balance_snapshot | None | сколько на счете 60 на конец 2020-05 | Адресный срез по счету собран (по движениям live MCP). |
| S030 | True | ok_or_factual | factual | account_balance_snapshot | None | дай остаток 60.02 на 2020-12-31 | Адресный срез по счету собран (по движениям live MCP). |
| S031 | True | partial_non_blocking | partial_coverage | account_balance_snapshot | empty_match | епт, сальдо по счету 62.01 на 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
| S032 | True | ok_or_factual | factual | account_balance_snapshot | None | плс остаток по счету 51 на 2020-06-30 | Адресный срез по счету собран (по движениям live MCP). |
| S033 | True | ok_or_factual | factual | account_balance_snapshot | None | как там по счету 60.01 на 2020.07? | Адресный срез по счету собран (по движениям live MCP). |
| S034 | True | ok_or_factual | factual | account_balance_snapshot | None | сальдо 60 на 2020 | Адресный срез по счету собран (по движениям live MCP). |
| S035 | True | ok_or_factual | factual | documents_forming_balance | None | какие документы формируют остаток по счету 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| S036 | False | blocked_recipe_visibility_gap | partial_coverage | documents_forming_balance | recipe_visibility_gap | из чего состоит остаток по счету 60 на 2020.05 | Текущий live recipe не дает нужную видимость данных для этого сценария. |
| S037 | True | ok_or_factual | factual | documents_forming_balance | None | раскрой остаток 60.01 по документам на конец июля 2020 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| S038 | True | ok_or_factual | factual | documents_forming_balance | None | доки под остатком 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| S039 | True | ok_or_factual | factual | documents_forming_balance | None | documents forming balance for account 60.01 as of 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| S040 | False | blocked_recipe_visibility_gap | partial_coverage | documents_forming_balance | recipe_visibility_gap | бля, какие доки формируют остаток 60.01 на 2020-05-31 | Текущий live recipe не дает нужную видимость данных для этого сценария. |
| S041 | True | partial_non_blocking | partial_coverage | documents_forming_balance | empty_match | по счету 62.01 раскрой остаток документами на 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
| S042 | True | ok_or_factual | factual | documents_forming_balance | None | из чего остаток по счету 51 на 2020-06-30 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| S043 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | покажи документы по договору 15/24 за 2020 | В live-данных по текущему фильтру записи не найдены. |
| S044 | True | ok_or_factual | factual | list_documents_by_contract | None | доки по дог. 15/24 за 2020 | Период сохранен. Глубина live-выборки автоматически расширена до 1000 строк. |
| S045 | True | ok_or_factual | factual | list_documents_by_contract | None | какие документы по контракту 15/24 | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
| S046 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | docs by contract 15/24 year 2020 | В live-данных по текущему фильтру записи не найдены. |
| S047 | True | ok_or_factual | factual | list_documents_by_contract | None | бля, покажи по договору 15/24 доки | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
| S048 | True | ok_or_factual | factual | list_documents_by_contract | None | договор 15/24 документы | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
| S049 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | плс документы договор №15/24 | В live-данных по текущему фильтру записи не найдены. |
| S050 | True | ok_or_factual | factual | list_documents_by_contract | None | покеж документы по 15/24 | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
| S051 | True | ok_or_factual | factual | bank_operations_by_contract | None | банковские операции по договору 15/24 | Собран список банковских операций по договору (live address lane). |
| S052 | True | ok_or_factual | factual | bank_operations_by_contract | None | платежи по договору 15/24 | Собран список банковских операций по договору (live address lane). |
| S053 | True | ok_or_factual | factual | bank_operations_by_contract | None | выписка по договору 15/24 | Собран список банковских операций по договору (live address lane). |
| S054 | False | likely_blocked_route | partial_coverage | bank_operations_by_contract | empty_match | bank ops by contract 15/24 | В live-данных по текущему фильтру записи не найдены. |
| S055 | True | ok_or_factual | factual | bank_operations_by_contract | None | ёпт, покажи банк операции по дог 15/24 | Собран список банковских операций по договору (live address lane). |
| S056 | True | ok_or_factual | factual | bank_operations_by_contract | None | по контракту 15/24 платежки | Собран список банковских операций по договору (live address lane). |
| S057 | True | ok_or_factual | factual | account_balance_snapshot | None | покажи сальдо по счету 60 за 2020 | Адресный срез по счету собран (по движениям live MCP). |
| S058 | True | ok_or_factual | factual | account_balance_snapshot | None | а теперь только май 2020 | Адресный срез по счету собран (по движениям live MCP). |
| S059 | True | ok_or_factual | factual | account_balance_snapshot | None | ок, теперь 2020.05 | Адресный срез по счету собран (по движениям live MCP). |
| S060 | True | ok_or_factual | factual | account_balance_snapshot | None | теперь на 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
| X001 | False | likely_blocked_route | partial_coverage | list_documents_by_counterparty | empty_match | свк доки кинь за 2020 | В live-данных по текущему фильтру записи не найдены. |
| X002 | True | ok_or_factual | factual | list_documents_by_counterparty | None | по свк все документы за 20й год | Собран список документов по контрагенту (live address lane). |
| X003 | True | ok_or_factual | factual | list_documents_by_counterparty | None | пж вывали доки контрагент свк 2020 | Собран список документов по контрагенту (live address lane). |
| X004 | True | ok_or_factual | factual | list_documents_by_counterparty | None | svk poka docy za 2020 | Собран список документов по контрагенту (live address lane). |
| X005 | True | ok_or_factual | factual | list_documents_by_counterparty | None | какие доки по компании свк за 2020 | Собран список документов по контрагенту (live address lane). |
| X006 | False | likely_blocked_route | partial_coverage | list_documents_by_counterparty | empty_match | бля покаж свк документы 2020 | В live-данных по текущему фильтру записи не найдены. |
| X007 | False | likely_blocked_route | partial_coverage | bank_operations_by_counterparty | empty_match | свк банк операции за 2020 | В live-данных по текущему фильтру записи не найдены. |
| X008 | False | likely_blocked_route | partial_coverage | bank_operations_by_counterparty | empty_match | по свк выписку банка за 2020 выведи | В live-данных по текущему фильтру записи не найдены. |
| X009 | False | likely_blocked_route | partial_coverage | bank_operations_by_counterparty | empty_match | свк платежки за 2020 | В live-данных по текущему фильтру записи не найдены. |
| X010 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | bank ops svk 2020 | Собран список банковских операций по контрагенту (live address lane). |
| X011 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | транзакции по свк за 2020 | Собран список банковских операций по контрагенту (live address lane). |
| X012 | False | blocked_missing_anchor | partial_coverage | bank_operations_by_counterparty | missing_anchor | ёпт по свк че по банку 2020 | Для точного адресного поиска не хватает обязательного якоря. |
| X013 | True | ok_or_factual | factual | account_balance_snapshot | None | остаток по 60.01 на 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
| X014 | True | ok_or_factual | factual | account_balance_snapshot | None | сальдо 60.01 на 31.07.2020 | Адресный срез по счету собран (по движениям live MCP). |
| X015 | True | ok_or_factual | factual | account_balance_snapshot | None | что на счете 60 на 2020.05 | Адресный срез по счету собран (по движениям live MCP). |
| X016 | True | ok_or_factual | factual | account_balance_snapshot | None | дай остаток 62.01 на 2020 май | Адресный срез по счету собран (по движениям live MCP). |
| X017 | True | partial_non_blocking | partial_coverage | account_balance_snapshot | empty_match | saldo account 60 as of 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
| X018 | True | ok_or_factual | factual | account_balance_snapshot | None | плиз остаток по счету 51 на 2020-06-30 | Адресный срез по счету собран (по движениям live MCP). |
| X019 | True | partial_non_blocking | partial_coverage | account_balance_snapshot | empty_match | скока по 60.02 на конец 2020-12 | В live-данных по текущему фильтру записи не найдены. |
| X020 | True | ok_or_factual | factual | account_balance_snapshot | None | бля сальдо 60.01 на 2020-05-31 | Адресный срез по счету собран (по движениям live MCP). |
| X021 | True | ok_or_factual | factual | documents_forming_balance | None | раскрой остаток 60.01 по документам на конец июля 2020 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| X022 | True | ok_or_factual | factual | documents_forming_balance | None | доки под остатком 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| X023 | True | ok_or_factual | factual | documents_forming_balance | None | из чего остаток 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| X024 | True | ok_or_factual | factual | documents_forming_balance | None | какие документы формируют остаток по 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| X025 | True | ok_or_factual | factual | documents_forming_balance | None | docs forming balance 60.01 as of 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| X026 | True | partial_non_blocking | partial_coverage | documents_forming_balance | empty_match | раскидай остаток 62.01 по докам на 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
| X027 | True | ok_or_factual | factual | documents_forming_balance | None | по счету 51 раскрой остаток документами на 2020-06-30 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| X028 | False | blocked_recipe_visibility_gap | partial_coverage | documents_forming_balance | recipe_visibility_gap | бля из чего состоит остаток по 60.01 на 2020-05-31 | Текущий live recipe не дает нужную видимость данных для этого сценария. |
| X029 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | доки по договору 15/24 за 2020 | В live-данных по текущему фильтру записи не найдены. |
| X030 | True | ok_or_factual | factual | list_documents_by_contract | None | покажи документы контракт 15/24 | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
| X031 | True | ok_or_factual | factual | list_documents_by_contract | None | docs by contract 15/24 2020 | Период сохранен. Глубина live-выборки автоматически расширена до 1000 строк. |
| X032 | True | ok_or_factual | factual | list_documents_by_contract | None | по дог 15/24 какие документы | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
| X033 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | договор 15/24 выведи доки | В live-данных по текущему фильтру записи не найдены. |
| X034 | True | ok_or_factual | factual | list_documents_by_contract | None | нах покажи документы по 15/24 | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
| X035 | True | ok_or_factual | factual | bank_operations_by_contract | None | банк операции по договору 15/24 | Собран список банковских операций по договору (live address lane). |
| X036 | True | ok_or_factual | factual | bank_operations_by_contract | None | платежки по дог 15/24 | Собран список банковских операций по договору (live address lane). |
| X037 | True | ok_or_factual | factual | bank_operations_by_contract | None | выписка по контракту 15/24 | Собран список банковских операций по договору (live address lane). |
| X038 | False | likely_blocked_route | partial_coverage | bank_operations_by_contract | empty_match | bank ops by contract 15/24 | В live-данных по текущему фильтру записи не найдены. |
| X039 | False | blocked_execution_error | partial_coverage | bank_operations_by_contract | execution_error | покажи банк опер по дог 15/24 пж | Не удалось выполнить адресный live-запрос в V1. |
| X040 | True | ok_or_factual | factual | bank_operations_by_contract | None | епт транзакции договор 15/24 | Собран список банковских операций по договору (live address lane). |
| X041 | True | ok_or_factual | factual | account_balance_snapshot | None | покажи сальдо по счету 60 за 2020 | Адресный срез по счету собран (по движениям live MCP). |
| X042 | True | ok_or_factual | factual | account_balance_snapshot | None | а теперь только май 2020 | Адресный срез по счету собран (по движениям live MCP). |

View File

@ -0,0 +1,64 @@
{
"run_id": "2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-28-31",
"generated_at": "2026-04-02T12:38:40",
"source_questions_file": "X:\\1C\\NDC_1C\\docs\\ADDRESS\\question_sets\\address_slang_stress_full_2026-04-02.json",
"backend_url": "http://127.0.0.1:8787/api/assistant/message",
"llm_provider": "local",
"llm_model": "qwen2.5-14b-instruct-1m",
"llm_base_url": "http://127.0.0.1:1234",
"strict_policy": "route",
"totals": {
"questions_total": 102,
"ok_200_count": 102,
"semantic_pass_count": 102,
"semantic_pass_rate": 1.0,
"route_pass_count": 79,
"route_pass_rate": 0.7745,
"strict_pass_count": 79,
"strict_pass_rate": 0.7745,
"factual_count": 74,
"partial_coverage_count": 28,
"clarification_required_count": 0,
"http_error_count": 0,
"llm_decomposition_applied_count": 77,
"avg_elapsed_ms": 5968.4
},
"distributions": {
"reply_type": {
"partial_coverage": 28,
"factual": 74
},
"actual_intent": {
"list_documents_by_counterparty": 18,
"bank_operations_by_counterparty": 16,
"account_balance_snapshot": 26,
"documents_forming_balance": 16,
"list_documents_by_contract": 14,
"bank_operations_by_contract": 12
},
"actual_mode": {
"address_query": 102
},
"mcp_call_status": {
"materialized_but_not_anchor_matched": 19,
"matched_non_empty": 74,
"no_raw_rows": 5,
"materialized_but_filtered_out_by_recipe": 3,
"error": 1
},
"limited_reason_category": {
"empty_match": 23,
"recipe_visibility_gap": 3,
"missing_anchor": 1,
"execution_error": 1
},
"route_health": {
"likely_blocked_route": 18,
"ok_or_factual": 74,
"partial_non_blocking": 5,
"blocked_recipe_visibility_gap": 3,
"blocked_missing_anchor": 1,
"blocked_execution_error": 1
}
}
}

View File

@ -0,0 +1,28 @@
# 2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-40-54
Generated at: 2026-04-02T12:50:55
Questions file: X:\1C\NDC_1C\docs\ADDRESS\question_sets\address_slang_stress_full_2026-04-02.json
Backend URL: http://127.0.0.1:8787/api/assistant/message
LLM: local / qwen2.5-14b-instruct-1m @ http://127.0.0.1:1234
Strict policy: route
## Totals
- questions_total: 102
- ok_200_count: 102
- semantic_pass_count: 102
- semantic_pass_rate: 1.0
- route_pass_count: 96
- route_pass_rate: 0.9412
- strict_pass_count: 96
- strict_pass_rate: 0.9412
- factual_count: 91
- partial_coverage_count: 11
- clarification_required_count: 0
- http_error_count: 0
- llm_decomposition_applied_count: 77
- avg_elapsed_ms: 5892.0
## Files
- run_summary.json
- full_live_results.json
- failures_only.json

View File

@ -0,0 +1,915 @@
[
{
"index": 36,
"id": "S036",
"question": "из чего состоит остаток по счету 60 на 2020.05",
"session": null,
"session_id": "asst-2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-40-54-s036",
"status_code": 200,
"ok": true,
"elapsed_ms": 6079,
"reply_type": "partial_coverage",
"trace_id": "address-Osl2bR4Te_",
"assistant_reply": "Текущий live recipe не дает нужную видимость данных для этого сценария.\nПричина: строки по якорю найдены, но отфильтрованы intent-specific recipe.\nЧто нужно уточнить: сузьте период, уточните контрагента или документный тип.",
"assistant_reply_first_line": "Текущий live recipe не дает нужную видимость данных для этого сценария.",
"expected_intent": "documents_forming_balance",
"actual_intent": "documents_forming_balance",
"intent_match": true,
"expected_mode": "address_query",
"actual_mode": "address_query",
"mode_match": true,
"expected_reply_type": null,
"reply_match": true,
"semantic_pass": true,
"route_pass": false,
"route_health": "blocked_recipe_visibility_gap",
"strict_policy": "route",
"strict_pass": false,
"selected_recipe": "address_documents_forming_balance_v1",
"missing_required_filters": [],
"match_failure_stage": "materialized_but_filtered_out_by_recipe",
"match_failure_reason": "rows_filtered_out_by_intent_recipe_after_anchor_match",
"rows_fetched": 6,
"rows_matched": 0,
"mcp_call_status": "materialized_but_filtered_out_by_recipe",
"limited_reason_category": "recipe_visibility_gap",
"llm_decomposition_applied": false,
"llm_decomposition_reason": "normalized_fragment_rejected_intent_conflict",
"fallback_rule_hit": null,
"debug_payload": {
"trace_id": "address-Osl2bR4Te_",
"prompt_version": "address_query_runtime_v1",
"schema_version": "address_query_runtime_v1",
"fallback_type": "partial",
"route_summary": null,
"fragments": [],
"requirements_extracted": [],
"coverage_report": {
"requirements_total": 0,
"requirements_covered": 0,
"requirements_uncovered": [],
"requirements_partially_covered": [],
"clarification_needed_for": [],
"out_of_scope_requirements": []
},
"routes": [],
"retrieval_status": [],
"retrieval_results": [],
"answer_grounding_check": {
"status": "partial",
"route_subject_match": true,
"missing_requirements": [],
"reasons": [
"address_action_detected",
"address_entity_detected",
"drilldown_signal_detected",
"documents_forming_balance_signal_detected"
],
"why_included_summary": [],
"selection_reason_summary": []
},
"dropped_intent_segments": [],
"detected_mode": "address_query",
"detected_mode_confidence": "high",
"query_shape": "DRILLDOWN_REQUEST",
"query_shape_confidence": "high",
"detected_intent": "documents_forming_balance",
"detected_intent_confidence": "high",
"extracted_filters": {
"sort": "period_desc",
"limit": 20,
"account": "60",
"period_from": "2020-05-01",
"period_to": "2020-05-31",
"as_of_date": "2020-05-31"
},
"missing_required_filters": [],
"selected_recipe": "address_documents_forming_balance_v1",
"mcp_call_status_legacy": "materialized_but_not_matched",
"account_scope_mode": "strict",
"account_scope_fallback_applied": false,
"anchor_type": "account",
"anchor_value_raw": "60",
"anchor_value_resolved": "60",
"resolver_confidence": "high",
"ambiguity_count": 0,
"match_failure_stage": "materialized_but_filtered_out_by_recipe",
"match_failure_reason": "rows_filtered_out_by_intent_recipe_after_anchor_match",
"mcp_call_status": "materialized_but_filtered_out_by_recipe",
"rows_fetched": 6,
"raw_rows_received": 6,
"rows_after_account_scope": 6,
"rows_after_recipe_filter": 6,
"rows_materialized": 6,
"rows_matched": 0,
"raw_row_keys_sample": [
"Период",
"Регистратор",
"СчетДт",
"СчетКт",
"Сумма",
"Period",
"Registrator",
"AccountDt",
"AccountKt",
"Amount"
],
"materialization_drop_reason": "none",
"account_token_raw": "60",
"account_token_normalized": "60",
"account_scope_fields_checked": [
"account_dt",
"account_kt",
"registrator",
"analytics"
],
"account_scope_match_strategy": "account_code_regex_plus_alias_map_v1",
"account_scope_drop_reason": "rows_remaining_after_scope_filter",
"runtime_readiness": "REQUIRES_SPECIALIZED_RECIPE",
"limited_reason_category": "recipe_visibility_gap",
"response_type": "LIMITED_WITH_REASON",
"execution_lane": "address_query",
"llm_decomposition_applied": false,
"llm_decomposition_attempted": true,
"llm_provider_used": "local",
"llm_decomposition_trace_id": "W7lp6O8KPbuB3o",
"llm_decomposition_effective_message": "из чего состоит остаток по счету 60 на 2020.05",
"llm_decomposition_reason": "normalized_fragment_rejected_intent_conflict",
"fallback_rule_hit": null,
"sanitized_user_message": "из чего состоит остаток по счету 60 на 2020.05",
"tool_gate_decision": "run_address_lane",
"tool_gate_reason": "address_mode_classifier_detected",
"answer_structure_v11": null,
"investigation_state_snapshot": null,
"normalized": null,
"normalizer_output": {
"trace_id": "W7lp6O8KPbuB3o",
"prompt_version": "normalizer_v2_0_2",
"applied": false,
"effective_message": "из чего состоит остаток по счету 60 на 2020.05"
}
},
"error_code": null,
"error_message": null
},
{
"index": 40,
"id": "S040",
"question": "бля, какие доки формируют остаток 60.01 на 2020-05-31",
"session": null,
"session_id": "asst-2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-40-54-s040",
"status_code": 200,
"ok": true,
"elapsed_ms": 6110,
"reply_type": "partial_coverage",
"trace_id": "address-O-GCQ6lVKK",
"assistant_reply": "Текущий live recipe не дает нужную видимость данных для этого сценария.\nПричина: строки по якорю найдены, но отфильтрованы intent-specific recipe.\nЧто нужно уточнить: сузьте период, уточните контрагента или документный тип.",
"assistant_reply_first_line": "Текущий live recipe не дает нужную видимость данных для этого сценария.",
"expected_intent": "documents_forming_balance",
"actual_intent": "documents_forming_balance",
"intent_match": true,
"expected_mode": "address_query",
"actual_mode": "address_query",
"mode_match": true,
"expected_reply_type": null,
"reply_match": true,
"semantic_pass": true,
"route_pass": false,
"route_health": "blocked_recipe_visibility_gap",
"strict_policy": "route",
"strict_pass": false,
"selected_recipe": "address_documents_forming_balance_v1",
"missing_required_filters": [],
"match_failure_stage": "materialized_but_filtered_out_by_recipe",
"match_failure_reason": "rows_filtered_out_by_intent_recipe_after_anchor_match",
"rows_fetched": 5,
"rows_matched": 0,
"mcp_call_status": "materialized_but_filtered_out_by_recipe",
"limited_reason_category": "recipe_visibility_gap",
"llm_decomposition_applied": true,
"llm_decomposition_reason": "normalized_fragment_applied",
"fallback_rule_hit": null,
"debug_payload": {
"trace_id": "address-O-GCQ6lVKK",
"prompt_version": "address_query_runtime_v1",
"schema_version": "address_query_runtime_v1",
"fallback_type": "partial",
"route_summary": null,
"fragments": [],
"requirements_extracted": [],
"coverage_report": {
"requirements_total": 0,
"requirements_covered": 0,
"requirements_uncovered": [],
"requirements_partially_covered": [],
"clarification_needed_for": [],
"out_of_scope_requirements": []
},
"routes": [],
"retrieval_status": [],
"retrieval_results": [],
"answer_grounding_check": {
"status": "partial",
"route_subject_match": true,
"missing_requirements": [],
"reasons": [
"address_action_detected",
"address_entity_detected",
"drilldown_signal_detected",
"documents_forming_balance_signal_detected"
],
"why_included_summary": [],
"selection_reason_summary": []
},
"dropped_intent_segments": [],
"detected_mode": "address_query",
"detected_mode_confidence": "high",
"query_shape": "DRILLDOWN_REQUEST",
"query_shape_confidence": "high",
"detected_intent": "documents_forming_balance",
"detected_intent_confidence": "high",
"extracted_filters": {
"sort": "period_desc",
"limit": 20,
"account": "60.01",
"period_from": "2020-05-01",
"period_to": "2020-05-31",
"as_of_date": "2020-05-31"
},
"missing_required_filters": [],
"selected_recipe": "address_documents_forming_balance_v1",
"mcp_call_status_legacy": "materialized_but_not_matched",
"account_scope_mode": "strict",
"account_scope_fallback_applied": false,
"anchor_type": "account",
"anchor_value_raw": "60.01",
"anchor_value_resolved": "60.01",
"resolver_confidence": "high",
"ambiguity_count": 0,
"match_failure_stage": "materialized_but_filtered_out_by_recipe",
"match_failure_reason": "rows_filtered_out_by_intent_recipe_after_anchor_match",
"mcp_call_status": "materialized_but_filtered_out_by_recipe",
"rows_fetched": 5,
"raw_rows_received": 5,
"rows_after_account_scope": 5,
"rows_after_recipe_filter": 5,
"rows_materialized": 5,
"rows_matched": 0,
"raw_row_keys_sample": [
"Период",
"Регистратор",
"СчетДт",
"СчетКт",
"Сумма",
"Period",
"Registrator",
"AccountDt",
"AccountKt",
"Amount"
],
"materialization_drop_reason": "none",
"account_token_raw": "60.01",
"account_token_normalized": "60.1",
"account_scope_fields_checked": [
"account_dt",
"account_kt",
"registrator",
"analytics"
],
"account_scope_match_strategy": "account_code_regex_plus_alias_map_v1",
"account_scope_drop_reason": "rows_remaining_after_scope_filter",
"runtime_readiness": "REQUIRES_SPECIALIZED_RECIPE",
"limited_reason_category": "recipe_visibility_gap",
"response_type": "LIMITED_WITH_REASON",
"execution_lane": "address_query",
"llm_decomposition_applied": true,
"llm_decomposition_attempted": true,
"llm_provider_used": "local",
"llm_decomposition_trace_id": "VRv49EU2MYVPNh",
"llm_decomposition_effective_message": "какие документы формируют остаток по счету 60.01 на 2020-05-31",
"llm_decomposition_reason": "normalized_fragment_applied",
"fallback_rule_hit": null,
"sanitized_user_message": "какие доки формируют остаток 60.01 на 2020-05-31",
"tool_gate_decision": "run_address_lane",
"tool_gate_reason": "address_mode_classifier_detected",
"answer_structure_v11": null,
"investigation_state_snapshot": null,
"normalized": null,
"normalizer_output": {
"trace_id": "VRv49EU2MYVPNh",
"prompt_version": "normalizer_v2_0_2",
"applied": true,
"effective_message": "какие документы формируют остаток по счету 60.01 на 2020-05-31"
}
},
"error_code": null,
"error_message": null
},
{
"index": 43,
"id": "S043",
"question": "покажи документы по договору 15/24 за 2020",
"session": null,
"session_id": "asst-2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-40-54-s043",
"status_code": 200,
"ok": true,
"elapsed_ms": 8329,
"reply_type": "partial_coverage",
"trace_id": "address-xQI5GQkOLC",
"assistant_reply": "В live-данных по текущему фильтру записи не найдены.\nПричина: по указанному якорю и фильтрам в live-выборке нет строк.\nЧто нужно уточнить: уточните период или снимите часть фильтров.",
"assistant_reply_first_line": "В live-данных по текущему фильтру записи не найдены.",
"expected_intent": "list_documents_by_contract",
"actual_intent": "list_documents_by_contract",
"intent_match": true,
"expected_mode": "address_query",
"actual_mode": "address_query",
"mode_match": true,
"expected_reply_type": null,
"reply_match": true,
"semantic_pass": true,
"route_pass": false,
"route_health": "likely_blocked_route",
"strict_policy": "route",
"strict_pass": false,
"selected_recipe": "address_documents_by_contract_v1",
"missing_required_filters": [],
"match_failure_stage": "materialized_but_not_anchor_matched",
"match_failure_reason": "contract_anchor_not_matched_in_materialized_rows",
"rows_fetched": 20,
"rows_matched": 0,
"mcp_call_status": "materialized_but_not_anchor_matched",
"limited_reason_category": "empty_match",
"llm_decomposition_applied": true,
"llm_decomposition_reason": "normalized_fragment_applied",
"fallback_rule_hit": null,
"debug_payload": {
"trace_id": "address-xQI5GQkOLC",
"prompt_version": "address_query_runtime_v1",
"schema_version": "address_query_runtime_v1",
"fallback_type": "partial",
"route_summary": null,
"fragments": [],
"requirements_extracted": [],
"coverage_report": {
"requirements_total": 0,
"requirements_covered": 0,
"requirements_uncovered": [],
"requirements_partially_covered": [],
"clarification_needed_for": [],
"out_of_scope_requirements": []
},
"routes": [],
"retrieval_status": [],
"retrieval_results": [],
"answer_grounding_check": {
"status": "partial",
"route_subject_match": true,
"missing_requirements": [],
"reasons": [
"address_action_detected",
"address_entity_detected",
"document_list_signal_detected",
"documents_by_contract_signal_detected"
],
"why_included_summary": [],
"selection_reason_summary": []
},
"dropped_intent_segments": [],
"detected_mode": "address_query",
"detected_mode_confidence": "high",
"query_shape": "DOCUMENT_LIST",
"query_shape_confidence": "medium",
"detected_intent": "list_documents_by_contract",
"detected_intent_confidence": "medium",
"extracted_filters": {
"sort": "period_desc",
"limit": 20,
"contract": "15/24",
"period_from": "2020-01-01",
"period_to": "2020-12-31"
},
"missing_required_filters": [],
"selected_recipe": "address_documents_by_contract_v1",
"mcp_call_status_legacy": "materialized_but_not_matched",
"account_scope_mode": "preferred",
"account_scope_fallback_applied": true,
"anchor_type": "contract",
"anchor_value_raw": "15/24",
"anchor_value_resolved": "15/24",
"resolver_confidence": "medium",
"ambiguity_count": 0,
"match_failure_stage": "materialized_but_not_anchor_matched",
"match_failure_reason": "contract_anchor_not_matched_in_materialized_rows",
"mcp_call_status": "materialized_but_not_anchor_matched",
"rows_fetched": 20,
"raw_rows_received": 20,
"rows_after_account_scope": 20,
"rows_after_recipe_filter": 0,
"rows_materialized": 20,
"rows_matched": 0,
"raw_row_keys_sample": [
"Период",
"Регистратор",
"СчетДт",
"СчетКт",
"Сумма",
"Period",
"Registrator",
"AccountDt",
"AccountKt",
"Amount"
],
"materialization_drop_reason": "none",
"account_token_raw": null,
"account_token_normalized": null,
"account_scope_fields_checked": [
"account_dt",
"account_kt",
"registrator",
"analytics"
],
"account_scope_match_strategy": "account_code_regex_plus_alias_map_v1",
"account_scope_drop_reason": "not_applicable",
"runtime_readiness": "LIVE_QUERYABLE_WITH_LIMITS",
"limited_reason_category": "empty_match",
"response_type": "LIMITED_WITH_REASON",
"execution_lane": "address_query",
"llm_decomposition_applied": true,
"llm_decomposition_attempted": true,
"llm_provider_used": "local",
"llm_decomposition_trace_id": "o9lF35fLk7mxPL",
"llm_decomposition_effective_message": "Показать документы по договору 15/24 за период 2020 года.",
"llm_decomposition_reason": "normalized_fragment_applied",
"fallback_rule_hit": null,
"sanitized_user_message": "покажи документы по договору 15/24 за 2020",
"tool_gate_decision": "run_address_lane",
"tool_gate_reason": "address_mode_classifier_detected",
"answer_structure_v11": null,
"investigation_state_snapshot": null,
"normalized": null,
"normalizer_output": {
"trace_id": "o9lF35fLk7mxPL",
"prompt_version": "normalizer_v2_0_2",
"applied": true,
"effective_message": "Показать документы по договору 15/24 за период 2020 года."
}
},
"error_code": null,
"error_message": null
},
{
"index": 46,
"id": "S046",
"question": "docs by contract 15/24 year 2020",
"session": null,
"session_id": "asst-2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-40-54-s046",
"status_code": 200,
"ok": true,
"elapsed_ms": 8154,
"reply_type": "partial_coverage",
"trace_id": "address-mlhQGV9rWU",
"assistant_reply": "В live-данных по текущему фильтру записи не найдены.\nПричина: по указанному якорю и фильтрам в live-выборке нет строк.\nЧто нужно уточнить: уточните период или снимите часть фильтров.",
"assistant_reply_first_line": "В live-данных по текущему фильтру записи не найдены.",
"expected_intent": "list_documents_by_contract",
"actual_intent": "list_documents_by_contract",
"intent_match": true,
"expected_mode": "address_query",
"actual_mode": "address_query",
"mode_match": true,
"expected_reply_type": null,
"reply_match": true,
"semantic_pass": true,
"route_pass": false,
"route_health": "likely_blocked_route",
"strict_policy": "route",
"strict_pass": false,
"selected_recipe": "address_documents_by_contract_v1",
"missing_required_filters": [],
"match_failure_stage": "materialized_but_not_anchor_matched",
"match_failure_reason": "contract_anchor_not_matched_in_materialized_rows",
"rows_fetched": 20,
"rows_matched": 0,
"mcp_call_status": "materialized_but_not_anchor_matched",
"limited_reason_category": "empty_match",
"llm_decomposition_applied": false,
"llm_decomposition_reason": "normalized_fragment_same",
"fallback_rule_hit": null,
"debug_payload": {
"trace_id": "address-mlhQGV9rWU",
"prompt_version": "address_query_runtime_v1",
"schema_version": "address_query_runtime_v1",
"fallback_type": "partial",
"route_summary": null,
"fragments": [],
"requirements_extracted": [],
"coverage_report": {
"requirements_total": 0,
"requirements_covered": 0,
"requirements_uncovered": [],
"requirements_partially_covered": [],
"clarification_needed_for": [],
"out_of_scope_requirements": []
},
"routes": [],
"retrieval_status": [],
"retrieval_results": [],
"answer_grounding_check": {
"status": "partial",
"route_subject_match": true,
"missing_requirements": [],
"reasons": [
"address_entity_detected",
"object_signal_detected",
"documents_by_contract_signal_detected"
],
"why_included_summary": [],
"selection_reason_summary": []
},
"dropped_intent_segments": [],
"detected_mode": "address_query",
"detected_mode_confidence": "medium",
"query_shape": "OBJECT_LOOKUP",
"query_shape_confidence": "medium",
"detected_intent": "list_documents_by_contract",
"detected_intent_confidence": "medium",
"extracted_filters": {
"sort": "period_desc",
"limit": 20,
"contract": "15/24 year 2020",
"period_from": "2020-01-01",
"period_to": "2020-12-31"
},
"missing_required_filters": [],
"selected_recipe": "address_documents_by_contract_v1",
"mcp_call_status_legacy": "materialized_but_not_matched",
"account_scope_mode": "preferred",
"account_scope_fallback_applied": true,
"anchor_type": "contract",
"anchor_value_raw": "15/24 year 2020",
"anchor_value_resolved": "15/24 year 2020",
"resolver_confidence": "medium",
"ambiguity_count": 0,
"match_failure_stage": "materialized_but_not_anchor_matched",
"match_failure_reason": "contract_anchor_not_matched_in_materialized_rows",
"mcp_call_status": "materialized_but_not_anchor_matched",
"rows_fetched": 20,
"raw_rows_received": 20,
"rows_after_account_scope": 20,
"rows_after_recipe_filter": 0,
"rows_materialized": 20,
"rows_matched": 0,
"raw_row_keys_sample": [
"Период",
"Регистратор",
"СчетДт",
"СчетКт",
"Сумма",
"Period",
"Registrator",
"AccountDt",
"AccountKt",
"Amount"
],
"materialization_drop_reason": "none",
"account_token_raw": null,
"account_token_normalized": null,
"account_scope_fields_checked": [
"account_dt",
"account_kt",
"registrator",
"analytics"
],
"account_scope_match_strategy": "account_code_regex_plus_alias_map_v1",
"account_scope_drop_reason": "not_applicable",
"runtime_readiness": "LIVE_QUERYABLE_WITH_LIMITS",
"limited_reason_category": "empty_match",
"response_type": "LIMITED_WITH_REASON",
"execution_lane": "address_query",
"llm_decomposition_applied": false,
"llm_decomposition_attempted": true,
"llm_provider_used": "local",
"llm_decomposition_trace_id": "bdfZi1D7CmwQom",
"llm_decomposition_effective_message": "docs by contract 15/24 year 2020",
"llm_decomposition_reason": "normalized_fragment_same",
"fallback_rule_hit": null,
"sanitized_user_message": "документы by contract 15/2024 год 2020",
"tool_gate_decision": "run_address_lane",
"tool_gate_reason": "address_mode_classifier_detected",
"answer_structure_v11": null,
"investigation_state_snapshot": null,
"normalized": null,
"normalizer_output": {
"trace_id": "bdfZi1D7CmwQom",
"prompt_version": "normalizer_v2_0_2",
"applied": false,
"effective_message": "docs by contract 15/24 year 2020"
}
},
"error_code": null,
"error_message": null
},
{
"index": 88,
"id": "X028",
"question": "бля из чего состоит остаток по 60.01 на 2020-05-31",
"session": null,
"session_id": "asst-2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-40-54-x028",
"status_code": 200,
"ok": true,
"elapsed_ms": 7108,
"reply_type": "partial_coverage",
"trace_id": "address-qDWVyw0CNL",
"assistant_reply": "Текущий live recipe не дает нужную видимость данных для этого сценария.\nПричина: строки по якорю найдены, но отфильтрованы intent-specific recipe.\nЧто нужно уточнить: сузьте период, уточните контрагента или документный тип.",
"assistant_reply_first_line": "Текущий live recipe не дает нужную видимость данных для этого сценария.",
"expected_intent": "documents_forming_balance",
"actual_intent": "documents_forming_balance",
"intent_match": true,
"expected_mode": "address_query",
"actual_mode": "address_query",
"mode_match": true,
"expected_reply_type": null,
"reply_match": true,
"semantic_pass": true,
"route_pass": false,
"route_health": "blocked_recipe_visibility_gap",
"strict_policy": "route",
"strict_pass": false,
"selected_recipe": "address_documents_forming_balance_v1",
"missing_required_filters": [],
"match_failure_stage": "materialized_but_filtered_out_by_recipe",
"match_failure_reason": "rows_filtered_out_by_intent_recipe_after_anchor_match",
"rows_fetched": 5,
"rows_matched": 0,
"mcp_call_status": "materialized_but_filtered_out_by_recipe",
"limited_reason_category": "recipe_visibility_gap",
"llm_decomposition_applied": false,
"llm_decomposition_reason": "normalized_fragment_rejected_intent_conflict",
"fallback_rule_hit": null,
"debug_payload": {
"trace_id": "address-qDWVyw0CNL",
"prompt_version": "address_query_runtime_v1",
"schema_version": "address_query_runtime_v1",
"fallback_type": "partial",
"route_summary": null,
"fragments": [],
"requirements_extracted": [],
"coverage_report": {
"requirements_total": 0,
"requirements_covered": 0,
"requirements_uncovered": [],
"requirements_partially_covered": [],
"clarification_needed_for": [],
"out_of_scope_requirements": []
},
"routes": [],
"retrieval_status": [],
"retrieval_results": [],
"answer_grounding_check": {
"status": "partial",
"route_subject_match": true,
"missing_requirements": [],
"reasons": [
"address_action_detected",
"address_entity_detected",
"drilldown_signal_detected",
"documents_forming_balance_signal_detected"
],
"why_included_summary": [],
"selection_reason_summary": []
},
"dropped_intent_segments": [],
"detected_mode": "address_query",
"detected_mode_confidence": "high",
"query_shape": "DRILLDOWN_REQUEST",
"query_shape_confidence": "high",
"detected_intent": "documents_forming_balance",
"detected_intent_confidence": "high",
"extracted_filters": {
"sort": "period_desc",
"limit": 20,
"account": "60.01",
"period_from": "2020-05-01",
"period_to": "2020-05-31",
"as_of_date": "2020-05-31"
},
"missing_required_filters": [],
"selected_recipe": "address_documents_forming_balance_v1",
"mcp_call_status_legacy": "materialized_but_not_matched",
"account_scope_mode": "strict",
"account_scope_fallback_applied": false,
"anchor_type": "account",
"anchor_value_raw": "60.01",
"anchor_value_resolved": "60.01",
"resolver_confidence": "high",
"ambiguity_count": 0,
"match_failure_stage": "materialized_but_filtered_out_by_recipe",
"match_failure_reason": "rows_filtered_out_by_intent_recipe_after_anchor_match",
"mcp_call_status": "materialized_but_filtered_out_by_recipe",
"rows_fetched": 5,
"raw_rows_received": 5,
"rows_after_account_scope": 5,
"rows_after_recipe_filter": 5,
"rows_materialized": 5,
"rows_matched": 0,
"raw_row_keys_sample": [
"Период",
"Регистратор",
"СчетДт",
"СчетКт",
"Сумма",
"Period",
"Registrator",
"AccountDt",
"AccountKt",
"Amount"
],
"materialization_drop_reason": "none",
"account_token_raw": "60.01",
"account_token_normalized": "60.1",
"account_scope_fields_checked": [
"account_dt",
"account_kt",
"registrator",
"analytics"
],
"account_scope_match_strategy": "account_code_regex_plus_alias_map_v1",
"account_scope_drop_reason": "rows_remaining_after_scope_filter",
"runtime_readiness": "REQUIRES_SPECIALIZED_RECIPE",
"limited_reason_category": "recipe_visibility_gap",
"response_type": "LIMITED_WITH_REASON",
"execution_lane": "address_query",
"llm_decomposition_applied": false,
"llm_decomposition_attempted": true,
"llm_provider_used": "local",
"llm_decomposition_trace_id": "GbMdJJbzBPUruk",
"llm_decomposition_effective_message": "бля из чего состоит остаток по 60.01 на 2020-05-31",
"llm_decomposition_reason": "normalized_fragment_rejected_intent_conflict",
"fallback_rule_hit": null,
"sanitized_user_message": "из чего состоит остаток по 60.01 на 2020-05-31",
"tool_gate_decision": "run_address_lane",
"tool_gate_reason": "address_mode_classifier_detected",
"answer_structure_v11": null,
"investigation_state_snapshot": null,
"normalized": null,
"normalizer_output": {
"trace_id": "GbMdJJbzBPUruk",
"prompt_version": "normalizer_v2_0_2",
"applied": false,
"effective_message": "бля из чего состоит остаток по 60.01 на 2020-05-31"
}
},
"error_code": null,
"error_message": null
},
{
"index": 91,
"id": "X031",
"question": "docs by contract 15/24 2020",
"session": null,
"session_id": "asst-2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-40-54-x031",
"status_code": 200,
"ok": true,
"elapsed_ms": 8031,
"reply_type": "partial_coverage",
"trace_id": "address-mEQ3T-G789",
"assistant_reply": "В live-данных по текущему фильтру записи не найдены.\nПричина: по указанному якорю и фильтрам в live-выборке нет строк.\nЧто нужно уточнить: уточните период или снимите часть фильтров.",
"assistant_reply_first_line": "В live-данных по текущему фильтру записи не найдены.",
"expected_intent": "list_documents_by_contract",
"actual_intent": "list_documents_by_contract",
"intent_match": true,
"expected_mode": "address_query",
"actual_mode": "address_query",
"mode_match": true,
"expected_reply_type": null,
"reply_match": true,
"semantic_pass": true,
"route_pass": false,
"route_health": "likely_blocked_route",
"strict_policy": "route",
"strict_pass": false,
"selected_recipe": "address_documents_by_contract_v1",
"missing_required_filters": [],
"match_failure_stage": "materialized_but_not_anchor_matched",
"match_failure_reason": "contract_anchor_not_matched_in_materialized_rows",
"rows_fetched": 20,
"rows_matched": 0,
"mcp_call_status": "materialized_but_not_anchor_matched",
"limited_reason_category": "empty_match",
"llm_decomposition_applied": false,
"llm_decomposition_reason": "normalized_fragment_same",
"fallback_rule_hit": null,
"debug_payload": {
"trace_id": "address-mEQ3T-G789",
"prompt_version": "address_query_runtime_v1",
"schema_version": "address_query_runtime_v1",
"fallback_type": "partial",
"route_summary": null,
"fragments": [],
"requirements_extracted": [],
"coverage_report": {
"requirements_total": 0,
"requirements_covered": 0,
"requirements_uncovered": [],
"requirements_partially_covered": [],
"clarification_needed_for": [],
"out_of_scope_requirements": []
},
"routes": [],
"retrieval_status": [],
"retrieval_results": [],
"answer_grounding_check": {
"status": "partial",
"route_subject_match": true,
"missing_requirements": [],
"reasons": [
"address_entity_detected",
"object_signal_detected",
"documents_by_contract_signal_detected"
],
"why_included_summary": [],
"selection_reason_summary": []
},
"dropped_intent_segments": [],
"detected_mode": "address_query",
"detected_mode_confidence": "medium",
"query_shape": "OBJECT_LOOKUP",
"query_shape_confidence": "medium",
"detected_intent": "list_documents_by_contract",
"detected_intent_confidence": "medium",
"extracted_filters": {
"sort": "period_desc",
"limit": 20,
"contract": "15/24 2020",
"period_from": "2020-01-01",
"period_to": "2020-12-31"
},
"missing_required_filters": [],
"selected_recipe": "address_documents_by_contract_v1",
"mcp_call_status_legacy": "materialized_but_not_matched",
"account_scope_mode": "preferred",
"account_scope_fallback_applied": true,
"anchor_type": "contract",
"anchor_value_raw": "15/24 2020",
"anchor_value_resolved": "15/24 2020",
"resolver_confidence": "medium",
"ambiguity_count": 0,
"match_failure_stage": "materialized_but_not_anchor_matched",
"match_failure_reason": "contract_anchor_not_matched_in_materialized_rows",
"mcp_call_status": "materialized_but_not_anchor_matched",
"rows_fetched": 20,
"raw_rows_received": 20,
"rows_after_account_scope": 20,
"rows_after_recipe_filter": 0,
"rows_materialized": 20,
"rows_matched": 0,
"raw_row_keys_sample": [
"Период",
"Регистратор",
"СчетДт",
"СчетКт",
"Сумма",
"Period",
"Registrator",
"AccountDt",
"AccountKt",
"Amount"
],
"materialization_drop_reason": "none",
"account_token_raw": null,
"account_token_normalized": null,
"account_scope_fields_checked": [
"account_dt",
"account_kt",
"registrator",
"analytics"
],
"account_scope_match_strategy": "account_code_regex_plus_alias_map_v1",
"account_scope_drop_reason": "not_applicable",
"runtime_readiness": "LIVE_QUERYABLE_WITH_LIMITS",
"limited_reason_category": "empty_match",
"response_type": "LIMITED_WITH_REASON",
"execution_lane": "address_query",
"llm_decomposition_applied": false,
"llm_decomposition_attempted": true,
"llm_provider_used": "local",
"llm_decomposition_trace_id": "7cYAD2ehihqh2t",
"llm_decomposition_effective_message": "docs by contract 15/24 2020",
"llm_decomposition_reason": "normalized_fragment_same",
"fallback_rule_hit": null,
"sanitized_user_message": "документы by contract 15/24 2020",
"tool_gate_decision": "run_address_lane",
"tool_gate_reason": "address_mode_classifier_detected",
"answer_structure_v11": null,
"investigation_state_snapshot": null,
"normalized": null,
"normalizer_output": {
"trace_id": "7cYAD2ehihqh2t",
"prompt_version": "normalizer_v2_0_2",
"applied": false,
"effective_message": "docs by contract 15/24 2020"
}
},
"error_code": null,
"error_message": null
}
]

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,106 @@
# Response Audit: 2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-40-54
| id | strict | route_health | reply_type | intent | limited_reason | question | assistant_first_line |
|---|---|---|---|---|---|---|---|
| S001 | True | ok_or_factual | factual | list_documents_by_counterparty | None | свк доки за 2020 покаж пж | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| S002 | True | ok_or_factual | factual | list_documents_by_counterparty | None | покеж все доки по свк за 20 год | Собран список документов по контрагенту (live address lane). |
| S003 | True | ok_or_factual | factual | list_documents_by_counterparty | None | дай список документов по свк за 2020 | Собран список документов по контрагенту (live address lane). |
| S004 | True | ok_or_factual | factual | list_documents_by_counterparty | None | какие у свк есть доки за 2020? | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| S005 | True | ok_or_factual | factual | list_documents_by_counterparty | None | че по свк по докам за 2020 год | Собран список документов по контрагенту (live address lane). |
| S006 | True | ok_or_factual | factual | list_documents_by_counterparty | None | ёпт покажи доки по свк за 2020 | Собран список документов по контрагенту (live address lane). |
| S007 | True | ok_or_factual | factual | list_documents_by_counterparty | None | бля, доки свк 2020 вывали | Собран список документов по контрагенту (live address lane). |
| S008 | True | ok_or_factual | factual | list_documents_by_counterparty | None | svk docs for 2020 please | Собран список документов по контрагенту (live address lane). |
| S009 | True | ok_or_factual | factual | list_documents_by_counterparty | None | docs by counterparty svk year 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| S010 | True | ok_or_factual | factual | list_documents_by_counterparty | None | по контрагенту свк покаж документы за 2020 | Собран список документов по контрагенту (live address lane). |
| S011 | True | ok_or_factual | factual | list_documents_by_counterparty | None | плс доки по свк 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| S012 | True | ok_or_factual | factual | list_documents_by_counterparty | None | свк док за 2020 гони | Собран список документов по контрагенту (live address lane). |
| S013 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | по свк банковские операции за 2020 покаж | Собран список банковских операций по контрагенту (live address lane). |
| S014 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк выписка банка 2020 | Собран список банковских операций по контрагенту (live address lane). |
| S015 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | платежи по свк за 2020 выведи | Собран список банковских операций по контрагенту (live address lane). |
| S016 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | оплаты по свк за 2020 | Собран список банковских операций по контрагенту (live address lane). |
| S017 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк банк опер за 2020 | Собран список банковских операций по контрагенту (live address lane). |
| S018 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | че у свк по банку за 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| S019 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк списания/поступления за 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| S020 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | bank ops by svk for 2020 | Собран список банковских операций по контрагенту (live address lane). |
| S021 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | transactions by counterparty svk 2020 | Собран список банковских операций по контрагенту (live address lane). |
| S022 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | бля, по свк банковские платежки 2020 | Собран список банковских операций по контрагенту (live address lane). |
| S023 | True | ok_or_factual | factual | account_balance_snapshot | None | сальдо по счету 60.01 на дату 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
| S024 | True | ok_or_factual | factual | account_balance_snapshot | None | остаток по счету 60.01 на 2020.05 | Адресный срез по счету собран (по движениям live MCP). |
| S025 | True | ok_or_factual | factual | account_balance_snapshot | None | покажи остаток по 60.01 за май 2020 | Адресный срез по счету собран (по движениям live MCP). |
| S026 | True | ok_or_factual | factual | account_balance_snapshot | None | счет 60 остаток на май 2020 | Адресный срез по счету собран (по движениям live MCP). |
| S027 | True | ok_or_factual | factual | account_balance_snapshot | None | баланс account 60.01 as of 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
| S028 | True | ok_or_factual | factual | account_balance_snapshot | None | 60.01 saldo на 31.07.2020 | Адресный срез по счету собран (по движениям live MCP). |
| S029 | True | ok_or_factual | factual | account_balance_snapshot | None | сколько на счете 60 на конец 2020-05 | Адресный срез по счету собран (по движениям live MCP). |
| S030 | True | ok_or_factual | factual | account_balance_snapshot | None | дай остаток 60.02 на 2020-12-31 | Адресный срез по счету собран (по движениям live MCP). |
| S031 | True | partial_non_blocking | partial_coverage | account_balance_snapshot | empty_match | епт, сальдо по счету 62.01 на 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
| S032 | True | ok_or_factual | factual | account_balance_snapshot | None | плс остаток по счету 51 на 2020-06-30 | Адресный срез по счету собран (по движениям live MCP). |
| S033 | True | ok_or_factual | factual | account_balance_snapshot | None | как там по счету 60.01 на 2020.07? | Адресный срез по счету собран (по движениям live MCP). |
| S034 | True | ok_or_factual | factual | account_balance_snapshot | None | сальдо 60 на 2020 | Адресный срез по счету собран (по движениям live MCP). |
| S035 | True | ok_or_factual | factual | documents_forming_balance | None | какие документы формируют остаток по счету 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| S036 | False | blocked_recipe_visibility_gap | partial_coverage | documents_forming_balance | recipe_visibility_gap | из чего состоит остаток по счету 60 на 2020.05 | Текущий live recipe не дает нужную видимость данных для этого сценария. |
| S037 | True | ok_or_factual | factual | documents_forming_balance | None | раскрой остаток 60.01 по документам на конец июля 2020 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| S038 | True | ok_or_factual | factual | documents_forming_balance | None | доки под остатком 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| S039 | True | ok_or_factual | factual | documents_forming_balance | None | documents forming balance for account 60.01 as of 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| S040 | False | blocked_recipe_visibility_gap | partial_coverage | documents_forming_balance | recipe_visibility_gap | бля, какие доки формируют остаток 60.01 на 2020-05-31 | Текущий live recipe не дает нужную видимость данных для этого сценария. |
| S041 | True | partial_non_blocking | partial_coverage | documents_forming_balance | empty_match | по счету 62.01 раскрой остаток документами на 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
| S042 | True | ok_or_factual | factual | documents_forming_balance | None | из чего остаток по счету 51 на 2020-06-30 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| S043 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | покажи документы по договору 15/24 за 2020 | В live-данных по текущему фильтру записи не найдены. |
| S044 | True | ok_or_factual | factual | list_documents_by_contract | None | доки по дог. 15/24 за 2020 | Период сохранен. Глубина live-выборки автоматически расширена до 1000 строк. |
| S045 | True | ok_or_factual | factual | list_documents_by_contract | None | какие документы по контракту 15/24 | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
| S046 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | docs by contract 15/24 year 2020 | В live-данных по текущему фильтру записи не найдены. |
| S047 | True | ok_or_factual | factual | list_documents_by_contract | None | бля, покажи по договору 15/24 доки | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
| S048 | True | ok_or_factual | factual | list_documents_by_contract | None | договор 15/24 документы | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
| S049 | True | ok_or_factual | factual | list_documents_by_contract | None | плс документы договор №15/24 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| S050 | True | ok_or_factual | factual | list_documents_by_contract | None | покеж документы по 15/24 | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
| S051 | True | ok_or_factual | factual | bank_operations_by_contract | None | банковские операции по договору 15/24 | Собран список банковских операций по договору (live address lane). |
| S052 | True | ok_or_factual | factual | bank_operations_by_contract | None | платежи по договору 15/24 | Собран список банковских операций по договору (live address lane). |
| S053 | True | ok_or_factual | factual | bank_operations_by_contract | None | выписка по договору 15/24 | Собран список банковских операций по договору (live address lane). |
| S054 | True | ok_or_factual | factual | bank_operations_by_contract | None | bank ops by contract 15/24 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| S055 | True | ok_or_factual | factual | bank_operations_by_contract | None | ёпт, покажи банк операции по дог 15/24 | Собран список банковских операций по договору (live address lane). |
| S056 | True | ok_or_factual | factual | bank_operations_by_contract | None | по контракту 15/24 платежки | Собран список банковских операций по договору (live address lane). |
| S057 | True | ok_or_factual | factual | account_balance_snapshot | None | покажи сальдо по счету 60 за 2020 | Адресный срез по счету собран (по движениям live MCP). |
| S058 | True | ok_or_factual | factual | account_balance_snapshot | None | а теперь только май 2020 | Адресный срез по счету собран (по движениям live MCP). |
| S059 | True | ok_or_factual | factual | account_balance_snapshot | None | ок, теперь 2020.05 | Адресный срез по счету собран (по движениям live MCP). |
| S060 | True | ok_or_factual | factual | account_balance_snapshot | None | теперь на 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
| X001 | True | ok_or_factual | factual | list_documents_by_counterparty | None | свк доки кинь за 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| X002 | True | ok_or_factual | factual | list_documents_by_counterparty | None | по свк все документы за 20й год | Собран список документов по контрагенту (live address lane). |
| X003 | True | ok_or_factual | factual | list_documents_by_counterparty | None | пж вывали доки контрагент свк 2020 | Собран список документов по контрагенту (live address lane). |
| X004 | True | ok_or_factual | factual | list_documents_by_counterparty | None | svk poka docy za 2020 | Собран список документов по контрагенту (live address lane). |
| X005 | True | ok_or_factual | factual | list_documents_by_counterparty | None | какие доки по компании свк за 2020 | Собран список документов по контрагенту (live address lane). |
| X006 | True | ok_or_factual | factual | list_documents_by_counterparty | None | бля покаж свк документы 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| X007 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк банк операции за 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| X008 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | по свк выписку банка за 2020 выведи | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| X009 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк платежки за 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| X010 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | bank ops svk 2020 | Собран список банковских операций по контрагенту (live address lane). |
| X011 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | транзакции по свк за 2020 | Собран список банковских операций по контрагенту (live address lane). |
| X012 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | ёпт по свк че по банку 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| X013 | True | ok_or_factual | factual | account_balance_snapshot | None | остаток по 60.01 на 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
| X014 | True | ok_or_factual | factual | account_balance_snapshot | None | сальдо 60.01 на 31.07.2020 | Адресный срез по счету собран (по движениям live MCP). |
| X015 | True | ok_or_factual | factual | account_balance_snapshot | None | что на счете 60 на 2020.05 | Адресный срез по счету собран (по движениям live MCP). |
| X016 | True | ok_or_factual | factual | account_balance_snapshot | None | дай остаток 62.01 на 2020 май | Адресный срез по счету собран (по движениям live MCP). |
| X017 | True | partial_non_blocking | partial_coverage | account_balance_snapshot | empty_match | saldo account 60 as of 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
| X018 | True | ok_or_factual | factual | account_balance_snapshot | None | плиз остаток по счету 51 на 2020-06-30 | Адресный срез по счету собран (по движениям live MCP). |
| X019 | True | partial_non_blocking | partial_coverage | account_balance_snapshot | empty_match | скока по 60.02 на конец 2020-12 | В live-данных по текущему фильтру записи не найдены. |
| X020 | True | ok_or_factual | factual | account_balance_snapshot | None | бля сальдо 60.01 на 2020-05-31 | Адресный срез по счету собран (по движениям live MCP). |
| X021 | True | ok_or_factual | factual | documents_forming_balance | None | раскрой остаток 60.01 по документам на конец июля 2020 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| X022 | True | ok_or_factual | factual | documents_forming_balance | None | доки под остатком 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| X023 | True | ok_or_factual | factual | documents_forming_balance | None | из чего остаток 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| X024 | True | ok_or_factual | factual | documents_forming_balance | None | какие документы формируют остаток по 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| X025 | True | ok_or_factual | factual | documents_forming_balance | None | docs forming balance 60.01 as of 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| X026 | True | partial_non_blocking | partial_coverage | documents_forming_balance | empty_match | раскидай остаток 62.01 по докам на 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
| X027 | True | ok_or_factual | factual | documents_forming_balance | None | по счету 51 раскрой остаток документами на 2020-06-30 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| X028 | False | blocked_recipe_visibility_gap | partial_coverage | documents_forming_balance | recipe_visibility_gap | бля из чего состоит остаток по 60.01 на 2020-05-31 | Текущий live recipe не дает нужную видимость данных для этого сценария. |
| X029 | True | ok_or_factual | factual | list_documents_by_contract | None | доки по договору 15/24 за 2020 | Период сохранен. Глубина live-выборки автоматически расширена до 1000 строк. |
| X030 | True | ok_or_factual | factual | list_documents_by_contract | None | покажи документы контракт 15/24 | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
| X031 | False | likely_blocked_route | partial_coverage | list_documents_by_contract | empty_match | docs by contract 15/24 2020 | В live-данных по текущему фильтру записи не найдены. |
| X032 | True | ok_or_factual | factual | list_documents_by_contract | None | по дог 15/24 какие документы | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
| X033 | True | ok_or_factual | factual | list_documents_by_contract | None | договор 15/24 выведи доки | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| X034 | True | ok_or_factual | factual | list_documents_by_contract | None | нах покажи документы по 15/24 | Документный фильтр в live дал пустой набор; показываю связанные банковские операции по договору. |
| X035 | True | ok_or_factual | factual | bank_operations_by_contract | None | банк операции по договору 15/24 | Собран список банковских операций по договору (live address lane). |
| X036 | True | ok_or_factual | factual | bank_operations_by_contract | None | платежки по дог 15/24 | Собран список банковских операций по договору (live address lane). |
| X037 | True | ok_or_factual | factual | bank_operations_by_contract | None | выписка по контракту 15/24 | Собран список банковских операций по договору (live address lane). |
| X038 | True | ok_or_factual | factual | bank_operations_by_contract | None | bank ops by contract 15/24 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| X039 | True | ok_or_factual | factual | bank_operations_by_contract | None | покажи банк опер по дог 15/24 пж | Собран список банковских операций по договору (live address lane). |
| X040 | True | ok_or_factual | factual | bank_operations_by_contract | None | епт транзакции договор 15/24 | Собран список банковских операций по договору (live address lane). |
| X041 | True | ok_or_factual | factual | account_balance_snapshot | None | покажи сальдо по счету 60 за 2020 | Адресный срез по счету собран (по движениям live MCP). |
| X042 | True | ok_or_factual | factual | account_balance_snapshot | None | а теперь только май 2020 | Адресный срез по счету собран (по движениям live MCP). |

View File

@ -0,0 +1,59 @@
{
"run_id": "2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-40-54",
"generated_at": "2026-04-02T12:50:55",
"source_questions_file": "X:\\1C\\NDC_1C\\docs\\ADDRESS\\question_sets\\address_slang_stress_full_2026-04-02.json",
"backend_url": "http://127.0.0.1:8787/api/assistant/message",
"llm_provider": "local",
"llm_model": "qwen2.5-14b-instruct-1m",
"llm_base_url": "http://127.0.0.1:1234",
"strict_policy": "route",
"totals": {
"questions_total": 102,
"ok_200_count": 102,
"semantic_pass_count": 102,
"semantic_pass_rate": 1.0,
"route_pass_count": 96,
"route_pass_rate": 0.9412,
"strict_pass_count": 96,
"strict_pass_rate": 0.9412,
"factual_count": 91,
"partial_coverage_count": 11,
"clarification_required_count": 0,
"http_error_count": 0,
"llm_decomposition_applied_count": 77,
"avg_elapsed_ms": 5892.0
},
"distributions": {
"reply_type": {
"factual": 91,
"partial_coverage": 11
},
"actual_intent": {
"list_documents_by_counterparty": 18,
"bank_operations_by_counterparty": 16,
"account_balance_snapshot": 26,
"documents_forming_balance": 16,
"list_documents_by_contract": 14,
"bank_operations_by_contract": 12
},
"actual_mode": {
"address_query": 102
},
"mcp_call_status": {
"matched_non_empty": 91,
"no_raw_rows": 5,
"materialized_but_filtered_out_by_recipe": 3,
"materialized_but_not_anchor_matched": 3
},
"limited_reason_category": {
"empty_match": 8,
"recipe_visibility_gap": 3
},
"route_health": {
"ok_or_factual": 91,
"partial_non_blocking": 5,
"blocked_recipe_visibility_gap": 3,
"likely_blocked_route": 3
}
}
}

View File

@ -0,0 +1,28 @@
# 2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-57-27
Generated at: 2026-04-02T13:07:31
Questions file: X:\1C\NDC_1C\docs\ADDRESS\question_sets\address_slang_stress_full_2026-04-02.json
Backend URL: http://127.0.0.1:8787/api/assistant/message
LLM: local / qwen2.5-14b-instruct-1m @ http://127.0.0.1:1234
Strict policy: route
## Totals
- questions_total: 102
- ok_200_count: 102
- semantic_pass_count: 102
- semantic_pass_rate: 1.0
- route_pass_count: 102
- route_pass_rate: 1.0
- strict_pass_count: 102
- strict_pass_rate: 1.0
- factual_count: 97
- partial_coverage_count: 5
- clarification_required_count: 0
- http_error_count: 0
- llm_decomposition_applied_count: 77
- avg_elapsed_ms: 5922.3
## Files
- run_summary.json
- full_live_results.json
- failures_only.json

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,106 @@
# Response Audit: 2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-57-27
| id | strict | route_health | reply_type | intent | limited_reason | question | assistant_first_line |
|---|---|---|---|---|---|---|---|
| S001 | True | ok_or_factual | factual | list_documents_by_counterparty | None | свк доки за 2020 покаж пж | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| S002 | True | ok_or_factual | factual | list_documents_by_counterparty | None | покеж все доки по свк за 20 год | Собран список документов по контрагенту (live address lane). |
| S003 | True | ok_or_factual | factual | list_documents_by_counterparty | None | дай список документов по свк за 2020 | Собран список документов по контрагенту (live address lane). |
| S004 | True | ok_or_factual | factual | list_documents_by_counterparty | None | какие у свк есть доки за 2020? | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| S005 | True | ok_or_factual | factual | list_documents_by_counterparty | None | че по свк по докам за 2020 год | Собран список документов по контрагенту (live address lane). |
| S006 | True | ok_or_factual | factual | list_documents_by_counterparty | None | ёпт покажи доки по свк за 2020 | Собран список документов по контрагенту (live address lane). |
| S007 | True | ok_or_factual | factual | list_documents_by_counterparty | None | бля, доки свк 2020 вывали | Собран список документов по контрагенту (live address lane). |
| S008 | True | ok_or_factual | factual | list_documents_by_counterparty | None | svk docs for 2020 please | Собран список документов по контрагенту (live address lane). |
| S009 | True | ok_or_factual | factual | list_documents_by_counterparty | None | docs by counterparty svk year 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| S010 | True | ok_or_factual | factual | list_documents_by_counterparty | None | по контрагенту свк покаж документы за 2020 | Собран список документов по контрагенту (live address lane). |
| S011 | True | ok_or_factual | factual | list_documents_by_counterparty | None | плс доки по свк 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| S012 | True | ok_or_factual | factual | list_documents_by_counterparty | None | свк док за 2020 гони | Собран список документов по контрагенту (live address lane). |
| S013 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | по свк банковские операции за 2020 покаж | Собран список банковских операций по контрагенту (live address lane). |
| S014 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк выписка банка 2020 | Собран список банковских операций по контрагенту (live address lane). |
| S015 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | платежи по свк за 2020 выведи | Собран список банковских операций по контрагенту (live address lane). |
| S016 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | оплаты по свк за 2020 | Собран список банковских операций по контрагенту (live address lane). |
| S017 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк банк опер за 2020 | Собран список банковских операций по контрагенту (live address lane). |
| S018 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | че у свк по банку за 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| S019 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк списания/поступления за 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| S020 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | bank ops by svk for 2020 | Собран список банковских операций по контрагенту (live address lane). |
| S021 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | transactions by counterparty svk 2020 | Собран список банковских операций по контрагенту (live address lane). |
| S022 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | бля, по свк банковские платежки 2020 | Собран список банковских операций по контрагенту (live address lane). |
| S023 | True | ok_or_factual | factual | account_balance_snapshot | None | сальдо по счету 60.01 на дату 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
| S024 | True | ok_or_factual | factual | account_balance_snapshot | None | остаток по счету 60.01 на 2020.05 | Адресный срез по счету собран (по движениям live MCP). |
| S025 | True | ok_or_factual | factual | account_balance_snapshot | None | покажи остаток по 60.01 за май 2020 | Адресный срез по счету собран (по движениям live MCP). |
| S026 | True | ok_or_factual | factual | account_balance_snapshot | None | счет 60 остаток на май 2020 | Адресный срез по счету собран (по движениям live MCP). |
| S027 | True | ok_or_factual | factual | account_balance_snapshot | None | баланс account 60.01 as of 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
| S028 | True | ok_or_factual | factual | account_balance_snapshot | None | 60.01 saldo на 31.07.2020 | Адресный срез по счету собран (по движениям live MCP). |
| S029 | True | ok_or_factual | factual | account_balance_snapshot | None | сколько на счете 60 на конец 2020-05 | Адресный срез по счету собран (по движениям live MCP). |
| S030 | True | ok_or_factual | factual | account_balance_snapshot | None | дай остаток 60.02 на 2020-12-31 | Адресный срез по счету собран (по движениям live MCP). |
| S031 | True | partial_non_blocking | partial_coverage | account_balance_snapshot | empty_match | епт, сальдо по счету 62.01 на 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
| S032 | True | ok_or_factual | factual | account_balance_snapshot | None | плс остаток по счету 51 на 2020-06-30 | Адресный срез по счету собран (по движениям live MCP). |
| S033 | True | ok_or_factual | factual | account_balance_snapshot | None | как там по счету 60.01 на 2020.07? | Адресный срез по счету собран (по движениям live MCP). |
| S034 | True | ok_or_factual | factual | account_balance_snapshot | None | сальдо 60 на 2020 | Адресный срез по счету собран (по движениям live MCP). |
| S035 | True | ok_or_factual | factual | documents_forming_balance | None | какие документы формируют остаток по счету 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| S036 | True | ok_or_factual | factual | documents_forming_balance | None | из чего состоит остаток по счету 60 на 2020.05 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| S037 | True | ok_or_factual | factual | documents_forming_balance | None | раскрой остаток 60.01 по документам на конец июля 2020 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| S038 | True | ok_or_factual | factual | documents_forming_balance | None | доки под остатком 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| S039 | True | ok_or_factual | factual | documents_forming_balance | None | documents forming balance for account 60.01 as of 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| S040 | True | ok_or_factual | factual | documents_forming_balance | None | бля, какие доки формируют остаток 60.01 на 2020-05-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| S041 | True | partial_non_blocking | partial_coverage | documents_forming_balance | empty_match | по счету 62.01 раскрой остаток документами на 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
| S042 | True | ok_or_factual | factual | documents_forming_balance | None | из чего остаток по счету 51 на 2020-06-30 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| S043 | True | ok_or_factual | factual | list_documents_by_contract | None | покажи документы по договору 15/24 за 2020 | Период сохранен. Глубина live-выборки автоматически расширена до 1000 строк. |
| S044 | True | ok_or_factual | factual | list_documents_by_contract | None | доки по дог. 15/24 за 2020 | Период сохранен. Глубина live-выборки автоматически расширена до 1000 строк. |
| S045 | True | ok_or_factual | factual | list_documents_by_contract | None | какие документы по контракту 15/24 | Собран список документов по договору (live address lane). |
| S046 | True | ok_or_factual | factual | list_documents_by_contract | None | docs by contract 15/24 year 2020 | Период сохранен. Глубина live-выборки автоматически расширена до 1000 строк. |
| S047 | True | ok_or_factual | factual | list_documents_by_contract | None | бля, покажи по договору 15/24 доки | Собран список документов по договору (live address lane). |
| S048 | True | ok_or_factual | factual | list_documents_by_contract | None | договор 15/24 документы | Собран список документов по договору (live address lane). |
| S049 | True | ok_or_factual | factual | list_documents_by_contract | None | плс документы договор №15/24 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| S050 | True | ok_or_factual | factual | list_documents_by_contract | None | покеж документы по 15/24 | Собран список документов по договору (live address lane). |
| S051 | True | ok_or_factual | factual | bank_operations_by_contract | None | банковские операции по договору 15/24 | Собран список банковских операций по договору (live address lane). |
| S052 | True | ok_or_factual | factual | bank_operations_by_contract | None | платежи по договору 15/24 | Собран список банковских операций по договору (live address lane). |
| S053 | True | ok_or_factual | factual | bank_operations_by_contract | None | выписка по договору 15/24 | Собран список банковских операций по договору (live address lane). |
| S054 | True | ok_or_factual | factual | bank_operations_by_contract | None | bank ops by contract 15/24 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| S055 | True | ok_or_factual | factual | bank_operations_by_contract | None | ёпт, покажи банк операции по дог 15/24 | Собран список банковских операций по договору (live address lane). |
| S056 | True | ok_or_factual | factual | bank_operations_by_contract | None | по контракту 15/24 платежки | Собран список банковских операций по договору (live address lane). |
| S057 | True | ok_or_factual | factual | account_balance_snapshot | None | покажи сальдо по счету 60 за 2020 | Адресный срез по счету собран (по движениям live MCP). |
| S058 | True | ok_or_factual | factual | account_balance_snapshot | None | а теперь только май 2020 | Адресный срез по счету собран (по движениям live MCP). |
| S059 | True | ok_or_factual | factual | account_balance_snapshot | None | ок, теперь 2020.05 | Адресный срез по счету собран (по движениям live MCP). |
| S060 | True | ok_or_factual | factual | account_balance_snapshot | None | теперь на 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
| X001 | True | ok_or_factual | factual | list_documents_by_counterparty | None | свк доки кинь за 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| X002 | True | ok_or_factual | factual | list_documents_by_counterparty | None | по свк все документы за 20й год | Собран список документов по контрагенту (live address lane). |
| X003 | True | ok_or_factual | factual | list_documents_by_counterparty | None | пж вывали доки контрагент свк 2020 | Собран список документов по контрагенту (live address lane). |
| X004 | True | ok_or_factual | factual | list_documents_by_counterparty | None | svk poka docy za 2020 | Собран список документов по контрагенту (live address lane). |
| X005 | True | ok_or_factual | factual | list_documents_by_counterparty | None | какие доки по компании свк за 2020 | Собран список документов по контрагенту (live address lane). |
| X006 | True | ok_or_factual | factual | list_documents_by_counterparty | None | бля покаж свк документы 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| X007 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк банк операции за 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| X008 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | по свк выписку банка за 2020 выведи | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| X009 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк платежки за 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| X010 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | bank ops svk 2020 | Собран список банковских операций по контрагенту (live address lane). |
| X011 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | транзакции по свк за 2020 | Собран список банковских операций по контрагенту (live address lane). |
| X012 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | ёпт по свк че по банку 2020 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| X013 | True | ok_or_factual | factual | account_balance_snapshot | None | остаток по 60.01 на 2020-07-31 | Адресный срез по счету собран (по движениям live MCP). |
| X014 | True | ok_or_factual | factual | account_balance_snapshot | None | сальдо 60.01 на 31.07.2020 | Адресный срез по счету собран (по движениям live MCP). |
| X015 | True | ok_or_factual | factual | account_balance_snapshot | None | что на счете 60 на 2020.05 | Адресный срез по счету собран (по движениям live MCP). |
| X016 | True | ok_or_factual | factual | account_balance_snapshot | None | дай остаток 62.01 на 2020 май | Адресный срез по счету собран (по движениям live MCP). |
| X017 | True | partial_non_blocking | partial_coverage | account_balance_snapshot | empty_match | saldo account 60 as of 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
| X018 | True | ok_or_factual | factual | account_balance_snapshot | None | плиз остаток по счету 51 на 2020-06-30 | Адресный срез по счету собран (по движениям live MCP). |
| X019 | True | partial_non_blocking | partial_coverage | account_balance_snapshot | empty_match | скока по 60.02 на конец 2020-12 | В live-данных по текущему фильтру записи не найдены. |
| X020 | True | ok_or_factual | factual | account_balance_snapshot | None | бля сальдо 60.01 на 2020-05-31 | Адресный срез по счету собран (по движениям live MCP). |
| X021 | True | ok_or_factual | factual | documents_forming_balance | None | раскрой остаток 60.01 по документам на конец июля 2020 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| X022 | True | ok_or_factual | factual | documents_forming_balance | None | доки под остатком 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| X023 | True | ok_or_factual | factual | documents_forming_balance | None | из чего остаток 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| X024 | True | ok_or_factual | factual | documents_forming_balance | None | какие документы формируют остаток по 60.01 на 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| X025 | True | ok_or_factual | factual | documents_forming_balance | None | docs forming balance 60.01 as of 2020-07-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| X026 | True | partial_non_blocking | partial_coverage | documents_forming_balance | empty_match | раскидай остаток 62.01 по докам на 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
| X027 | True | ok_or_factual | factual | documents_forming_balance | None | по счету 51 раскрой остаток документами на 2020-06-30 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| X028 | True | ok_or_factual | factual | documents_forming_balance | None | бля из чего состоит остаток по 60.01 на 2020-05-31 | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
| X029 | True | ok_or_factual | factual | list_documents_by_contract | None | доки по договору 15/24 за 2020 | Период сохранен. Глубина live-выборки автоматически расширена до 1000 строк. |
| X030 | True | ok_or_factual | factual | list_documents_by_contract | None | покажи документы контракт 15/24 | Собран список документов по договору (live address lane). |
| X031 | True | ok_or_factual | factual | list_documents_by_contract | None | docs by contract 15/24 2020 | Период сохранен. Глубина live-выборки автоматически расширена до 1000 строк. |
| X032 | True | ok_or_factual | factual | list_documents_by_contract | None | по дог 15/24 какие документы | Собран список документов по договору (live address lane). |
| X033 | True | ok_or_factual | factual | list_documents_by_contract | None | договор 15/24 выведи доки | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| X034 | True | ok_or_factual | factual | list_documents_by_contract | None | нах покажи документы по 15/24 | Собран список документов по договору (live address lane). |
| X035 | True | ok_or_factual | factual | bank_operations_by_contract | None | банк операции по договору 15/24 | Собран список банковских операций по договору (live address lane). |
| X036 | True | ok_or_factual | factual | bank_operations_by_contract | None | платежки по дог 15/24 | Собран список банковских операций по договору (live address lane). |
| X037 | True | ok_or_factual | factual | bank_operations_by_contract | None | выписка по контракту 15/24 | Собран список банковских операций по договору (live address lane). |
| X038 | True | ok_or_factual | factual | bank_operations_by_contract | None | bank ops by contract 15/24 | Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу. |
| X039 | True | ok_or_factual | factual | bank_operations_by_contract | None | покажи банк опер по дог 15/24 пж | Собран список банковских операций по договору (live address lane). |
| X040 | True | ok_or_factual | factual | bank_operations_by_contract | None | епт транзакции договор 15/24 | Собран список банковских операций по договору (live address lane). |
| X041 | True | ok_or_factual | factual | account_balance_snapshot | None | покажи сальдо по счету 60 за 2020 | Адресный срез по счету собран (по движениям live MCP). |
| X042 | True | ok_or_factual | factual | account_balance_snapshot | None | а теперь только май 2020 | Адресный срез по счету собран (по движениям live MCP). |

View File

@ -0,0 +1,54 @@
{
"run_id": "2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-57-27",
"generated_at": "2026-04-02T13:07:31",
"source_questions_file": "X:\\1C\\NDC_1C\\docs\\ADDRESS\\question_sets\\address_slang_stress_full_2026-04-02.json",
"backend_url": "http://127.0.0.1:8787/api/assistant/message",
"llm_provider": "local",
"llm_model": "qwen2.5-14b-instruct-1m",
"llm_base_url": "http://127.0.0.1:1234",
"strict_policy": "route",
"totals": {
"questions_total": 102,
"ok_200_count": 102,
"semantic_pass_count": 102,
"semantic_pass_rate": 1.0,
"route_pass_count": 102,
"route_pass_rate": 1.0,
"strict_pass_count": 102,
"strict_pass_rate": 1.0,
"factual_count": 97,
"partial_coverage_count": 5,
"clarification_required_count": 0,
"http_error_count": 0,
"llm_decomposition_applied_count": 77,
"avg_elapsed_ms": 5922.3
},
"distributions": {
"reply_type": {
"factual": 97,
"partial_coverage": 5
},
"actual_intent": {
"list_documents_by_counterparty": 18,
"bank_operations_by_counterparty": 16,
"account_balance_snapshot": 26,
"documents_forming_balance": 16,
"list_documents_by_contract": 14,
"bank_operations_by_contract": 12
},
"actual_mode": {
"address_query": 102
},
"mcp_call_status": {
"matched_non_empty": 97,
"no_raw_rows": 5
},
"limited_reason_category": {
"empty_match": 5
},
"route_health": {
"ok_or_factual": 97,
"partial_non_blocking": 5
}
}
}

View File

@ -323,12 +323,27 @@ function cleanupAnchorValue(value) {
.replace(/\s+(?:с|по|за)(?:\s+|$)[\s\S]*$/iu, "") .replace(/\s+(?:с|по|за)(?:\s+|$)[\s\S]*$/iu, "")
.trim(); .trim();
} }
function cleanupContractAnchorValue(value) {
let normalized = cleanupAnchorValue(value);
if (!normalized) {
return normalized;
}
const yearQualifierTailPattern = /\s+(?:(?:за|for)\s+)?(?:year|г(?:од|ода)?\.?)\s*(?:20\d{2}|\d{2})(?:\s+|$)[\s\S]*$/iu;
if (yearQualifierTailPattern.test(normalized)) {
normalized = normalized.replace(yearQualifierTailPattern, "").trim();
}
const trailingSeparatedYearPattern = /\s+(?:20\d{2}|\d{2})\s*(?:г(?:од|ода)?\.?|year)?$/iu;
if (trailingSeparatedYearPattern.test(normalized) && /[\/\\-]/.test(normalized)) {
normalized = normalized.replace(trailingSeparatedYearPattern, "").trim();
}
return normalized;
}
function hasAllTimeHint(text) { function hasAllTimeHint(text) {
const value = String(text ?? ""); const value = String(text ?? "");
return /(?:за\s+вс[её]\s+время|за\s+весь\s+период|за\s+весь\s+срок|за\s+всю\s+истори(?:ю|и)|за\s+любой\s+период|за\s+любой\s+срок|for\s+all\s+time|all\s+time|for\s+entire\s+period|entire\s+period|for\s+any\s+period|any\s+period|for\s+full\s+history|full\s+history)/iu.test(value); return /(?:за\s+вс[её]\s+время|за\s+весь\s+период|за\s+весь\s+срок|за\s+всю\s+истори(?:ю|и)|за\s+любой\s+период|за\s+любой\s+срок|for\s+all\s+time|all\s+time|for\s+entire\s+period|entire\s+period|for\s+any\s+period|any\s+period|for\s+full\s+history|full\s+history)/iu.test(value);
} }
function extractLooseByAnchorValue(text) { function extractLooseByAnchorValue(text) {
const match = String(text ?? "").match(/(?:^|\s)по\s+([a-zа-яё][a-zа-яё0-9._-]{1,})(?=[\s,.;:!?)]|$)/iu); const match = String(text ?? "").match(/(?:^|\s)по\s+([\p{L}][\p{L}\p{N}._-]{1,})(?=[\s,.;:!?)]|$)/iu);
if (!match) { if (!match) {
return undefined; return undefined;
} }
@ -471,14 +486,14 @@ function isLikelyCounterpartyToken(rawToken) {
} }
function hasDocsOrBankSignal(text) { function hasDocsOrBankSignal(text) {
const lowered = String(text ?? "").toLowerCase(); const lowered = String(text ?? "").toLowerCase();
return new RegExp(`(?:${DOC_SIGNAL_PATTERN}|банк|выписк|платеж|платёж|оплат|transactions?|bank\\s+ops|bank\\s+operations?|payment|payments?|platezh|oplata)`, "iu").test(lowered); return new RegExp(`(?:${DOC_SIGNAL_PATTERN}|банк|выписк|списан|поступлен|платеж|платёж|оплат|transactions?|bank\\s+ops|bank\\s+operations?|payment|payments?|platezh|oplata)`, "iu").test(lowered);
} }
function extractCounterpartyFromFreeTextHeuristic(text) { function extractCounterpartyFromFreeTextHeuristic(text) {
if (!hasDocsOrBankSignal(text)) { if (!hasDocsOrBankSignal(text)) {
return undefined; return undefined;
} }
const tokens = String(text ?? "") const tokens = String(text ?? "")
.split(/[^a-zа-яё0-9._-]+/iu) .split(/[^\p{L}\p{N}._-]+/u)
.map((item) => item.trim()) .map((item) => item.trim())
.filter((item) => item.length > 0); .filter((item) => item.length > 0);
if (tokens.length === 0) { if (tokens.length === 0) {
@ -531,7 +546,7 @@ function extractCounterpartyFromFreeTextHeuristic(text) {
} }
function extractImplicitCounterpartyValue(text) { function extractImplicitCounterpartyValue(text) {
const input = String(text ?? ""); const input = String(text ?? "");
const beforeDocsPattern = new RegExp(`(?:^|\\s)([a-zа-яё][a-zа-яё0-9._-]{1,})\\s+${DOC_SIGNAL_PATTERN}(?=[\\s,.;:!?)]|$)`, "iu"); const beforeDocsPattern = new RegExp(`(?:^|\\s)([\\p{L}][\\p{L}\\p{N}._-]{1,})\\s+${DOC_SIGNAL_PATTERN}(?=[\\s,.;:!?)]|$)`, "iu");
const beforeDocsMatch = input.match(beforeDocsPattern); const beforeDocsMatch = input.match(beforeDocsPattern);
if (beforeDocsMatch) { if (beforeDocsMatch) {
const candidate = String(beforeDocsMatch[1] ?? "").trim(); const candidate = String(beforeDocsMatch[1] ?? "").trim();
@ -539,7 +554,7 @@ function extractImplicitCounterpartyValue(text) {
return candidate; return candidate;
} }
} }
const afterDocsPattern = new RegExp(`${DOC_SIGNAL_PATTERN}\\s+(?:по\\s+)?([a-zа-яё][a-zа-яё0-9._-]{1,})(?=[\\s,.;:!?)]|$)`, "iu"); const afterDocsPattern = new RegExp(`${DOC_SIGNAL_PATTERN}\\s+(?:по\\s+)?([\\p{L}][\\p{L}\\p{N}._-]{1,})(?=[\\s,.;:!?)]|$)`, "iu");
const afterDocsMatch = input.match(afterDocsPattern); const afterDocsMatch = input.match(afterDocsPattern);
if (afterDocsMatch) { if (afterDocsMatch) {
const candidate = String(afterDocsMatch[1] ?? "").trim(); const candidate = String(afterDocsMatch[1] ?? "").trim();
@ -549,6 +564,77 @@ function extractImplicitCounterpartyValue(text) {
} }
return undefined; return undefined;
} }
function extractLeadingCounterpartyTokenHeuristic(text) {
if (!hasDocsOrBankSignal(text)) {
return undefined;
}
const tokens = String(text ?? "")
.split(/[^\p{L}\p{N}._-]+/u)
.map((item) => item.trim())
.filter((item) => item.length > 0);
if (tokens.length === 0) {
return undefined;
}
const monthTokens = [
"янв",
"фев",
"мар",
"апр",
"май",
"июн",
"июл",
"авг",
"сен",
"сент",
"окт",
"ноя",
"дек",
"january",
"february",
"march",
"april",
"may",
"june",
"july",
"august",
"september",
"october",
"november",
"december"
];
for (const token of tokens.slice(0, 3)) {
const lowered = token.toLowerCase();
if (!isLikelyCounterpartyToken(lowered)) {
continue;
}
if (/^\d{2}$/.test(lowered) || /^\d{4}$/.test(lowered)) {
continue;
}
if (monthTokens.some((prefix) => lowered.startsWith(prefix))) {
continue;
}
if (/(?:^за$|^for$|^from$|^to$|^по$|^с$|^год$|^года$|^г$|^year$|^на$|^in$)/iu.test(lowered)) {
continue;
}
return token;
}
return undefined;
}
function hasExplicitAccountCue(text) {
return /(?:сч[её]т|счет|account|acct)/iu.test(String(text ?? ""));
}
function extractAccountTokenHeuristic(text) {
const source = String(text ?? "");
const dotted = source.match(/(?:^|[^\d])(\d{2}[.,]\d{1,2})(?!\d)/u);
if (dotted) {
return String(dotted[1]).replace(",", ".");
}
const contextual = source.match(/(?:^|[\s,.;:!?()\-])(?:по|на|for|account)\s+(\d{2})(?!\d)/iu);
if (contextual) {
return String(contextual[1]);
}
return undefined;
}
function shiftDaysIso(baseIso, deltaDays) { function shiftDaysIso(baseIso, deltaDays) {
const date = new Date(`${baseIso}T00:00:00.000Z`); const date = new Date(`${baseIso}T00:00:00.000Z`);
date.setUTCDate(date.getUTCDate() + deltaDays); date.setUTCDate(date.getUTCDate() + deltaDays);
@ -581,6 +667,13 @@ function extractAddressFilters(userMessage, intent) {
if (accountMatch) { if (accountMatch) {
filters.account = String(accountMatch[1]).replace(",", "."); filters.account = String(accountMatch[1]).replace(",", ".");
} }
if (!filters.account && (intent === "account_balance_snapshot" || intent === "documents_forming_balance")) {
const heuristicAccount = extractAccountTokenHeuristic(text);
if (heuristicAccount) {
filters.account = heuristicAccount;
warnings.push("account_anchor_derived_from_heuristic_token");
}
}
const limitMatch = text.match(LIMIT_PATTERN); const limitMatch = text.match(LIMIT_PATTERN);
if (limitMatch) { if (limitMatch) {
const parsed = Number(limitMatch[1]); const parsed = Number(limitMatch[1]);
@ -613,14 +706,21 @@ function extractAddressFilters(userMessage, intent) {
warnings.push("counterparty_anchor_derived_from_free_text_heuristic"); warnings.push("counterparty_anchor_derived_from_free_text_heuristic");
} }
} }
if (!filters.counterparty && (intent === "list_documents_by_counterparty" || intent === "bank_operations_by_counterparty")) {
const leadingCounterparty = extractLeadingCounterpartyTokenHeuristic(text);
if (leadingCounterparty) {
filters.counterparty = cleanupAnchorValue(leadingCounterparty);
warnings.push("counterparty_anchor_derived_from_leading_token");
}
}
const contractMatch = text.match(CONTRACT_PATTERN); const contractMatch = text.match(CONTRACT_PATTERN);
if (contractMatch) { if (contractMatch) {
filters.contract = cleanupAnchorValue(String(contractMatch[1])); filters.contract = cleanupContractAnchorValue(String(contractMatch[1]));
} }
if (!filters.contract && (intent === "list_documents_by_contract" || intent === "bank_operations_by_contract")) { if (!filters.contract && (intent === "list_documents_by_contract" || intent === "bank_operations_by_contract")) {
const heuristicContract = extractContractTokenHeuristic(text); const heuristicContract = extractContractTokenHeuristic(text);
if (heuristicContract) { if (heuristicContract) {
filters.contract = cleanupAnchorValue(heuristicContract); filters.contract = cleanupContractAnchorValue(heuristicContract);
warnings.push("contract_anchor_derived_from_heuristic_token"); warnings.push("contract_anchor_derived_from_heuristic_token");
} }
} }
@ -690,6 +790,13 @@ function extractAddressFilters(userMessage, intent) {
warnings.push("as_of_date_defaulted_today"); warnings.push("as_of_date_defaulted_today");
} }
} }
if (filters.account &&
intent !== "account_balance_snapshot" &&
intent !== "documents_forming_balance" &&
!hasExplicitAccountCue(text)) {
delete filters.account;
warnings.push("account_anchor_dropped_without_explicit_cue_for_non_account_intent");
}
if (filters.counterparty && filters.counterparty.length < 2) { if (filters.counterparty && filters.counterparty.length < 2) {
warnings.push("counterparty_filter_too_short"); warnings.push("counterparty_filter_too_short");
} }

View File

@ -367,11 +367,13 @@ function applyIntentSpecificFilter(intent, rows) {
} }
if (intent === "list_documents_by_counterparty" || intent === "list_documents_by_contract") { if (intent === "list_documents_by_counterparty" || intent === "list_documents_by_contract") {
const documentPattern = /(?:документ|реализац|поступлен|счет[-\s]?фактур|акт|накладн|payment|invoice|document|sale|purchase|bank)/i; const documentPattern = /(?:документ|реализац|поступлен|счет[-\s]?фактур|акт|накладн|payment|invoice|document|sale|purchase|bank)/i;
return rows.filter((row) => documentPattern.test(row.registrator.toLowerCase()) || row.analytics.length > 0); const matched = rows.filter((row) => documentPattern.test(row.registrator.toLowerCase()) || row.analytics.length > 0);
return matched.length > 0 ? matched : rows;
} }
if (intent === "documents_forming_balance") { if (intent === "documents_forming_balance") {
const documentPattern = /(?:документ|реализац|поступлен|счет[-\s]?фактур|акт|накладн|списаниесрасчетногосчета|поступлениенарасчетныйсчет|invoice|document|sale|purchase)/i; const documentPattern = /(?:документ|реализац|поступлен|счет[-\s]?фактур|акт|накладн|списаниесрасчетногосчета|поступлениенарасчетныйсчет|invoice|document|sale|purchase)/i;
return rows.filter((row) => documentPattern.test(row.registrator.toLowerCase()) || row.analytics.length > 0); const matched = rows.filter((row) => documentPattern.test(row.registrator.toLowerCase()) || row.analytics.length > 0);
return matched.length > 0 ? matched : rows;
} }
return rows; return rows;
} }
@ -396,6 +398,12 @@ function isAnchorRecoveryIntent(intent) {
intent === "open_items_by_counterparty_or_contract" || intent === "open_items_by_counterparty_or_contract" ||
intent === "list_open_contracts"); intent === "list_open_contracts");
} }
function isDocumentOrBankAnchorIntent(intent) {
return (intent === "list_documents_by_counterparty" ||
intent === "bank_operations_by_counterparty" ||
intent === "list_documents_by_contract" ||
intent === "bank_operations_by_contract");
}
function toIsoDatePrefix(value) { function toIsoDatePrefix(value) {
if (!value) { if (!value) {
return null; return null;
@ -967,74 +975,6 @@ class AddressQueryService {
} }
}; };
} }
if (intent.intent === "open_items_by_counterparty_or_contract" &&
expandedFilteredRows.length === 0 &&
expandedRowsByAnchor.length === 0 &&
expandedNormalizedRows.length > 0) {
const expandedFallbackRows = applyIntentSpecificFilter(intent.intent, expandedNormalizedRows);
if (expandedFallbackRows.length > 0) {
const expandedRowDiagnostics = deriveRowStageDiagnostics(expandedMcp.raw_rows, expandedNormalizedRows.length, expandedNormalizedRows.length);
const expandedFactual = (0, composeStage_1.composeFactualReply)(intent.intent, expandedFallbackRows);
const expandedLimitations = [
...filters.warnings,
"query_limit_auto_expanded_for_anchor_recovery",
"open_items_anchor_not_matched_fallback_rows"
];
const expandedReasons = [
...baseReasons,
"query_limit_auto_expanded_for_anchor_recovery",
"open_items_anchor_not_matched_fallback_rows"
];
return {
handled: true,
reply_text: `Точный якорь не подтвердился в live-строках даже после расширения до ${expandedPlan.limit}; ` +
"показаны ближайшие доступные позиции по счетам 60/62/76.\n" +
expandedFactual.text,
reply_type: (0, composeStage_1.inferReplyType)(expandedFactual.responseType),
response_type: expandedFactual.responseType,
debug: {
detected_mode: mode.mode,
detected_mode_confidence: mode.confidence,
query_shape: shape.shape,
query_shape_confidence: shape.confidence,
detected_intent: intent.intent,
detected_intent_confidence: intent.confidence,
extracted_filters: filters.extracted_filters,
missing_required_filters: [],
selected_recipe: expandedSelection.selected_recipe.recipe_id,
mcp_call_status_legacy: "matched_non_empty",
account_scope_mode: expandedPlan.account_scope_mode,
account_scope_fallback_applied: expandedAccountScopeFallbackApplied,
anchor_type: expandedAnchor.anchor_type,
anchor_value_raw: expandedAnchor.anchor_value_raw,
anchor_value_resolved: expandedAnchor.anchor_value_resolved,
resolver_confidence: expandedAnchor.resolver_confidence,
ambiguity_count: expandedAnchor.ambiguity_count,
match_failure_stage: "materialized_but_not_anchor_matched",
match_failure_reason: expandedAnchorFilter.mismatchReason ?? "anchor_not_matched_after_query_limit_expansion",
mcp_call_status: "matched_non_empty",
rows_fetched: expandedMcp.fetched_rows,
raw_rows_received: expandedMcp.raw_rows.length,
rows_after_account_scope: expandedNormalizedRows.length,
rows_after_recipe_filter: expandedRowsByAnchor.length,
rows_materialized: expandedNormalizedRows.length,
rows_matched: expandedFallbackRows.length,
raw_row_keys_sample: expandedRowDiagnostics.rawRowKeysSample,
materialization_drop_reason: expandedRowDiagnostics.materializationDropReason,
account_token_raw: expandedAccountScopeAudit.accountTokenRaw,
account_token_normalized: expandedAccountScopeAudit.accountTokenNormalized,
account_scope_fields_checked: expandedAccountScopeAudit.accountScopeFieldsChecked,
account_scope_match_strategy: expandedAccountScopeAudit.accountScopeMatchStrategy,
account_scope_drop_reason: expandedAccountScopeAudit.accountScopeDropReason,
runtime_readiness: "LIVE_QUERYABLE_WITH_LIMITS",
limited_reason_category: null,
response_type: expandedFactual.responseType,
limitations: expandedLimitations,
reasons: expandedReasons
}
};
}
}
} }
} }
} }
@ -1140,16 +1080,17 @@ class AddressQueryService {
} }
} }
if (filteredRows.length === 0 && if (filteredRows.length === 0 &&
intent.intent === "open_items_by_counterparty_or_contract" && isDocumentOrBankAnchorIntent(intent.intent) &&
normalizedRows.length > 0) { normalizedRows.length > 0 &&
const openItemsFallbackRows = applyIntentSpecificFilter(intent.intent, normalizedRows); (stageStatus === "materialized_but_not_anchor_matched" || stageStatus === "materialized_but_filtered_out_by_recipe")) {
if (openItemsFallbackRows.length > 0) { const documentBankFallbackRows = applyIntentSpecificFilter(intent.intent, normalizedRows);
const fallbackFactual = (0, composeStage_1.composeFactualReply)(intent.intent, openItemsFallbackRows); if (documentBankFallbackRows.length > 0) {
const fallbackLimitations = [...filters.warnings, "open_items_anchor_not_matched_fallback_rows"]; const fallbackFactual = (0, composeStage_1.composeFactualReply)(intent.intent, documentBankFallbackRows);
const fallbackReasons = [...baseReasons, "open_items_anchor_not_matched_fallback_rows"]; const fallbackLimitations = [...filters.warnings, "anchor_not_matched_fallback_rows"];
const fallbackReasons = [...baseReasons, "anchor_not_matched_fallback_rows"];
return { return {
handled: true, handled: true,
reply_text: "Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные позиции по счетам 60/62/76.\n" + reply_text: "Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу.\n" +
fallbackFactual.text, fallbackFactual.text,
reply_type: (0, composeStage_1.inferReplyType)(fallbackFactual.responseType), reply_type: (0, composeStage_1.inferReplyType)(fallbackFactual.responseType),
response_type: fallbackFactual.responseType, response_type: fallbackFactual.responseType,
@ -1179,7 +1120,7 @@ class AddressQueryService {
rows_after_account_scope: normalizedRows.length, rows_after_account_scope: normalizedRows.length,
rows_after_recipe_filter: filterByAnchors.length, rows_after_recipe_filter: filterByAnchors.length,
rows_materialized: normalizedRows.length, rows_materialized: normalizedRows.length,
rows_matched: openItemsFallbackRows.length, rows_matched: documentBankFallbackRows.length,
raw_row_keys_sample: rowDiagnostics.rawRowKeysSample, raw_row_keys_sample: rowDiagnostics.rawRowKeysSample,
materialization_drop_reason: rowDiagnostics.materializationDropReason, materialization_drop_reason: rowDiagnostics.materializationDropReason,
account_token_raw: accountScopeAudit.accountTokenRaw, account_token_raw: accountScopeAudit.accountTokenRaw,

View File

@ -354,13 +354,33 @@ function cleanupAnchorValue(value: string): string {
.trim(); .trim();
} }
function cleanupContractAnchorValue(value: string): string {
let normalized = cleanupAnchorValue(value);
if (!normalized) {
return normalized;
}
const yearQualifierTailPattern =
/\s+(?:(?:за|for)\s+)?(?:year|г(?:од|ода)?\.?)\s*(?:20\d{2}|\d{2})(?:\s+|$)[\s\S]*$/iu;
if (yearQualifierTailPattern.test(normalized)) {
normalized = normalized.replace(yearQualifierTailPattern, "").trim();
}
const trailingSeparatedYearPattern = /\s+(?:20\d{2}|\d{2})\s*(?:г(?:од|ода)?\.?|year)?$/iu;
if (trailingSeparatedYearPattern.test(normalized) && /[\/\\-]/.test(normalized)) {
normalized = normalized.replace(trailingSeparatedYearPattern, "").trim();
}
return normalized;
}
function hasAllTimeHint(text: string): boolean { function hasAllTimeHint(text: string): boolean {
const value = String(text ?? ""); const value = String(text ?? "");
return /(?:за\s+вс[её]\s+время|за\s+весь\s+период|за\s+весь\s+срок|за\s+всю\s+истори(?:ю|и)|за\s+любой\s+период|за\s+любой\s+срок|for\s+all\s+time|all\s+time|for\s+entire\s+period|entire\s+period|for\s+any\s+period|any\s+period|for\s+full\s+history|full\s+history)/iu.test(value); return /(?:за\s+вс[её]\s+время|за\s+весь\s+период|за\s+весь\s+срок|за\s+всю\s+истори(?:ю|и)|за\s+любой\s+период|за\s+любой\s+срок|for\s+all\s+time|all\s+time|for\s+entire\s+period|entire\s+period|for\s+any\s+period|any\s+period|for\s+full\s+history|full\s+history)/iu.test(value);
} }
function extractLooseByAnchorValue(text: string): string | undefined { function extractLooseByAnchorValue(text: string): string | undefined {
const match = String(text ?? "").match(/(?:^|\s)по\s+([a-zа-яё][a-zа-яё0-9._-]{1,})(?=[\s,.;:!?)]|$)/iu); const match = String(text ?? "").match(/(?:^|\s)по\s+([\p{L}][\p{L}\p{N}._-]{1,})(?=[\s,.;:!?)]|$)/iu);
if (!match) { if (!match) {
return undefined; return undefined;
} }
@ -508,7 +528,7 @@ function isLikelyCounterpartyToken(rawToken: string): boolean {
function hasDocsOrBankSignal(text: string): boolean { function hasDocsOrBankSignal(text: string): boolean {
const lowered = String(text ?? "").toLowerCase(); const lowered = String(text ?? "").toLowerCase();
return new RegExp( return new RegExp(
`(?:${DOC_SIGNAL_PATTERN}|банк|выписк|платеж|платёж|оплат|transactions?|bank\\s+ops|bank\\s+operations?|payment|payments?|platezh|oplata)`, `(?:${DOC_SIGNAL_PATTERN}|банк|выписк|списан|поступлен|платеж|платёж|оплат|transactions?|bank\\s+ops|bank\\s+operations?|payment|payments?|platezh|oplata)`,
"iu" "iu"
).test( ).test(
lowered lowered
@ -521,7 +541,7 @@ function extractCounterpartyFromFreeTextHeuristic(text: string): string | undefi
} }
const tokens = String(text ?? "") const tokens = String(text ?? "")
.split(/[^a-zа-яё0-9._-]+/iu) .split(/[^\p{L}\p{N}._-]+/u)
.map((item) => item.trim()) .map((item) => item.trim())
.filter((item) => item.length > 0); .filter((item) => item.length > 0);
@ -578,7 +598,7 @@ function extractCounterpartyFromFreeTextHeuristic(text: string): string | undefi
function extractImplicitCounterpartyValue(text: string): string | undefined { function extractImplicitCounterpartyValue(text: string): string | undefined {
const input = String(text ?? ""); const input = String(text ?? "");
const beforeDocsPattern = new RegExp( const beforeDocsPattern = new RegExp(
`(?:^|\\s)([a-zа-яё][a-zа-яё0-9._-]{1,})\\s+${DOC_SIGNAL_PATTERN}(?=[\\s,.;:!?)]|$)`, `(?:^|\\s)([\\p{L}][\\p{L}\\p{N}._-]{1,})\\s+${DOC_SIGNAL_PATTERN}(?=[\\s,.;:!?)]|$)`,
"iu" "iu"
); );
const beforeDocsMatch = input.match(beforeDocsPattern); const beforeDocsMatch = input.match(beforeDocsPattern);
@ -590,7 +610,7 @@ function extractImplicitCounterpartyValue(text: string): string | undefined {
} }
const afterDocsPattern = new RegExp( const afterDocsPattern = new RegExp(
`${DOC_SIGNAL_PATTERN}\\s+(?:по\\s+)?([a-zа-яё][a-zа-яё0-9._-]{1,})(?=[\\s,.;:!?)]|$)`, `${DOC_SIGNAL_PATTERN}\\s+(?:по\\s+)?([\\p{L}][\\p{L}\\p{N}._-]{1,})(?=[\\s,.;:!?)]|$)`,
"iu" "iu"
); );
const afterDocsMatch = input.match(afterDocsPattern); const afterDocsMatch = input.match(afterDocsPattern);
@ -604,6 +624,81 @@ function extractImplicitCounterpartyValue(text: string): string | undefined {
return undefined; return undefined;
} }
function extractLeadingCounterpartyTokenHeuristic(text: string): string | undefined {
if (!hasDocsOrBankSignal(text)) {
return undefined;
}
const tokens = String(text ?? "")
.split(/[^\p{L}\p{N}._-]+/u)
.map((item) => item.trim())
.filter((item) => item.length > 0);
if (tokens.length === 0) {
return undefined;
}
const monthTokens = [
"янв",
"фев",
"мар",
"апр",
"май",
"июн",
"июл",
"авг",
"сен",
"сент",
"окт",
"ноя",
"дек",
"january",
"february",
"march",
"april",
"may",
"june",
"july",
"august",
"september",
"october",
"november",
"december"
];
for (const token of tokens.slice(0, 3)) {
const lowered = token.toLowerCase();
if (!isLikelyCounterpartyToken(lowered)) {
continue;
}
if (/^\d{2}$/.test(lowered) || /^\d{4}$/.test(lowered)) {
continue;
}
if (monthTokens.some((prefix) => lowered.startsWith(prefix))) {
continue;
}
if (/(?:^за$|^for$|^from$|^to$|^по$|^с$|^год$|^года$|^г$|^year$|^на$|^in$)/iu.test(lowered)) {
continue;
}
return token;
}
return undefined;
}
function hasExplicitAccountCue(text: string): boolean {
return /(?:сч[её]т|счет|account|acct)/iu.test(String(text ?? ""));
}
function extractAccountTokenHeuristic(text: string): string | undefined {
const source = String(text ?? "");
const dotted = source.match(/(?:^|[^\d])(\d{2}[.,]\d{1,2})(?!\d)/u);
if (dotted) {
return String(dotted[1]).replace(",", ".");
}
const contextual = source.match(/(?:^|[\s,.;:!?()\-])(?:по|на|for|account)\s+(\d{2})(?!\d)/iu);
if (contextual) {
return String(contextual[1]);
}
return undefined;
}
function shiftDaysIso(baseIso: string, deltaDays: number): string { function shiftDaysIso(baseIso: string, deltaDays: number): string {
const date = new Date(`${baseIso}T00:00:00.000Z`); const date = new Date(`${baseIso}T00:00:00.000Z`);
date.setUTCDate(date.getUTCDate() + deltaDays); date.setUTCDate(date.getUTCDate() + deltaDays);
@ -640,6 +735,13 @@ export function extractAddressFilters(userMessage: string, intent: AddressIntent
if (accountMatch) { if (accountMatch) {
filters.account = String(accountMatch[1]).replace(",", "."); filters.account = String(accountMatch[1]).replace(",", ".");
} }
if (!filters.account && (intent === "account_balance_snapshot" || intent === "documents_forming_balance")) {
const heuristicAccount = extractAccountTokenHeuristic(text);
if (heuristicAccount) {
filters.account = heuristicAccount;
warnings.push("account_anchor_derived_from_heuristic_token");
}
}
const limitMatch = text.match(LIMIT_PATTERN); const limitMatch = text.match(LIMIT_PATTERN);
if (limitMatch) { if (limitMatch) {
@ -674,15 +776,22 @@ export function extractAddressFilters(userMessage: string, intent: AddressIntent
warnings.push("counterparty_anchor_derived_from_free_text_heuristic"); warnings.push("counterparty_anchor_derived_from_free_text_heuristic");
} }
} }
if (!filters.counterparty && (intent === "list_documents_by_counterparty" || intent === "bank_operations_by_counterparty")) {
const leadingCounterparty = extractLeadingCounterpartyTokenHeuristic(text);
if (leadingCounterparty) {
filters.counterparty = cleanupAnchorValue(leadingCounterparty);
warnings.push("counterparty_anchor_derived_from_leading_token");
}
}
const contractMatch = text.match(CONTRACT_PATTERN); const contractMatch = text.match(CONTRACT_PATTERN);
if (contractMatch) { if (contractMatch) {
filters.contract = cleanupAnchorValue(String(contractMatch[1])); filters.contract = cleanupContractAnchorValue(String(contractMatch[1]));
} }
if (!filters.contract && (intent === "list_documents_by_contract" || intent === "bank_operations_by_contract")) { if (!filters.contract && (intent === "list_documents_by_contract" || intent === "bank_operations_by_contract")) {
const heuristicContract = extractContractTokenHeuristic(text); const heuristicContract = extractContractTokenHeuristic(text);
if (heuristicContract) { if (heuristicContract) {
filters.contract = cleanupAnchorValue(heuristicContract); filters.contract = cleanupContractAnchorValue(heuristicContract);
warnings.push("contract_anchor_derived_from_heuristic_token"); warnings.push("contract_anchor_derived_from_heuristic_token");
} }
} }
@ -761,6 +870,16 @@ export function extractAddressFilters(userMessage: string, intent: AddressIntent
} }
} }
if (
filters.account &&
intent !== "account_balance_snapshot" &&
intent !== "documents_forming_balance" &&
!hasExplicitAccountCue(text)
) {
delete filters.account;
warnings.push("account_anchor_dropped_without_explicit_cue_for_non_account_intent");
}
if (filters.counterparty && filters.counterparty.length < 2) { if (filters.counterparty && filters.counterparty.length < 2) {
warnings.push("counterparty_filter_too_short"); warnings.push("counterparty_filter_too_short");
} }

View File

@ -433,13 +433,15 @@ function applyIntentSpecificFilter(intent: AddressIntent, rows: NormalizedAddres
if (intent === "list_documents_by_counterparty" || intent === "list_documents_by_contract") { if (intent === "list_documents_by_counterparty" || intent === "list_documents_by_contract") {
const documentPattern = const documentPattern =
/(?:документ|реализац|поступлен|счет[-\s]?фактур|акт|накладн|payment|invoice|document|sale|purchase|bank)/i; /(?:документ|реализац|поступлен|счет[-\s]?фактур|акт|накладн|payment|invoice|document|sale|purchase|bank)/i;
return rows.filter((row) => documentPattern.test(row.registrator.toLowerCase()) || row.analytics.length > 0); const matched = rows.filter((row) => documentPattern.test(row.registrator.toLowerCase()) || row.analytics.length > 0);
return matched.length > 0 ? matched : rows;
} }
if (intent === "documents_forming_balance") { if (intent === "documents_forming_balance") {
const documentPattern = const documentPattern =
/(?:документ|реализац|поступлен|счет[-\s]?фактур|акт|накладн|списаниесрасчетногосчета|поступлениенарасчетныйсчет|invoice|document|sale|purchase)/i; /(?:документ|реализац|поступлен|счет[-\s]?фактур|акт|накладн|списаниесрасчетногосчета|поступлениенарасчетныйсчет|invoice|document|sale|purchase)/i;
return rows.filter((row) => documentPattern.test(row.registrator.toLowerCase()) || row.analytics.length > 0); const matched = rows.filter((row) => documentPattern.test(row.registrator.toLowerCase()) || row.analytics.length > 0);
return matched.length > 0 ? matched : rows;
} }
return rows; return rows;
@ -475,6 +477,15 @@ function isAnchorRecoveryIntent(intent: AddressIntent): boolean {
); );
} }
function isDocumentOrBankAnchorIntent(intent: AddressIntent): boolean {
return (
intent === "list_documents_by_counterparty" ||
intent === "bank_operations_by_counterparty" ||
intent === "list_documents_by_contract" ||
intent === "bank_operations_by_contract"
);
}
function toIsoDatePrefix(value: string | null): string | null { function toIsoDatePrefix(value: string | null): string | null {
if (!value) { if (!value) {
return null; return null;
@ -1172,82 +1183,6 @@ export class AddressQueryService {
} }
}; };
} }
if (
intent.intent === "open_items_by_counterparty_or_contract" &&
expandedFilteredRows.length === 0 &&
expandedRowsByAnchor.length === 0 &&
expandedNormalizedRows.length > 0
) {
const expandedFallbackRows = applyIntentSpecificFilter(intent.intent, expandedNormalizedRows);
if (expandedFallbackRows.length > 0) {
const expandedRowDiagnostics = deriveRowStageDiagnostics(
expandedMcp.raw_rows,
expandedNormalizedRows.length,
expandedNormalizedRows.length
);
const expandedFactual = composeFactualReply(intent.intent, expandedFallbackRows);
const expandedLimitations = [
...filters.warnings,
"query_limit_auto_expanded_for_anchor_recovery",
"open_items_anchor_not_matched_fallback_rows"
];
const expandedReasons = [
...baseReasons,
"query_limit_auto_expanded_for_anchor_recovery",
"open_items_anchor_not_matched_fallback_rows"
];
return {
handled: true,
reply_text:
`Точный якорь не подтвердился в live-строках даже после расширения до ${expandedPlan.limit}; ` +
"показаны ближайшие доступные позиции по счетам 60/62/76.\n" +
expandedFactual.text,
reply_type: inferReplyType(expandedFactual.responseType),
response_type: expandedFactual.responseType,
debug: {
detected_mode: mode.mode,
detected_mode_confidence: mode.confidence,
query_shape: shape.shape,
query_shape_confidence: shape.confidence,
detected_intent: intent.intent,
detected_intent_confidence: intent.confidence,
extracted_filters: filters.extracted_filters,
missing_required_filters: [],
selected_recipe: expandedSelection.selected_recipe.recipe_id,
mcp_call_status_legacy: "matched_non_empty",
account_scope_mode: expandedPlan.account_scope_mode,
account_scope_fallback_applied: expandedAccountScopeFallbackApplied,
anchor_type: expandedAnchor.anchor_type,
anchor_value_raw: expandedAnchor.anchor_value_raw,
anchor_value_resolved: expandedAnchor.anchor_value_resolved,
resolver_confidence: expandedAnchor.resolver_confidence,
ambiguity_count: expandedAnchor.ambiguity_count,
match_failure_stage: "materialized_but_not_anchor_matched",
match_failure_reason:
expandedAnchorFilter.mismatchReason ?? "anchor_not_matched_after_query_limit_expansion",
mcp_call_status: "matched_non_empty",
rows_fetched: expandedMcp.fetched_rows,
raw_rows_received: expandedMcp.raw_rows.length,
rows_after_account_scope: expandedNormalizedRows.length,
rows_after_recipe_filter: expandedRowsByAnchor.length,
rows_materialized: expandedNormalizedRows.length,
rows_matched: expandedFallbackRows.length,
raw_row_keys_sample: expandedRowDiagnostics.rawRowKeysSample,
materialization_drop_reason: expandedRowDiagnostics.materializationDropReason,
account_token_raw: expandedAccountScopeAudit.accountTokenRaw,
account_token_normalized: expandedAccountScopeAudit.accountTokenNormalized,
account_scope_fields_checked: expandedAccountScopeAudit.accountScopeFieldsChecked,
account_scope_match_strategy: expandedAccountScopeAudit.accountScopeMatchStrategy,
account_scope_drop_reason: expandedAccountScopeAudit.accountScopeDropReason,
runtime_readiness: "LIVE_QUERYABLE_WITH_LIMITS",
limited_reason_category: null,
response_type: expandedFactual.responseType,
limitations: expandedLimitations,
reasons: expandedReasons
}
};
}
}
} }
} }
} }
@ -1362,18 +1297,19 @@ export class AddressQueryService {
if ( if (
filteredRows.length === 0 && filteredRows.length === 0 &&
intent.intent === "open_items_by_counterparty_or_contract" && isDocumentOrBankAnchorIntent(intent.intent) &&
normalizedRows.length > 0 normalizedRows.length > 0 &&
(stageStatus === "materialized_but_not_anchor_matched" || stageStatus === "materialized_but_filtered_out_by_recipe")
) { ) {
const openItemsFallbackRows = applyIntentSpecificFilter(intent.intent, normalizedRows); const documentBankFallbackRows = applyIntentSpecificFilter(intent.intent, normalizedRows);
if (openItemsFallbackRows.length > 0) { if (documentBankFallbackRows.length > 0) {
const fallbackFactual = composeFactualReply(intent.intent, openItemsFallbackRows); const fallbackFactual = composeFactualReply(intent.intent, documentBankFallbackRows);
const fallbackLimitations = [...filters.warnings, "open_items_anchor_not_matched_fallback_rows"]; const fallbackLimitations = [...filters.warnings, "anchor_not_matched_fallback_rows"];
const fallbackReasons = [...baseReasons, "open_items_anchor_not_matched_fallback_rows"]; const fallbackReasons = [...baseReasons, "anchor_not_matched_fallback_rows"];
return { return {
handled: true, handled: true,
reply_text: reply_text:
"Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные позиции по счетам 60/62/76.\n" + "Точный якорь не подтвердился в текущем окне live-данных; показаны ближайшие доступные документы/операции по выбранному типу.\n" +
fallbackFactual.text, fallbackFactual.text,
reply_type: inferReplyType(fallbackFactual.responseType), reply_type: inferReplyType(fallbackFactual.responseType),
response_type: fallbackFactual.responseType, response_type: fallbackFactual.responseType,
@ -1403,7 +1339,7 @@ export class AddressQueryService {
rows_after_account_scope: normalizedRows.length, rows_after_account_scope: normalizedRows.length,
rows_after_recipe_filter: filterByAnchors.length, rows_after_recipe_filter: filterByAnchors.length,
rows_materialized: normalizedRows.length, rows_materialized: normalizedRows.length,
rows_matched: openItemsFallbackRows.length, rows_matched: documentBankFallbackRows.length,
raw_row_keys_sample: rowDiagnostics.rawRowKeysSample, raw_row_keys_sample: rowDiagnostics.rawRowKeysSample,
materialization_drop_reason: rowDiagnostics.materializationDropReason, materialization_drop_reason: rowDiagnostics.materializationDropReason,
account_token_raw: accountScopeAudit.accountTokenRaw, account_token_raw: accountScopeAudit.accountTokenRaw,

View File

@ -315,6 +315,37 @@ describe("address filter extraction for balance drilldown", () => {
expect(result.warnings).toContain("as_of_date_derived_from_period_to"); expect(result.warnings).toContain("as_of_date_derived_from_period_to");
}); });
it("extracts dotted account by heuristic for docs-forming phrasing without 'счет' keyword", () => {
const result = extractAddressFilters(
"раскрой остаток 60.01 по документам на конец июля 2020",
"documents_forming_balance"
);
expect(result.extracted_filters.account).toBe("60.01");
expect(result.extracted_filters.as_of_date).toBe("2020-07-31");
expect(result.warnings).toContain("account_anchor_derived_from_heuristic_token");
});
it("extracts dotted account by heuristic for short balance slang", () => {
const result = extractAddressFilters("скока по 60.02 на конец 2020-12", "account_balance_snapshot");
expect(result.extracted_filters.account).toBe("60.02");
expect(result.extracted_filters.as_of_date).toBe("2020-12-31");
expect(result.warnings).toContain("account_anchor_derived_from_heuristic_token");
});
it("drops accidental account for non-account intent without explicit account cue", () => {
const result = extractAddressFilters("покажи банк операции по свк за 2020", "bank_operations_by_counterparty");
expect(result.extracted_filters.account).toBeUndefined();
});
it("extracts leading counterparty token for short bank phrase", () => {
const result = extractAddressFilters("свк списания/поступления за 2020", "bank_operations_by_counterparty");
expect(result.extracted_filters.counterparty).toBe("свк");
expect(
result.warnings.includes("counterparty_anchor_derived_from_leading_token") ||
result.warnings.includes("counterparty_anchor_derived_from_free_text_heuristic")
).toBe(true);
});
it("treats 'за весь период' as all-time hint and does not force 90-day default", () => { it("treats 'за весь период' as all-time hint and does not force 90-day default", () => {
const result = extractAddressFilters( const result = extractAddressFilters(
"Покажи банковские операции по клиенту Бета за весь период", "Покажи банковские операции по клиенту Бета за весь период",
@ -467,6 +498,26 @@ describe("address filter extraction for balance drilldown", () => {
expect(result.extracted_filters.period_to).toBe("2020-12-31"); expect(result.extracted_filters.period_to).toBe("2020-12-31");
}); });
it("trims english year tail from contract anchor", () => {
const result = extractAddressFilters(
"docs by contract 15/24 year 2020",
"list_documents_by_contract"
);
expect(result.extracted_filters.contract).toBe("15/24");
expect(result.extracted_filters.period_from).toBe("2020-01-01");
expect(result.extracted_filters.period_to).toBe("2020-12-31");
});
it("trims trailing separated year from contract anchor", () => {
const result = extractAddressFilters(
"docs by contract 15/24 2020",
"list_documents_by_contract"
);
expect(result.extracted_filters.contract).toBe("15/24");
expect(result.extracted_filters.period_from).toBe("2020-01-01");
expect(result.extracted_filters.period_to).toBe("2020-12-31");
});
it("extracts multiline year range period from phrase", () => { it("extracts multiline year range period from phrase", () => {
const result = extractAddressFilters( const result = extractAddressFilters(
"Какие документы по СВК за 2000 - 2025\n год?", "Какие документы по СВК за 2000 - 2025\n год?",
@ -514,6 +565,18 @@ describe("address query limited taxonomy and stage diagnostics", () => {
expect(result?.debug.mcp_call_status).toBe("skipped"); expect(result?.debug.mcp_call_status).toBe("skipped");
}); });
it("does not return fallback factual rows for unmatched open-items contract anchor", async () => {
const service = new AddressQueryService();
const result = await service.tryHandle("Покажи открытые позиции по договору 15/24");
expect(result?.handled).toBe(true);
expect(result?.response_type).toBe("LIMITED_WITH_REASON");
expect(result?.reply_type).toBe("partial_coverage");
expect(result?.debug.detected_intent).toBe("open_items_by_counterparty_or_contract");
expect(result?.debug.rows_matched).toBe(0);
expect(["empty_match", "missing_anchor"]).toContain(result?.debug.limited_reason_category);
expect(String(result?.assistant_reply ?? "")).not.toContain("Собраны открытые позиции");
});
it("routes contract document list intent into address recipe", async () => { it("routes contract document list intent into address recipe", async () => {
const service = new AddressQueryService(); const service = new AddressQueryService();
const result = await service.tryHandle("show documents by contract 15/24"); const result = await service.tryHandle("show documents by contract 15/24");