АДРЕСНЫЙ РЕЖИМ -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`
- comparator: `PASS`
- run: `docs/ADDRESS/runs/2026-04-08_Address_Nightly_Regression_2026-04-08_10-51-20/nightly_summary.json`
- Batch-2 lifecycle официально переведен в `Phase A active`:
- Batch-2 lifecycle закрыт до `Phase C` (domain + global gates PASS):
- domain card: `domain_general_batch2_lifecycle_card_v1.md`
- acceptance set: `docs/ADDRESS/question_sets/domain_general_batch2_lifecycle_acceptance_2026-04-08_phaseA.json`
- probe report: `wave1_batch2_phaseA_probe_report_2026-04-08.md`
- backlog: `step4_wave1_batch2_phaseA_backlog_v1.md`
- Batch-2 Phase-B progress:
- resolver hardening по `Q12/Q13/Q26/Q27/Q31/Q32` выполнен
- targeted test gate: `addressQueryRuntimeM23.test.ts = 210/210`, `build=PASS`
- live hotpass: `wave1_batch2_phaseB_resolver_hotpass_2026-04-08.md` (`route match 6/6`)
- backlog closeout: `step4_wave1_batch2_phaseA_backlog_v1.md`
- domain live-gate: `docs/ADDRESS/runs/2026-04-08_Address_Batch2_Lifecycle_FullGate_PhaseC_PostFix2/run_summary.json` (`strict 36/36`)
- targeted code gate: `addressQueryRuntimeM23.test.ts + assistantAddressFollowupContext.test.ts = 223/223`, `build=PASS`
- global non-regression: `docs/ADDRESS/runs/2026-04-08_Address_Nightly_Regression_2026-04-08_13-19-24/nightly_summary.json` (`stress 102/102`, `followup 25/25`, comparator PASS)
- Финальный stress-pack: `102/102`
`docs/ADDRESS/runs/2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-57-27/run_summary.json`
- Финальный follow-up pack: `25/25`
`docs/ADDRESS/runs/2026-04-02_Address_Followup_Context_Chains_2026-04-02_19-15-Run5/run_summary.json`
- Актуальный nightly regression (green):
`docs/ADDRESS/runs/2026-04-08_Address_Nightly_Regression_2026-04-08_10-51-20/nightly_summary.json`
`docs/ADDRESS/runs/2026-04-08_Address_Nightly_Regression_2026-04-08_13-19-24/nightly_summary.json`
- Task Scheduler: `NDC_ADDRESS_Nightly_Regression` временно `Disabled` (ручной режим до стабилизации infra-канала).
- Текущий production-контур: `question_mode=address_query`, live-first через MCP.
- Следующий этап: `Step-4` domain expansion по рельсовой модели Step-0.
## Что реально реализовано в коде (срез 2026-04-03)
## Что реально реализовано в коде (срез 2026-04-08)
Поддерживаемые intents в runtime:
- `period_coverage_profile` (Wave-1 B1, gate-closed)
- `document_type_and_account_section_profile` (Wave-1 B1, pre-gate)
- `counterparty_population_and_roles` (Wave-1 B1, pre-gate)
- `counterparty_activity_lifecycle` (Wave-1/B2, Phase-A active)
- `counterparty_activity_lifecycle` (Wave-1 B2, gate-closed)
- `contract_usage_overview` (Wave-1 B1, gate-closed)
- `customer_revenue_and_payments` (Wave-1 B3 value, gate-closed)
- `supplier_payouts_profile` (Wave-1 B3 value, gate-closed)

View File

@ -2,12 +2,12 @@
Дата: `2026-04-08`
Домен: `general_batch2_lifecycle`
Статус: `active` (Phase A стартован)
Статус: `closed` (Phase A/B/C закрыты; domain + global gate PASS)
Владелец: `Address Runtime Team`
## 1. Scope
Кратко: домен закрывает lifecycle-вопросы общего домена (`Q8..Q13 + Q26 + Q27 + Q31 + Q32`) и готовит единый рельсовый контракт перед Phase B.
Кратко: домен закрывает lifecycle-вопросы общего домена (`Q8..Q13 + Q26 + Q27 + Q31 + Q32`) и зафиксирован как rail-ready после Phase C gate.
In-scope intents:
@ -117,9 +117,9 @@ Global gate:
## 8. Rollout Plan
1. `phase_a` — contract freeze + acceptance set + probe baseline.
2. `phase_b` — resolver/compose hardening по lifecycle gap-ам.
3. `phase_c` — domain live gate + global comparator PASS.
1. `phase_a` — contract freeze + acceptance set + probe baseline (`completed`, 2026-04-08).
2. `phase_b` — resolver/compose hardening по lifecycle gap-ам (`completed`, 2026-04-08).
3. `phase_c` — domain live gate + global comparator PASS (`completed`, 2026-04-08).
## 9. Artifacts
@ -131,8 +131,14 @@ Global gate:
4. `step4_wave1_batch2_phaseA_backlog_v1.md`
5. `runs/<run_id>/run_summary.json`
6. `runs/<run_id>/full_live_results.json`
7. `wave1_batch2_phaseB_resolver_hotpass_2026-04-08.md`
8. `runs/2026-04-08_Address_Batch2_Lifecycle_FullGate_PhaseC_PostFix2/run_summary.json`
9. `runs/2026-04-08_Address_Nightly_Regression_2026-04-08_13-19-24/nightly_summary.json`
## 10. Change Log
- `2026-04-08` — создана карточка домена Batch-2 lifecycle и зафиксирован contract scope.
- `2026-04-08` — добавлен Phase-A acceptance набор `Q8..Q13 + Q26 + Q27 + Q31 + Q32`.
- `2026-04-08` — закрыт Phase-B hardening (resolver/decompose/follow-up контур по lifecycle noisy/follow-up формулировкам).
- `2026-04-08` — закрыт Phase-C domain gate: `strict 36/36` (`2026-04-08_Address_Batch2_Lifecycle_FullGate_PhaseC_PostFix2`).
- `2026-04-08` — подтвержден global non-regression PASS: `stress 102/102`, `followup 25/25`, comparator `PASS` (`2026-04-08_Address_Nightly_Regression_2026-04-08_13-19-24`).

View File

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

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-11 | document_type_and_account_section_profile | STRUCTURALLY_VISIBLE | LIVE_QUERYABLE_WITH_LIMITS | functional gates закрыты; остаточный риск в operational стабильности auto-nightly/MCP канала | держать comparator PASS (R6) и переходить к Batch-2 lifecycle |
| AQ-B1-12 | counterparty_population_and_roles | STRUCTURALLY_VISIBLE | LIVE_QUERYABLE_WITH_LIMITS | functional gates закрыты; остаточный риск в operational стабильности auto-nightly/MCP канала | держать comparator PASS (R6) и переходить к Batch-2 lifecycle |
| AQ-B2-13 | counterparty_activity_lifecycle | STRUCTURALLY_VISIBLE | LIVE_QUERYABLE_WITH_LIMITS | resolver drift hotfix закрыт, но Batch-2 domain gate еще не прогнан | закрыть Phase-B (follow-up/compose) и выполнить Batch-2 domain gate |
| AQ-B2-13 | counterparty_activity_lifecycle | STRUCTURALLY_VISIBLE | LIVE_QUERYABLE_WITH_LIMITS | functional gates закрыты; остаточный риск в operational стабильности auto-nightly/MCP канала | держать comparator PASS и использовать Batch-2 как reference-domain для следующей волны |
| AQ-B1-14 | contract_usage_overview | STRUCTURALLY_VISIBLE | LIVE_QUERYABLE_WITH_LIMITS | functional gates закрыты; остаточный риск в operational стабильности auto-nightly/MCP канала | держать comparator PASS (R6) и переходить к Batch-2 lifecycle |
| AQ-B3-15 | customer_revenue_and_payments | STRUCTURALLY_VISIBLE | LIVE_QUERYABLE_WITH_LIMITS | functional gates закрыты; остаточный риск в operational стабильности auto-nightly/MCP канала | держать comparator PASS (R6) и переходить к Batch-2 lifecycle |
| AQ-B3-16 | supplier_payouts_profile | STRUCTURALLY_VISIBLE | LIVE_QUERYABLE_WITH_LIMITS | functional gates закрыты; остаточный риск в operational стабильности auto-nightly/MCP канала | держать comparator PASS (R6) и переходить к Batch-2 lifecycle |
@ -38,7 +38,7 @@
| AQ-P1-10 | account_turnover_snapshot | STRUCTURALLY_VISIBLE | UNKNOWN | intent/recipe отсутствуют в runtime | планировать как отдельный домен Step-4 |
| AQ-P1-11 | list_documents_by_type | STRUCTURALLY_VISIBLE | UNKNOWN | intent/recipe отсутствуют в runtime | планировать как отдельный домен Step-4 |
## Sync Notes (2026-04-03)
## Sync Notes (2026-04-08)
- В runtime реализованы by-contract intents:
- `list_documents_by_contract`
@ -56,7 +56,7 @@
- Для value-слоя зафиксирован стандарт ранжирования: `top-20` по умолчанию (если пользователь не указал иной лимит).
- Добавлена устойчивость к сленгу/опечаткам в intent routing (в т.ч. фразы вида `приходы самые высокие`, `кликентов самый высокий чек`).
- Targeted code gate зеленый:
- `npm --prefix llm_normalizer/backend test -- addressQueryRuntimeM23.test.ts` -> `200/200`.
- `npm --prefix llm_normalizer/backend run test -- addressQueryRuntimeM23.test.ts assistantAddressFollowupContext.test.ts --testTimeout 30000` -> `223/223`.
- `npm --prefix llm_normalizer/backend run build` -> `PASS`.
- Domain live gates (2026-04-03):
- Batch-1 pack: `docs/ADDRESS/runs/2026-04-03_Address_Domain_General_B1_PhaseC_LiveGate_R3/` -> `strict 28/28`.
@ -74,7 +74,13 @@
- Batch-2 lifecycle Phase-B resolver hotpass (2026-04-08):
- report: `docs/ADDRESS/address_query/wave1_batch2_phaseB_resolver_hotpass_2026-04-08.md`
- фактический результат: `route match 6/6` на `Q12/Q13/Q26/Q27/Q31/Q32`
- кодовый gate: `addressQueryRuntimeM23.test.ts = 210/210`, `build=PASS`.
- кодовый gate: `addressQueryRuntimeM23.test.ts = 220/220`, `assistantAddressFollowupContext.test.ts = 3/3`, `build=PASS`.
- Batch-2 lifecycle Phase-C domain gate (2026-04-08):
- run: `docs/ADDRESS/runs/2026-04-08_Address_Batch2_Lifecycle_FullGate_PhaseC_PostFix2/`
- фактический результат: `strict 36/36`, `false_factual_rate=0`, `execution_error_rate=0`.
- Global non-regression после Phase-C (2026-04-08):
- run: `docs/ADDRESS/runs/2026-04-08_Address_Nightly_Regression_2026-04-08_13-19-24/nightly_summary.json`
- фактический результат: `stress_102=102/102`, `followup_25=25/25`, comparator `PASS`.
- `COMPOUND_FACTUAL_QUERY` остается detection-only (без multi-intent execution).
- Финальные gate-артефакты стабильности:
- stress `102/102`: `docs/ADDRESS/runs/2026-04-02_Address_Slang_Live_Stress_2026-04-02_12-57-27/run_summary.json`

View File

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

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

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

View File

@ -1391,10 +1391,10 @@ function hasAccountingSignal(text) {
}
function hasFollowupMarker(text) {
const compact = compactWhitespace(text.toLowerCase());
return /^(и|а еще|а ещё|еще|ещё|добав|уточн|продолж|также|а если|а теперь|теперь|plus|also|dobav|utochn|prodolzh|then|now)/i.test(compact);
return /^(и|а\s+кто|а еще|а ещё|еще|ещё|добав|уточн|продолж|также|а если|а теперь|теперь|plus|also|dobav|utochn|prodolzh|then|now)/i.test(compact);
}
function hasReferentialPointer(text) {
return /(по этому|по тому|это же|этой|этим|этому|из этого|в этом|тот же|same thing|that one|po etomu|po tomu)/i.test(text.toLowerCase());
return /(по этому|по тому|это же|этой|этим|этому|из этого|из них|из этих|из тех|в этом|тот же|same thing|that one|po etomu|po tomu)/i.test(text.toLowerCase());
}
function hasSmallTalkSignal(text) {
return /(привет|как дела|спасибо|благодарю|thanks|thank you|hello|hi)\b/i.test(text.toLowerCase());
@ -2374,6 +2374,30 @@ function readAddressFilterString(addressDebug, key) {
}
return toNonEmptyString(filters[key]);
}
function isAddressLaneDebugPayload(debug) {
if (!debug || typeof debug !== "object") {
return false;
}
if (debug.detected_mode === "address_query") {
return true;
}
if (typeof debug.selected_recipe === "string" && debug.selected_recipe.trim().length > 0) {
return true;
}
if (typeof debug.mcp_call_status === "string" && debug.mcp_call_status.trim().length > 0) {
return true;
}
if (typeof debug.anchor_type === "string" && debug.anchor_type.trim().length > 0) {
return true;
}
if (debug.extracted_filters && typeof debug.extracted_filters === "object") {
const keys = Object.keys(debug.extracted_filters);
if (keys.length > 0 && typeof debug.detected_intent === "string" && debug.detected_intent.trim().length > 0) {
return true;
}
}
return false;
}
function findLastAddressAssistantDebug(items) {
for (let index = items.length - 1; index >= 0; index -= 1) {
const item = items[index];
@ -2381,7 +2405,7 @@ function findLastAddressAssistantDebug(items) {
continue;
}
const debug = item.debug;
if (debug.detected_mode === "address_query" || debug.prompt_version === "address_query_runtime_v1") {
if (isAddressLaneDebugPayload(debug)) {
return debug;
}
}
@ -2394,7 +2418,7 @@ function findRecentAddressFilterValue(items, key) {
continue;
}
const debug = item.debug;
if (!(debug.detected_mode === "address_query" || debug.prompt_version === "address_query_runtime_v1")) {
if (!isAddressLaneDebugPayload(debug)) {
continue;
}
const directFilterValue = readAddressFilterString(debug, key);
@ -2438,6 +2462,13 @@ function hasAddressFollowupContextSignal(userMessage) {
if (shortFollowup && /(?:^|\s)(?:также|тоже|also|same|again|ещ[её]|теперь|then|now)(?=$|[\s,.;:!?])/iu.test(text)) {
return true;
}
if (shortFollowup &&
/(?:кто\s+из\s+(?:них|этих|тех)|кто\s+нов(?:ые|ых|ый)|кто\s+потом\s+исчез|кто\s+был\s+(?:только|ровно)\s+один\s+раз)/iu.test(text)) {
return true;
}
if (shortFollowup && /^(?:а|и)\s+кто\b/iu.test(text)) {
return true;
}
if (shortFollowup &&
/(?:^|\s)по\s+[a-zа-яё][a-zа-яё0-9._-]{1,}(?=$|[\s,.;:!?])/iu.test(text) &&
!/(?:по\s+этому|по\s+тому|по\s+нему|по\s+ней|по\s+ним)/iu.test(text)) {

View File

@ -1403,6 +1403,41 @@ describe("address intent resolver expansion (M2.3a)", () => {
expect(result.intent).toBe("counterparty_activity_lifecycle");
});
it("keeps supplier lifecycle segmentation with operations wording in lifecycle intent", () => {
const result = resolveAddressIntent("Раздели поставщиков на регулярных и эпизодических по частоте операций.");
expect(result.intent).toBe("counterparty_activity_lifecycle");
});
it("keeps stale supplier operations wording in lifecycle intent", () => {
const result = resolveAddressIntent("Какие поставщики давно не использовались в операционной активности?");
expect(result.intent).toBe("counterparty_activity_lifecycle");
});
it("keeps slang all-customers-all-time wording in lifecycle intent", () => {
const result = resolveAddressIntent("выведи всех заков за все время");
expect(result.intent).toBe("counterparty_activity_lifecycle");
});
it("keeps churn wording with year in lifecycle intent", () => {
const result = resolveAddressIntent("кто был активен в 2020 и потом отвалился");
expect(result.intent).toBe("counterparty_activity_lifecycle");
});
it("keeps one-time-plus-churn wording in lifecycle intent", () => {
const result = resolveAddressIntent("кто с нами был ровно один раз и пропал");
expect(result.intent).toBe("counterparty_activity_lifecycle");
});
it("keeps oldest-collaboration slang wording in lifecycle intent", () => {
const result = resolveAddressIntent("самые старые по сотрудничеству кто");
expect(result.intent).toBe("counterparty_activity_lifecycle");
});
it("keeps regular-vs-one-off supplier slang in lifecycle intent (not population)", () => {
const result = resolveAddressIntent("разбей поставщиков на регуляр и разовые");
expect(result.intent).toBe("counterparty_activity_lifecycle");
});
it("resolves contract usage overview intent", () => {
const result = resolveAddressIntent("Сколько всего договоров заведено и сколько из них реально использовались?");
expect(result.intent).toBe("contract_usage_overview");
@ -2219,6 +2254,22 @@ describe("address query limited taxonomy and stage diagnostics", () => {
});
describe("address decompose stage follow-up carryover", () => {
it("keeps slang all-customers-all-time wording in address lane via resolved intent fallback", () => {
const result = runAddressDecomposeStage("выведи всех заков за все время", null);
expect(result).not.toBeNull();
expect(result?.mode.mode).toBe("address_query");
expect(result?.intent.intent).toBe("counterparty_activity_lifecycle");
});
it("keeps churn wording with year in address lane via resolved intent fallback", () => {
const result = runAddressDecomposeStage("кто был активен в 2020 и потом отвалился", null);
expect(result).not.toBeNull();
expect(result?.mode.mode).toBe("address_query");
expect(result?.intent.intent).toBe("counterparty_activity_lifecycle");
expect(result?.filters.extracted_filters.period_from).toBe("2020-01-01");
expect(result?.filters.extracted_filters.period_to).toBe("2020-12-31");
});
it("uses short bare year in follow-up period switch", () => {
const result = runAddressDecomposeStage("теперь за 21", {
previous_intent: "counterparty_activity_lifecycle",
@ -2235,6 +2286,24 @@ describe("address decompose stage follow-up carryover", () => {
expect(result?.filters.extracted_filters.period_to).toBe("2021-12-31");
});
it("keeps lifecycle follow-up phrasing with referential pointer and inherits period", () => {
const result = runAddressDecomposeStage("А кто из них новые?", {
previous_intent: "counterparty_activity_lifecycle",
previous_filters: {
period_from: "2020-01-01",
period_to: "2020-12-31"
},
previous_anchor_type: "unknown",
previous_anchor_value: null
});
expect(result).not.toBeNull();
expect(result?.mode.mode).toBe("address_query");
expect(result?.intent.intent).toBe("counterparty_activity_lifecycle");
expect(result?.filters.extracted_filters.period_from).toBe("2020-01-01");
expect(result?.filters.extracted_filters.period_to).toBe("2020-12-31");
expect(result?.baseReasons).toContain("address_followup_context_applied");
});
it("keeps short period follow-up in address lane and preserves previous counterparty anchor", () => {
const result = runAddressDecomposeStage("а теперь только за май 2020", {
previous_intent: "list_documents_by_counterparty",

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(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);
});
});