АДРЕСНЫЙ РЕЖИМ -Step-4: Batch-2 lifecycle закрыт gate 36/36, nightly 102/102 + 25/25 PASS
This commit is contained in:
parent
1f9bb886ee
commit
71762af575
|
|
@ -23,33 +23,30 @@
|
|||
- `followup_25`: `25/25`
|
||||
- comparator: `PASS`
|
||||
- run: `docs/ADDRESS/runs/2026-04-08_Address_Nightly_Regression_2026-04-08_10-51-20/nightly_summary.json`
|
||||
- Batch-2 lifecycle официально переведен в `Phase A active`:
|
||||
- Batch-2 lifecycle закрыт до `Phase C` (domain + global gates PASS):
|
||||
- domain card: `domain_general_batch2_lifecycle_card_v1.md`
|
||||
- acceptance set: `docs/ADDRESS/question_sets/domain_general_batch2_lifecycle_acceptance_2026-04-08_phaseA.json`
|
||||
- probe report: `wave1_batch2_phaseA_probe_report_2026-04-08.md`
|
||||
- backlog: `step4_wave1_batch2_phaseA_backlog_v1.md`
|
||||
- Batch-2 Phase-B progress:
|
||||
- resolver hardening по `Q12/Q13/Q26/Q27/Q31/Q32` выполнен
|
||||
- targeted test gate: `addressQueryRuntimeM23.test.ts = 210/210`, `build=PASS`
|
||||
- live hotpass: `wave1_batch2_phaseB_resolver_hotpass_2026-04-08.md` (`route match 6/6`)
|
||||
- backlog closeout: `step4_wave1_batch2_phaseA_backlog_v1.md`
|
||||
- domain live-gate: `docs/ADDRESS/runs/2026-04-08_Address_Batch2_Lifecycle_FullGate_PhaseC_PostFix2/run_summary.json` (`strict 36/36`)
|
||||
- targeted code gate: `addressQueryRuntimeM23.test.ts + assistantAddressFollowupContext.test.ts = 223/223`, `build=PASS`
|
||||
- global non-regression: `docs/ADDRESS/runs/2026-04-08_Address_Nightly_Regression_2026-04-08_13-19-24/nightly_summary.json` (`stress 102/102`, `followup 25/25`, comparator PASS)
|
||||
- Финальный stress-pack: `102/102`
|
||||
`docs/ADDRESS/runs/2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-57-27/run_summary.json`
|
||||
- Финальный follow-up pack: `25/25`
|
||||
`docs/ADDRESS/runs/2026-04-02_Address_Followup_Context_Chains_2026-04-02_19-15-Run5/run_summary.json`
|
||||
- Актуальный nightly regression (green):
|
||||
`docs/ADDRESS/runs/2026-04-08_Address_Nightly_Regression_2026-04-08_10-51-20/nightly_summary.json`
|
||||
`docs/ADDRESS/runs/2026-04-08_Address_Nightly_Regression_2026-04-08_13-19-24/nightly_summary.json`
|
||||
- Task Scheduler: `NDC_ADDRESS_Nightly_Regression` временно `Disabled` (ручной режим до стабилизации infra-канала).
|
||||
- Текущий production-контур: `question_mode=address_query`, live-first через MCP.
|
||||
- Следующий этап: `Step-4` domain expansion по рельсовой модели Step-0.
|
||||
|
||||
## Что реально реализовано в коде (срез 2026-04-03)
|
||||
## Что реально реализовано в коде (срез 2026-04-08)
|
||||
|
||||
Поддерживаемые intents в runtime:
|
||||
|
||||
- `period_coverage_profile` (Wave-1 B1, gate-closed)
|
||||
- `document_type_and_account_section_profile` (Wave-1 B1, pre-gate)
|
||||
- `counterparty_population_and_roles` (Wave-1 B1, pre-gate)
|
||||
- `counterparty_activity_lifecycle` (Wave-1/B2, Phase-A active)
|
||||
- `counterparty_activity_lifecycle` (Wave-1 B2, gate-closed)
|
||||
- `contract_usage_overview` (Wave-1 B1, gate-closed)
|
||||
- `customer_revenue_and_payments` (Wave-1 B3 value, gate-closed)
|
||||
- `supplier_payouts_profile` (Wave-1 B3 value, gate-closed)
|
||||
|
|
|
|||
|
|
@ -2,12 +2,12 @@
|
|||
|
||||
Дата: `2026-04-08`
|
||||
Домен: `general_batch2_lifecycle`
|
||||
Статус: `active` (Phase A стартован)
|
||||
Статус: `closed` (Phase A/B/C закрыты; domain + global gate PASS)
|
||||
Владелец: `Address Runtime Team`
|
||||
|
||||
## 1. Scope
|
||||
|
||||
Кратко: домен закрывает lifecycle-вопросы общего домена (`Q8..Q13 + Q26 + Q27 + Q31 + Q32`) и готовит единый рельсовый контракт перед Phase B.
|
||||
Кратко: домен закрывает lifecycle-вопросы общего домена (`Q8..Q13 + Q26 + Q27 + Q31 + Q32`) и зафиксирован как rail-ready после Phase C gate.
|
||||
|
||||
In-scope intents:
|
||||
|
||||
|
|
@ -117,9 +117,9 @@ Global gate:
|
|||
|
||||
## 8. Rollout Plan
|
||||
|
||||
1. `phase_a` — contract freeze + acceptance set + probe baseline.
|
||||
2. `phase_b` — resolver/compose hardening по lifecycle gap-ам.
|
||||
3. `phase_c` — domain live gate + global comparator PASS.
|
||||
1. `phase_a` — contract freeze + acceptance set + probe baseline (`completed`, 2026-04-08).
|
||||
2. `phase_b` — resolver/compose hardening по lifecycle gap-ам (`completed`, 2026-04-08).
|
||||
3. `phase_c` — domain live gate + global comparator PASS (`completed`, 2026-04-08).
|
||||
|
||||
## 9. Artifacts
|
||||
|
||||
|
|
@ -131,8 +131,14 @@ Global gate:
|
|||
4. `step4_wave1_batch2_phaseA_backlog_v1.md`
|
||||
5. `runs/<run_id>/run_summary.json`
|
||||
6. `runs/<run_id>/full_live_results.json`
|
||||
7. `wave1_batch2_phaseB_resolver_hotpass_2026-04-08.md`
|
||||
8. `runs/2026-04-08_Address_Batch2_Lifecycle_FullGate_PhaseC_PostFix2/run_summary.json`
|
||||
9. `runs/2026-04-08_Address_Nightly_Regression_2026-04-08_13-19-24/nightly_summary.json`
|
||||
|
||||
## 10. Change Log
|
||||
|
||||
- `2026-04-08` — создана карточка домена Batch-2 lifecycle и зафиксирован contract scope.
|
||||
- `2026-04-08` — добавлен Phase-A acceptance набор `Q8..Q13 + Q26 + Q27 + Q31 + Q32`.
|
||||
- `2026-04-08` — закрыт Phase-B hardening (resolver/decompose/follow-up контур по lifecycle noisy/follow-up формулировкам).
|
||||
- `2026-04-08` — закрыт Phase-C domain gate: `strict 36/36` (`2026-04-08_Address_Batch2_Lifecycle_FullGate_PhaseC_PostFix2`).
|
||||
- `2026-04-08` — подтвержден global non-regression PASS: `stress 102/102`, `followup 25/25`, comparator `PASS` (`2026-04-08_Address_Nightly_Regression_2026-04-08_13-19-24`).
|
||||
|
|
|
|||
|
|
@ -13,14 +13,14 @@ flowchart LR
|
|||
D["Global Nightly Comparator (R6)<br/>102/102 + 25/25 PASS"]
|
||||
E["Auto-nightly Incident<br/>2026-04-08 09:52<br/>MCP fetch failed"]
|
||||
F["Targeted Fix<br/>S019 predecompose anchor drift"]
|
||||
G["Manual Control Nightly Recheck<br/>2026-04-08 10:51<br/>102/102 + 25/25 PASS"]
|
||||
H["CURRENT STATE<br/>BATCH2_PHASE_B_ACTIVE"]
|
||||
I["NEXT STEP<br/>Batch-2 Phase B closeout<br/>Follow-up carryover + compose hardening"]
|
||||
K["Batch-2 Gate<br/>Phase C -> Global Regression"]
|
||||
G["Manual Control Nightly Recheck<br/>2026-04-08 13:19<br/>102/102 + 25/25 PASS"]
|
||||
H["CURRENT STATE<br/>BATCH2_PHASE_C_CLOSED"]
|
||||
I["NEXT STEP<br/>Batch-4/5 domain scoping<br/>Debt/Aging/Risk"]
|
||||
K["Batch-2 Gate Closed<br/>36/36 + Global PASS"]
|
||||
J["Operational Rail<br/>Scheduler: Disabled<br/>Manual nightly only"]
|
||||
|
||||
A --> B --> C --> D --> H --> I --> K
|
||||
D --> E --> F --> G --> H
|
||||
A --> B --> C --> D --> K --> H --> I
|
||||
D --> E --> F --> G --> K
|
||||
E --> J
|
||||
H --> J
|
||||
```
|
||||
|
|
@ -31,8 +31,10 @@ flowchart LR
|
|||
`docs/ADDRESS/runs/2026-04-03_Address_Nightly_Regression_Post_AnchorHardening_R6/nightly_summary.json`
|
||||
- Incident run (auto-nightly):
|
||||
`docs/ADDRESS/runs/2026-04-08_Address_Nightly_Regression_2026-04-08_09-52-39/nightly_summary.json`
|
||||
- Control recheck PASS (manual):
|
||||
`docs/ADDRESS/runs/2026-04-08_Address_Nightly_Regression_2026-04-08_10-51-20/nightly_summary.json`
|
||||
- Control recheck PASS (manual, latest):
|
||||
`docs/ADDRESS/runs/2026-04-08_Address_Nightly_Regression_2026-04-08_13-19-24/nightly_summary.json`
|
||||
- Batch-2 domain gate PASS:
|
||||
`docs/ADDRESS/runs/2026-04-08_Address_Batch2_Lifecycle_FullGate_PhaseC_PostFix2/run_summary.json`
|
||||
- Master checker (entry to Batch-2):
|
||||
`docs/ADDRESS/address_query/step4_wave1_batch1_master_checker_v1.md`
|
||||
- Batch-2 Phase-A artifacts:
|
||||
|
|
@ -47,5 +49,5 @@ flowchart LR
|
|||
|
||||
- Функциональные гейты закрыты.
|
||||
- Точечный flake `S019` закрыт.
|
||||
- Batch-2 переведен в `Phase B active`; resolver drift по `Q12/Q13/Q26/Q27/Q31/Q32` закрыт (`hotpass 6/6`).
|
||||
- Следующий практический шаг: Phase-B closeout (follow-up carryover + compose), затем Batch-2 domain gate.
|
||||
- Batch-2 lifecycle закрыт до `Phase C`: domain gate `36/36`, global regression `102/102 + 25/25`, comparator PASS.
|
||||
- Следующий практический шаг: стартовать scoping Batch-4/Batch-5 (`debt/aging/risk`) как отдельную доменную волну.
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@
|
|||
| AQ-B1-10 | period_coverage_profile | STRUCTURALLY_VISIBLE | LIVE_QUERYABLE_WITH_LIMITS | functional gates закрыты; остаточный риск в operational стабильности auto-nightly/MCP канала | держать comparator PASS (R6) и переходить к Batch-2 lifecycle |
|
||||
| AQ-B1-11 | document_type_and_account_section_profile | STRUCTURALLY_VISIBLE | LIVE_QUERYABLE_WITH_LIMITS | functional gates закрыты; остаточный риск в operational стабильности auto-nightly/MCP канала | держать comparator PASS (R6) и переходить к Batch-2 lifecycle |
|
||||
| AQ-B1-12 | counterparty_population_and_roles | STRUCTURALLY_VISIBLE | LIVE_QUERYABLE_WITH_LIMITS | functional gates закрыты; остаточный риск в operational стабильности auto-nightly/MCP канала | держать comparator PASS (R6) и переходить к Batch-2 lifecycle |
|
||||
| AQ-B2-13 | counterparty_activity_lifecycle | STRUCTURALLY_VISIBLE | LIVE_QUERYABLE_WITH_LIMITS | resolver drift hotfix закрыт, но Batch-2 domain gate еще не прогнан | закрыть Phase-B (follow-up/compose) и выполнить Batch-2 domain gate |
|
||||
| AQ-B2-13 | counterparty_activity_lifecycle | STRUCTURALLY_VISIBLE | LIVE_QUERYABLE_WITH_LIMITS | functional gates закрыты; остаточный риск в operational стабильности auto-nightly/MCP канала | держать comparator PASS и использовать Batch-2 как reference-domain для следующей волны |
|
||||
| AQ-B1-14 | contract_usage_overview | STRUCTURALLY_VISIBLE | LIVE_QUERYABLE_WITH_LIMITS | functional gates закрыты; остаточный риск в operational стабильности auto-nightly/MCP канала | держать comparator PASS (R6) и переходить к Batch-2 lifecycle |
|
||||
| AQ-B3-15 | customer_revenue_and_payments | STRUCTURALLY_VISIBLE | LIVE_QUERYABLE_WITH_LIMITS | functional gates закрыты; остаточный риск в operational стабильности auto-nightly/MCP канала | держать comparator PASS (R6) и переходить к Batch-2 lifecycle |
|
||||
| AQ-B3-16 | supplier_payouts_profile | STRUCTURALLY_VISIBLE | LIVE_QUERYABLE_WITH_LIMITS | functional gates закрыты; остаточный риск в operational стабильности auto-nightly/MCP канала | держать comparator PASS (R6) и переходить к Batch-2 lifecycle |
|
||||
|
|
@ -38,7 +38,7 @@
|
|||
| AQ-P1-10 | account_turnover_snapshot | STRUCTURALLY_VISIBLE | UNKNOWN | intent/recipe отсутствуют в runtime | планировать как отдельный домен Step-4 |
|
||||
| AQ-P1-11 | list_documents_by_type | STRUCTURALLY_VISIBLE | UNKNOWN | intent/recipe отсутствуют в runtime | планировать как отдельный домен Step-4 |
|
||||
|
||||
## Sync Notes (2026-04-03)
|
||||
## Sync Notes (2026-04-08)
|
||||
|
||||
- В runtime реализованы by-contract intents:
|
||||
- `list_documents_by_contract`
|
||||
|
|
@ -56,7 +56,7 @@
|
|||
- Для value-слоя зафиксирован стандарт ранжирования: `top-20` по умолчанию (если пользователь не указал иной лимит).
|
||||
- Добавлена устойчивость к сленгу/опечаткам в intent routing (в т.ч. фразы вида `приходы самые высокие`, `кликентов самый высокий чек`).
|
||||
- Targeted code gate зеленый:
|
||||
- `npm --prefix llm_normalizer/backend test -- addressQueryRuntimeM23.test.ts` -> `200/200`.
|
||||
- `npm --prefix llm_normalizer/backend run test -- addressQueryRuntimeM23.test.ts assistantAddressFollowupContext.test.ts --testTimeout 30000` -> `223/223`.
|
||||
- `npm --prefix llm_normalizer/backend run build` -> `PASS`.
|
||||
- Domain live gates (2026-04-03):
|
||||
- Batch-1 pack: `docs/ADDRESS/runs/2026-04-03_Address_Domain_General_B1_PhaseC_LiveGate_R3/` -> `strict 28/28`.
|
||||
|
|
@ -74,7 +74,13 @@
|
|||
- Batch-2 lifecycle Phase-B resolver hotpass (2026-04-08):
|
||||
- report: `docs/ADDRESS/address_query/wave1_batch2_phaseB_resolver_hotpass_2026-04-08.md`
|
||||
- фактический результат: `route match 6/6` на `Q12/Q13/Q26/Q27/Q31/Q32`
|
||||
- кодовый gate: `addressQueryRuntimeM23.test.ts = 210/210`, `build=PASS`.
|
||||
- кодовый gate: `addressQueryRuntimeM23.test.ts = 220/220`, `assistantAddressFollowupContext.test.ts = 3/3`, `build=PASS`.
|
||||
- Batch-2 lifecycle Phase-C domain gate (2026-04-08):
|
||||
- run: `docs/ADDRESS/runs/2026-04-08_Address_Batch2_Lifecycle_FullGate_PhaseC_PostFix2/`
|
||||
- фактический результат: `strict 36/36`, `false_factual_rate=0`, `execution_error_rate=0`.
|
||||
- Global non-regression после Phase-C (2026-04-08):
|
||||
- run: `docs/ADDRESS/runs/2026-04-08_Address_Nightly_Regression_2026-04-08_13-19-24/nightly_summary.json`
|
||||
- фактический результат: `stress_102=102/102`, `followup_25=25/25`, comparator `PASS`.
|
||||
- `COMPOUND_FACTUAL_QUERY` остается detection-only (без multi-intent execution).
|
||||
- Финальные gate-артефакты стабильности:
|
||||
- stress `102/102`: `docs/ADDRESS/runs/2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-57-27/run_summary.json`
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Step-4 Wave-1 Batch-2 — Phase A/B Backlog V1
|
||||
|
||||
Дата: 2026-04-08
|
||||
Статус: `active`
|
||||
Статус: `closed` (`Phase C done`, domain/global gates PASS)
|
||||
Scope: `Q8..Q13 + Q26 + Q27 + Q31 + Q32`
|
||||
|
||||
## 1. Phase A (Design/Contract) — статус
|
||||
|
|
@ -29,7 +29,7 @@ Scope: `Q8..Q13 + Q26 + Q27 + Q31 + Q32`
|
|||
Добавить contract lifecycle routing:
|
||||
- stale contract phrasing -> `contract_usage_overview`
|
||||
- multi-contract/active contract phrasing -> `contract_usage_and_value`
|
||||
- [ ] `llm_normalizer/backend/src/services/address_runtime/decomposeStage.ts`
|
||||
- [x] `llm_normalizer/backend/src/services/address_runtime/decomposeStage.ts`
|
||||
Усилить follow-up carryover для Batch-2 chain:
|
||||
`а кто новые`, `а кто потом исчез`, `а теперь за 2021`, `и какие договоры активны`.
|
||||
|
||||
|
|
@ -53,7 +53,7 @@ Scope: `Q8..Q13 + Q26 + Q27 + Q31 + Q32`
|
|||
|
||||
- [x] `llm_normalizer/backend/tests/addressQueryRuntimeM23.test.ts`
|
||||
Добавить regression-кейсы под `Q12/Q13/Q26/Q27/Q31/Q32`.
|
||||
- [ ] `llm_normalizer/backend/tests/assistantAddressFollowupContext.test.ts`
|
||||
- [x] `llm_normalizer/backend/tests/assistantAddressFollowupContext.test.ts`
|
||||
Добавить lifecycle follow-up chains для переключения года и сегментов.
|
||||
- [x] Кодовый gate:
|
||||
- `npm --prefix llm_normalizer/backend run test -- addressQueryRuntimeM23.test.ts --testTimeout 20000`
|
||||
|
|
@ -64,20 +64,25 @@ Scope: `Q8..Q13 + Q26 + Q27 + Q31 + Q32`
|
|||
|
||||
## 3. Phase C (Gate) — критерии закрытия
|
||||
|
||||
- [ ] Domain run-pack по
|
||||
- [x] Domain run-pack по
|
||||
`docs/ADDRESS/question_sets/domain_general_batch2_lifecycle_acceptance_2026-04-08_phaseA.json`:
|
||||
- `strict_pass(route)=100%`
|
||||
- `false_factual_rate=0`
|
||||
- `execution_error_rate=0`
|
||||
- [ ] Global non-regression:
|
||||
- [x] Global non-regression:
|
||||
- `address_slang_stress_full_2026-04-02.json`
|
||||
- `address_followup_context_chains_2026-04-02.json`
|
||||
обе метрики не ниже baseline (`102/102`, `25/25`).
|
||||
- [ ] Comparator PASS against latest green nightly:
|
||||
`docs/ADDRESS/runs/2026-04-08_Address_Nightly_Regression_2026-04-08_10-51-20/nightly_summary.json`
|
||||
- [x] Comparator PASS against latest green nightly:
|
||||
`docs/ADDRESS/runs/2026-04-08_Address_Nightly_Regression_2026-04-08_13-19-24/nightly_summary.json`
|
||||
|
||||
## 4. Текущий приоритет (следующий кодовый шаг)
|
||||
|
||||
1. Закрыть follow-up carryover для lifecycle/contract lifecycle chain.
|
||||
2. Дожать compose-представления для `stale`/`one-time`/`longest-running`/`regular-vs-episodic`.
|
||||
3. Прогнать полный Batch-2 domain gate pack + global comparator.
|
||||
1. Перевести Batch-2 из wave backlog в master checker как `closed`.
|
||||
2. Подготовить Batch-4/Batch-5 scope (debt/aging/risk) отдельной доменной карточкой.
|
||||
3. Держать nightly regression в green-контуре как release guardrail.
|
||||
|
||||
## 5. Фактические артефакты закрытия
|
||||
|
||||
1. Domain gate PASS: `docs/ADDRESS/runs/2026-04-08_Address_Batch2_Lifecycle_FullGate_PhaseC_PostFix2/run_summary.json` (`strict 36/36`).
|
||||
2. Global non-regression PASS: `docs/ADDRESS/runs/2026-04-08_Address_Nightly_Regression_2026-04-08_13-19-24/nightly_summary.json` (`stress 102/102`, `followup 25/25`, comparator PASS).
|
||||
|
|
|
|||
|
|
@ -0,0 +1,33 @@
|
|||
# 2026-04-08_Address_Batch2_Lifecycle_FullGate_PhaseC_Baseline
|
||||
|
||||
Generated at: 2026-04-08T12:50:53
|
||||
Questions file: X:\1C\NDC_1C\docs\ADDRESS\question_sets\domain_general_batch2_lifecycle_acceptance_2026-04-08_phaseA.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: 36
|
||||
- ok_200_count: 36
|
||||
- semantic_pass_count: 25
|
||||
- semantic_pass_rate: 0.6944
|
||||
- route_pass_count: 25
|
||||
- route_pass_rate: 0.6944
|
||||
- strict_pass_count: 25
|
||||
- strict_pass_rate: 0.6944
|
||||
- factual_count: 26
|
||||
- partial_coverage_count: 7
|
||||
- clarification_required_count: 3
|
||||
- http_error_count: 0
|
||||
- llm_decomposition_attempted_count: 36
|
||||
- llm_decomposition_applied_count: 23
|
||||
- llm_fallback_count: 0
|
||||
- llm_fallback_rate: 0.0
|
||||
- tool_gate_blocked_count: 0
|
||||
- tool_gate_blocked_rate: 0.0
|
||||
- avg_elapsed_ms: 7234.1
|
||||
|
||||
## Files
|
||||
- run_summary.json
|
||||
- full_live_results.json
|
||||
- failures_only.json
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,40 @@
|
|||
# Response Audit: 2026-04-08_Address_Batch2_Lifecycle_FullGate_PhaseC_Baseline
|
||||
|
||||
| id | strict | route_health | reply_type | intent | limited_reason | question | assistant_first_line |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| B2_C001 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие заказчики работали с нами в 2020 году? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_C002 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие заказчики работали с нами за все время? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_C003 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие заказчики появились у нас впервые в 2020 году? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_C004 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие заказчики были активны в 2020 году, но дальше перестали встречаться? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_C005 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие контрагенты работали с нами только один раз за все время? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_C006 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие контрагенты работают с нами дольше всего по периоду активности? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_C007 | False | likely_blocked_route | partial_coverage | bank_operations_by_counterparty | empty_match | Раздели поставщиков на регулярных и эпизодических по частоте операций. | В live-данных по текущему фильтру записи не найдены. |
|
||||
| B2_C008 | False | blocked_missing_anchor | partial_coverage | bank_operations_by_counterparty | missing_anchor | Какие поставщики давно не использовались в операционной активности? | Для точного адресного поиска не хватает обязательного якоря. |
|
||||
| B2_C009 | True | ok_or_factual | factual | contract_usage_overview | None | Какие договоры давно не использовались (stale contracts)? | Профиль договорной базы собран (catalog + usage aggregate). |
|
||||
| B2_C010 | True | ok_or_factual | factual | contract_usage_and_value | None | Покажи контрагентов с несколькими договорами и укажи, какие договоры у них активны. | Собран профиль договоров по обороту/бюджету (bank-doc contract aggregate). |
|
||||
| B2_C011 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие заказчики работали с нами в 2021 году? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_C012 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие заказчики впервые появились у нас в 2021 году? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_N001 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | какие клиенты были активны в 20м | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_N002 | False | likely_blocked_route | partial_coverage | list_documents_by_counterparty | empty_match | выведи всех заков за все время | В live-данных по текущему фильтру записи не найдены. |
|
||||
| B2_N003 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | кто к нам пришел впервые в 2020 | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_N004 | False | blocked_missing_anchor | partial_coverage | bank_operations_by_counterparty | missing_anchor | кто был активен в 2020 и потом отвалился | Для точного адресного поиска не хватает обязательного якоря. |
|
||||
| B2_N005 | False | blocked_unsupported | partial_coverage | unknown | unsupported | кто с нами был ровно один раз и пропал | Этот запрос не подходит под address_query V1. |
|
||||
| B2_N006 | False | blocked_unsupported | partial_coverage | unknown | unsupported | самые старые по сотрудничеству кто | Этот запрос не подходит под address_query V1. |
|
||||
| B2_N007 | False | ok_or_factual | factual | counterparty_population_and_roles | None | разбей поставщиков на регуляр и разовые | Профиль контрагентов собран (catalog + bank-doc activity aggregate). |
|
||||
| B2_N008 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | какие поставщики давно мертвые | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_N009 | True | ok_or_factual | factual | contract_usage_overview | None | какие договоры уже протухли и не двигаются | Профиль договорной базы собран (catalog + usage aggregate). |
|
||||
| B2_N010 | True | ok_or_factual | factual | contract_usage_and_value | None | у кого несколько договоров и какие из них рабочие | Собран профиль договоров по обороту/бюджету (bank-doc contract aggregate). |
|
||||
| B2_N011 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | новые клиенты за 21й год | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_N012 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | клиенты которые исчезли после 21 года | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_F001 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие заказчики работали с нами в 2020 году? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_F002 | False | blocked_clarification | clarification_required | None | None | А кто из них новые? | Коротко: Наиболее вероятный механизм проблемы подтвержден частично и требует первичной проверки. Что сломано: |
|
||||
| B2_F003 | False | blocked_clarification | clarification_required | None | None | А кто потом исчез? | Коротко: Наиболее вероятный механизм проблемы подтвержден частично и требует первичной проверки. Что сломано: |
|
||||
| B2_F004 | False | blocked_clarification | clarification_required | None | None | И кто был только один раз? | Коротко: Наиболее вероятный механизм проблемы подтвержден частично и требует первичной проверки. Что сломано: |
|
||||
| B2_F005 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Раздели поставщиков на регулярных и эпизодических. | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_F006 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Теперь покажи тех, кто давно не использовался. | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_F007 | True | ok_or_factual | factual | contract_usage_overview | None | Какие договоры давно не использовались? | Профиль договорной базы собран (catalog + usage aggregate). |
|
||||
| B2_F008 | True | ok_or_factual | factual | contract_usage_and_value | None | Теперь покажи контрагентов с несколькими договорами. | Собран профиль договоров по обороту/бюджету (bank-doc contract aggregate). |
|
||||
| B2_F009 | True | ok_or_factual | factual | contract_usage_and_value | None | И у них какие договоры сейчас активны? | Собран профиль договоров по обороту/бюджету (bank-doc contract aggregate). |
|
||||
| B2_F010 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие заказчики работали с нами в 2020 году? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_F011 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Теперь за 2021. | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_F012 | False | blocked_unsupported | partial_coverage | unknown | unsupported | А кто новые в этом году? | Этот запрос не подходит под address_query V1. |
|
||||
|
|
@ -0,0 +1,152 @@
|
|||
{
|
||||
"run_id": "2026-04-08_Address_Batch2_Lifecycle_FullGate_PhaseC_Baseline",
|
||||
"generated_at": "2026-04-08T12:50:53",
|
||||
"source_questions_file": "X:\\1C\\NDC_1C\\docs\\ADDRESS\\question_sets\\domain_general_batch2_lifecycle_acceptance_2026-04-08_phaseA.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": 36,
|
||||
"ok_200_count": 36,
|
||||
"semantic_pass_count": 25,
|
||||
"semantic_pass_rate": 0.6944,
|
||||
"route_pass_count": 25,
|
||||
"route_pass_rate": 0.6944,
|
||||
"strict_pass_count": 25,
|
||||
"strict_pass_rate": 0.6944,
|
||||
"factual_count": 26,
|
||||
"partial_coverage_count": 7,
|
||||
"clarification_required_count": 3,
|
||||
"http_error_count": 0,
|
||||
"llm_decomposition_attempted_count": 36,
|
||||
"llm_decomposition_applied_count": 23,
|
||||
"llm_fallback_count": 0,
|
||||
"llm_fallback_rate": 0.0,
|
||||
"tool_gate_blocked_count": 0,
|
||||
"tool_gate_blocked_rate": 0.0,
|
||||
"avg_elapsed_ms": 7234.1
|
||||
},
|
||||
"distributions": {
|
||||
"reply_type": {
|
||||
"factual": 26,
|
||||
"partial_coverage": 7,
|
||||
"clarification_required": 3
|
||||
},
|
||||
"actual_intent": {
|
||||
"counterparty_activity_lifecycle": 18,
|
||||
"bank_operations_by_counterparty": 3,
|
||||
"contract_usage_overview": 3,
|
||||
"contract_usage_and_value": 4,
|
||||
"list_documents_by_counterparty": 1,
|
||||
"unknown": 3,
|
||||
"counterparty_population_and_roles": 1,
|
||||
"None": 3
|
||||
},
|
||||
"actual_mode": {
|
||||
"address_query": 33,
|
||||
"None": 3
|
||||
},
|
||||
"mcp_call_status": {
|
||||
"matched_non_empty": 26,
|
||||
"materialized_but_not_anchor_matched": 2,
|
||||
"skipped": 5,
|
||||
"None": 3
|
||||
},
|
||||
"limited_reason_category": {
|
||||
"empty_match": 2,
|
||||
"missing_anchor": 2,
|
||||
"unsupported": 3
|
||||
},
|
||||
"route_health": {
|
||||
"ok_or_factual": 26,
|
||||
"likely_blocked_route": 2,
|
||||
"blocked_missing_anchor": 2,
|
||||
"blocked_unsupported": 3,
|
||||
"blocked_clarification": 3
|
||||
},
|
||||
"tool_gate_decision": {
|
||||
"run_address_lane": 36
|
||||
},
|
||||
"tool_gate_reason": {
|
||||
"address_mode_classifier_detected": 32,
|
||||
"llm_canonical_candidate_detected": 4
|
||||
}
|
||||
},
|
||||
"address_llm_predecompose_metrics": {
|
||||
"overall": {
|
||||
"llm_attempted": 36,
|
||||
"llm_applied": 23,
|
||||
"fallback_used": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"tool_gate_blocked": 0,
|
||||
"gate_block_rate": 0.0
|
||||
},
|
||||
"by_intent": {
|
||||
"counterparty_activity_lifecycle": {
|
||||
"total": 18,
|
||||
"llm_attempted": 18,
|
||||
"llm_applied": 15,
|
||||
"fallback_used": 0,
|
||||
"tool_gate_blocked": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"gate_block_rate": 0.0
|
||||
},
|
||||
"bank_operations_by_counterparty": {
|
||||
"total": 3,
|
||||
"llm_attempted": 3,
|
||||
"llm_applied": 1,
|
||||
"fallback_used": 0,
|
||||
"tool_gate_blocked": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"gate_block_rate": 0.0
|
||||
},
|
||||
"contract_usage_overview": {
|
||||
"total": 3,
|
||||
"llm_attempted": 3,
|
||||
"llm_applied": 0,
|
||||
"fallback_used": 0,
|
||||
"tool_gate_blocked": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"gate_block_rate": 0.0
|
||||
},
|
||||
"contract_usage_and_value": {
|
||||
"total": 4,
|
||||
"llm_attempted": 4,
|
||||
"llm_applied": 4,
|
||||
"fallback_used": 0,
|
||||
"tool_gate_blocked": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"gate_block_rate": 0.0
|
||||
},
|
||||
"list_documents_by_counterparty": {
|
||||
"total": 1,
|
||||
"llm_attempted": 1,
|
||||
"llm_applied": 1,
|
||||
"fallback_used": 0,
|
||||
"tool_gate_blocked": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"gate_block_rate": 0.0
|
||||
},
|
||||
"unknown": {
|
||||
"total": 6,
|
||||
"llm_attempted": 6,
|
||||
"llm_applied": 2,
|
||||
"fallback_used": 0,
|
||||
"tool_gate_blocked": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"gate_block_rate": 0.0
|
||||
},
|
||||
"counterparty_population_and_roles": {
|
||||
"total": 1,
|
||||
"llm_attempted": 1,
|
||||
"llm_applied": 0,
|
||||
"fallback_used": 0,
|
||||
"tool_gate_blocked": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"gate_block_rate": 0.0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
# 2026-04-08_Address_Batch2_Lifecycle_FullGate_PhaseC_PostFix1
|
||||
|
||||
Generated at: 2026-04-08T13:06:15
|
||||
Questions file: X:\1C\NDC_1C\docs\ADDRESS\question_sets\domain_general_batch2_lifecycle_acceptance_2026-04-08_phaseA.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: 36
|
||||
- ok_200_count: 36
|
||||
- semantic_pass_count: 34
|
||||
- semantic_pass_rate: 0.9444
|
||||
- route_pass_count: 34
|
||||
- route_pass_rate: 0.9444
|
||||
- strict_pass_count: 34
|
||||
- strict_pass_rate: 0.9444
|
||||
- factual_count: 34
|
||||
- partial_coverage_count: 0
|
||||
- clarification_required_count: 2
|
||||
- http_error_count: 0
|
||||
- llm_decomposition_attempted_count: 36
|
||||
- llm_decomposition_applied_count: 24
|
||||
- llm_fallback_count: 0
|
||||
- llm_fallback_rate: 0.0
|
||||
- tool_gate_blocked_count: 0
|
||||
- tool_gate_blocked_rate: 0.0
|
||||
- avg_elapsed_ms: 6538
|
||||
|
||||
## Files
|
||||
- run_summary.json
|
||||
- full_live_results.json
|
||||
- failures_only.json
|
||||
|
|
@ -0,0 +1,864 @@
|
|||
[
|
||||
{
|
||||
"index": 14,
|
||||
"id": "B2_N002",
|
||||
"question": "выведи всех заков за все время",
|
||||
"session": null,
|
||||
"session_id": "asst-2026-04-08_Address_Batch2_Lifecycle_FullGate_PhaseC_PostFix1-b2_n002",
|
||||
"status_code": 200,
|
||||
"ok": true,
|
||||
"elapsed_ms": 15233,
|
||||
"reply_type": "clarification_required",
|
||||
"trace_id": "y3KLFxBtTvRHhn",
|
||||
"assistant_reply": "Коротко: Проблема подтверждается частично; для уверенного вывода нужны уточнения. Что сломано:\n- Есть признаки проблемы, но без уточнений по периоду и объекту вывод ненадежен. Почему это похоже на проблему:\n- Сигнал проблемы есть, но механизм подтвержден не полностью. На чем это основано:\n- Опора частичная: часть требований покрыта не полностью.\n- Отдельно не подтверждено или покрыто частично: R1. Что проверить первым:\n- Уточните период проверки, чтобы подтвердить проблему без лишнего шума.\n- Проверьте связку документов и проводок по проблемному участку в указанном периоде.\n- Уточните период проверки (например, июль 2020). Ограничения:\n- Ни одно требование не получило подтвержденного покрытия.\n- Нет explainable-сигналов why_included в результатах выборки.\n- required anchors claim-bound grounding.\n- evidence.\n- Targeted evidence acquisition claim target path.",
|
||||
"assistant_reply_first_line": "Коротко: Проблема подтверждается частично; для уверенного вывода нужны уточнения. Что сломано:",
|
||||
"expected_intent": "counterparty_activity_lifecycle",
|
||||
"actual_intent": null,
|
||||
"intent_match": false,
|
||||
"expected_mode": "address_query",
|
||||
"actual_mode": null,
|
||||
"mode_match": false,
|
||||
"expected_reply_type": null,
|
||||
"reply_match": true,
|
||||
"semantic_pass": false,
|
||||
"route_pass": false,
|
||||
"route_health": "blocked_clarification",
|
||||
"strict_policy": "route",
|
||||
"strict_pass": false,
|
||||
"selected_recipe": null,
|
||||
"missing_required_filters": null,
|
||||
"match_failure_stage": null,
|
||||
"match_failure_reason": null,
|
||||
"rows_fetched": null,
|
||||
"rows_matched": null,
|
||||
"mcp_call_status": null,
|
||||
"limited_reason_category": null,
|
||||
"llm_decomposition_attempted": true,
|
||||
"llm_decomposition_applied": null,
|
||||
"llm_decomposition_reason": null,
|
||||
"llm_canonical_candidate_detected": null,
|
||||
"fallback_rule_hit": null,
|
||||
"tool_gate_decision": "run_address_lane",
|
||||
"tool_gate_reason": "llm_canonical_candidate_detected",
|
||||
"predecompose_contract_intent": null,
|
||||
"predecompose_contract_aggregation_profile": null,
|
||||
"predecompose_contract_period_scope": null,
|
||||
"debug_payload": {
|
||||
"trace_id": "y3KLFxBtTvRHhn",
|
||||
"prompt_version": "address_query_runtime_v1",
|
||||
"schema_version": "v1",
|
||||
"fallback_type": "clarification",
|
||||
"route_summary": null,
|
||||
"fragments": [],
|
||||
"requirements_extracted": [
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"source_fragment_id": null,
|
||||
"requirement_text": "выведи всех заков за все время",
|
||||
"subject_tokens": [],
|
||||
"status": "clarification_needed",
|
||||
"route": null
|
||||
}
|
||||
],
|
||||
"coverage_report": {
|
||||
"requirements_total": 1,
|
||||
"requirements_covered": 0,
|
||||
"requirements_uncovered": [],
|
||||
"requirements_partially_covered": [],
|
||||
"clarification_needed_for": [
|
||||
"R1"
|
||||
],
|
||||
"out_of_scope_requirements": []
|
||||
},
|
||||
"routes": [],
|
||||
"retrieval_status": [],
|
||||
"retrieval_results": [],
|
||||
"answer_grounding_check": {
|
||||
"status": "no_grounded_answer",
|
||||
"route_subject_match": true,
|
||||
"missing_requirements": [
|
||||
"R1"
|
||||
],
|
||||
"reasons": [
|
||||
"Ни одно требование не получило подтвержденного покрытия.",
|
||||
"Нет explainable-сигналов why_included в результатах выборки.",
|
||||
"Недостаточно покрытия required anchors для claim-bound grounding.",
|
||||
"Недостаточно допустимого evidence для обоснованного ответа.",
|
||||
"Targeted evidence acquisition не дал допустимых попаданий по claim target path."
|
||||
],
|
||||
"why_included_summary": [],
|
||||
"selection_reason_summary": []
|
||||
},
|
||||
"dropped_intent_segments": [],
|
||||
"question_type_class": "unknown",
|
||||
"company_anchors": {
|
||||
"contract_numbers": [],
|
||||
"document_numbers": [],
|
||||
"dates": [],
|
||||
"amounts": [],
|
||||
"accounts": [],
|
||||
"periods": [],
|
||||
"document_types": [],
|
||||
"all": []
|
||||
},
|
||||
"business_scope_raw": [],
|
||||
"business_scope_resolved": [
|
||||
"company_specific_accounting"
|
||||
],
|
||||
"company_grounding_applied": true,
|
||||
"scope_resolution_reason": [
|
||||
"settlement_claim_company_scope_recovery"
|
||||
],
|
||||
"company_scope_resolution_reason": [
|
||||
"settlement_claim_company_scope_recovery"
|
||||
],
|
||||
"raw_time_anchor": null,
|
||||
"raw_time_scope": null,
|
||||
"resolved_time_anchor": null,
|
||||
"resolved_primary_period": null,
|
||||
"effective_primary_period": null,
|
||||
"temporal_guard_input": null,
|
||||
"temporal_alignment_status": "conflicting",
|
||||
"temporal_resolution_source": "normalized_time_scope:missing",
|
||||
"temporal_guard_basis": "none",
|
||||
"temporal_guard_applied": false,
|
||||
"temporal_guard_outcome": "passed",
|
||||
"temporal_guard": {
|
||||
"raw_time_anchor": null,
|
||||
"raw_time_scope": null,
|
||||
"resolved_time_anchor": null,
|
||||
"resolved_primary_period": null,
|
||||
"effective_primary_period": null,
|
||||
"temporal_guard_input": null,
|
||||
"temporal_alignment_status": "conflicting",
|
||||
"temporal_resolution_source": "normalized_time_scope:missing",
|
||||
"temporal_guard_basis": "none",
|
||||
"temporal_guard_applied": false,
|
||||
"temporal_guard_outcome": "passed",
|
||||
"primary_period_window": null,
|
||||
"allowed_context_window": null,
|
||||
"controlled_temporal_expansion_enabled": false,
|
||||
"context_expansion_reasons_allowed": [
|
||||
"prehistory",
|
||||
"carryover",
|
||||
"post_period_closure",
|
||||
"long_running_contract_context"
|
||||
],
|
||||
"normalized_anchor_drift_detected": false,
|
||||
"reason_codes": [
|
||||
"missing_resolved_primary_period"
|
||||
]
|
||||
},
|
||||
"raw_numeric_tokens": [],
|
||||
"classified_numeric_tokens": [],
|
||||
"rejected_as_non_accounts": [],
|
||||
"resolved_account_anchors": [],
|
||||
"domain_polarity_guard": {
|
||||
"applied": false,
|
||||
"polarity": "not_applicable",
|
||||
"outcome": "not_applicable",
|
||||
"supplier_score": 0,
|
||||
"customer_score": 0,
|
||||
"account_scope": [],
|
||||
"raw_numeric_tokens": [],
|
||||
"classified_numeric_tokens": [],
|
||||
"rejected_as_non_accounts": [],
|
||||
"resolved_account_anchors": [],
|
||||
"rejected_problem_units": 0,
|
||||
"rejected_evidence": 0,
|
||||
"critical_contradiction": false,
|
||||
"reason_codes": []
|
||||
},
|
||||
"claim_anchor_audit": {
|
||||
"claim_type": "prove_settlement_closure_state",
|
||||
"settlement_role": "unknown",
|
||||
"settlement_role_resolution_reason": [
|
||||
"settlement_role_resolved_unknown"
|
||||
],
|
||||
"polarity_resolution_status": "unknown",
|
||||
"required_anchors": [
|
||||
"period",
|
||||
"account_scope",
|
||||
"counterparty_scope_or_contract",
|
||||
"closure_signal"
|
||||
],
|
||||
"resolved_anchors": {
|
||||
"period": [],
|
||||
"account_scope": [],
|
||||
"amounts": [],
|
||||
"contract": [],
|
||||
"document_numbers": [],
|
||||
"document_types": [],
|
||||
"counterparty_scope": [],
|
||||
"advance_signal": [],
|
||||
"closure_signal": [],
|
||||
"vat_signal": [],
|
||||
"chain_signal": [],
|
||||
"close_signal": [],
|
||||
"cost_scope": [],
|
||||
"rbp_signal": [],
|
||||
"writeoff_signal": [],
|
||||
"fixed_asset_signal": [],
|
||||
"amortization_signal": [],
|
||||
"expected_fa_set": [],
|
||||
"actual_fa_set": []
|
||||
},
|
||||
"missing_anchors": [
|
||||
"period",
|
||||
"account_scope",
|
||||
"counterparty_scope_or_contract",
|
||||
"closure_signal"
|
||||
],
|
||||
"claim_anchor_resolution_rate": 0,
|
||||
"primary_period": null,
|
||||
"allowed_context_window": null,
|
||||
"context_expansion_reasons_allowed": [
|
||||
"prehistory",
|
||||
"carryover",
|
||||
"post_period_closure",
|
||||
"long_running_contract_context"
|
||||
],
|
||||
"reason_codes": [
|
||||
"claim_missing_required_anchors",
|
||||
"claim_anchor_resolution_low",
|
||||
"unresolved_supplier_customer_polarity"
|
||||
]
|
||||
},
|
||||
"settlement_role": "unknown",
|
||||
"settlement_role_resolution_reason": [
|
||||
"settlement_role_resolved_unknown"
|
||||
],
|
||||
"polarity_resolution_status": "unknown",
|
||||
"targeted_evidence_acquisition": {
|
||||
"claim_type": "prove_settlement_closure_state",
|
||||
"required_checks": [
|
||||
"payment_document_found",
|
||||
"contract_matched",
|
||||
"settlement_object_matched",
|
||||
"closing_document_found",
|
||||
"register_closure_entry_found",
|
||||
"posting_link_found"
|
||||
],
|
||||
"check_status": {
|
||||
"payment_document_found": "not_found",
|
||||
"contract_matched": "not_found",
|
||||
"settlement_object_matched": "not_found",
|
||||
"closing_document_found": "not_found",
|
||||
"register_closure_entry_found": "not_found",
|
||||
"posting_link_found": "not_found"
|
||||
},
|
||||
"targeted_item_hits": 0,
|
||||
"targeted_evidence_hits": 0,
|
||||
"targeted_evidence_hit_rate": 0,
|
||||
"targeted_evidence_source_refs": [],
|
||||
"reason_codes": [
|
||||
"targeted_evidence_not_found",
|
||||
"targeted_evidence_hit_rate_low"
|
||||
]
|
||||
},
|
||||
"evidence_admissibility_gate": {
|
||||
"candidate_evidence_total": 0,
|
||||
"admissible_evidence_count": 0,
|
||||
"rejected_evidence_count": 0,
|
||||
"rejected_item_count": 0,
|
||||
"reject_breakdown": {
|
||||
"wrong_period": 0,
|
||||
"wrong_domain": 0,
|
||||
"wrong_account_scope": 0,
|
||||
"weak_source_mapping": 0,
|
||||
"zero_live_match": 0,
|
||||
"future_dated_or_out_of_window": 0
|
||||
},
|
||||
"category_breakdown": {
|
||||
"hard_evidence": 0,
|
||||
"supporting_signal": 0,
|
||||
"inadmissible_noise": 0
|
||||
},
|
||||
"reason_codes": [
|
||||
"no_admissible_evidence_for_grounded_answer"
|
||||
]
|
||||
},
|
||||
"eligibility_time_basis": "none",
|
||||
"grounded_answer_eligibility_guard": {
|
||||
"eligible": false,
|
||||
"temporal_passed": true,
|
||||
"eligibility_time_basis": "none",
|
||||
"business_scope_passed": true,
|
||||
"polarity_passed": true,
|
||||
"claim_anchors_passed": false,
|
||||
"claim_anchor_resolution_rate": 0,
|
||||
"missing_required_anchors": 4,
|
||||
"admissible_evidence_count": 0,
|
||||
"critical_contradiction": false,
|
||||
"outcome": "limited_or_insufficient_evidence",
|
||||
"grounding_mode": "limited_or_insufficient_evidence",
|
||||
"reason_codes": [
|
||||
"claim_anchor_coverage_insufficient",
|
||||
"admissible_evidence_count_zero",
|
||||
"targeted_evidence_hit_rate_zero"
|
||||
]
|
||||
},
|
||||
"problem_centric_answer_applied": false,
|
||||
"problem_units_used_count": 0,
|
||||
"problem_answer_mode": "stage1_policy_v11",
|
||||
"address_llm_predecompose_attempted": true,
|
||||
"address_llm_predecompose_applied": false,
|
||||
"address_llm_predecompose_reason": "normalized_fragment_rejected_intent_drop",
|
||||
"address_llm_predecompose_provider": "local",
|
||||
"address_fallback_rule_hit": null,
|
||||
"address_tool_gate_decision": "run_address_lane",
|
||||
"address_tool_gate_reason": "llm_canonical_candidate_detected",
|
||||
"address_llm_predecompose_contract": {
|
||||
"schema_version": "address_llm_predecompose_contract_v1",
|
||||
"source_message": "выведи всех заков за все время",
|
||||
"canonical_message": "выведи всех заков за все время",
|
||||
"mode": "unsupported",
|
||||
"mode_confidence": "low",
|
||||
"query_shape": "UNKNOWN",
|
||||
"query_shape_confidence": "low",
|
||||
"intent": "counterparty_activity_lifecycle",
|
||||
"intent_confidence": "high",
|
||||
"entities": {
|
||||
"account": null,
|
||||
"counterparty": null,
|
||||
"contract": null,
|
||||
"document_type": null,
|
||||
"document_ref": null,
|
||||
"organization": null
|
||||
},
|
||||
"period": {
|
||||
"scope": "all_time",
|
||||
"period_from": null,
|
||||
"period_to": "2026-04-08",
|
||||
"as_of_date": null,
|
||||
"has_explicit_period": true
|
||||
},
|
||||
"aggregation_profile": "management_profile"
|
||||
},
|
||||
"answer_structure_v11": {
|
||||
"schema_version": "answer_structure_v1_1",
|
||||
"answer_summary": "Нужны уточнения: без сужения фокуса надежный вывод невозможен.",
|
||||
"direct_answer": "Есть признаки проблемы, но без уточнений по периоду и объекту вывод ненадежен.",
|
||||
"mechanism_block": {
|
||||
"status": "unresolved",
|
||||
"mechanism_notes": [],
|
||||
"limitation_reason_codes": []
|
||||
},
|
||||
"evidence_block": {
|
||||
"evidence_ids": [],
|
||||
"source_refs": [],
|
||||
"mechanism_notes": [],
|
||||
"coverage_note": "coverage_partial_or_limited"
|
||||
},
|
||||
"uncertainty_block": {
|
||||
"open_uncertainties": [
|
||||
"R1",
|
||||
"missing_anchor:period",
|
||||
"missing_anchor:account",
|
||||
"missing_anchor:document_or_object",
|
||||
"missing_anchor:counterparty"
|
||||
],
|
||||
"limitations": [
|
||||
"Ни одно требование не получило подтвержденного покрытия.",
|
||||
"Нет explainable-сигналов why_included в результатах выборки.",
|
||||
"Недостаточно покрытия required anchors для claim-bound grounding.",
|
||||
"Недостаточно допустимого evidence для обоснованного ответа.",
|
||||
"Targeted evidence acquisition не дал допустимых попаданий по claim target path."
|
||||
]
|
||||
},
|
||||
"next_step_block": {
|
||||
"recommended_actions": [
|
||||
"Дайте недостающие якоря (период/счет/объект), иначе сильный factual вывод невозможен."
|
||||
],
|
||||
"clarification_questions": [
|
||||
"Уточните период проверки (например, июль 2020).",
|
||||
"Уточните счет или группу счетов (например, 19, 60, 62).",
|
||||
"Укажите документ/GUID/конкретный объект для трассировки.",
|
||||
"Укажите контрагента или группу контрагентов.",
|
||||
"Закройте уточнения для требований: R1."
|
||||
]
|
||||
}
|
||||
},
|
||||
"investigation_state_snapshot": {
|
||||
"schema_version": "investigation_state_v1",
|
||||
"session_id": "asst-2026-04-08_Address_Batch2_Lifecycle_FullGate_PhaseC_PostFix1-b2_n002",
|
||||
"status": "active",
|
||||
"turn_index": 1,
|
||||
"updated_at": "2026-04-08T10:03:52.888Z",
|
||||
"question_id": "msg-b1JYcK4ipB",
|
||||
"question_scope_id": "s:выведи всех заков за все время",
|
||||
"scope_origin": "underspecified",
|
||||
"focus": {
|
||||
"domain": null,
|
||||
"period": null,
|
||||
"primary_accounts": [],
|
||||
"active_query_subject": "выведи всех заков за все время"
|
||||
},
|
||||
"narrowing_status": "unknown",
|
||||
"evidence_refs": [],
|
||||
"open_uncertainties": [
|
||||
"clarify:R1"
|
||||
],
|
||||
"last_answer_mode": "clarification_required",
|
||||
"followup_context": {
|
||||
"previous_question_id": null,
|
||||
"last_user_message": "выведи всех заков за все время",
|
||||
"referenced_requirement_ids": [
|
||||
"R1"
|
||||
],
|
||||
"active_domain": null,
|
||||
"active_requirement_ids": [
|
||||
"R1"
|
||||
],
|
||||
"uncovered_requirement_ids": [
|
||||
"R1"
|
||||
],
|
||||
"last_problem_unit_id": null,
|
||||
"settlement_next_actions": [],
|
||||
"evidence_summary": [],
|
||||
"question_scope_id": "s:выведи всех заков за все время",
|
||||
"scope_origin": "underspecified"
|
||||
},
|
||||
"query_mode_hint": "investigation_candidate"
|
||||
},
|
||||
"normalized": null
|
||||
},
|
||||
"error_code": null,
|
||||
"error_message": null
|
||||
},
|
||||
{
|
||||
"index": 16,
|
||||
"id": "B2_N004",
|
||||
"question": "кто был активен в 2020 и потом отвалился",
|
||||
"session": null,
|
||||
"session_id": "asst-2026-04-08_Address_Batch2_Lifecycle_FullGate_PhaseC_PostFix1-b2_n004",
|
||||
"status_code": 200,
|
||||
"ok": true,
|
||||
"elapsed_ms": 17655,
|
||||
"reply_type": "clarification_required",
|
||||
"trace_id": "ysDSi5BxQlzQy7",
|
||||
"assistant_reply": "Коротко: Наиболее вероятный механизм проблемы подтвержден частично и требует первичной проверки. Что сломано:\n- Есть признаки проблемы, но без уточнений по периоду и объекту вывод ненадежен. Почему это похоже на проблему:\n- Сигнал проблемы есть, но механизм подтвержден не полностью. На чем это основано:\n- Опора частичная: часть требований покрыта не полностью.\n- Отдельно не подтверждено или покрыто частично: R1. Что проверить первым:\n- Проверьте связку документов и проводок по проблемному участку в указанном периоде. Ограничения:\n- Якоря из вопроса без прямого подтверждения: 2020, period:2020.\n- Ни одно требование не получило подтвержденного покрытия.\n- Нет explainable-сигналов why_included в результатах выборки.\n- required anchors claim-bound grounding.\n- evidence.\n- Targeted evidence acquisition claim target path.",
|
||||
"assistant_reply_first_line": "Коротко: Наиболее вероятный механизм проблемы подтвержден частично и требует первичной проверки. Что сломано:",
|
||||
"expected_intent": "counterparty_activity_lifecycle",
|
||||
"actual_intent": null,
|
||||
"intent_match": false,
|
||||
"expected_mode": "address_query",
|
||||
"actual_mode": null,
|
||||
"mode_match": false,
|
||||
"expected_reply_type": null,
|
||||
"reply_match": true,
|
||||
"semantic_pass": false,
|
||||
"route_pass": false,
|
||||
"route_health": "blocked_clarification",
|
||||
"strict_policy": "route",
|
||||
"strict_pass": false,
|
||||
"selected_recipe": null,
|
||||
"missing_required_filters": null,
|
||||
"match_failure_stage": null,
|
||||
"match_failure_reason": null,
|
||||
"rows_fetched": null,
|
||||
"rows_matched": null,
|
||||
"mcp_call_status": null,
|
||||
"limited_reason_category": null,
|
||||
"llm_decomposition_attempted": true,
|
||||
"llm_decomposition_applied": null,
|
||||
"llm_decomposition_reason": null,
|
||||
"llm_canonical_candidate_detected": null,
|
||||
"fallback_rule_hit": null,
|
||||
"tool_gate_decision": "run_address_lane",
|
||||
"tool_gate_reason": "llm_canonical_candidate_detected",
|
||||
"predecompose_contract_intent": null,
|
||||
"predecompose_contract_aggregation_profile": null,
|
||||
"predecompose_contract_period_scope": null,
|
||||
"debug_payload": {
|
||||
"trace_id": "ysDSi5BxQlzQy7",
|
||||
"prompt_version": "address_query_runtime_v1",
|
||||
"schema_version": "v1",
|
||||
"fallback_type": "clarification",
|
||||
"route_summary": null,
|
||||
"fragments": [],
|
||||
"requirements_extracted": [
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"source_fragment_id": null,
|
||||
"requirement_text": "кто был активен в 2020 и потом отвалился",
|
||||
"subject_tokens": [],
|
||||
"status": "clarification_needed",
|
||||
"route": null
|
||||
}
|
||||
],
|
||||
"coverage_report": {
|
||||
"requirements_total": 1,
|
||||
"requirements_covered": 0,
|
||||
"requirements_uncovered": [],
|
||||
"requirements_partially_covered": [],
|
||||
"clarification_needed_for": [
|
||||
"R1"
|
||||
],
|
||||
"out_of_scope_requirements": []
|
||||
},
|
||||
"routes": [],
|
||||
"retrieval_status": [],
|
||||
"retrieval_results": [],
|
||||
"answer_grounding_check": {
|
||||
"status": "no_grounded_answer",
|
||||
"route_subject_match": true,
|
||||
"missing_requirements": [
|
||||
"R1"
|
||||
],
|
||||
"reasons": [
|
||||
"Ни одно требование не получило подтвержденного покрытия.",
|
||||
"Нет explainable-сигналов why_included в результатах выборки.",
|
||||
"Недостаточно покрытия required anchors для claim-bound grounding.",
|
||||
"Недостаточно допустимого evidence для обоснованного ответа.",
|
||||
"Targeted evidence acquisition не дал допустимых попаданий по claim target path."
|
||||
],
|
||||
"why_included_summary": [],
|
||||
"selection_reason_summary": []
|
||||
},
|
||||
"dropped_intent_segments": [],
|
||||
"question_type_class": "why_breaks",
|
||||
"company_anchors": {
|
||||
"contract_numbers": [],
|
||||
"document_numbers": [],
|
||||
"dates": [],
|
||||
"amounts": [],
|
||||
"accounts": [],
|
||||
"periods": [
|
||||
"2020"
|
||||
],
|
||||
"document_types": [],
|
||||
"all": [
|
||||
"period:2020"
|
||||
]
|
||||
},
|
||||
"business_scope_raw": [],
|
||||
"business_scope_resolved": [
|
||||
"company_specific_accounting"
|
||||
],
|
||||
"company_grounding_applied": true,
|
||||
"scope_resolution_reason": [
|
||||
"settlement_claim_company_scope_recovery"
|
||||
],
|
||||
"company_scope_resolution_reason": [
|
||||
"settlement_claim_company_scope_recovery"
|
||||
],
|
||||
"raw_time_anchor": null,
|
||||
"raw_time_scope": null,
|
||||
"resolved_time_anchor": null,
|
||||
"resolved_primary_period": null,
|
||||
"effective_primary_period": null,
|
||||
"temporal_guard_input": null,
|
||||
"temporal_alignment_status": "conflicting",
|
||||
"temporal_resolution_source": "normalized_time_scope:missing",
|
||||
"temporal_guard_basis": "none",
|
||||
"temporal_guard_applied": false,
|
||||
"temporal_guard_outcome": "passed",
|
||||
"temporal_guard": {
|
||||
"raw_time_anchor": null,
|
||||
"raw_time_scope": null,
|
||||
"resolved_time_anchor": null,
|
||||
"resolved_primary_period": null,
|
||||
"effective_primary_period": null,
|
||||
"temporal_guard_input": null,
|
||||
"temporal_alignment_status": "conflicting",
|
||||
"temporal_resolution_source": "normalized_time_scope:missing",
|
||||
"temporal_guard_basis": "none",
|
||||
"temporal_guard_applied": false,
|
||||
"temporal_guard_outcome": "passed",
|
||||
"primary_period_window": null,
|
||||
"allowed_context_window": null,
|
||||
"controlled_temporal_expansion_enabled": false,
|
||||
"context_expansion_reasons_allowed": [
|
||||
"prehistory",
|
||||
"carryover",
|
||||
"post_period_closure",
|
||||
"long_running_contract_context"
|
||||
],
|
||||
"normalized_anchor_drift_detected": false,
|
||||
"reason_codes": [
|
||||
"missing_resolved_primary_period"
|
||||
]
|
||||
},
|
||||
"raw_numeric_tokens": [
|
||||
"2020"
|
||||
],
|
||||
"classified_numeric_tokens": [],
|
||||
"rejected_as_non_accounts": [],
|
||||
"resolved_account_anchors": [],
|
||||
"domain_polarity_guard": {
|
||||
"applied": false,
|
||||
"polarity": "not_applicable",
|
||||
"outcome": "not_applicable",
|
||||
"supplier_score": 0,
|
||||
"customer_score": 0,
|
||||
"account_scope": [],
|
||||
"raw_numeric_tokens": [
|
||||
"2020"
|
||||
],
|
||||
"classified_numeric_tokens": [],
|
||||
"rejected_as_non_accounts": [],
|
||||
"resolved_account_anchors": [],
|
||||
"rejected_problem_units": 0,
|
||||
"rejected_evidence": 0,
|
||||
"critical_contradiction": false,
|
||||
"reason_codes": []
|
||||
},
|
||||
"claim_anchor_audit": {
|
||||
"claim_type": "prove_settlement_closure_state",
|
||||
"settlement_role": "unknown",
|
||||
"settlement_role_resolution_reason": [
|
||||
"settlement_role_resolved_unknown"
|
||||
],
|
||||
"polarity_resolution_status": "unknown",
|
||||
"required_anchors": [
|
||||
"period",
|
||||
"account_scope",
|
||||
"counterparty_scope_or_contract",
|
||||
"closure_signal"
|
||||
],
|
||||
"resolved_anchors": {
|
||||
"period": [
|
||||
"2020"
|
||||
],
|
||||
"account_scope": [],
|
||||
"amounts": [],
|
||||
"contract": [],
|
||||
"document_numbers": [],
|
||||
"document_types": [],
|
||||
"counterparty_scope": [],
|
||||
"advance_signal": [],
|
||||
"closure_signal": [],
|
||||
"vat_signal": [],
|
||||
"chain_signal": [],
|
||||
"close_signal": [],
|
||||
"cost_scope": [],
|
||||
"rbp_signal": [],
|
||||
"writeoff_signal": [],
|
||||
"fixed_asset_signal": [],
|
||||
"amortization_signal": [],
|
||||
"expected_fa_set": [],
|
||||
"actual_fa_set": []
|
||||
},
|
||||
"missing_anchors": [
|
||||
"account_scope",
|
||||
"counterparty_scope_or_contract",
|
||||
"closure_signal"
|
||||
],
|
||||
"claim_anchor_resolution_rate": 0.25,
|
||||
"primary_period": null,
|
||||
"allowed_context_window": null,
|
||||
"context_expansion_reasons_allowed": [
|
||||
"prehistory",
|
||||
"carryover",
|
||||
"post_period_closure",
|
||||
"long_running_contract_context"
|
||||
],
|
||||
"reason_codes": [
|
||||
"claim_missing_required_anchors",
|
||||
"claim_anchor_resolution_low",
|
||||
"unresolved_supplier_customer_polarity"
|
||||
]
|
||||
},
|
||||
"settlement_role": "unknown",
|
||||
"settlement_role_resolution_reason": [
|
||||
"settlement_role_resolved_unknown"
|
||||
],
|
||||
"polarity_resolution_status": "unknown",
|
||||
"targeted_evidence_acquisition": {
|
||||
"claim_type": "prove_settlement_closure_state",
|
||||
"required_checks": [
|
||||
"payment_document_found",
|
||||
"contract_matched",
|
||||
"settlement_object_matched",
|
||||
"closing_document_found",
|
||||
"register_closure_entry_found",
|
||||
"posting_link_found"
|
||||
],
|
||||
"check_status": {
|
||||
"payment_document_found": "not_found",
|
||||
"contract_matched": "not_found",
|
||||
"settlement_object_matched": "not_found",
|
||||
"closing_document_found": "not_found",
|
||||
"register_closure_entry_found": "not_found",
|
||||
"posting_link_found": "not_found"
|
||||
},
|
||||
"targeted_item_hits": 0,
|
||||
"targeted_evidence_hits": 0,
|
||||
"targeted_evidence_hit_rate": 0,
|
||||
"targeted_evidence_source_refs": [],
|
||||
"reason_codes": [
|
||||
"targeted_evidence_not_found",
|
||||
"targeted_evidence_hit_rate_low"
|
||||
]
|
||||
},
|
||||
"evidence_admissibility_gate": {
|
||||
"candidate_evidence_total": 0,
|
||||
"admissible_evidence_count": 0,
|
||||
"rejected_evidence_count": 0,
|
||||
"rejected_item_count": 0,
|
||||
"reject_breakdown": {
|
||||
"wrong_period": 0,
|
||||
"wrong_domain": 0,
|
||||
"wrong_account_scope": 0,
|
||||
"weak_source_mapping": 0,
|
||||
"zero_live_match": 0,
|
||||
"future_dated_or_out_of_window": 0
|
||||
},
|
||||
"category_breakdown": {
|
||||
"hard_evidence": 0,
|
||||
"supporting_signal": 0,
|
||||
"inadmissible_noise": 0
|
||||
},
|
||||
"reason_codes": [
|
||||
"no_admissible_evidence_for_grounded_answer"
|
||||
]
|
||||
},
|
||||
"eligibility_time_basis": "none",
|
||||
"grounded_answer_eligibility_guard": {
|
||||
"eligible": false,
|
||||
"temporal_passed": true,
|
||||
"eligibility_time_basis": "none",
|
||||
"business_scope_passed": true,
|
||||
"polarity_passed": true,
|
||||
"claim_anchors_passed": false,
|
||||
"claim_anchor_resolution_rate": 0.25,
|
||||
"missing_required_anchors": 3,
|
||||
"admissible_evidence_count": 0,
|
||||
"critical_contradiction": false,
|
||||
"outcome": "limited_or_insufficient_evidence",
|
||||
"grounding_mode": "limited_or_insufficient_evidence",
|
||||
"reason_codes": [
|
||||
"claim_anchor_coverage_insufficient",
|
||||
"admissible_evidence_count_zero",
|
||||
"targeted_evidence_hit_rate_zero"
|
||||
]
|
||||
},
|
||||
"problem_centric_answer_applied": false,
|
||||
"problem_units_used_count": 0,
|
||||
"problem_answer_mode": "stage1_policy_v11",
|
||||
"address_llm_predecompose_attempted": true,
|
||||
"address_llm_predecompose_applied": false,
|
||||
"address_llm_predecompose_reason": "normalized_fragment_rejected_intent_conflict",
|
||||
"address_llm_predecompose_provider": "local",
|
||||
"address_fallback_rule_hit": null,
|
||||
"address_tool_gate_decision": "run_address_lane",
|
||||
"address_tool_gate_reason": "llm_canonical_candidate_detected",
|
||||
"address_llm_predecompose_contract": {
|
||||
"schema_version": "address_llm_predecompose_contract_v1",
|
||||
"source_message": "кто был активен в 2020 и потом отвалился",
|
||||
"canonical_message": "кто был активен в 2020 и потом отвалился",
|
||||
"mode": "unsupported",
|
||||
"mode_confidence": "low",
|
||||
"query_shape": "COMPOUND_FACTUAL_QUERY",
|
||||
"query_shape_confidence": "medium",
|
||||
"intent": "counterparty_activity_lifecycle",
|
||||
"intent_confidence": "high",
|
||||
"entities": {
|
||||
"account": null,
|
||||
"counterparty": null,
|
||||
"contract": null,
|
||||
"document_type": null,
|
||||
"document_ref": null,
|
||||
"organization": null
|
||||
},
|
||||
"period": {
|
||||
"scope": "year",
|
||||
"period_from": "2020-01-01",
|
||||
"period_to": "2020-12-31",
|
||||
"as_of_date": null,
|
||||
"has_explicit_period": true
|
||||
},
|
||||
"aggregation_profile": "management_profile"
|
||||
},
|
||||
"answer_structure_v11": {
|
||||
"schema_version": "answer_structure_v1_1",
|
||||
"answer_summary": "Нужны уточнения: без сужения фокуса надежный вывод невозможен.",
|
||||
"direct_answer": "Есть признаки проблемы, но без уточнений по периоду и объекту вывод ненадежен.",
|
||||
"mechanism_block": {
|
||||
"status": "unresolved",
|
||||
"mechanism_notes": [],
|
||||
"limitation_reason_codes": []
|
||||
},
|
||||
"evidence_block": {
|
||||
"evidence_ids": [],
|
||||
"source_refs": [],
|
||||
"mechanism_notes": [],
|
||||
"coverage_note": "coverage_partial_or_limited"
|
||||
},
|
||||
"uncertainty_block": {
|
||||
"open_uncertainties": [
|
||||
"R1",
|
||||
"missing_anchor:account",
|
||||
"missing_anchor:document_or_object",
|
||||
"missing_anchor:counterparty"
|
||||
],
|
||||
"limitations": [
|
||||
"Ни одно требование не получило подтвержденного покрытия.",
|
||||
"Нет explainable-сигналов why_included в результатах выборки.",
|
||||
"Недостаточно покрытия required anchors для claim-bound grounding.",
|
||||
"Недостаточно допустимого evidence для обоснованного ответа.",
|
||||
"Targeted evidence acquisition не дал допустимых попаданий по claim target path.",
|
||||
"Часть якорей запроса пока не подтверждена в опоре: 2020, period:2020."
|
||||
]
|
||||
},
|
||||
"next_step_block": {
|
||||
"recommended_actions": [
|
||||
"Дайте недостающие якоря (период/счет/объект), иначе сильный factual вывод невозможен."
|
||||
],
|
||||
"clarification_questions": [
|
||||
"Уточните счет или группу счетов (например, 19, 60, 62).",
|
||||
"Укажите документ/GUID/конкретный объект для трассировки.",
|
||||
"Укажите контрагента или группу контрагентов.",
|
||||
"Закройте уточнения для требований: R1."
|
||||
]
|
||||
}
|
||||
},
|
||||
"investigation_state_snapshot": {
|
||||
"schema_version": "investigation_state_v1",
|
||||
"session_id": "asst-2026-04-08_Address_Batch2_Lifecycle_FullGate_PhaseC_PostFix1-b2_n004",
|
||||
"status": "active",
|
||||
"turn_index": 1,
|
||||
"updated_at": "2026-04-08T10:04:16.662Z",
|
||||
"question_id": "msg-S5jM_9Rutv",
|
||||
"question_scope_id": "p:2020|s:кто был активен в 2020 и потом отвалился",
|
||||
"scope_origin": "explicit_from_message",
|
||||
"focus": {
|
||||
"domain": null,
|
||||
"period": "2020",
|
||||
"primary_accounts": [],
|
||||
"active_query_subject": "кто был активен в 2020 и потом отвалился"
|
||||
},
|
||||
"narrowing_status": "unknown",
|
||||
"evidence_refs": [],
|
||||
"open_uncertainties": [
|
||||
"clarify:R1"
|
||||
],
|
||||
"last_answer_mode": "clarification_required",
|
||||
"followup_context": {
|
||||
"previous_question_id": null,
|
||||
"last_user_message": "кто был активен в 2020 и потом отвалился",
|
||||
"referenced_requirement_ids": [
|
||||
"R1"
|
||||
],
|
||||
"active_domain": null,
|
||||
"active_requirement_ids": [
|
||||
"R1"
|
||||
],
|
||||
"uncovered_requirement_ids": [
|
||||
"R1"
|
||||
],
|
||||
"last_problem_unit_id": null,
|
||||
"settlement_next_actions": [],
|
||||
"evidence_summary": [],
|
||||
"question_scope_id": "p:2020|s:кто был активен в 2020 и потом отвалился",
|
||||
"scope_origin": "explicit_from_message"
|
||||
},
|
||||
"query_mode_hint": "investigation_candidate"
|
||||
},
|
||||
"normalized": null
|
||||
},
|
||||
"error_code": null,
|
||||
"error_message": null
|
||||
}
|
||||
]
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,40 @@
|
|||
# Response Audit: 2026-04-08_Address_Batch2_Lifecycle_FullGate_PhaseC_PostFix1
|
||||
|
||||
| id | strict | route_health | reply_type | intent | limited_reason | question | assistant_first_line |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| B2_C001 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие заказчики работали с нами в 2020 году? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_C002 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие заказчики работали с нами за все время? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_C003 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие заказчики появились у нас впервые в 2020 году? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_C004 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие заказчики были активны в 2020 году, но дальше перестали встречаться? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_C005 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие контрагенты работали с нами только один раз за все время? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_C006 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие контрагенты работают с нами дольше всего по периоду активности? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_C007 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Раздели поставщиков на регулярных и эпизодических по частоте операций. | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_C008 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие поставщики давно не использовались в операционной активности? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_C009 | True | ok_or_factual | factual | contract_usage_overview | None | Какие договоры давно не использовались (stale contracts)? | Профиль договорной базы собран (catalog + usage aggregate). |
|
||||
| B2_C010 | True | ok_or_factual | factual | contract_usage_and_value | None | Покажи контрагентов с несколькими договорами и укажи, какие договоры у них активны. | Собран профиль договоров по обороту/бюджету (bank-doc contract aggregate). |
|
||||
| B2_C011 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие заказчики работали с нами в 2021 году? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_C012 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие заказчики впервые появились у нас в 2021 году? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_N001 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | какие клиенты были активны в 20м | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_N002 | False | blocked_clarification | clarification_required | None | None | выведи всех заков за все время | Коротко: Проблема подтверждается частично; для уверенного вывода нужны уточнения. Что сломано: |
|
||||
| B2_N003 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | кто к нам пришел впервые в 2020 | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_N004 | False | blocked_clarification | clarification_required | None | None | кто был активен в 2020 и потом отвалился | Коротко: Наиболее вероятный механизм проблемы подтвержден частично и требует первичной проверки. Что сломано: |
|
||||
| B2_N005 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | кто с нами был ровно один раз и пропал | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_N006 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | самые старые по сотрудничеству кто | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_N007 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | разбей поставщиков на регуляр и разовые | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_N008 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | какие поставщики давно мертвые | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_N009 | True | ok_or_factual | factual | contract_usage_overview | None | какие договоры уже протухли и не двигаются | Профиль договорной базы собран (catalog + usage aggregate). |
|
||||
| B2_N010 | True | ok_or_factual | factual | contract_usage_and_value | None | у кого несколько договоров и какие из них рабочие | Собран профиль договоров по обороту/бюджету (bank-doc contract aggregate). |
|
||||
| B2_N011 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | новые клиенты за 21й год | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_N012 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | клиенты которые исчезли после 21 года | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_F001 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие заказчики работали с нами в 2020 году? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_F002 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | А кто из них новые? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_F003 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | А кто потом исчез? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_F004 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | И кто был только один раз? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_F005 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Раздели поставщиков на регулярных и эпизодических. | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_F006 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Теперь покажи тех, кто давно не использовался. | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_F007 | True | ok_or_factual | factual | contract_usage_overview | None | Какие договоры давно не использовались? | Профиль договорной базы собран (catalog + usage aggregate). |
|
||||
| B2_F008 | True | ok_or_factual | factual | contract_usage_and_value | None | Теперь покажи контрагентов с несколькими договорами. | Собран профиль договоров по обороту/бюджету (bank-doc contract aggregate). |
|
||||
| B2_F009 | True | ok_or_factual | factual | contract_usage_and_value | None | И у них какие договоры сейчас активны? | Собран профиль договоров по обороту/бюджету (bank-doc contract aggregate). |
|
||||
| B2_F010 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие заказчики работали с нами в 2020 году? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_F011 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Теперь за 2021. | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_F012 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | А кто новые в этом году? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
|
|
@ -0,0 +1,111 @@
|
|||
{
|
||||
"run_id": "2026-04-08_Address_Batch2_Lifecycle_FullGate_PhaseC_PostFix1",
|
||||
"generated_at": "2026-04-08T13:06:15",
|
||||
"source_questions_file": "X:\\1C\\NDC_1C\\docs\\ADDRESS\\question_sets\\domain_general_batch2_lifecycle_acceptance_2026-04-08_phaseA.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": 36,
|
||||
"ok_200_count": 36,
|
||||
"semantic_pass_count": 34,
|
||||
"semantic_pass_rate": 0.9444,
|
||||
"route_pass_count": 34,
|
||||
"route_pass_rate": 0.9444,
|
||||
"strict_pass_count": 34,
|
||||
"strict_pass_rate": 0.9444,
|
||||
"factual_count": 34,
|
||||
"partial_coverage_count": 0,
|
||||
"clarification_required_count": 2,
|
||||
"http_error_count": 0,
|
||||
"llm_decomposition_attempted_count": 36,
|
||||
"llm_decomposition_applied_count": 24,
|
||||
"llm_fallback_count": 0,
|
||||
"llm_fallback_rate": 0.0,
|
||||
"tool_gate_blocked_count": 0,
|
||||
"tool_gate_blocked_rate": 0.0,
|
||||
"avg_elapsed_ms": 6538
|
||||
},
|
||||
"distributions": {
|
||||
"reply_type": {
|
||||
"factual": 34,
|
||||
"clarification_required": 2
|
||||
},
|
||||
"actual_intent": {
|
||||
"counterparty_activity_lifecycle": 27,
|
||||
"contract_usage_overview": 3,
|
||||
"contract_usage_and_value": 4,
|
||||
"None": 2
|
||||
},
|
||||
"actual_mode": {
|
||||
"address_query": 34,
|
||||
"None": 2
|
||||
},
|
||||
"mcp_call_status": {
|
||||
"matched_non_empty": 34,
|
||||
"None": 2
|
||||
},
|
||||
"limited_reason_category": {},
|
||||
"route_health": {
|
||||
"ok_or_factual": 34,
|
||||
"blocked_clarification": 2
|
||||
},
|
||||
"tool_gate_decision": {
|
||||
"run_address_lane": 36
|
||||
},
|
||||
"tool_gate_reason": {
|
||||
"address_mode_classifier_detected": 29,
|
||||
"llm_canonical_candidate_detected": 7
|
||||
}
|
||||
},
|
||||
"address_llm_predecompose_metrics": {
|
||||
"overall": {
|
||||
"llm_attempted": 36,
|
||||
"llm_applied": 24,
|
||||
"fallback_used": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"tool_gate_blocked": 0,
|
||||
"gate_block_rate": 0.0
|
||||
},
|
||||
"by_intent": {
|
||||
"counterparty_activity_lifecycle": {
|
||||
"total": 27,
|
||||
"llm_attempted": 27,
|
||||
"llm_applied": 20,
|
||||
"fallback_used": 0,
|
||||
"tool_gate_blocked": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"gate_block_rate": 0.0
|
||||
},
|
||||
"contract_usage_overview": {
|
||||
"total": 3,
|
||||
"llm_attempted": 3,
|
||||
"llm_applied": 0,
|
||||
"fallback_used": 0,
|
||||
"tool_gate_blocked": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"gate_block_rate": 0.0
|
||||
},
|
||||
"contract_usage_and_value": {
|
||||
"total": 4,
|
||||
"llm_attempted": 4,
|
||||
"llm_applied": 4,
|
||||
"fallback_used": 0,
|
||||
"tool_gate_blocked": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"gate_block_rate": 0.0
|
||||
},
|
||||
"unknown": {
|
||||
"total": 2,
|
||||
"llm_attempted": 2,
|
||||
"llm_applied": 0,
|
||||
"fallback_used": 0,
|
||||
"tool_gate_blocked": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"gate_block_rate": 0.0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
# 2026-04-08_Address_Batch2_Lifecycle_FullGate_PhaseC_PostFix2
|
||||
|
||||
Generated at: 2026-04-08T13:18:24
|
||||
Questions file: X:\1C\NDC_1C\docs\ADDRESS\question_sets\domain_general_batch2_lifecycle_acceptance_2026-04-08_phaseA.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: 36
|
||||
- ok_200_count: 36
|
||||
- semantic_pass_count: 36
|
||||
- semantic_pass_rate: 1.0
|
||||
- route_pass_count: 36
|
||||
- route_pass_rate: 1.0
|
||||
- strict_pass_count: 36
|
||||
- strict_pass_rate: 1.0
|
||||
- factual_count: 36
|
||||
- partial_coverage_count: 0
|
||||
- clarification_required_count: 0
|
||||
- http_error_count: 0
|
||||
- llm_decomposition_attempted_count: 36
|
||||
- llm_decomposition_applied_count: 24
|
||||
- llm_fallback_count: 0
|
||||
- llm_fallback_rate: 0.0
|
||||
- tool_gate_blocked_count: 0
|
||||
- tool_gate_blocked_rate: 0.0
|
||||
- avg_elapsed_ms: 5924.0
|
||||
|
||||
## Files
|
||||
- run_summary.json
|
||||
- full_live_results.json
|
||||
- failures_only.json
|
||||
|
|
@ -0,0 +1 @@
|
|||
[]
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,40 @@
|
|||
# Response Audit: 2026-04-08_Address_Batch2_Lifecycle_FullGate_PhaseC_PostFix2
|
||||
|
||||
| id | strict | route_health | reply_type | intent | limited_reason | question | assistant_first_line |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| B2_C001 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие заказчики работали с нами в 2020 году? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_C002 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие заказчики работали с нами за все время? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_C003 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие заказчики появились у нас впервые в 2020 году? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_C004 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие заказчики были активны в 2020 году, но дальше перестали встречаться? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_C005 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие контрагенты работали с нами только один раз за все время? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_C006 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие контрагенты работают с нами дольше всего по периоду активности? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_C007 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Раздели поставщиков на регулярных и эпизодических по частоте операций. | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_C008 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие поставщики давно не использовались в операционной активности? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_C009 | True | ok_or_factual | factual | contract_usage_overview | None | Какие договоры давно не использовались (stale contracts)? | Профиль договорной базы собран (catalog + usage aggregate). |
|
||||
| B2_C010 | True | ok_or_factual | factual | contract_usage_and_value | None | Покажи контрагентов с несколькими договорами и укажи, какие договоры у них активны. | Собран профиль договоров по обороту/бюджету (bank-doc contract aggregate). |
|
||||
| B2_C011 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие заказчики работали с нами в 2021 году? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_C012 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие заказчики впервые появились у нас в 2021 году? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_N001 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | какие клиенты были активны в 20м | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_N002 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | выведи всех заков за все время | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_N003 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | кто к нам пришел впервые в 2020 | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_N004 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | кто был активен в 2020 и потом отвалился | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_N005 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | кто с нами был ровно один раз и пропал | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_N006 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | самые старые по сотрудничеству кто | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_N007 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | разбей поставщиков на регуляр и разовые | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_N008 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | какие поставщики давно мертвые | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_N009 | True | ok_or_factual | factual | contract_usage_overview | None | какие договоры уже протухли и не двигаются | Профиль договорной базы собран (catalog + usage aggregate). |
|
||||
| B2_N010 | True | ok_or_factual | factual | contract_usage_and_value | None | у кого несколько договоров и какие из них рабочие | Собран профиль договоров по обороту/бюджету (bank-doc contract aggregate). |
|
||||
| B2_N011 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | новые клиенты за 21й год | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_N012 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | клиенты которые исчезли после 21 года | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_F001 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие заказчики работали с нами в 2020 году? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_F002 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | А кто из них новые? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_F003 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | А кто потом исчез? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_F004 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | И кто был только один раз? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_F005 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Раздели поставщиков на регулярных и эпизодических. | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_F006 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Теперь покажи тех, кто давно не использовался. | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_F007 | True | ok_or_factual | factual | contract_usage_overview | None | Какие договоры давно не использовались? | Профиль договорной базы собран (catalog + usage aggregate). |
|
||||
| B2_F008 | True | ok_or_factual | factual | contract_usage_and_value | None | Теперь покажи контрагентов с несколькими договорами. | Собран профиль договоров по обороту/бюджету (bank-doc contract aggregate). |
|
||||
| B2_F009 | True | ok_or_factual | factual | contract_usage_and_value | None | И у них какие договоры сейчас активны? | Собран профиль договоров по обороту/бюджету (bank-doc contract aggregate). |
|
||||
| B2_F010 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Какие заказчики работали с нами в 2020 году? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_F011 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | Теперь за 2021. | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
| B2_F012 | True | ok_or_factual | factual | counterparty_activity_lifecycle | None | А кто новые в этом году? | Собран профиль активности заказчиков (bank-doc activity aggregate). |
|
||||
|
|
@ -0,0 +1,97 @@
|
|||
{
|
||||
"run_id": "2026-04-08_Address_Batch2_Lifecycle_FullGate_PhaseC_PostFix2",
|
||||
"generated_at": "2026-04-08T13:18:24",
|
||||
"source_questions_file": "X:\\1C\\NDC_1C\\docs\\ADDRESS\\question_sets\\domain_general_batch2_lifecycle_acceptance_2026-04-08_phaseA.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": 36,
|
||||
"ok_200_count": 36,
|
||||
"semantic_pass_count": 36,
|
||||
"semantic_pass_rate": 1.0,
|
||||
"route_pass_count": 36,
|
||||
"route_pass_rate": 1.0,
|
||||
"strict_pass_count": 36,
|
||||
"strict_pass_rate": 1.0,
|
||||
"factual_count": 36,
|
||||
"partial_coverage_count": 0,
|
||||
"clarification_required_count": 0,
|
||||
"http_error_count": 0,
|
||||
"llm_decomposition_attempted_count": 36,
|
||||
"llm_decomposition_applied_count": 24,
|
||||
"llm_fallback_count": 0,
|
||||
"llm_fallback_rate": 0.0,
|
||||
"tool_gate_blocked_count": 0,
|
||||
"tool_gate_blocked_rate": 0.0,
|
||||
"avg_elapsed_ms": 5924.0
|
||||
},
|
||||
"distributions": {
|
||||
"reply_type": {
|
||||
"factual": 36
|
||||
},
|
||||
"actual_intent": {
|
||||
"counterparty_activity_lifecycle": 29,
|
||||
"contract_usage_overview": 3,
|
||||
"contract_usage_and_value": 4
|
||||
},
|
||||
"actual_mode": {
|
||||
"address_query": 36
|
||||
},
|
||||
"mcp_call_status": {
|
||||
"matched_non_empty": 36
|
||||
},
|
||||
"limited_reason_category": {},
|
||||
"route_health": {
|
||||
"ok_or_factual": 36
|
||||
},
|
||||
"tool_gate_decision": {
|
||||
"run_address_lane": 36
|
||||
},
|
||||
"tool_gate_reason": {
|
||||
"address_mode_classifier_detected": 29,
|
||||
"llm_canonical_candidate_detected": 7
|
||||
}
|
||||
},
|
||||
"address_llm_predecompose_metrics": {
|
||||
"overall": {
|
||||
"llm_attempted": 36,
|
||||
"llm_applied": 24,
|
||||
"fallback_used": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"tool_gate_blocked": 0,
|
||||
"gate_block_rate": 0.0
|
||||
},
|
||||
"by_intent": {
|
||||
"counterparty_activity_lifecycle": {
|
||||
"total": 29,
|
||||
"llm_attempted": 29,
|
||||
"llm_applied": 20,
|
||||
"fallback_used": 0,
|
||||
"tool_gate_blocked": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"gate_block_rate": 0.0
|
||||
},
|
||||
"contract_usage_overview": {
|
||||
"total": 3,
|
||||
"llm_attempted": 3,
|
||||
"llm_applied": 0,
|
||||
"fallback_used": 0,
|
||||
"tool_gate_blocked": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"gate_block_rate": 0.0
|
||||
},
|
||||
"contract_usage_and_value": {
|
||||
"total": 4,
|
||||
"llm_attempted": 4,
|
||||
"llm_applied": 4,
|
||||
"fallback_used": 0,
|
||||
"tool_gate_blocked": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"gate_block_rate": 0.0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
# 2026-04-08_Address_Nightly_followup_25_13-29-46
|
||||
|
||||
Generated at: 2026-04-08T13:32:20
|
||||
Questions file: X:\1C\NDC_1C\docs\ADDRESS\question_sets\address_followup_context_chains_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: 25
|
||||
- ok_200_count: 25
|
||||
- semantic_pass_count: 25
|
||||
- semantic_pass_rate: 1.0
|
||||
- route_pass_count: 25
|
||||
- route_pass_rate: 1.0
|
||||
- strict_pass_count: 25
|
||||
- strict_pass_rate: 1.0
|
||||
- factual_count: 23
|
||||
- partial_coverage_count: 2
|
||||
- clarification_required_count: 0
|
||||
- http_error_count: 0
|
||||
- llm_decomposition_attempted_count: 25
|
||||
- llm_decomposition_applied_count: 21
|
||||
- llm_fallback_count: 0
|
||||
- llm_fallback_rate: 0.0
|
||||
- tool_gate_blocked_count: 0
|
||||
- tool_gate_blocked_rate: 0.0
|
||||
- avg_elapsed_ms: 6133.8
|
||||
|
||||
## Files
|
||||
- run_summary.json
|
||||
- full_live_results.json
|
||||
- failures_only.json
|
||||
|
|
@ -0,0 +1 @@
|
|||
[]
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,29 @@
|
|||
# Response Audit: 2026-04-08_Address_Nightly_followup_25_13-29-46
|
||||
|
||||
| id | strict | route_health | reply_type | intent | limited_reason | question | assistant_first_line |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| F001 | True | ok_or_factual | factual | list_documents_by_counterparty | None | Покажи документы по СВК за 2020 | Собран список документов по контрагенту (live address lane). |
|
||||
| F002 | True | ok_or_factual | factual | list_documents_by_counterparty | None | а теперь только за май 2020 | По окну 2020-05-01..2020-05-31 строк не найдено; показаны ближайшие доступные данные 2020-07-27..2021-11-10. |
|
||||
| F003 | True | ok_or_factual | factual | account_balance_snapshot | None | а по счету 60.01 на ту же дату | Адресный срез по счету собран (по движениям live MCP). |
|
||||
| F004 | True | ok_or_factual | factual | account_balance_snapshot | None | а на ту же дату по 62.01 | Адресный срез по счету собран (по движениям live MCP). |
|
||||
| F005 | True | ok_or_factual | factual | documents_forming_balance | None | раскрой остаток по 62.01 документами на ту же дату | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||
| F006 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | Покажи банковские операции по СВК за 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||
| F007 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | а теперь только ноябрь 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||
| F008 | True | ok_or_factual | factual | list_documents_by_counterparty | None | а теперь документы по нему | Собран список документов по контрагенту (live address lane). |
|
||||
| F009 | True | ok_or_factual | factual | account_balance_snapshot | None | и остаток по 51 на ту же дату | Адресный срез по счету собран (по движениям live MCP). |
|
||||
| F010 | True | ok_or_factual | factual | account_balance_snapshot | None | а теперь только май 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||
| F011 | True | partial_non_blocking | partial_coverage | account_balance_snapshot | empty_match | Покажи сальдо по счету 60 на 2020-12-31 | В live-данных по текущему фильтру записи не найдены. |
|
||||
| F012 | True | ok_or_factual | factual | account_balance_snapshot | None | а теперь только май 2020 | Адресный срез по счету собран (по движениям live MCP). |
|
||||
| F013 | True | ok_or_factual | factual | account_balance_snapshot | None | а на ту же дату по 62 | Адресный срез по счету собран (по движениям live MCP). |
|
||||
| F014 | True | ok_or_factual | factual | documents_forming_balance | None | раскрой 62 документами на ту же дату | Собран drilldown документов, формирующих остаток по счету на указанную дату. |
|
||||
| F015 | True | partial_non_blocking | partial_coverage | account_balance_snapshot | empty_match | вернись на 2020-12-31 по 60 | В live-данных по текущему фильтру записи не найдены. |
|
||||
| F016 | True | ok_or_factual | factual | list_documents_by_contract | None | Покажи документы по договору 19/15 за 2020 | Период сохранен. Глубина live-выборки автоматически расширена до 1000 строк. |
|
||||
| F017 | True | ok_or_factual | factual | bank_operations_by_contract | None | а теперь банковские операции | Период сохранен. Глубина live-выборки автоматически расширена до 1000 строк. |
|
||||
| F018 | True | ok_or_factual | factual | bank_operations_by_contract | None | а теперь только за 2020 | Период сохранен. Глубина live-выборки автоматически расширена до 1000 строк. |
|
||||
| F019 | True | ok_or_factual | factual | open_items_by_counterparty_or_contract | None | есть ли открытые позиции по договору 19/15 на 2020-12-31 | Собраны открытые позиции по указанному фильтру (контрагент/договор). |
|
||||
| F020 | True | ok_or_factual | factual | list_documents_by_contract | None | покажи документы по этому же договору | Собран список документов по договору (live address lane). |
|
||||
| F021 | True | ok_or_factual | factual | bank_operations_by_contract | None | Покажи банковские операции по договору 19/15 | Собран список банковских операций по договору (live address lane). |
|
||||
| F022 | True | ok_or_factual | factual | open_items_by_counterparty_or_contract | None | а теперь открытые позиции по нему | Период сохранен. Глубина live-выборки автоматически расширена до 1000 строк. |
|
||||
| F023 | True | ok_or_factual | factual | open_items_by_counterparty_or_contract | None | а теперь на 2020-12-31 | Собраны открытые позиции по указанному фильтру (контрагент/договор). |
|
||||
| F024 | True | ok_or_factual | factual | account_balance_snapshot | None | а по счету 51 на ту же дату | Адресный срез по счету собран (по движениям live MCP). |
|
||||
| F025 | True | ok_or_factual | factual | list_documents_by_contract | None | а документы по этому же договору за тот же период | Собран список документов по договору (live address lane). |
|
||||
|
|
@ -0,0 +1,142 @@
|
|||
{
|
||||
"run_id": "2026-04-08_Address_Nightly_followup_25_13-29-46",
|
||||
"generated_at": "2026-04-08T13:32:20",
|
||||
"source_questions_file": "X:\\1C\\NDC_1C\\docs\\ADDRESS\\question_sets\\address_followup_context_chains_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": 25,
|
||||
"ok_200_count": 25,
|
||||
"semantic_pass_count": 25,
|
||||
"semantic_pass_rate": 1.0,
|
||||
"route_pass_count": 25,
|
||||
"route_pass_rate": 1.0,
|
||||
"strict_pass_count": 25,
|
||||
"strict_pass_rate": 1.0,
|
||||
"factual_count": 23,
|
||||
"partial_coverage_count": 2,
|
||||
"clarification_required_count": 0,
|
||||
"http_error_count": 0,
|
||||
"llm_decomposition_attempted_count": 25,
|
||||
"llm_decomposition_applied_count": 21,
|
||||
"llm_fallback_count": 0,
|
||||
"llm_fallback_rate": 0.0,
|
||||
"tool_gate_blocked_count": 0,
|
||||
"tool_gate_blocked_rate": 0.0,
|
||||
"avg_elapsed_ms": 6133.8
|
||||
},
|
||||
"distributions": {
|
||||
"reply_type": {
|
||||
"factual": 23,
|
||||
"partial_coverage": 2
|
||||
},
|
||||
"actual_intent": {
|
||||
"list_documents_by_counterparty": 3,
|
||||
"account_balance_snapshot": 9,
|
||||
"documents_forming_balance": 2,
|
||||
"bank_operations_by_counterparty": 2,
|
||||
"list_documents_by_contract": 3,
|
||||
"bank_operations_by_contract": 3,
|
||||
"open_items_by_counterparty_or_contract": 3
|
||||
},
|
||||
"actual_mode": {
|
||||
"address_query": 25
|
||||
},
|
||||
"mcp_call_status": {
|
||||
"matched_non_empty": 23,
|
||||
"no_raw_rows": 2
|
||||
},
|
||||
"limited_reason_category": {
|
||||
"empty_match": 2
|
||||
},
|
||||
"route_health": {
|
||||
"ok_or_factual": 23,
|
||||
"partial_non_blocking": 2
|
||||
},
|
||||
"tool_gate_decision": {
|
||||
"run_address_lane": 25
|
||||
},
|
||||
"tool_gate_reason": {
|
||||
"address_mode_classifier_detected": 16,
|
||||
"llm_canonical_candidate_detected": 9
|
||||
}
|
||||
},
|
||||
"address_llm_predecompose_metrics": {
|
||||
"overall": {
|
||||
"llm_attempted": 25,
|
||||
"llm_applied": 21,
|
||||
"fallback_used": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"tool_gate_blocked": 0,
|
||||
"gate_block_rate": 0.0
|
||||
},
|
||||
"by_intent": {
|
||||
"list_documents_by_counterparty": {
|
||||
"total": 3,
|
||||
"llm_attempted": 3,
|
||||
"llm_applied": 3,
|
||||
"fallback_used": 0,
|
||||
"tool_gate_blocked": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"gate_block_rate": 0.0
|
||||
},
|
||||
"account_balance_snapshot": {
|
||||
"total": 9,
|
||||
"llm_attempted": 9,
|
||||
"llm_applied": 7,
|
||||
"fallback_used": 0,
|
||||
"tool_gate_blocked": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"gate_block_rate": 0.0
|
||||
},
|
||||
"documents_forming_balance": {
|
||||
"total": 2,
|
||||
"llm_attempted": 2,
|
||||
"llm_applied": 2,
|
||||
"fallback_used": 0,
|
||||
"tool_gate_blocked": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"gate_block_rate": 0.0
|
||||
},
|
||||
"bank_operations_by_counterparty": {
|
||||
"total": 2,
|
||||
"llm_attempted": 2,
|
||||
"llm_applied": 1,
|
||||
"fallback_used": 0,
|
||||
"tool_gate_blocked": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"gate_block_rate": 0.0
|
||||
},
|
||||
"list_documents_by_contract": {
|
||||
"total": 3,
|
||||
"llm_attempted": 3,
|
||||
"llm_applied": 3,
|
||||
"fallback_used": 0,
|
||||
"tool_gate_blocked": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"gate_block_rate": 0.0
|
||||
},
|
||||
"bank_operations_by_contract": {
|
||||
"total": 3,
|
||||
"llm_attempted": 3,
|
||||
"llm_applied": 2,
|
||||
"fallback_used": 0,
|
||||
"tool_gate_blocked": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"gate_block_rate": 0.0
|
||||
},
|
||||
"open_items_by_counterparty_or_contract": {
|
||||
"total": 3,
|
||||
"llm_attempted": 3,
|
||||
"llm_applied": 3,
|
||||
"fallback_used": 0,
|
||||
"tool_gate_blocked": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"gate_block_rate": 0.0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,67 @@
|
|||
{
|
||||
"generated_at": "2026-04-08T13:32:20",
|
||||
"overall_pass": true,
|
||||
"baseline": {
|
||||
"summary_path": "X:\\1C\\NDC_1C\\docs\\ADDRESS\\runs\\2026-04-02_Address_Followup_Context_Chains_2026-04-02_19-15-Run5\\run_summary.json",
|
||||
"run_id": "2026-04-02_Address_Followup_Context_Chains_2026-04-02_19-15-Run5",
|
||||
"questions_total": 25,
|
||||
"strict_pass_rate": 1.0,
|
||||
"route_pass_rate": 1.0,
|
||||
"execution_error_count": 0,
|
||||
"false_factual_rate": 0.0,
|
||||
"notes": [
|
||||
"execution_error_count derived as http_error_count + limited_reason_category.execution_error",
|
||||
"false_factual_rate derived from false_factual_count/questions_total"
|
||||
]
|
||||
},
|
||||
"candidate": {
|
||||
"summary_path": "X:\\1C\\NDC_1C\\docs\\ADDRESS\\runs\\2026-04-08_Address_Nightly_Regression_2026-04-08_13-19-24\\2026-04-08_Address_Nightly_followup_25_13-29-46\\run_summary.json",
|
||||
"run_id": "2026-04-08_Address_Nightly_followup_25_13-29-46",
|
||||
"questions_total": 25,
|
||||
"strict_pass_rate": 1.0,
|
||||
"route_pass_rate": 1.0,
|
||||
"execution_error_count": 0,
|
||||
"false_factual_rate": 0.0,
|
||||
"notes": [
|
||||
"execution_error_count derived as http_error_count + limited_reason_category.execution_error",
|
||||
"false_factual_rate derived from false_factual_count/questions_total"
|
||||
]
|
||||
},
|
||||
"checks": [
|
||||
{
|
||||
"metric": "strict_pass_rate",
|
||||
"passed": true,
|
||||
"baseline": 1.0,
|
||||
"candidate": 1.0,
|
||||
"rule": "candidate >= baseline"
|
||||
},
|
||||
{
|
||||
"metric": "route_pass_rate",
|
||||
"passed": true,
|
||||
"baseline": 1.0,
|
||||
"candidate": 1.0,
|
||||
"rule": "candidate >= baseline"
|
||||
},
|
||||
{
|
||||
"metric": "execution_error_count",
|
||||
"passed": true,
|
||||
"baseline": 0,
|
||||
"candidate": 0,
|
||||
"rule": "candidate <= baseline"
|
||||
},
|
||||
{
|
||||
"metric": "false_factual_rate",
|
||||
"passed": true,
|
||||
"baseline": 0.0,
|
||||
"candidate": 0.0,
|
||||
"rule": "candidate <= baseline"
|
||||
},
|
||||
{
|
||||
"metric": "questions_total_match",
|
||||
"passed": true,
|
||||
"baseline": 25,
|
||||
"candidate": 25,
|
||||
"rule": "candidate == baseline"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"generated_at": "2026-04-08T13:32:20",
|
||||
"total": 1,
|
||||
"passed": 1,
|
||||
"failed": 0,
|
||||
"results": [
|
||||
{
|
||||
"run_dir": "X:\\1C\\NDC_1C\\docs\\ADDRESS\\runs\\2026-04-08_Address_Nightly_Regression_2026-04-08_13-19-24\\2026-04-08_Address_Nightly_followup_25_13-29-46",
|
||||
"valid": true,
|
||||
"errors": [],
|
||||
"warnings": [],
|
||||
"metrics": {
|
||||
"run_id": "2026-04-08_Address_Nightly_followup_25_13-29-46",
|
||||
"questions_total": 25,
|
||||
"route_pass_rate": 1.0,
|
||||
"strict_pass_rate": 1.0,
|
||||
"http_error_count": 0,
|
||||
"rows_count": 25,
|
||||
"failures_count": 0
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
# 2026-04-08_Address_Nightly_stress_102_13-19-24
|
||||
|
||||
Generated at: 2026-04-08T13:29:46
|
||||
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_attempted_count: 102
|
||||
- llm_decomposition_applied_count: 74
|
||||
- llm_fallback_count: 0
|
||||
- llm_fallback_rate: 0.0
|
||||
- tool_gate_blocked_count: 0
|
||||
- tool_gate_blocked_rate: 0.0
|
||||
- avg_elapsed_ms: 6099.6
|
||||
|
||||
## Files
|
||||
- run_summary.json
|
||||
- full_live_results.json
|
||||
- failures_only.json
|
||||
|
|
@ -0,0 +1 @@
|
|||
[]
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,106 @@
|
|||
# Response Audit: 2026-04-08_Address_Nightly_stress_102_13-19-24
|
||||
|
||||
| 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 address lane). |
|
||||
| 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 address lane). |
|
||||
| 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 address lane). |
|
||||
| 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 address lane). |
|
||||
| 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 address lane). |
|
||||
| S019 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк списания/поступления за 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||
| 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 | покажи документы по договору 19/15 за 2020 | Период сохранен. Глубина live-выборки автоматически расширена до 1000 строк. |
|
||||
| S044 | True | ok_or_factual | factual | list_documents_by_contract | None | доки по дог. 19/15 за 2020 | Период сохранен. Глубина live-выборки автоматически расширена до 1000 строк. |
|
||||
| S045 | True | ok_or_factual | factual | list_documents_by_contract | None | какие документы по контракту 19/15 | Собран список документов по договору (live address lane). |
|
||||
| S046 | True | ok_or_factual | factual | list_documents_by_contract | None | docs by contract 19/15 year 2020 | Период сохранен. Глубина live-выборки автоматически расширена до 1000 строк. |
|
||||
| S047 | True | ok_or_factual | factual | list_documents_by_contract | None | бля, покажи по договору 19/15 доки | Собран список документов по договору (live address lane). |
|
||||
| S048 | True | ok_or_factual | factual | list_documents_by_contract | None | договор 19/15 документы | Собран список документов по договору (live address lane). |
|
||||
| S049 | True | ok_or_factual | factual | list_documents_by_contract | None | плс документы договор №19/15 | Собран список документов по договору (live address lane). |
|
||||
| S050 | True | ok_or_factual | factual | list_documents_by_contract | None | покеж документы по 19/15 | Собран список документов по договору (live address lane). |
|
||||
| S051 | True | ok_or_factual | factual | bank_operations_by_contract | None | банковские операции по договору 19/15 | Собран список банковских операций по договору (live address lane). |
|
||||
| S052 | True | ok_or_factual | factual | bank_operations_by_contract | None | платежи по договору 19/15 | Собран список банковских операций по договору (live address lane). |
|
||||
| S053 | True | ok_or_factual | factual | bank_operations_by_contract | None | выписка по договору 19/15 | Собран список банковских операций по договору (live address lane). |
|
||||
| S054 | True | ok_or_factual | factual | bank_operations_by_contract | None | bank ops by contract 19/15 | Собран список банковских операций по договору (live address lane). |
|
||||
| S055 | True | ok_or_factual | factual | bank_operations_by_contract | None | ёпт, покажи банк операции по дог 19/15 | Собран список банковских операций по договору (live address lane). |
|
||||
| S056 | True | ok_or_factual | factual | bank_operations_by_contract | None | по контракту 19/15 платежки | Собран список банковских операций по договору (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 address lane). |
|
||||
| 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 address lane). |
|
||||
| X007 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк банк операции за 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||
| X008 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | по свк выписку банка за 2020 выведи | Собран список банковских операций по контрагенту (live address lane). |
|
||||
| X009 | True | ok_or_factual | factual | bank_operations_by_counterparty | None | свк платежки за 2020 | Собран список банковских операций по контрагенту (live address lane). |
|
||||
| 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 address lane). |
|
||||
| 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 | доки по договору 19/15 за 2020 | Период сохранен. Глубина live-выборки автоматически расширена до 1000 строк. |
|
||||
| X030 | True | ok_or_factual | factual | list_documents_by_contract | None | покажи документы контракт 19/15 | Собран список документов по договору (live address lane). |
|
||||
| X031 | True | ok_or_factual | factual | list_documents_by_contract | None | docs by contract 19/15 2020 | Период сохранен. Глубина live-выборки автоматически расширена до 1000 строк. |
|
||||
| X032 | True | ok_or_factual | factual | list_documents_by_contract | None | по дог 19/15 какие документы | Собран список документов по договору (live address lane). |
|
||||
| X033 | True | ok_or_factual | factual | list_documents_by_contract | None | договор 19/15 выведи доки | Собран список документов по договору (live address lane). |
|
||||
| X034 | True | ok_or_factual | factual | list_documents_by_contract | None | нах покажи документы по 19/15 | Собран список документов по договору (live address lane). |
|
||||
| X035 | True | ok_or_factual | factual | bank_operations_by_contract | None | банк операции по договору 19/15 | Собран список банковских операций по договору (live address lane). |
|
||||
| X036 | True | ok_or_factual | factual | bank_operations_by_contract | None | платежки по дог 19/15 | Собран список банковских операций по договору (live address lane). |
|
||||
| X037 | True | ok_or_factual | factual | bank_operations_by_contract | None | выписка по контракту 19/15 | Собран список банковских операций по договору (live address lane). |
|
||||
| X038 | True | ok_or_factual | factual | bank_operations_by_contract | None | bank ops by contract 19/15 | Собран список банковских операций по договору (live address lane). |
|
||||
| X039 | True | ok_or_factual | factual | bank_operations_by_contract | None | покажи банк опер по дог 19/15 пж | Собран список банковских операций по договору (live address lane). |
|
||||
| X040 | True | ok_or_factual | factual | bank_operations_by_contract | None | епт транзакции договор 19/15 | Собран список банковских операций по договору (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). |
|
||||
|
|
@ -0,0 +1,132 @@
|
|||
{
|
||||
"run_id": "2026-04-08_Address_Nightly_stress_102_13-19-24",
|
||||
"generated_at": "2026-04-08T13:29:46",
|
||||
"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_attempted_count": 102,
|
||||
"llm_decomposition_applied_count": 74,
|
||||
"llm_fallback_count": 0,
|
||||
"llm_fallback_rate": 0.0,
|
||||
"tool_gate_blocked_count": 0,
|
||||
"tool_gate_blocked_rate": 0.0,
|
||||
"avg_elapsed_ms": 6099.6
|
||||
},
|
||||
"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
|
||||
},
|
||||
"tool_gate_decision": {
|
||||
"run_address_lane": 102
|
||||
},
|
||||
"tool_gate_reason": {
|
||||
"address_mode_classifier_detected": 98,
|
||||
"llm_canonical_candidate_detected": 4
|
||||
}
|
||||
},
|
||||
"address_llm_predecompose_metrics": {
|
||||
"overall": {
|
||||
"llm_attempted": 102,
|
||||
"llm_applied": 74,
|
||||
"fallback_used": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"tool_gate_blocked": 0,
|
||||
"gate_block_rate": 0.0
|
||||
},
|
||||
"by_intent": {
|
||||
"list_documents_by_counterparty": {
|
||||
"total": 18,
|
||||
"llm_attempted": 18,
|
||||
"llm_applied": 11,
|
||||
"fallback_used": 0,
|
||||
"tool_gate_blocked": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"gate_block_rate": 0.0
|
||||
},
|
||||
"bank_operations_by_counterparty": {
|
||||
"total": 16,
|
||||
"llm_attempted": 16,
|
||||
"llm_applied": 9,
|
||||
"fallback_used": 0,
|
||||
"tool_gate_blocked": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"gate_block_rate": 0.0
|
||||
},
|
||||
"account_balance_snapshot": {
|
||||
"total": 26,
|
||||
"llm_attempted": 26,
|
||||
"llm_applied": 25,
|
||||
"fallback_used": 0,
|
||||
"tool_gate_blocked": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"gate_block_rate": 0.0
|
||||
},
|
||||
"documents_forming_balance": {
|
||||
"total": 16,
|
||||
"llm_attempted": 16,
|
||||
"llm_applied": 11,
|
||||
"fallback_used": 0,
|
||||
"tool_gate_blocked": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"gate_block_rate": 0.0
|
||||
},
|
||||
"list_documents_by_contract": {
|
||||
"total": 14,
|
||||
"llm_attempted": 14,
|
||||
"llm_applied": 10,
|
||||
"fallback_used": 0,
|
||||
"tool_gate_blocked": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"gate_block_rate": 0.0
|
||||
},
|
||||
"bank_operations_by_contract": {
|
||||
"total": 12,
|
||||
"llm_attempted": 12,
|
||||
"llm_applied": 8,
|
||||
"fallback_used": 0,
|
||||
"tool_gate_blocked": 0,
|
||||
"fallback_rate": 0.0,
|
||||
"gate_block_rate": 0.0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,67 @@
|
|||
{
|
||||
"generated_at": "2026-04-08T13:29:46",
|
||||
"overall_pass": true,
|
||||
"baseline": {
|
||||
"summary_path": "X:\\1C\\NDC_1C\\docs\\ADDRESS\\runs\\2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-57-27\\run_summary.json",
|
||||
"run_id": "2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-57-27",
|
||||
"questions_total": 102,
|
||||
"strict_pass_rate": 1.0,
|
||||
"route_pass_rate": 1.0,
|
||||
"execution_error_count": 0,
|
||||
"false_factual_rate": 0.0,
|
||||
"notes": [
|
||||
"execution_error_count derived as http_error_count + limited_reason_category.execution_error",
|
||||
"false_factual_rate derived from false_factual_count/questions_total"
|
||||
]
|
||||
},
|
||||
"candidate": {
|
||||
"summary_path": "X:\\1C\\NDC_1C\\docs\\ADDRESS\\runs\\2026-04-08_Address_Nightly_Regression_2026-04-08_13-19-24\\2026-04-08_Address_Nightly_stress_102_13-19-24\\run_summary.json",
|
||||
"run_id": "2026-04-08_Address_Nightly_stress_102_13-19-24",
|
||||
"questions_total": 102,
|
||||
"strict_pass_rate": 1.0,
|
||||
"route_pass_rate": 1.0,
|
||||
"execution_error_count": 0,
|
||||
"false_factual_rate": 0.0,
|
||||
"notes": [
|
||||
"execution_error_count derived as http_error_count + limited_reason_category.execution_error",
|
||||
"false_factual_rate derived from false_factual_count/questions_total"
|
||||
]
|
||||
},
|
||||
"checks": [
|
||||
{
|
||||
"metric": "strict_pass_rate",
|
||||
"passed": true,
|
||||
"baseline": 1.0,
|
||||
"candidate": 1.0,
|
||||
"rule": "candidate >= baseline"
|
||||
},
|
||||
{
|
||||
"metric": "route_pass_rate",
|
||||
"passed": true,
|
||||
"baseline": 1.0,
|
||||
"candidate": 1.0,
|
||||
"rule": "candidate >= baseline"
|
||||
},
|
||||
{
|
||||
"metric": "execution_error_count",
|
||||
"passed": true,
|
||||
"baseline": 0,
|
||||
"candidate": 0,
|
||||
"rule": "candidate <= baseline"
|
||||
},
|
||||
{
|
||||
"metric": "false_factual_rate",
|
||||
"passed": true,
|
||||
"baseline": 0.0,
|
||||
"candidate": 0.0,
|
||||
"rule": "candidate <= baseline"
|
||||
},
|
||||
{
|
||||
"metric": "questions_total_match",
|
||||
"passed": true,
|
||||
"baseline": 102,
|
||||
"candidate": 102,
|
||||
"rule": "candidate == baseline"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"generated_at": "2026-04-08T13:29:46",
|
||||
"total": 1,
|
||||
"passed": 1,
|
||||
"failed": 0,
|
||||
"results": [
|
||||
{
|
||||
"run_dir": "X:\\1C\\NDC_1C\\docs\\ADDRESS\\runs\\2026-04-08_Address_Nightly_Regression_2026-04-08_13-19-24\\2026-04-08_Address_Nightly_stress_102_13-19-24",
|
||||
"valid": true,
|
||||
"errors": [],
|
||||
"warnings": [],
|
||||
"metrics": {
|
||||
"run_id": "2026-04-08_Address_Nightly_stress_102_13-19-24",
|
||||
"questions_total": 102,
|
||||
"route_pass_rate": 1.0,
|
||||
"strict_pass_rate": 1.0,
|
||||
"http_error_count": 0,
|
||||
"rows_count": 102,
|
||||
"failures_count": 0
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
# 2026-04-08_Address_Nightly_Regression_2026-04-08_13-19-24
|
||||
|
||||
Generated at: 2026-04-08T13:32:20
|
||||
Dry run: False
|
||||
Strict policy: route
|
||||
Overall: PASS
|
||||
|
||||
## Packs
|
||||
### stress_102
|
||||
- run_id: 2026-04-08_Address_Nightly_stress_102_13-19-24
|
||||
- runner_ok: True
|
||||
- validator_ok: True
|
||||
- comparator_ok: True
|
||||
- run_dir: X:\1C\NDC_1C\docs\ADDRESS\runs\2026-04-08_Address_Nightly_Regression_2026-04-08_13-19-24\2026-04-08_Address_Nightly_stress_102_13-19-24
|
||||
|
||||
### followup_25
|
||||
- run_id: 2026-04-08_Address_Nightly_followup_25_13-29-46
|
||||
- runner_ok: True
|
||||
- validator_ok: True
|
||||
- comparator_ok: True
|
||||
- run_dir: X:\1C\NDC_1C\docs\ADDRESS\runs\2026-04-08_Address_Nightly_Regression_2026-04-08_13-19-24\2026-04-08_Address_Nightly_followup_25_13-29-46
|
||||
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
{
|
||||
"nightly_run_id": "2026-04-08_Address_Nightly_Regression_2026-04-08_13-19-24",
|
||||
"generated_at": "2026-04-08T13:32:20",
|
||||
"dry_run": false,
|
||||
"overall_ok": true,
|
||||
"strict_policy": "route",
|
||||
"packs": [
|
||||
{
|
||||
"pack": "stress_102",
|
||||
"run_id": "2026-04-08_Address_Nightly_stress_102_13-19-24",
|
||||
"questions_file": "X:\\1C\\NDC_1C\\docs\\ADDRESS\\question_sets\\address_slang_stress_full_2026-04-02.json",
|
||||
"baseline_summary": "X:\\1C\\NDC_1C\\docs\\ADDRESS\\runs\\2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-57-27\\run_summary.json",
|
||||
"run_dir": "X:\\1C\\NDC_1C\\docs\\ADDRESS\\runs\\2026-04-08_Address_Nightly_Regression_2026-04-08_13-19-24\\2026-04-08_Address_Nightly_stress_102_13-19-24",
|
||||
"runner_ok": true,
|
||||
"validator_ok": true,
|
||||
"comparator_ok": true,
|
||||
"errors": [],
|
||||
"validator_report": "X:\\1C\\NDC_1C\\docs\\ADDRESS\\runs\\2026-04-08_Address_Nightly_Regression_2026-04-08_13-19-24\\2026-04-08_Address_Nightly_stress_102_13-19-24_validator_report.json",
|
||||
"comparator_report": "X:\\1C\\NDC_1C\\docs\\ADDRESS\\runs\\2026-04-08_Address_Nightly_Regression_2026-04-08_13-19-24\\2026-04-08_Address_Nightly_stress_102_13-19-24_comparator_report.json"
|
||||
},
|
||||
{
|
||||
"pack": "followup_25",
|
||||
"run_id": "2026-04-08_Address_Nightly_followup_25_13-29-46",
|
||||
"questions_file": "X:\\1C\\NDC_1C\\docs\\ADDRESS\\question_sets\\address_followup_context_chains_2026-04-02.json",
|
||||
"baseline_summary": "X:\\1C\\NDC_1C\\docs\\ADDRESS\\runs\\2026-04-02_Address_Followup_Context_Chains_2026-04-02_19-15-Run5\\run_summary.json",
|
||||
"run_dir": "X:\\1C\\NDC_1C\\docs\\ADDRESS\\runs\\2026-04-08_Address_Nightly_Regression_2026-04-08_13-19-24\\2026-04-08_Address_Nightly_followup_25_13-29-46",
|
||||
"runner_ok": true,
|
||||
"validator_ok": true,
|
||||
"comparator_ok": true,
|
||||
"errors": [],
|
||||
"validator_report": "X:\\1C\\NDC_1C\\docs\\ADDRESS\\runs\\2026-04-08_Address_Nightly_Regression_2026-04-08_13-19-24\\2026-04-08_Address_Nightly_followup_25_13-29-46_validator_report.json",
|
||||
"comparator_report": "X:\\1C\\NDC_1C\\docs\\ADDRESS\\runs\\2026-04-08_Address_Nightly_Regression_2026-04-08_13-19-24\\2026-04-08_Address_Nightly_followup_25_13-29-46_comparator_report.json"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -268,6 +268,14 @@ const COUNTERPARTY_ACTIVITY_LIFECYCLE_HINTS = [
|
|||
"регулярные поставщики",
|
||||
"эпизодические поставщики",
|
||||
"давно не использовались поставщики",
|
||||
"всех заков",
|
||||
"кто был активен",
|
||||
"потом отвалился",
|
||||
"ровно один раз",
|
||||
"и пропал",
|
||||
"самые старые по сотрудничеству",
|
||||
"разбей поставщиков на регуляр и разовые",
|
||||
"кто новые в этом году",
|
||||
"active customers",
|
||||
"customer activity list",
|
||||
"counterparty lifecycle"
|
||||
|
|
@ -605,13 +613,13 @@ function hasCounterpartyPopulationAndRolesSignal(text: string): boolean {
|
|||
}
|
||||
|
||||
function hasLifecycleSegmentationSignal(text: string): boolean {
|
||||
return /(?:вперв|нов(?:ые|ых|ые\s+контрагент|ые\s+клиент|ые\s+заказчик)|исчез|ушед|ушл|только\s+один\s+раз|однораз|дольше\s+всех|долгожив|регулярн|эпизодич|давно\s+не\s+использ|неиспольз|потом\s+перестал)/iu.test(
|
||||
return /(?:вперв|нов(?:ые|ых|ые\s+контрагент|ые\s+клиент|ые\s+заказчик)|исчез|ушед|ушл|пропал|отвал|только\s+один\s+раз|ровно\s+один\s+раз|однораз|дольше\s+всех|долгожив|самые\s+старые|старые\s+по\s+сотрудничеству|регуляр|эпизодич|разов(?:ые|ой|ые\s+поставщик)|давно\s+не\s+использ|неиспольз|потом\s+перестал)/iu.test(
|
||||
text
|
||||
);
|
||||
}
|
||||
|
||||
function hasCounterpartyActivityLifecycleSignal(text: string): boolean {
|
||||
if (hasDocumentSignal(text) || hasBankOperationSignal(text)) {
|
||||
if ((hasDocumentSignal(text) || hasBankOperationSignal(text)) && !hasLifecycleSegmentationSignal(text)) {
|
||||
return false;
|
||||
}
|
||||
if (hasAny(text, COUNTERPARTY_ACTIVITY_LIFECYCLE_HINTS)) {
|
||||
|
|
@ -633,6 +641,10 @@ function hasCounterpartyActivityLifecycleSignal(text: string): boolean {
|
|||
);
|
||||
const hasListVerb = /(?:какие|кто|покажи|выведи|список|list|show)/iu.test(text);
|
||||
const hasRosterQualifier = /(?:у\s+нас|вообще|в\s+баз[еы]|какие\s+есть|кто\s+есть|who\s+are)/iu.test(text);
|
||||
const hasImplicitCounterpartyQuestion =
|
||||
/(?:кто\s+с\s+нами|кто\s+у\s+нас|всех?\s+зак(?:ов|а|и)?|все\s+заки|кто\s+нов(?:ые|ых|ый)\b|кто\s+был\s+активен|самые\s+старые\s+по\s+сотрудничеству)/iu.test(
|
||||
text
|
||||
);
|
||||
const hasListWithWindow = hasCounterpartyLexeme && hasListVerb && hasTimeWindowLexeme;
|
||||
if (hasListWithWindow) {
|
||||
return true;
|
||||
|
|
@ -643,6 +655,12 @@ function hasCounterpartyActivityLifecycleSignal(text: string): boolean {
|
|||
if (hasCounterpartyLexeme && hasLifecycleSegmentationSignal(text)) {
|
||||
return true;
|
||||
}
|
||||
if (hasImplicitCounterpartyQuestion && (hasLifecycleSegmentationSignal(text) || hasTimeWindowLexeme || hasActivityLexeme)) {
|
||||
return true;
|
||||
}
|
||||
if (!hasCounterpartyLexeme && hasListVerb && hasLifecycleSegmentationSignal(text) && /\bкто\b/iu.test(text)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return hasCounterpartyLexeme && hasActivityLexeme && (hasTimeWindowLexeme || hasListVerb);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -57,6 +57,10 @@ function hasSameDateHint(text: string): boolean {
|
|||
);
|
||||
}
|
||||
|
||||
function hasExplicitPeriodLiteral(text: string): boolean {
|
||||
return /\b(?:19|20)\d{2}(?:[./-](?:0?[1-9]|1[0-2]))?\b/.test(String(text ?? ""));
|
||||
}
|
||||
|
||||
function hasOpenItemsHint(text: string): boolean {
|
||||
return /(?:open\s+items|unclosed\s+items|хвост|висят|незакрыт|не\s+закрыт|открыт|долг|задолж|позиц)/iu.test(String(text ?? ""));
|
||||
}
|
||||
|
|
@ -393,6 +397,20 @@ function mergeFollowupFilters(
|
|||
return { filters: merged, reasons };
|
||||
}
|
||||
|
||||
if (
|
||||
intent === "counterparty_activity_lifecycle" &&
|
||||
hasAddressFollowupContextSignal(userMessage) &&
|
||||
!hasExplicitPeriodLiteral(userMessage)
|
||||
) {
|
||||
const currentPeriodFrom = toNonEmptyString(merged.period_from);
|
||||
const currentPeriodTo = toNonEmptyString(merged.period_to);
|
||||
const todayIso = new Date().toISOString().slice(0, 10);
|
||||
if (!currentPeriodFrom && currentPeriodTo === todayIso) {
|
||||
delete merged.period_to;
|
||||
reasons.push("period_to_cleared_for_lifecycle_followup");
|
||||
}
|
||||
}
|
||||
|
||||
const currentHasPeriod = hasExplicitPeriodWindow(merged);
|
||||
const previousHasPeriod = hasExplicitPeriodWindow(previous);
|
||||
if (!currentHasPeriod && previousHasPeriod && hasAddressFollowupContextSignal(userMessage)) {
|
||||
|
|
@ -543,9 +561,20 @@ export function runAddressDecomposeStage(
|
|||
followupContext: AddressFollowupContext | null
|
||||
): AddressDecomposeStageResult | null {
|
||||
const detectedMode = detectAddressQuestionMode(userMessage);
|
||||
const shape = classifyAddressQueryShape(userMessage);
|
||||
if (shape.shape === "EXPLAIN_OR_REASON") {
|
||||
return null;
|
||||
}
|
||||
const detectedIntent = resolveAddressIntent(userMessage);
|
||||
const mode =
|
||||
detectedMode.mode === "address_query"
|
||||
? detectedMode
|
||||
: detectedIntent.intent !== "unknown"
|
||||
? {
|
||||
mode: "address_query" as const,
|
||||
confidence: "medium" as const,
|
||||
reasons: [...detectedMode.reasons, "address_mode_from_resolved_intent"]
|
||||
}
|
||||
: followupContext && hasAddressFollowupContextSignal(userMessage)
|
||||
? {
|
||||
mode: "address_query" as const,
|
||||
|
|
@ -556,13 +585,6 @@ export function runAddressDecomposeStage(
|
|||
if (mode.mode !== "address_query") {
|
||||
return null;
|
||||
}
|
||||
|
||||
const shape = classifyAddressQueryShape(userMessage);
|
||||
if (shape.shape === "EXPLAIN_OR_REASON") {
|
||||
return null;
|
||||
}
|
||||
|
||||
const detectedIntent = resolveAddressIntent(userMessage);
|
||||
const intent = deriveIntentWithFollowupContext(detectedIntent, userMessage, followupContext);
|
||||
const extractedFilters = extractAddressFilters(userMessage, intent.intent);
|
||||
const followupMerged = mergeFollowupFilters(extractedFilters.extracted_filters, intent.intent, userMessage, followupContext);
|
||||
|
|
|
|||
|
|
@ -1391,10 +1391,10 @@ function hasAccountingSignal(text) {
|
|||
}
|
||||
function hasFollowupMarker(text) {
|
||||
const compact = compactWhitespace(text.toLowerCase());
|
||||
return /^(и|а еще|а ещё|еще|ещё|добав|уточн|продолж|также|а если|а теперь|теперь|plus|also|dobav|utochn|prodolzh|then|now)/i.test(compact);
|
||||
return /^(и|а\s+кто|а еще|а ещё|еще|ещё|добав|уточн|продолж|также|а если|а теперь|теперь|plus|also|dobav|utochn|prodolzh|then|now)/i.test(compact);
|
||||
}
|
||||
function hasReferentialPointer(text) {
|
||||
return /(по этому|по тому|это же|этой|этим|этому|из этого|в этом|тот же|same thing|that one|po etomu|po tomu)/i.test(text.toLowerCase());
|
||||
return /(по этому|по тому|это же|этой|этим|этому|из этого|из них|из этих|из тех|в этом|тот же|same thing|that one|po etomu|po tomu)/i.test(text.toLowerCase());
|
||||
}
|
||||
function hasSmallTalkSignal(text) {
|
||||
return /(привет|как дела|спасибо|благодарю|thanks|thank you|hello|hi)\b/i.test(text.toLowerCase());
|
||||
|
|
@ -2374,6 +2374,30 @@ function readAddressFilterString(addressDebug, key) {
|
|||
}
|
||||
return toNonEmptyString(filters[key]);
|
||||
}
|
||||
function isAddressLaneDebugPayload(debug) {
|
||||
if (!debug || typeof debug !== "object") {
|
||||
return false;
|
||||
}
|
||||
if (debug.detected_mode === "address_query") {
|
||||
return true;
|
||||
}
|
||||
if (typeof debug.selected_recipe === "string" && debug.selected_recipe.trim().length > 0) {
|
||||
return true;
|
||||
}
|
||||
if (typeof debug.mcp_call_status === "string" && debug.mcp_call_status.trim().length > 0) {
|
||||
return true;
|
||||
}
|
||||
if (typeof debug.anchor_type === "string" && debug.anchor_type.trim().length > 0) {
|
||||
return true;
|
||||
}
|
||||
if (debug.extracted_filters && typeof debug.extracted_filters === "object") {
|
||||
const keys = Object.keys(debug.extracted_filters);
|
||||
if (keys.length > 0 && typeof debug.detected_intent === "string" && debug.detected_intent.trim().length > 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
function findLastAddressAssistantDebug(items) {
|
||||
for (let index = items.length - 1; index >= 0; index -= 1) {
|
||||
const item = items[index];
|
||||
|
|
@ -2381,7 +2405,7 @@ function findLastAddressAssistantDebug(items) {
|
|||
continue;
|
||||
}
|
||||
const debug = item.debug;
|
||||
if (debug.detected_mode === "address_query" || debug.prompt_version === "address_query_runtime_v1") {
|
||||
if (isAddressLaneDebugPayload(debug)) {
|
||||
return debug;
|
||||
}
|
||||
}
|
||||
|
|
@ -2394,7 +2418,7 @@ function findRecentAddressFilterValue(items, key) {
|
|||
continue;
|
||||
}
|
||||
const debug = item.debug;
|
||||
if (!(debug.detected_mode === "address_query" || debug.prompt_version === "address_query_runtime_v1")) {
|
||||
if (!isAddressLaneDebugPayload(debug)) {
|
||||
continue;
|
||||
}
|
||||
const directFilterValue = readAddressFilterString(debug, key);
|
||||
|
|
@ -2438,6 +2462,13 @@ function hasAddressFollowupContextSignal(userMessage) {
|
|||
if (shortFollowup && /(?:^|\s)(?:также|тоже|also|same|again|ещ[её]|теперь|then|now)(?=$|[\s,.;:!?])/iu.test(text)) {
|
||||
return true;
|
||||
}
|
||||
if (shortFollowup &&
|
||||
/(?:кто\s+из\s+(?:них|этих|тех)|кто\s+нов(?:ые|ых|ый)|кто\s+потом\s+исчез|кто\s+был\s+(?:только|ровно)\s+один\s+раз)/iu.test(text)) {
|
||||
return true;
|
||||
}
|
||||
if (shortFollowup && /^(?:а|и)\s+кто\b/iu.test(text)) {
|
||||
return true;
|
||||
}
|
||||
if (shortFollowup &&
|
||||
/(?:^|\s)по\s+[a-zа-яё][a-zа-яё0-9._-]{1,}(?=$|[\s,.;:!?])/iu.test(text) &&
|
||||
!/(?:по\s+этому|по\s+тому|по\s+нему|по\s+ней|по\s+ним)/iu.test(text)) {
|
||||
|
|
|
|||
|
|
@ -1403,6 +1403,41 @@ describe("address intent resolver expansion (M2.3a)", () => {
|
|||
expect(result.intent).toBe("counterparty_activity_lifecycle");
|
||||
});
|
||||
|
||||
it("keeps supplier lifecycle segmentation with operations wording in lifecycle intent", () => {
|
||||
const result = resolveAddressIntent("Раздели поставщиков на регулярных и эпизодических по частоте операций.");
|
||||
expect(result.intent).toBe("counterparty_activity_lifecycle");
|
||||
});
|
||||
|
||||
it("keeps stale supplier operations wording in lifecycle intent", () => {
|
||||
const result = resolveAddressIntent("Какие поставщики давно не использовались в операционной активности?");
|
||||
expect(result.intent).toBe("counterparty_activity_lifecycle");
|
||||
});
|
||||
|
||||
it("keeps slang all-customers-all-time wording in lifecycle intent", () => {
|
||||
const result = resolveAddressIntent("выведи всех заков за все время");
|
||||
expect(result.intent).toBe("counterparty_activity_lifecycle");
|
||||
});
|
||||
|
||||
it("keeps churn wording with year in lifecycle intent", () => {
|
||||
const result = resolveAddressIntent("кто был активен в 2020 и потом отвалился");
|
||||
expect(result.intent).toBe("counterparty_activity_lifecycle");
|
||||
});
|
||||
|
||||
it("keeps one-time-plus-churn wording in lifecycle intent", () => {
|
||||
const result = resolveAddressIntent("кто с нами был ровно один раз и пропал");
|
||||
expect(result.intent).toBe("counterparty_activity_lifecycle");
|
||||
});
|
||||
|
||||
it("keeps oldest-collaboration slang wording in lifecycle intent", () => {
|
||||
const result = resolveAddressIntent("самые старые по сотрудничеству кто");
|
||||
expect(result.intent).toBe("counterparty_activity_lifecycle");
|
||||
});
|
||||
|
||||
it("keeps regular-vs-one-off supplier slang in lifecycle intent (not population)", () => {
|
||||
const result = resolveAddressIntent("разбей поставщиков на регуляр и разовые");
|
||||
expect(result.intent).toBe("counterparty_activity_lifecycle");
|
||||
});
|
||||
|
||||
it("resolves contract usage overview intent", () => {
|
||||
const result = resolveAddressIntent("Сколько всего договоров заведено и сколько из них реально использовались?");
|
||||
expect(result.intent).toBe("contract_usage_overview");
|
||||
|
|
@ -2219,6 +2254,22 @@ describe("address query limited taxonomy and stage diagnostics", () => {
|
|||
});
|
||||
|
||||
describe("address decompose stage follow-up carryover", () => {
|
||||
it("keeps slang all-customers-all-time wording in address lane via resolved intent fallback", () => {
|
||||
const result = runAddressDecomposeStage("выведи всех заков за все время", null);
|
||||
expect(result).not.toBeNull();
|
||||
expect(result?.mode.mode).toBe("address_query");
|
||||
expect(result?.intent.intent).toBe("counterparty_activity_lifecycle");
|
||||
});
|
||||
|
||||
it("keeps churn wording with year in address lane via resolved intent fallback", () => {
|
||||
const result = runAddressDecomposeStage("кто был активен в 2020 и потом отвалился", null);
|
||||
expect(result).not.toBeNull();
|
||||
expect(result?.mode.mode).toBe("address_query");
|
||||
expect(result?.intent.intent).toBe("counterparty_activity_lifecycle");
|
||||
expect(result?.filters.extracted_filters.period_from).toBe("2020-01-01");
|
||||
expect(result?.filters.extracted_filters.period_to).toBe("2020-12-31");
|
||||
});
|
||||
|
||||
it("uses short bare year in follow-up period switch", () => {
|
||||
const result = runAddressDecomposeStage("теперь за 21", {
|
||||
previous_intent: "counterparty_activity_lifecycle",
|
||||
|
|
@ -2235,6 +2286,24 @@ describe("address decompose stage follow-up carryover", () => {
|
|||
expect(result?.filters.extracted_filters.period_to).toBe("2021-12-31");
|
||||
});
|
||||
|
||||
it("keeps lifecycle follow-up phrasing with referential pointer and inherits period", () => {
|
||||
const result = runAddressDecomposeStage("А кто из них новые?", {
|
||||
previous_intent: "counterparty_activity_lifecycle",
|
||||
previous_filters: {
|
||||
period_from: "2020-01-01",
|
||||
period_to: "2020-12-31"
|
||||
},
|
||||
previous_anchor_type: "unknown",
|
||||
previous_anchor_value: null
|
||||
});
|
||||
expect(result).not.toBeNull();
|
||||
expect(result?.mode.mode).toBe("address_query");
|
||||
expect(result?.intent.intent).toBe("counterparty_activity_lifecycle");
|
||||
expect(result?.filters.extracted_filters.period_from).toBe("2020-01-01");
|
||||
expect(result?.filters.extracted_filters.period_to).toBe("2020-12-31");
|
||||
expect(result?.baseReasons).toContain("address_followup_context_applied");
|
||||
});
|
||||
|
||||
it("keeps short period follow-up in address lane and preserves previous counterparty anchor", () => {
|
||||
const result = runAddressDecomposeStage("а теперь только за май 2020", {
|
||||
previous_intent: "list_documents_by_counterparty",
|
||||
|
|
|
|||
|
|
@ -192,4 +192,91 @@ describe("assistant address follow-up carryover", () => {
|
|||
expect(String(calls[1].options?.followupContext?.previous_anchor_value ?? "").length).toBeGreaterThan(0);
|
||||
expect(normalizerService.normalize).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("reuses last real address context after intermediate clarification fallback", async () => {
|
||||
const calls: Array<{ message: string; options?: any }> = [];
|
||||
const lifecycleFollowupMessage = "А кто из них новые?";
|
||||
|
||||
const addressQueryService = {
|
||||
tryHandle: vi.fn(async (message: string, options?: any) => {
|
||||
calls.push({ message, options });
|
||||
if (message === "что там не так?") {
|
||||
return null;
|
||||
}
|
||||
if (message === lifecycleFollowupMessage && !options?.followupContext) {
|
||||
return null;
|
||||
}
|
||||
if (message === lifecycleFollowupMessage && options?.followupContext) {
|
||||
return buildAddressLaneResult({
|
||||
debug: {
|
||||
...buildAddressLaneResult().debug,
|
||||
detected_intent: "counterparty_activity_lifecycle",
|
||||
extracted_filters: {
|
||||
period_from: "2020-01-01",
|
||||
period_to: "2020-12-31"
|
||||
},
|
||||
reasons: ["address_action_detected", "address_followup_context_applied"]
|
||||
}
|
||||
});
|
||||
}
|
||||
return buildAddressLaneResult();
|
||||
})
|
||||
} as any;
|
||||
|
||||
const normalizerService = {
|
||||
normalize: vi.fn(async (payload: any) => ({
|
||||
assistant_reply: payload?.userQuestion === "что там не так?" ? "Нужно уточнение по фокусу." : "unexpected_normalizer_call",
|
||||
reply_type: payload?.userQuestion === "что там не так?" ? "clarification_required" : "partial_coverage",
|
||||
debug: {
|
||||
prompt_version: "address_query_runtime_v1",
|
||||
detected_mode: null,
|
||||
detected_intent: null
|
||||
}
|
||||
}))
|
||||
} as any;
|
||||
|
||||
const sessions = new AssistantSessionStore();
|
||||
const service = new AssistantService(
|
||||
normalizerService,
|
||||
sessions as any,
|
||||
{} as any,
|
||||
{ persistSession: vi.fn() } as any,
|
||||
addressQueryService
|
||||
);
|
||||
|
||||
const sessionId = `asst-address-followup-clar-${Date.now()}`;
|
||||
const first = await service.handleMessage({
|
||||
session_id: sessionId,
|
||||
user_message: "покажи документы по свк за 2020",
|
||||
useMock: true
|
||||
} as any);
|
||||
expect(first.ok).toBe(true);
|
||||
expect(first.reply_type).toBe("factual");
|
||||
|
||||
const second = await service.handleMessage({
|
||||
session_id: sessionId,
|
||||
user_message: "что там не так?",
|
||||
useMock: true
|
||||
} as any);
|
||||
expect(second.ok).toBe(true);
|
||||
expect(second.reply_type).toBe("clarification_required");
|
||||
|
||||
const third = await service.handleMessage({
|
||||
session_id: sessionId,
|
||||
user_message: lifecycleFollowupMessage,
|
||||
useMock: true
|
||||
} as any);
|
||||
expect(third.ok).toBe(true);
|
||||
expect(third.reply_type).toBe("factual");
|
||||
expect(third.debug?.detected_mode).toBe("address_query");
|
||||
expect(third.debug?.detected_intent).toBe("counterparty_activity_lifecycle");
|
||||
|
||||
expect(calls.length).toBeGreaterThanOrEqual(2);
|
||||
const contextualCall = calls.find((item) => item.message === lifecycleFollowupMessage && Boolean(item.options?.followupContext));
|
||||
expect(contextualCall).toBeTruthy();
|
||||
expect(contextualCall?.options?.followupContext?.previous_intent).toBe("list_documents_by_counterparty");
|
||||
expect(contextualCall?.options?.followupContext?.previous_anchor_type).toBe("counterparty");
|
||||
expect(String(contextualCall?.options?.followupContext?.previous_anchor_value ?? "").length).toBeGreaterThan(0);
|
||||
expect(normalizerService.normalize).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
|
|
|
|||
Loading…
Reference in New Issue