АДРЕСНЫЙ РЕЖИМ -Step-4: Batch-2 lifecycle закрыт gate 36/36, nightly 102/102 + 25/25 PASS

This commit is contained in:
dctouch 2026-04-08 13:39:40 +03:00
parent 1f9bb886ee
commit 71762af575
41 changed files with 50617 additions and 53 deletions

View File

@ -23,33 +23,30 @@
- `followup_25`: `25/25` - `followup_25`: `25/25`
- comparator: `PASS` - comparator: `PASS`
- run: `docs/ADDRESS/runs/2026-04-08_Address_Nightly_Regression_2026-04-08_10-51-20/nightly_summary.json` - 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` - 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` - backlog closeout: `step4_wave1_batch2_phaseA_backlog_v1.md`
- probe report: `wave1_batch2_phaseA_probe_report_2026-04-08.md` - domain live-gate: `docs/ADDRESS/runs/2026-04-08_Address_Batch2_Lifecycle_FullGate_PhaseC_PostFix2/run_summary.json` (`strict 36/36`)
- backlog: `step4_wave1_batch2_phaseA_backlog_v1.md` - targeted code gate: `addressQueryRuntimeM23.test.ts + assistantAddressFollowupContext.test.ts = 223/223`, `build=PASS`
- Batch-2 Phase-B progress: - 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)
- 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`)
- Финальный stress-pack: `102/102` - Финальный stress-pack: `102/102`
`docs/ADDRESS/runs/2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-57-27/run_summary.json` `docs/ADDRESS/runs/2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-57-27/run_summary.json`
- Финальный follow-up pack: `25/25` - Финальный follow-up pack: `25/25`
`docs/ADDRESS/runs/2026-04-02_Address_Followup_Context_Chains_2026-04-02_19-15-Run5/run_summary.json` `docs/ADDRESS/runs/2026-04-02_Address_Followup_Context_Chains_2026-04-02_19-15-Run5/run_summary.json`
- Актуальный nightly regression (green): - Актуальный 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-канала). - Task Scheduler: `NDC_ADDRESS_Nightly_Regression` временно `Disabled` (ручной режим до стабилизации infra-канала).
- Текущий production-контур: `question_mode=address_query`, live-first через MCP. - Текущий production-контур: `question_mode=address_query`, live-first через MCP.
- Следующий этап: `Step-4` domain expansion по рельсовой модели Step-0. - Следующий этап: `Step-4` domain expansion по рельсовой модели Step-0.
## Что реально реализовано в коде (срез 2026-04-03) ## Что реально реализовано в коде (срез 2026-04-08)
Поддерживаемые intents в runtime: Поддерживаемые intents в runtime:
- `period_coverage_profile` (Wave-1 B1, gate-closed) - `period_coverage_profile` (Wave-1 B1, gate-closed)
- `document_type_and_account_section_profile` (Wave-1 B1, pre-gate) - `document_type_and_account_section_profile` (Wave-1 B1, pre-gate)
- `counterparty_population_and_roles` (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) - `contract_usage_overview` (Wave-1 B1, gate-closed)
- `customer_revenue_and_payments` (Wave-1 B3 value, gate-closed) - `customer_revenue_and_payments` (Wave-1 B3 value, gate-closed)
- `supplier_payouts_profile` (Wave-1 B3 value, gate-closed) - `supplier_payouts_profile` (Wave-1 B3 value, gate-closed)

View File

@ -2,12 +2,12 @@
Дата: `2026-04-08` Дата: `2026-04-08`
Домен: `general_batch2_lifecycle` Домен: `general_batch2_lifecycle`
Статус: `active` (Phase A стартован) Статус: `closed` (Phase A/B/C закрыты; domain + global gate PASS)
Владелец: `Address Runtime Team` Владелец: `Address Runtime Team`
## 1. Scope ## 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: In-scope intents:
@ -117,9 +117,9 @@ Global gate:
## 8. Rollout Plan ## 8. Rollout Plan
1. `phase_a` — contract freeze + acceptance set + probe baseline. 1. `phase_a` — contract freeze + acceptance set + probe baseline (`completed`, 2026-04-08).
2. `phase_b` — resolver/compose hardening по lifecycle gap-ам. 2. `phase_b` — resolver/compose hardening по lifecycle gap-ам (`completed`, 2026-04-08).
3. `phase_c` — domain live gate + global comparator PASS. 3. `phase_c` — domain live gate + global comparator PASS (`completed`, 2026-04-08).
## 9. Artifacts ## 9. Artifacts
@ -131,8 +131,14 @@ Global gate:
4. `step4_wave1_batch2_phaseA_backlog_v1.md` 4. `step4_wave1_batch2_phaseA_backlog_v1.md`
5. `runs/<run_id>/run_summary.json` 5. `runs/<run_id>/run_summary.json`
6. `runs/<run_id>/full_live_results.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 ## 10. Change Log
- `2026-04-08` — создана карточка домена Batch-2 lifecycle и зафиксирован contract scope. - `2026-04-08` — создана карточка домена Batch-2 lifecycle и зафиксирован contract scope.
- `2026-04-08` — добавлен Phase-A acceptance набор `Q8..Q13 + Q26 + Q27 + Q31 + Q32`. - `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`).

