АДРЕСНЫЙ РЕЖИМ - Batch-2 (Phase A/B): стабилизация LLM-маршрутизации жизненного цикла контрагентов и договоров + актуализация документации
This commit is contained in:
@@ -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.
|
||||
Reference in New Issue
Block a user