АДРЕСНЫЙ РЕЖИМ - Batch-2 (Phase A/B): стабилизация LLM-маршрутизации жизненного цикла контрагентов и договоров + актуализация документации

This commit is contained in:
2026-04-08 12:42:02 +03:00
parent eec5ef4fc0
commit 1f9bb886ee
28 changed files with 2281 additions and 128 deletions
+21 -7
View File
@@ -1,6 +1,6 @@
# ADDRESS Query Docs
Дата: 2026-04-03
Дата: 2026-04-08
Статус синхронизации: актуализировано по текущему коду в `llm_normalizer/backend/src/services/*`.
## Актуальный статус (2026-04-08)
@@ -23,6 +23,15 @@
- `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`:
- 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`)
- Финальный 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`
@@ -37,14 +46,14 @@
Поддерживаемые intents в runtime:
- `period_coverage_profile` (Wave-1 B1, pre-gate)
- `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, pre-gate)
- `contract_usage_overview` (Wave-1 B1, pre-gate)
- `customer_revenue_and_payments` (Wave-1 B3 value, pre-gate)
- `supplier_payouts_profile` (Wave-1 B3 value, pre-gate)
- `contract_usage_and_value` (Wave-1 B3 value, pre-gate)
- `counterparty_activity_lifecycle` (Wave-1/B2, Phase-A active)
- `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)
- `contract_usage_and_value` (Wave-1 B3 value, gate-closed)
- `list_open_contracts`
- `list_payables_counterparties`
- `list_receivables_counterparties`
@@ -84,6 +93,11 @@
- `wave1_batch1_readiness_report_2026-04-02.md` - авто-отчет готовности к старту Batch-1.
- `stage3_value_universalization_closeout_2026-04-03.md` - закрытие этапа 3 по value-вопросам общего домена (профит, тестовый gate, остаточные риски).
- `wave1_batch1_batch3_live_gate_report_2026-04-03.md` - фактический отчет по live-gate Batch-1/Batch-3 и статусу глобального regression/comparator (PASS в R6).
- `project_status_rails_graph_2026-04-08.md` - визуальный граф текущего статуса рельсов (закрытые гейты, operational-контур, точка входа в Batch-2).
- `domain_general_batch2_lifecycle_card_v1.md` - domain card для Batch-2 lifecycle (`Q8..Q13 + Q26 + Q27 + Q31 + Q32`).
- `wave1_batch2_phaseA_probe_report_2026-04-08.md` - baseline probe Batch-2 с фактическими gap-ами перед Phase B.
- `step4_wave1_batch2_phaseA_backlog_v1.md` - рабочий backlog Batch-2 (Phase A/B/C).
- `wave1_batch2_phaseB_resolver_hotpass_2026-04-08.md` - фиксация закрытия resolver drift на критичных Batch-2 формулировках (`6/6`).
- `domain_general_batch1_foundation_card_v1.md` - domain card первой волны (Phase A).
- `step4_wave1_batch1_phaseA_backlog_v1.md` - рабочий backlog по подготовке кода и gate-этапам Batch-1.
- `domain_card_template_v1.md` - шаблон описания домена для repeatable delivery.
@@ -2,7 +2,7 @@
Дата: `2026-04-02`
Домен: `general_batch1_foundation`
Статус: `active` (Phase A prepared, Phase B runtime intents implemented, Phase C pending)
Статус: `closed` (Phase A/B/C закрыты, domain gate PASS)
Владелец: `Address Runtime Team`
## 1. Scope
@@ -152,3 +152,4 @@ Global gate:
- `2026-04-02` — реализованы `counterparty_population_and_roles` и `contract_usage_overview`; targeted live-pack `Q6/Q7/Q28` прошел `strict factual 9/9` (`2026-04-02_Address_Batch1_NextPack_Q6_Q7_Q28`).
- 2026-04-02 - hotfix slang count routing: скока/скок поставщиков|заказчиков стабильно маршрутизируются в counterparty_population_and_roles; targeted live-pack 2026-04-02_Address_SupplierCount_Targeted_AfterFix прошел strict factual 4/4.
- 2026-04-02 - hotfix follow-up slang variant: скок клиентов now maps to counterparty_population_and_roles; targeted live-pack 2026-04-02_Address_SupplierClient_Followup_AfterFix passed strict factual 3/3.
- 2026-04-08 - статус карточки обновлен на `closed` после live-gate (`strict 28/28`) и global comparator PASS; следующий шаг вынесен в Batch-2 lifecycle.
@@ -0,0 +1,138 @@
# Domain Card — general_batch2_lifecycle V1
Дата: `2026-04-08`
Домен: `general_batch2_lifecycle`
Статус: `active` (Phase A стартован)
Владелец: `Address Runtime Team`
## 1. Scope
Кратко: домен закрывает lifecycle-вопросы общего домена (`Q8..Q13 + Q26 + Q27 + Q31 + Q32`) и готовит единый рельсовый контракт перед Phase B.
In-scope intents:
1. `counterparty_activity_lifecycle`
2. `contract_usage_overview` (для stale contract слоя)
3. `contract_usage_and_value` (для multi-contract структуры)
Out-of-scope:
1. value-ranking блок (`Q14..Q25 + Q29 + Q30`) — закрыт отдельным Batch-3.
2. debt/aging/risk блок (`Q33+`) — отдельные Batch-4/Batch-5.
3. `COMPOUND_FACTUAL_QUERY` multi-step execution вне явного lifecycle контракта.
## 2. Intent Contract
### 2.1 `counterparty_activity_lifecycle`
- `query_shape`: `FACTUAL_LIST`
- `required_filters`: `[]`
- `optional_filters`: `[period_from, period_to, as_of_date, organization, limit, sort]`
- `resolver_signals`: `активны`, `новые`, `исчезли`, `только один раз`, `дольше всех`, `регулярные`, `эпизодические`, `давно не использовались`
- `ambiguity_rules`: если есть сигналы lifecycle + role split, приоритет у lifecycle (не у `counterparty_population_and_roles`)
- `fallback_policy`: при отсутствии явного периода используется all-time окно; factual без якорей разрешен
### 2.2 `contract_usage_overview`
- `query_shape`: `FACTUAL_SUMMARY`
- `required_filters`: `[]`
- `optional_filters`: `[period_from, period_to, as_of_date, organization, limit]`
- `resolver_signals`: `договоры не использовались`, `stale contracts`, `мертвые договоры`
- `ambiguity_rules`: если вопрос про общий статус использования договоров без топ-ранжирования, приоритет у `contract_usage_overview`
- `fallback_policy`: если stale-метрика не подтверждается, допустим `LIMITED_WITH_REASON` без ложного factual
### 2.3 `contract_usage_and_value`
- `query_shape`: `FACTUAL_LIST`
- `required_filters`: `[]`
- `optional_filters`: `[period_from, period_to, as_of_date, organization, limit, sort]`
- `resolver_signals`: `несколько договоров у контрагента`, `мультидоговорные`, `какие договоры активны`
- `ambiguity_rules`: multi-contract структура имеет приоритет над anchor-required lookup intent-ами
- `fallback_policy`: при невозможности построить структуру выдаем `LIMITED_WITH_REASON`, без перехода в broad document list
## 3. Recipe Mapping
Связка `intent -> recipe_id` должна совпадать с runtime catalog (`addressRecipeCatalog.ts`).
| intent | recipe_id | mcp_method | expected_statuses |
| --- | --- | --- | --- |
| `counterparty_activity_lifecycle` | `address_counterparty_activity_lifecycle_v1` | `POST /api/execute_query` | `matched_non_empty`, `no_raw_rows`, `materialized_but_not_matched` |
| `contract_usage_overview` | `address_contract_usage_overview_v1` | `POST /api/execute_query` | `matched_non_empty`, `no_raw_rows`, `materialized_but_not_matched` |
| `contract_usage_and_value` | `address_contract_usage_and_value_v1` | `POST /api/execute_query` | `matched_non_empty`, `no_raw_rows`, `materialized_but_not_matched` |
## 4. Anchor and Resolver Rules
- `anchor_type`: `period`, `organization`, optional `counterparty` for follow-up context
- `anchor_resolution_order`: explicit period -> follow-up period -> all-time default
- `min_confidence`: `medium`
- `unresolved_behavior`: при unresolved lifecycle сегменте отдавать `LIMITED_WITH_REASON` (`unsupported`/`empty_match`) без псевдо-factual
## 5. Limited Reasons (taxonomy)
Разрешенные категории для домена:
1. `empty_match`
2. `unsupported`
3. `execution_error`
4. `missing_anchor` (только для реального anchor-required маршрута)
Запрещено:
- подменять lifecycle intent на lookup intent с обязательным якорем без явного сигнала пользователя;
- выдавать broad fallback list в вопросах про lifecycle сегментацию.
## 6. Test Coverage
Unit:
1. resolver positives/negatives для `Q8..Q13`, `Q26`, `Q27`, `Q31`, `Q32`
2. приоритет lifecycle над population-role split
3. follow-up period switch (`2020 -> 2021`) для lifecycle цепочек
4. contract lifecycle phrase routing без обязательного якоря
Integration:
1. recipe selection на lifecycle/contract-lifecycle фразах
2. execution status mapping (`matched_non_empty`, `unsupported`, `empty_match`)
3. debug payload completeness
Live acceptance:
1. canonical вопросы
2. noisy/slang вопросы
3. follow-up chains
## 7. Gate Criteria
Domain gate:
- `strict_pass(route)=100%`
- `false_factual_rate=0`
- `execution_error_rate=0`
Global gate:
- baseline stress не ниже эталона `102/102`
- baseline follow-up не ниже эталона `25/25`
## 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.
## 9. Artifacts
Обязательные артефакты:
1. `domain_general_batch2_lifecycle_card_v1.md`
2. `question_sets/domain_general_batch2_lifecycle_acceptance_2026-04-08_phaseA.json`
3. `wave1_batch2_phaseA_probe_report_2026-04-08.md`
4. `step4_wave1_batch2_phaseA_backlog_v1.md`
5. `runs/<run_id>/run_summary.json`
6. `runs/<run_id>/full_live_results.json`
## 10. Change Log
- `2026-04-08` — создана карточка домена Batch-2 lifecycle и зафиксирован contract scope.
- `2026-04-08` — добавлен Phase-A acceptance набор `Q8..Q13 + Q26 + Q27 + Q31 + Q32`.
@@ -1,7 +1,7 @@
# Global Execution Checklist V1
Дата старта: 2026-04-02
Последнее обновление: 2026-04-02
Последнее обновление: 2026-04-08
Цель: последовательное закрытие Address Query V1 без архитектурного дрейфа и без company-specific хардкода.
## Правило выполнения
@@ -89,12 +89,27 @@
- `domain_general_batch1_foundation_card_v1.md`
- `domain_general_batch1_acceptance_2026-04-02_phaseA.json`
- `step4_wave1_batch1_phaseA_backlog_v1.md`
- [ ] Phase A закрыт (intent naming freeze + negative cases).
- [ ] Phase B закрыт (resolver/types/recipes/compose для Batch-1).
- [ ] Phase C закрыт (domain gate + global non-regression gate).
- [x] Phase A закрыт (intent naming freeze + acceptance set + domain card).
- [x] Phase B закрыт (resolver/types/recipes/compose для Batch-1).
- [x] Phase C закрыт (domain gate + global non-regression gate).
- [x] Phase B.1 начат: реализован первый Batch-1 intent `period_coverage_profile` (resolver + types + recipe + compose), unit/build green.
- [x] Phase B.1 progress: реализован второй Batch-1 intent `document_type_and_account_section_profile` (resolver + classifier + recipe + compose), unit/build green (`107 passed`).
#### Step-4 Wave-1 (general domain, Batch-2 lifecycle: Q8..Q13 + Q26 + Q27 + Q31 + Q32)
- [x] Phase A стартован:
- `domain_general_batch2_lifecycle_card_v1.md`
- `domain_general_batch2_lifecycle_acceptance_2026-04-08_phaseA.json`
- `wave1_batch2_phaseA_probe_report_2026-04-08.md`
- `step4_wave1_batch2_phaseA_backlog_v1.md`
- [ ] Phase A закрыт (negative-пары + final contract freeze).
- [ ] Phase B закрыт (resolver/decompose/compose hardening для lifecycle gap-ов).
- [x] Phase B progress:
- resolver hardening по `Q12/Q13/Q26/Q27/Q31/Q32`
- test gate: `addressQueryRuntimeM23.test.ts = 210/210`, `build=PASS`
- live hotpass: `wave1_batch2_phaseB_resolver_hotpass_2026-04-08.md` (`route match 6/6`)
- [ ] Phase C закрыт (Batch-2 domain gate + global comparator PASS).
## Документация (code-sync)
- [x] Базовые docs синхронизированы с текущим runtime-кодом (`README`, `address_scenario_matrix`, `query_recipes`, `runtime_readiness_matrix`, `address_runtime_contracts`, `runtime_integration_plan`).
@@ -0,0 +1,51 @@
# ADDRESS Project Status Rails Graph (2026-04-08)
Дата среза: 2026-04-08
Контур: `question_mode=address_query`
## Граф статуса
```mermaid
flowchart LR
A["Step-0 Pre-Prod Rails<br/>CLOSED"]
B["Wave-1 Runtime Prep (B1+B3)<br/>intents + tests"]
C["Domain Live Gates<br/>B1: 28/28 PASS<br/>B3: 33/33 PASS"]
D["Global Nightly Comparator (R6)<br/>102/102 + 25/25 PASS"]
E["Auto-nightly Incident<br/>2026-04-08 09:52<br/>MCP fetch failed"]
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"]
J["Operational Rail<br/>Scheduler: Disabled<br/>Manual nightly only"]
A --> B --> C --> D --> H --> I --> K
D --> E --> F --> G --> H
E --> J
H --> J
```
## Контрольные артефакты
- Global comparator PASS (reference):
`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`
- Master checker (entry to Batch-2):
`docs/ADDRESS/address_query/step4_wave1_batch1_master_checker_v1.md`
- Batch-2 Phase-A artifacts:
- `docs/ADDRESS/address_query/domain_general_batch2_lifecycle_card_v1.md`
- `docs/ADDRESS/question_sets/domain_general_batch2_lifecycle_acceptance_2026-04-08_phaseA.json`
- `docs/ADDRESS/address_query/wave1_batch2_phaseA_probe_report_2026-04-08.md`
- `docs/ADDRESS/address_query/step4_wave1_batch2_phaseA_backlog_v1.md`
- Batch-2 Phase-B hotpass (resolver drift fix):
- `docs/ADDRESS/address_query/wave1_batch2_phaseB_resolver_hotpass_2026-04-08.md`
## Коротко по статусу
- Функциональные гейты закрыты.
- Точечный 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.
@@ -1,6 +1,6 @@
# Runtime Readiness Matrix V1 (Code Sync)
Дата: 2026-04-03
Дата: 2026-04-08
Формат: `scenario -> structural_readiness -> runtime_readiness -> blocker`
@@ -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 | lifecycle-сценарии требуют отдельного доменного live-pack (Batch-2) | собрать Batch-2 acceptance и закрыть route gate |
| 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-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 |
@@ -67,6 +67,14 @@
- авто-запуск nightly из Task Scheduler дал `overall_ok=false` из-за инфраструктурного `MCP fetch failed: fetch failed` в части вызовов, не как функциональный откат доменных intent-ов.
- ручной контрольный nightly (`2026-04-08 10:29`) показал точечный flake в `AQ-P0-07` семействе (`S019`: `materialized_but_not_anchor_matched`), при этом `followup_25` остался `25/25`.
- повторный контрольный nightly (`2026-04-08 10:51`) закрыт в `PASS`: `stress_102=102/102`, `followup_25=25/25`, comparator `PASS` (`docs/ADDRESS/runs/2026-04-08_Address_Nightly_Regression_2026-04-08_10-51-20/nightly_summary.json`).
- Batch-2 lifecycle Phase-A probe (2026-04-08):
- report: `docs/ADDRESS/address_query/wave1_batch2_phaseA_probe_report_2026-04-08.md`
- baseline coverage: `semantic_match 4/10`
- основные gap-и: `Q12/Q13/Q27` -> `unsupported`, `Q26` -> drift в `counterparty_population_and_roles`, `Q31/Q32` -> drift в anchor-required lookup ветки.
- 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`.
- `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`
@@ -62,6 +62,15 @@ Batch-1 можно переводить в runtime только после за
- [x] Контрольный nightly recheck (`2026-04-08 10:51`) закрыт в `PASS`
run: `docs/ADDRESS/runs/2026-04-08_Address_Nightly_Regression_2026-04-08_10-51-20/nightly_summary.json`
детали: `stress_102=102/102`, `followup_25=25/25`, comparator PASS.
- [x] Batch-2 lifecycle Phase A стартован:
- `domain_general_batch2_lifecycle_card_v1.md`
- `docs/ADDRESS/question_sets/domain_general_batch2_lifecycle_acceptance_2026-04-08_phaseA.json`
- `wave1_batch2_phaseA_probe_report_2026-04-08.md`
- `step4_wave1_batch2_phaseA_backlog_v1.md`
- [x] Batch-2 Phase-B progress:
- resolver drift по `Q12/Q13/Q26/Q27/Q31/Q32` закрыт
- `addressQueryRuntimeM23.test.ts = 210/210`, `build=PASS`
- live hotpass `wave1_batch2_phaseB_resolver_hotpass_2026-04-08.md` (`route match 6/6`)
- [x] Phase B закрыт.
- [x] Phase C закрыт.
@@ -69,4 +78,4 @@ Batch-1 можно переводить в runtime только после за
1. Начинать можно, но строго по фазам выше.
2. Прямое включение Batch-1 intents в production-path без Phase B/C — запрещено.
3. Точка входа в работу: контрольный nightly уже зафиксирован в `PASS`, следующий шаг — старт Batch-2 lifecycle (`Q8..Q13 + Q26 + Q27 + Q31 + Q32`) по тем же gate-правилам.
3. Точка входа в работу: Batch-2 уже в `Phase A active`; следующий шаг — выполнить Batch-2 Phase B и закрыть domain gate/глобальный comparator.
@@ -1,9 +1,12 @@
# Step-4 Wave-1 Batch-1 — Phase A/B Backlog V1
Дата: 2026-04-02
Статус: `active`
Статус: `closed` (historical backlog, фактическое закрытие Batch-1/Batch-3 зафиксировано в gate reports)
Scope: `Q1..Q7 + Q28`
> Примечание на 2026-04-08: файл сохранен как исторический backlog старта Wave-1.
> Текущий рабочий backlog для новой волны: `step4_wave1_batch2_phaseA_backlog_v1.md`.
## 1. Phase A (Design/Contract) — старт
- [x] Зафиксирован master checker: `step4_wave1_batch1_master_checker_v1.md`
@@ -0,0 +1,83 @@
# Step-4 Wave-1 Batch-2 — Phase A/B Backlog V1
Дата: 2026-04-08
Статус: `active`
Scope: `Q8..Q13 + Q26 + Q27 + Q31 + Q32`
## 1. Phase A (Design/Contract) — статус
- [x] Зафиксирован вход в Batch-2 из master checker: `step4_wave1_batch1_master_checker_v1.md`
- [x] Зафиксирована domain card: `domain_general_batch2_lifecycle_card_v1.md`
- [x] Сформирован acceptance набор: `domain_general_batch2_lifecycle_acceptance_2026-04-08_phaseA.json`
- [x] Выполнен Phase-A probe и зафиксированы gap-ы: `wave1_batch2_phaseA_probe_report_2026-04-08.md`
- [ ] Добавить explicit negative-пары (близкие формулировки для anti-drift на lookup intent-ы)
## 2. Phase B (Runtime Prep) — задачи по коду
### 2.1 Resolver / Decompose
- [x] `llm_normalizer/backend/src/services/addressIntentResolver.ts`
Добавить сигналы lifecycle для `Q12/Q13/Q27`:
- `только один раз`, `single activity`, `one-time`
- `дольше всех`, `longest-running`
- `давно не использовались` (supplier lifecycle)
- [x] `llm_normalizer/backend/src/services/addressIntentResolver.ts`
Зафиксировать priority rule:
`counterparty_activity_lifecycle` > `counterparty_population_and_roles`
для сегментационных формулировок (`регулярные/эпизодические`, `исчезли`, `новые`, `long-term`).
- [x] `llm_normalizer/backend/src/services/addressIntentResolver.ts`
Добавить 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`
Усилить follow-up carryover для Batch-2 chain:
`а кто новые`, `а кто потом исчез`, `а теперь за 2021`, `и какие договоры активны`.
### 2.2 Filter / Recipe / Compose
- [ ] `llm_normalizer/backend/src/services/addressFilterExtractor.ts`
Нормализовать lifecycle period cues (`после <год>`, `за <год>`, `впервые в <год>`).
- [ ] `llm_normalizer/backend/src/services/address_runtime/composeStage.ts`
Добавить стабильные summary-профили для:
- new counterparties
- lost counterparties
- one-time counterparties
- long-running counterparties
- regular vs episodic suppliers
- stale suppliers/contracts
- [ ] `llm_normalizer/backend/src/services/address_runtime/composeStage.ts`
Для `contract_usage_and_value` добавить блок multi-contract структуры:
`контрагент -> количество договоров -> активные/неактивные`.
### 2.3 Tests / Gates
- [x] `llm_normalizer/backend/tests/addressQueryRuntimeM23.test.ts`
Добавить regression-кейсы под `Q12/Q13/Q26/Q27/Q31/Q32`.
- [ ] `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`
- `npm --prefix llm_normalizer/backend run build`
- [x] Быстрый live hotpass по проблемным маршрутам:
- report: `wave1_batch2_phaseB_resolver_hotpass_2026-04-08.md`
- result: `route match 6/6`
## 3. Phase C (Gate) — критерии закрытия
- [ ] 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:
- `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`
## 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.
@@ -0,0 +1,62 @@
# Wave-1 Batch-2 Phase-A Probe Report
Дата: 2026-04-08
Контур: `question_mode=address_query`
Цель: зафиксировать текущий фактический coverage Batch-2 перед Phase-B implementation.
## 1. Probe set
Проверены 10 representative-вопросов:
- `Q8..Q13` (customer lifecycle)
- `Q26..Q27` (supplier lifecycle)
- `Q31..Q32` (contract lifecycle/structure)
## 2. Контур прогона
Probe выполнен через временный `tsx` harness к `AddressQueryService` с 10 representative-кейсами.
Временный script удален после фиксации результата в отчете.
## 3. Результат
- `semantic_match = 4/10`
- `route coverage = partial`
- `execution_error = 0` (в probe-срезе)
## 4. Детализация по кейсам
| Q | expected_intent | detected_intent | status | note |
| --- | --- | --- | --- | --- |
| Q8 | `counterparty_activity_lifecycle` | `counterparty_activity_lifecycle` | PASS | factual list |
| Q9 | `counterparty_activity_lifecycle` | `counterparty_activity_lifecycle` | PASS | factual list |
| Q10 | `counterparty_activity_lifecycle` | `counterparty_activity_lifecycle` | PASS | factual list |
| Q11 | `counterparty_activity_lifecycle` | `counterparty_activity_lifecycle` | PASS | factual list |
| Q12 | `counterparty_activity_lifecycle` | `unknown` | FAIL | `unsupported` |
| Q13 | `counterparty_activity_lifecycle` | `unknown` | FAIL | `unsupported` |
| Q26 | `counterparty_activity_lifecycle` | `counterparty_population_and_roles` | FAIL | role-split intent hijack |
| Q27 | `counterparty_activity_lifecycle` | `unknown` | FAIL | `unsupported` |
| Q31 | `contract_usage_overview` | `list_documents_by_contract` | FAIL | `missing_anchor` drift to lookup |
| Q32 | `contract_usage_and_value` | `list_contracts_by_counterparty` | FAIL | `missing_anchor` drift to lookup |
## 5. Выводы для Phase B
1. Lifecycle клиентского слоя (`Q8..Q11`) базово работает.
2. Не закрыты важные lifecycle сегменты:
`one-time`, `longest-running`, `stale suppliers`.
3. Есть конфликт маршрутов между lifecycle intent-ом и population/lookup intent-ами:
- `Q26` уходит в `counterparty_population_and_roles`;
- `Q31/Q32` уходит в anchor-required lookup ветки.
## 6. Приоритеты исправлений
1. Resolver-сигналы для `Q12/Q13/Q27` -> `counterparty_activity_lifecycle`.
2. Resolver-priority rule: lifecycle segmentation > role population split.
3. Contract lifecycle routing:
- `stale contracts` -> `contract_usage_overview`;
- `multi-contract active map` -> `contract_usage_and_value`.
4. Follow-up carryover для lifecycle chain без обязательных anchor-фильтров.
## 7. Решение
`READY_FOR_PHASE_B_IMPLEMENTATION`
Фаза A закрыта как design/probe baseline; следующий шаг — runtime hardening и domain live-gate Batch-2.
@@ -0,0 +1,38 @@
# Wave-1 Batch-2 Phase-B Resolver Hotpass
Дата: 2026-04-08
Контур: `question_mode=address_query`
Цель: подтвердить устранение resolver drift по критичным Batch-2 lifecycle формулировкам.
## 1. Проверочный набор
Проверены бывшие проблемные формулировки:
1. `Q12` one-time counterparties
2. `Q13` longest-running counterparties
3. `Q26` regular vs episodic suppliers
4. `Q27` stale suppliers
5. `Q31` stale contracts
6. `Q32` multi-contract counterparties + active contracts
## 2. Факт результата
- `route match = 6/6`
- `reply_type = factual` по всем 6 кейсам
- `mcp_call_status = matched_non_empty` по всем 6 кейсам
## 3. Детализация
| case | detected_intent | selected_recipe | status |
| --- | --- | --- | --- |
| Q12 one-time | `counterparty_activity_lifecycle` | `address_counterparty_activity_lifecycle_v1` | PASS |
| Q13 longest-running | `counterparty_activity_lifecycle` | `address_counterparty_activity_lifecycle_v1` | PASS |
| Q26 regular/episodic | `counterparty_activity_lifecycle` | `address_counterparty_activity_lifecycle_v1` | PASS |
| Q27 stale suppliers | `counterparty_activity_lifecycle` | `address_counterparty_activity_lifecycle_v1` | PASS |
| Q31 stale contracts | `contract_usage_overview` | `address_contract_usage_overview_v1` | PASS |
| Q32 multi-contract active map | `contract_usage_and_value` | `address_contract_usage_and_value_v1` | PASS |
## 4. Примечание
Это не финальный domain gate Batch-2.
Следующий шаг: закрыть оставшиеся Phase-B задачи (follow-up carryover + compose нюансы), затем прогнать полный Batch-2 acceptance pack и global comparator.