View File

@ -13,14 +13,14 @@ flowchart LR
D["Global Nightly Comparator (R6)<br/>102/102 + 25/25 PASS"] 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"] E["Auto-nightly Incident<br/>2026-04-08 09:52<br/>MCP fetch failed"]
F["Targeted Fix<br/>S019 predecompose anchor drift"] 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"] G["Manual Control Nightly Recheck<br/>2026-04-08 13:19<br/>102/102 + 25/25 PASS"]
H["CURRENT STATE<br/>BATCH2_PHASE_B_ACTIVE"] H["CURRENT STATE<br/>BATCH2_PHASE_C_CLOSED"]
I["NEXT STEP<br/>Batch-2 Phase B closeout<br/>Follow-up carryover + compose hardening"] I["NEXT STEP<br/>Batch-4/5 domain scoping<br/>Debt/Aging/Risk"]
K["Batch-2 Gate<br/>Phase C -> Global Regression"] K["Batch-2 Gate Closed<br/>36/36 + Global PASS"]
J["Operational Rail<br/>Scheduler: Disabled<br/>Manual nightly only"] J["Operational Rail<br/>Scheduler: Disabled<br/>Manual nightly only"]
A --> B --> C --> D --> H --> I --> K A --> B --> C --> D --> K --> H --> I
D --> E --> F --> G --> H D --> E --> F --> G --> K
E --> J E --> J
H --> J H --> J
``` ```
@ -31,8 +31,10 @@ flowchart LR
`docs/ADDRESS/runs/2026-04-03_Address_Nightly_Regression_Post_AnchorHardening_R6/nightly_summary.json` `docs/ADDRESS/runs/2026-04-03_Address_Nightly_Regression_Post_AnchorHardening_R6/nightly_summary.json`
- Incident run (auto-nightly): - Incident run (auto-nightly):
`docs/ADDRESS/runs/2026-04-08_Address_Nightly_Regression_2026-04-08_09-52-39/nightly_summary.json` `docs/ADDRESS/runs/2026-04-08_Address_Nightly_Regression_2026-04-08_09-52-39/nightly_summary.json`
- Control recheck PASS (manual): - Control recheck PASS (manual, latest):
`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`
- 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): - Master checker (entry to Batch-2):
`docs/ADDRESS/address_query/step4_wave1_batch1_master_checker_v1.md` `docs/ADDRESS/address_query/step4_wave1_batch1_master_checker_v1.md`
- Batch-2 Phase-A artifacts: - Batch-2 Phase-A artifacts:
@ -47,5 +49,5 @@ flowchart LR
- Функциональные гейты закрыты. - Функциональные гейты закрыты.
- Точечный flake `S019` закрыт. - Точечный flake `S019` закрыт.
- Batch-2 переведен в `Phase B active`; resolver drift по `Q12/Q13/Q26/Q27/Q31/Q32` закрыт (`hotpass 6/6`). - Batch-2 lifecycle закрыт до `Phase C`: domain gate `36/36`, global regression `102/102 + 25/25`, comparator PASS.
- Следующий практический шаг: Phase-B closeout (follow-up carryover + compose), затем Batch-2 domain gate. - Следующий практический шаг: стартовать scoping Batch-4/Batch-5 (`debt/aging/risk`) как отдельную доменную волну.

View File

@ -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-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-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-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-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-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 | | 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-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 | | 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: - В runtime реализованы by-contract intents:
- `list_documents_by_contract` - `list_documents_by_contract`
@ -56,7 +56,7 @@
- Для value-слоя зафиксирован стандарт ранжирования: `top-20` по умолчанию (если пользователь не указал иной лимит). - Для value-слоя зафиксирован стандарт ранжирования: `top-20` по умолчанию (если пользователь не указал иной лимит).
- Добавлена устойчивость к сленгу/опечаткам в intent routing (в т.ч. фразы вида `приходы самые высокие`, `кликентов самый высокий чек`). - Добавлена устойчивость к сленгу/опечаткам в intent routing (в т.ч. фразы вида `приходы самые высокие`, `кликентов самый высокий чек`).
- Targeted code gate зеленый: - 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`. - `npm --prefix llm_normalizer/backend run build` -> `PASS`.
- Domain live gates (2026-04-03): - 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`. - 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): - Batch-2 lifecycle Phase-B resolver hotpass (2026-04-08):
- report: `docs/ADDRESS/address_query/wave1_batch2_phaseB_resolver_hotpass_2026-04-08.md` - report: `docs/ADDRESS/address_query/wave1_batch2_phaseB_resolver_hotpass_2026-04-08.md`
- фактический результат: `route match 6/6` на `Q12/Q13/Q26/Q27/Q31/Q32` - фактический результат: `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). - `COMPOUND_FACTUAL_QUERY` остается detection-only (без multi-intent execution).
- Финальные gate-артефакты стабильности: - Финальные gate-артефакты стабильности:
- stress `102/102`: `docs/ADDRESS/runs/2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-57-27/run_summary.json` - stress `102/102`: `docs/ADDRESS/runs/2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-57-27/run_summary.json`

View File

@ -1,7 +1,7 @@
# Step-4 Wave-1 Batch-2 — Phase A/B Backlog V1 # Step-4 Wave-1 Batch-2 — Phase A/B Backlog V1
Дата: 2026-04-08 Дата: 2026-04-08
Статус: `active` Статус: `closed` (`Phase C done`, domain/global gates PASS)
Scope: `Q8..Q13 + Q26 + Q27 + Q31 + Q32` Scope: `Q8..Q13 + Q26 + Q27 + Q31 + Q32`
## 1. Phase A (Design/Contract) — статус ## 1. Phase A (Design/Contract) — статус
@ -29,7 +29,7 @@ Scope: `Q8..Q13 + Q26 + Q27 + Q31 + Q32`
Добавить contract lifecycle routing: Добавить contract lifecycle routing:
- stale contract phrasing -> `contract_usage_overview` - stale contract phrasing -> `contract_usage_overview`
- multi-contract/active contract phrasing -> `contract_usage_and_value` - 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: Усилить follow-up carryover для Batch-2 chain:
`а кто новые`, `а кто потом исчез`, `а теперь за 2021`, `и какие договоры активны`. `а кто новые`, `а кто потом исчез`, `а теперь за 2021`, `и какие договоры активны`.
@ -53,7 +53,7 @@ Scope: `Q8..Q13 + Q26 + Q27 + Q31 + Q32`
- [x] `llm_normalizer/backend/tests/addressQueryRuntimeM23.test.ts` - [x] `llm_normalizer/backend/tests/addressQueryRuntimeM23.test.ts`
Добавить regression-кейсы под `Q12/Q13/Q26/Q27/Q31/Q32`. Добавить 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 для переключения года и сегментов. Добавить lifecycle follow-up chains для переключения года и сегментов.
- [x] Кодовый gate: - [x] Кодовый gate:
- `npm --prefix llm_normalizer/backend run test -- addressQueryRuntimeM23.test.ts --testTimeout 20000` - `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) — критерии закрытия ## 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`: `docs/ADDRESS/question_sets/domain_general_batch2_lifecycle_acceptance_2026-04-08_phaseA.json`:
- `strict_pass(route)=100%` - `strict_pass(route)=100%`
- `false_factual_rate=0` - `false_factual_rate=0`
- `execution_error_rate=0` - `execution_error_rate=0`
- [ ] Global non-regression: - [x] Global non-regression:
- `address_slang_stress_full_2026-04-02.json` - `address_slang_stress_full_2026-04-02.json`
- `address_followup_context_chains_2026-04-02.json` - `address_followup_context_chains_2026-04-02.json`
обе метрики не ниже baseline (`102/102`, `25/25`). обе метрики не ниже baseline (`102/102`, `25/25`).
- [ ] Comparator PASS against latest green nightly: - [x] Comparator PASS against latest green nightly:
`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`
## 4. Текущий приоритет (следующий кодовый шаг) ## 4. Текущий приоритет (следующий кодовый шаг)
1. Закрыть follow-up carryover для lifecycle/contract lifecycle chain. 1. Перевести Batch-2 из wave backlog в master checker как `closed`.
2. Дожать compose-представления для `stale`/`one-time`/`longest-running`/`regular-vs-episodic`. 2. Подготовить Batch-4/Batch-5 scope (debt/aging/risk) отдельной доменной карточкой.
3. Прогнать полный Batch-2 domain gate pack + global comparator. 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).

View File

@ -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 one or more lines are too long

View File

@ -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. |

View File

@ -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
}
}
}
}

View File

@ -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

View File

@ -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

View File

@ -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). |

View File

@ -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
}
}
}
}

View File

@ -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

File diff suppressed because one or more lines are too long

View File

@ -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). |

View File

@ -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
}
}
}
}

View File

@ -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

View File

@ -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). |

View File

@ -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
}
}
}
}

View File

@ -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"
}
]
}

View File

@ -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
}
}
]
}

View File

@ -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

View File

@ -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). |

View File

@ -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
}
}
}
}

View File

@ -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"
}
]
}

View File

@ -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
}
}
]
}

View File

@ -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

View File

@ -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"
}
]
}

View File

@ -268,6 +268,14 @@ const COUNTERPARTY_ACTIVITY_LIFECYCLE_HINTS = [
"регулярные поставщики", "регулярные поставщики",
"эпизодические поставщики", "эпизодические поставщики",
"давно не использовались поставщики", "давно не использовались поставщики",
"всех заков",
"кто был активен",
"потом отвалился",
"ровно один раз",
"и пропал",
"самые старые по сотрудничеству",
"разбей поставщиков на регуляр и разовые",
"кто новые в этом году",
"active customers", "active customers",
"customer activity list", "customer activity list",
"counterparty lifecycle" "counterparty lifecycle"
@ -605,13 +613,13 @@ function hasCounterpartyPopulationAndRolesSignal(text: string): boolean {
} }
function hasLifecycleSegmentationSignal(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 text
); );
} }
function hasCounterpartyActivityLifecycleSignal(text: string): boolean { function hasCounterpartyActivityLifecycleSignal(text: string): boolean {
if (hasDocumentSignal(text) || hasBankOperationSignal(text)) { if ((hasDocumentSignal(text) || hasBankOperationSignal(text)) && !hasLifecycleSegmentationSignal(text)) {
return false; return false;
} }
if (hasAny(text, COUNTERPARTY_ACTIVITY_LIFECYCLE_HINTS)) { if (hasAny(text, COUNTERPARTY_ACTIVITY_LIFECYCLE_HINTS)) {
@ -633,6 +641,10 @@ function hasCounterpartyActivityLifecycleSignal(text: string): boolean {
); );
const hasListVerb = /(?:какие|кто|покажи|выведи|список|list|show)/iu.test(text); const hasListVerb = /(?:какие|кто|покажи|выведи|список|list|show)/iu.test(text);
const hasRosterQualifier = /(?:у\s+нас|вообще|в\s+баз[еы]|какие\s+есть|кто\s+есть|who\s+are)/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; const hasListWithWindow = hasCounterpartyLexeme && hasListVerb && hasTimeWindowLexeme;
if (hasListWithWindow) { if (hasListWithWindow) {
return true; return true;
@ -643,6 +655,12 @@ function hasCounterpartyActivityLifecycleSignal(text: string): boolean {
if (hasCounterpartyLexeme && hasLifecycleSegmentationSignal(text)) { if (hasCounterpartyLexeme && hasLifecycleSegmentationSignal(text)) {
return true; 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); return hasCounterpartyLexeme && hasActivityLexeme && (hasTimeWindowLexeme || hasListVerb);
} }

View File

@ -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 { function hasOpenItemsHint(text: string): boolean {
return /(?:open\s+items|unclosed\s+items|хвост|висят|незакрыт|не\s+закрыт|открыт|долг|задолж|позиц)/iu.test(String(text ?? "")); return /(?:open\s+items|unclosed\s+items|хвост|висят|незакрыт|не\s+закрыт|открыт|долг|задолж|позиц)/iu.test(String(text ?? ""));
} }
@ -393,6 +397,20 @@ function mergeFollowupFilters(
return { filters: merged, reasons }; 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 currentHasPeriod = hasExplicitPeriodWindow(merged);
const previousHasPeriod = hasExplicitPeriodWindow(previous); const previousHasPeriod = hasExplicitPeriodWindow(previous);
if (!currentHasPeriod && previousHasPeriod && hasAddressFollowupContextSignal(userMessage)) { if (!currentHasPeriod && previousHasPeriod && hasAddressFollowupContextSignal(userMessage)) {
@ -543,9 +561,20 @@ export function runAddressDecomposeStage(
followupContext: AddressFollowupContext | null followupContext: AddressFollowupContext | null
): AddressDecomposeStageResult | null { ): AddressDecomposeStageResult | null {
const detectedMode = detectAddressQuestionMode(userMessage); const detectedMode = detectAddressQuestionMode(userMessage);
const shape = classifyAddressQueryShape(userMessage);
if (shape.shape === "EXPLAIN_OR_REASON") {
return null;
}
const detectedIntent = resolveAddressIntent(userMessage);
const mode = const mode =
detectedMode.mode === "address_query" detectedMode.mode === "address_query"
? detectedMode ? detectedMode
: detectedIntent.intent !== "unknown"
? {
mode: "address_query" as const,
confidence: "medium" as const,
reasons: [...detectedMode.reasons, "address_mode_from_resolved_intent"]
}
: followupContext && hasAddressFollowupContextSignal(userMessage) : followupContext && hasAddressFollowupContextSignal(userMessage)
? { ? {
mode: "address_query" as const, mode: "address_query" as const,
@ -556,13 +585,6 @@ export function runAddressDecomposeStage(
if (mode.mode !== "address_query") { if (mode.mode !== "address_query") {
return null; 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 intent = deriveIntentWithFollowupContext(detectedIntent, userMessage, followupContext);
const extractedFilters = extractAddressFilters(userMessage, intent.intent); const extractedFilters = extractAddressFilters(userMessage, intent.intent);
const followupMerged = mergeFollowupFilters(extractedFilters.extracted_filters, intent.intent, userMessage, followupContext); const followupMerged = mergeFollowupFilters(extractedFilters.extracted_filters, intent.intent, userMessage, followupContext);

View File

@ -1391,10 +1391,10 @@ function hasAccountingSignal(text) {
} }
function hasFollowupMarker(text) { function hasFollowupMarker(text) {
const compact = compactWhitespace(text.toLowerCase()); 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) { 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) { function hasSmallTalkSignal(text) {
return /(привет|как дела|спасибо|благодарю|thanks|thank you|hello|hi)\b/i.test(text.toLowerCase()); return /(привет|как дела|спасибо|благодарю|thanks|thank you|hello|hi)\b/i.test(text.toLowerCase());
@ -2374,6 +2374,30 @@ function readAddressFilterString(addressDebug, key) {
} }
return toNonEmptyString(filters[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) { function findLastAddressAssistantDebug(items) {
for (let index = items.length - 1; index >= 0; index -= 1) { for (let index = items.length - 1; index >= 0; index -= 1) {
const item = items[index]; const item = items[index];
@ -2381,7 +2405,7 @@ function findLastAddressAssistantDebug(items) {
continue; continue;
} }
const debug = item.debug; const debug = item.debug;
if (debug.detected_mode === "address_query" || debug.prompt_version === "address_query_runtime_v1") { if (isAddressLaneDebugPayload(debug)) {
return debug; return debug;
} }
} }
@ -2394,7 +2418,7 @@ function findRecentAddressFilterValue(items, key) {
continue; continue;
} }
const debug = item.debug; const debug = item.debug;
if (!(debug.detected_mode === "address_query" || debug.prompt_version === "address_query_runtime_v1")) { if (!isAddressLaneDebugPayload(debug)) {
continue; continue;
} }
const directFilterValue = readAddressFilterString(debug, key); const directFilterValue = readAddressFilterString(debug, key);
@ -2438,6 +2462,13 @@ function hasAddressFollowupContextSignal(userMessage) {
if (shortFollowup && /(?:^|\s)(?:также|тоже|also|same|again|ещ[её]|теперь|then|now)(?=$|[\s,.;:!?])/iu.test(text)) { if (shortFollowup && /(?:^|\s)(?:также|тоже|also|same|again|ещ[её]|теперь|then|now)(?=$|[\s,.;:!?])/iu.test(text)) {
return true; 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 && if (shortFollowup &&
/(?:^|\s)по\s+[a-zа-яё][a-zа-яё0-9._-]{1,}(?=$|[\s,.;:!?])/iu.test(text) && /(?:^|\s)по\s+[a-zа-яё][a-zа-яё0-9._-]{1,}(?=$|[\s,.;:!?])/iu.test(text) &&
!/(?:по\s+этому|по\s+тому|по\s+нему|по\s+ней|по\s+ним)/iu.test(text)) { !/(?:по\s+этому|по\s+тому|по\s+нему|по\s+ней|по\s+ним)/iu.test(text)) {

View File

@ -1403,6 +1403,41 @@ describe("address intent resolver expansion (M2.3a)", () => {
expect(result.intent).toBe("counterparty_activity_lifecycle"); 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", () => { it("resolves contract usage overview intent", () => {
const result = resolveAddressIntent("Сколько всего договоров заведено и сколько из них реально использовались?"); const result = resolveAddressIntent("Сколько всего договоров заведено и сколько из них реально использовались?");
expect(result.intent).toBe("contract_usage_overview"); 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", () => { 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", () => { it("uses short bare year in follow-up period switch", () => {
const result = runAddressDecomposeStage("теперь за 21", { const result = runAddressDecomposeStage("теперь за 21", {
previous_intent: "counterparty_activity_lifecycle", 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"); 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", () => { it("keeps short period follow-up in address lane and preserves previous counterparty anchor", () => {
const result = runAddressDecomposeStage("а теперь только за май 2020", { const result = runAddressDecomposeStage("а теперь только за май 2020", {
previous_intent: "list_documents_by_counterparty", previous_intent: "list_documents_by_counterparty",

View File

@ -192,4 +192,91 @@ describe("assistant address follow-up carryover", () => {
expect(String(calls[1].options?.followupContext?.previous_anchor_value ?? "").length).toBeGreaterThan(0); expect(String(calls[1].options?.followupContext?.previous_anchor_value ?? "").length).toBeGreaterThan(0);
expect(normalizerService.normalize).not.toHaveBeenCalled(); 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);
});
}); });