АДРЕСНЫЙ РЕЖИМ - локальная подель на декомпозе

This commit is contained in:
2026-04-01 17:55:02 +03:00
parent 4060a5e575
commit 4d59672576
90 changed files with 19595 additions and 785 deletions
+585
View File
@@ -0,0 +1,585 @@
# Assistant conversation export
session_id: asst--iAIydc_EC
export_mode: technical
exported_at: 2026-04-01T12:33:31.795Z
## 1. user
message_id: msg-2d0MoaXT6W
created_at: 2026-04-01T12:32:28.939Z
reply_type: n/a
Какой остаток по счету 60 на дату 2020-07-31?
## 2. assistant
message_id: msg-MVrv4gqMpT
created_at: 2026-04-01T12:32:29.818Z
reply_type: partial_coverage
trace_id: address-Q_QdUVA19F
В live-данных по текущему фильтру записи не найдены.
Причина: по выбранным фильтрам в live-выборке нет строк.
Что нужно уточнить: уточните период, контрагента, договор или снимите часть фильтров.
### technical_debug_payload_json
```json
{
"trace_id": "address-Q_QdUVA19F",
"prompt_version": "address_query_runtime_v1",
"schema_version": "address_query_runtime_v1",
"fallback_type": "partial",
"route_summary": null,
"fragments": [],
"requirements_extracted": [],
"coverage_report": {
"requirements_total": 0,
"requirements_covered": 0,
"requirements_uncovered": [],
"requirements_partially_covered": [],
"clarification_needed_for": [],
"out_of_scope_requirements": []
},
"routes": [],
"retrieval_status": [],
"retrieval_results": [],
"answer_grounding_check": {
"status": "partial",
"route_subject_match": true,
"missing_requirements": [],
"reasons": [
"address_action_detected",
"address_entity_detected",
"aggregate_signal_detected",
"account_balance_signal_detected"
],
"why_included_summary": [],
"selection_reason_summary": []
},
"dropped_intent_segments": [],
"detected_mode": "address_query",
"detected_mode_confidence": "high",
"query_shape": "AGGREGATE_LOOKUP",
"query_shape_confidence": "high",
"detected_intent": "account_balance_snapshot",
"detected_intent_confidence": "high",
"extracted_filters": {
"sort": "period_desc",
"limit": 20,
"account": "60",
"as_of_date": "2020-07-31"
},
"missing_required_filters": [],
"selected_recipe": "address_movements_account_snapshot_v1",
"mcp_call_status_legacy": "raw_rows_received_but_not_materialized",
"account_scope_mode": "strict",
"account_scope_fallback_applied": false,
"anchor_type": "account",
"anchor_value_raw": "60",
"anchor_value_resolved": "60",
"resolver_confidence": "high",
"ambiguity_count": 0,
"match_failure_stage": "none",
"match_failure_reason": null,
"mcp_call_status": "raw_rows_received_but_not_materialized",
"rows_fetched": 20,
"raw_rows_received": 20,
"rows_after_account_scope": 0,
"rows_after_recipe_filter": 0,
"rows_materialized": 0,
"rows_matched": 0,
"raw_row_keys_sample": [
"Период",
"Регистратор",
"СчетДт",
"СчетКт",
"Сумма",
"Period",
"Registrator",
"AccountDt",
"AccountKt",
"Amount"
],
"materialization_drop_reason": "dropped_by_account_scope_filter",
"account_token_raw": "60",
"account_token_normalized": "60",
"account_scope_fields_checked": [
"account_dt",
"account_kt",
"registrator",
"analytics"
],
"account_scope_match_strategy": "account_code_regex_plus_alias_map_v1",
"account_scope_drop_reason": "no_rows_after_scope_filter",
"runtime_readiness": "LIVE_QUERYABLE_WITH_LIMITS",
"limited_reason_category": "empty_match",
"response_type": "LIMITED_WITH_REASON",
"answer_structure_v11": null,
"investigation_state_snapshot": null,
"normalized": null,
"normalizer_output": null
}
```
## 3. user
message_id: msg-tPODcsFT2j
created_at: 2026-04-01T12:32:43.787Z
reply_type: n/a
Какой остаток по счету 76 на дату 2020-12-31?
## 4. assistant
message_id: msg-sbyXymS8Tu
created_at: 2026-04-01T12:32:44.036Z
reply_type: partial_coverage
trace_id: address-tWfGlq9Bif
В live-данных по текущему фильтру записи не найдены.
Причина: по выбранным фильтрам в live-выборке нет строк.
Что нужно уточнить: уточните период, контрагента, договор или снимите часть фильтров.
### technical_debug_payload_json
```json
{
"trace_id": "address-tWfGlq9Bif",
"prompt_version": "address_query_runtime_v1",
"schema_version": "address_query_runtime_v1",
"fallback_type": "partial",
"route_summary": null,
"fragments": [],
"requirements_extracted": [],
"coverage_report": {
"requirements_total": 0,
"requirements_covered": 0,
"requirements_uncovered": [],
"requirements_partially_covered": [],
"clarification_needed_for": [],
"out_of_scope_requirements": []
},
"routes": [],
"retrieval_status": [],
"retrieval_results": [],
"answer_grounding_check": {
"status": "partial",
"route_subject_match": true,
"missing_requirements": [],
"reasons": [
"address_action_detected",
"address_entity_detected",
"aggregate_signal_detected",
"account_balance_signal_detected"
],
"why_included_summary": [],
"selection_reason_summary": []
},
"dropped_intent_segments": [],
"detected_mode": "address_query",
"detected_mode_confidence": "high",
"query_shape": "AGGREGATE_LOOKUP",
"query_shape_confidence": "high",
"detected_intent": "account_balance_snapshot",
"detected_intent_confidence": "high",
"extracted_filters": {
"sort": "period_desc",
"limit": 20,
"account": "76",
"as_of_date": "2020-12-31"
},
"missing_required_filters": [],
"selected_recipe": "address_movements_account_snapshot_v1",
"mcp_call_status_legacy": "raw_rows_received_but_not_materialized",
"account_scope_mode": "strict",
"account_scope_fallback_applied": false,
"anchor_type": "account",
"anchor_value_raw": "76",
"anchor_value_resolved": "76",
"resolver_confidence": "high",
"ambiguity_count": 0,
"match_failure_stage": "none",
"match_failure_reason": null,
"mcp_call_status": "raw_rows_received_but_not_materialized",
"rows_fetched": 20,
"raw_rows_received": 20,
"rows_after_account_scope": 0,
"rows_after_recipe_filter": 0,
"rows_materialized": 0,
"rows_matched": 0,
"raw_row_keys_sample": [
"Период",
"Регистратор",
"СчетДт",
"СчетКт",
"Сумма",
"Period",
"Registrator",
"AccountDt",
"AccountKt",
"Amount"
],
"materialization_drop_reason": "dropped_by_account_scope_filter",
"account_token_raw": "76",
"account_token_normalized": "76",
"account_scope_fields_checked": [
"account_dt",
"account_kt",
"registrator",
"analytics"
],
"account_scope_match_strategy": "account_code_regex_plus_alias_map_v1",
"account_scope_drop_reason": "no_rows_after_scope_filter",
"runtime_readiness": "LIVE_QUERYABLE_WITH_LIMITS",
"limited_reason_category": "empty_match",
"response_type": "LIMITED_WITH_REASON",
"answer_structure_v11": null,
"investigation_state_snapshot": null,
"normalized": null,
"normalizer_output": null
}
```
## 5. user
message_id: msg-_0vMruaosw
created_at: 2026-04-01T12:32:52.525Z
reply_type: n/a
Какие документы формируют остаток по счету 62 на дату 2020-07-31?
## 6. assistant
message_id: msg-vDgQf1_P6u
created_at: 2026-04-01T12:32:53.206Z
reply_type: partial_coverage
trace_id: address-D2al1c11rV
В live-данных по текущему фильтру записи не найдены.
Причина: по выбранным фильтрам в live-выборке нет строк.
Что нужно уточнить: уточните период, контрагента, договор или снимите часть фильтров.
### technical_debug_payload_json
```json
{
"trace_id": "address-D2al1c11rV",
"prompt_version": "address_query_runtime_v1",
"schema_version": "address_query_runtime_v1",
"fallback_type": "partial",
"route_summary": null,
"fragments": [],
"requirements_extracted": [],
"coverage_report": {
"requirements_total": 0,
"requirements_covered": 0,
"requirements_uncovered": [],
"requirements_partially_covered": [],
"clarification_needed_for": [],
"out_of_scope_requirements": []
},
"routes": [],
"retrieval_status": [],
"retrieval_results": [],
"answer_grounding_check": {
"status": "partial",
"route_subject_match": true,
"missing_requirements": [],
"reasons": [
"address_action_detected",
"address_entity_detected",
"drilldown_signal_detected",
"documents_forming_balance_signal_detected"
],
"why_included_summary": [],
"selection_reason_summary": []
},
"dropped_intent_segments": [],
"detected_mode": "address_query",
"detected_mode_confidence": "high",
"query_shape": "DRILLDOWN_REQUEST",
"query_shape_confidence": "high",
"detected_intent": "documents_forming_balance",
"detected_intent_confidence": "high",
"extracted_filters": {
"sort": "period_desc",
"limit": 20,
"account": "62",
"as_of_date": "2020-07-31"
},
"missing_required_filters": [],
"selected_recipe": "address_documents_forming_balance_v1",
"mcp_call_status_legacy": "raw_rows_received_but_not_materialized",
"account_scope_mode": "strict",
"account_scope_fallback_applied": false,
"anchor_type": "account",
"anchor_value_raw": "62",
"anchor_value_resolved": "62",
"resolver_confidence": "high",
"ambiguity_count": 0,
"match_failure_stage": "none",
"match_failure_reason": null,
"mcp_call_status": "raw_rows_received_but_not_materialized",
"rows_fetched": 20,
"raw_rows_received": 20,
"rows_after_account_scope": 0,
"rows_after_recipe_filter": 0,
"rows_materialized": 0,
"rows_matched": 0,
"raw_row_keys_sample": [
"Период",
"Регистратор",
"СчетДт",
"СчетКт",
"Сумма",
"Period",
"Registrator",
"AccountDt",
"AccountKt",
"Amount"
],
"materialization_drop_reason": "dropped_by_account_scope_filter",
"account_token_raw": "62",
"account_token_normalized": "62",
"account_scope_fields_checked": [
"account_dt",
"account_kt",
"registrator",
"analytics"
],
"account_scope_match_strategy": "account_code_regex_plus_alias_map_v1",
"account_scope_drop_reason": "no_rows_after_scope_filter",
"runtime_readiness": "LIVE_QUERYABLE_WITH_LIMITS",
"limited_reason_category": "empty_match",
"response_type": "LIMITED_WITH_REASON",
"answer_structure_v11": null,
"investigation_state_snapshot": null,
"normalized": null,
"normalizer_output": null
}
```
## 7. user
message_id: msg-n4DAnggWmb
created_at: 2026-04-01T12:33:02.902Z
reply_type: n/a
Что формирует остаток по счету 76 на дату 2020-12-31?
## 8. assistant
message_id: msg-46fXowQ8cs
created_at: 2026-04-01T12:33:03.352Z
reply_type: partial_coverage
trace_id: address-o7q7qa-FOF
В live-данных по текущему фильтру записи не найдены.
Причина: по выбранным фильтрам в live-выборке нет строк.
Что нужно уточнить: уточните период, контрагента, договор или снимите часть фильтров.
### technical_debug_payload_json
```json
{
"trace_id": "address-o7q7qa-FOF",
"prompt_version": "address_query_runtime_v1",
"schema_version": "address_query_runtime_v1",
"fallback_type": "partial",
"route_summary": null,
"fragments": [],
"requirements_extracted": [],
"coverage_report": {
"requirements_total": 0,
"requirements_covered": 0,
"requirements_uncovered": [],
"requirements_partially_covered": [],
"clarification_needed_for": [],
"out_of_scope_requirements": []
},
"routes": [],
"retrieval_status": [],
"retrieval_results": [],
"answer_grounding_check": {
"status": "partial",
"route_subject_match": true,
"missing_requirements": [],
"reasons": [
"address_action_detected",
"address_entity_detected",
"aggregate_signal_detected",
"account_balance_signal_detected"
],
"why_included_summary": [],
"selection_reason_summary": []
},
"dropped_intent_segments": [],
"detected_mode": "address_query",
"detected_mode_confidence": "high",
"query_shape": "AGGREGATE_LOOKUP",
"query_shape_confidence": "high",
"detected_intent": "account_balance_snapshot",
"detected_intent_confidence": "high",
"extracted_filters": {
"sort": "period_desc",
"limit": 20,
"account": "76",
"as_of_date": "2020-12-31"
},
"missing_required_filters": [],
"selected_recipe": "address_movements_account_snapshot_v1",
"mcp_call_status_legacy": "raw_rows_received_but_not_materialized",
"account_scope_mode": "strict",
"account_scope_fallback_applied": false,
"anchor_type": "account",
"anchor_value_raw": "76",
"anchor_value_resolved": "76",
"resolver_confidence": "high",
"ambiguity_count": 0,
"match_failure_stage": "none",
"match_failure_reason": null,
"mcp_call_status": "raw_rows_received_but_not_materialized",
"rows_fetched": 20,
"raw_rows_received": 20,
"rows_after_account_scope": 0,
"rows_after_recipe_filter": 0,
"rows_materialized": 0,
"rows_matched": 0,
"raw_row_keys_sample": [
"Период",
"Регистратор",
"СчетДт",
"СчетКт",
"Сумма",
"Period",
"Registrator",
"AccountDt",
"AccountKt",
"Amount"
],
"materialization_drop_reason": "dropped_by_account_scope_filter",
"account_token_raw": "76",
"account_token_normalized": "76",
"account_scope_fields_checked": [
"account_dt",
"account_kt",
"registrator",
"analytics"
],
"account_scope_match_strategy": "account_code_regex_plus_alias_map_v1",
"account_scope_drop_reason": "no_rows_after_scope_filter",
"runtime_readiness": "LIVE_QUERYABLE_WITH_LIMITS",
"limited_reason_category": "empty_match",
"response_type": "LIMITED_WITH_REASON",
"answer_structure_v11": null,
"investigation_state_snapshot": null,
"normalized": null,
"normalizer_output": null
}
```
## 9. user
message_id: msg-ATLBoTgwlD
created_at: 2026-04-01T12:33:20.966Z
reply_type: n/a
Покажи банковские операции по контрагенту СВК с 2020-07-01 по 2020-07-31
## 10. assistant
message_id: msg-p1biGQOTcr
created_at: 2026-04-01T12:33:21.620Z
reply_type: factual
trace_id: address-JwD-3OLHgc
Собран список банковских операций по контрагенту (live address lane).
Строк отобрано: 2.
1. 2020-07-30T12:00:00Z | Поступление на расчетный счет 00000000029 от 30.07.2020 12:00:00 | 0 / 0 | 20000 | аналитика: Группа СВК
2. 2020-07-27T12:00:00Z | Поступление на расчетный счет 00000000028 от 27.07.2020 12:00:00 | 0 / 0 | 40860 | аналитика: Группа СВК
### technical_debug_payload_json
```json
{
"trace_id": "address-JwD-3OLHgc",
"prompt_version": "address_query_runtime_v1",
"schema_version": "address_query_runtime_v1",
"fallback_type": "none",
"route_summary": null,
"fragments": [],
"requirements_extracted": [],
"coverage_report": {
"requirements_total": 0,
"requirements_covered": 0,
"requirements_uncovered": [],
"requirements_partially_covered": [],
"clarification_needed_for": [],
"out_of_scope_requirements": []
},
"routes": [],
"retrieval_status": [],
"retrieval_results": [],
"answer_grounding_check": {
"status": "grounded",
"route_subject_match": true,
"missing_requirements": [],
"reasons": [
"address_action_detected",
"address_entity_detected",
"object_signal_detected",
"bank_ops_by_counterparty_signal_detected"
],
"why_included_summary": [],
"selection_reason_summary": []
},
"dropped_intent_segments": [],
"detected_mode": "address_query",
"detected_mode_confidence": "high",
"query_shape": "OBJECT_LOOKUP",
"query_shape_confidence": "medium",
"detected_intent": "bank_operations_by_counterparty",
"detected_intent_confidence": "medium",
"extracted_filters": {
"sort": "period_desc",
"limit": 20,
"counterparty": "СВК",
"period_from": "2020-07-01",
"period_to": "2020-07-31"
},
"missing_required_filters": [],
"selected_recipe": "address_bank_operations_by_counterparty_v1",
"mcp_call_status_legacy": "matched_non_empty",
"account_scope_mode": "preferred",
"account_scope_fallback_applied": false,
"anchor_type": "counterparty",
"anchor_value_raw": "СВК",
"anchor_value_resolved": "Группа СВК",
"resolver_confidence": "medium",
"ambiguity_count": 0,
"match_failure_stage": "none",
"match_failure_reason": null,
"mcp_call_status": "matched_non_empty",
"rows_fetched": 19,
"raw_rows_received": 19,
"rows_after_account_scope": 3,
"rows_after_recipe_filter": 2,
"rows_materialized": 3,
"rows_matched": 2,
"raw_row_keys_sample": [
"Период",
"Регистратор",
"СчетДт",
"СчетКт",
"Сумма",
"Контрагент",
"Period",
"Registrator",
"Amount"
],
"materialization_drop_reason": "none",
"account_token_raw": null,
"account_token_normalized": null,
"account_scope_fields_checked": [
"account_dt",
"account_kt",
"registrator",
"analytics"
],
"account_scope_match_strategy": "account_code_regex_plus_alias_map_v1",
"account_scope_drop_reason": "not_applicable",
"runtime_readiness": "LIVE_QUERYABLE_WITH_LIMITS",
"limited_reason_category": null,
"response_type": "FACTUAL_LIST",
"answer_structure_v11": null,
"investigation_state_snapshot": null,
"normalized": null,
"normalizer_output": null
}
```
+2
View File
@@ -9,6 +9,7 @@
- `query_recipes_v1.md` - каталог фильтров и recipe-контракты.
- `runtime_integration_plan.md` - план встраивания `question_mode=address_query`.
- `address_runtime_contracts.md` - контракты runtime/debug/result для address lane.
- `address_architecture_contract_v1.md` - архитектурные границы `Decompose -> Resolve -> Execute -> Compose` и политика data-agnostic runtime.
- `runtime_readiness_matrix_v1.md` - матрица structural vs runtime readiness.
- `known_positive_live_suite_v1.md` - базовый template positive-evidence suite.
- `data_aware_positive_acceptance_suite_v1.md` - M2.3 canonical guide для curated live acceptance.
@@ -23,4 +24,5 @@
- `docs/ADDRESS/runs/2026-03-29_Address_Query_Runtime_V1_M2_3A_Stage_Diagnostic_Materialization/`
- `docs/ADDRESS/runs/2026-03-29_Address_Query_Runtime_V1_M2_3B_AccountScope_Mode_Tuning/`
- `docs/ADDRESS/runs/2026-03-29_Address_Query_Runtime_V1_M2_3C_Resolver_Filter_Tuning_And_AccountScope_Audit/`
- `docs/ADDRESS/runs/2026-04-01_Address_Query_Runtime_V1_M2_3D_Query_Variants_Expansion/`
@@ -0,0 +1,154 @@
# Address Architecture Contract V1
Дата: 2026-04-01
## 1) Зачем документ
Этот контракт фиксирует архитектурные границы `address_query`-контура, чтобы система оставалась переносимой между разными 1С-базами и не обрастала company-specific логикой.
Контракт обязателен для всех следующих инкрементов (`M2.4+`), рефакторов и новых intent/recipe.
## 2) Непересекаемые принципы
- `MCP/live-first`: основной источник фактов - live MCP.
- `MSP-only` в runtime: production path работает через MCP/MSP; snapshot - только controlled fallback.
- `snapshot` допускается только как явный fallback с reason code, а не как скрытая подмена.
- `runtime = data-agnostic`: никаких хардкодов под конкретную компанию.
- `acceptance = data-aware`: positive-кейсы можно подбирать на текущей базе только для проверки.
- `false_factual_rate = 0`: factual-ответ только при подтвержденных `rows_matched > 0`.
- `whitelist execution only`: никаких свободных NL->query генераторов.
## 3) Канонический pipeline
## Stage A: Decompose
Назначение: интерпретация текста вопроса, без обращения к данным компании.
Выход stage:
- `question_mode`
- `query_shape`
- `intent_candidates`
- `anchors_raw`
- `time_scope_raw`
- `filters_raw`
- `decomposition_plan` (опционально, для compound)
Запрещено на этапе Decompose:
- резолвить реальные объекты базы (контрагентов, договоры, документы);
- тянуть company-specific словари;
- генерировать запросы к 1С.
## Stage B: Resolve
Назначение: привязка raw-якорей к живым объектам через MCP.
Выход stage:
- `anchor_type`
- `anchor_value_raw`
- `anchor_value_resolved`
- `resolver_confidence`
- `ambiguity_count`
Правило:
- если якорь не подтвержден, runtime не выдумывает факт и идет в `LIMITED_WITH_REASON`.
## Stage C: Execute
Назначение: выполнение только через recipe whitelist.
Правила:
- `intent -> recipe_id` только из каталога;
- fixed `limit/sort/window` политика;
- `MCP` read-only;
- `MSP/MCP-only` execution path в production;
- snapshot fallback только явный.
Диагностика по стадиям:
- `no_raw_rows`
- `raw_rows_received_but_not_materialized`
- `materialized_but_not_anchor_matched`
- `materialized_but_filtered_out_by_recipe`
- `matched_non_empty`
- `error`
## Stage D: Compose
Назначение: финальный ответ строго по execution-результату.
Правила:
- factual только из `rows_matched`;
- если пусто - `LIMITED_WITH_REASON` с конкретной причиной;
- без reasoning-галлюцинаций и без “догадки по смыслу”.
## 4) Политика словарей
Разрешено (статически в коде):
- доменная типовая лексика (`доки`, `остаток`, `договор`, `дебиторка` и т.д.);
- правила парсинга дат/периодов/счетов;
- stop-слова и служебные alias-правила.
Запрещено:
- хранить в коде списки компаний, ИНН, договоров, документов конкретной базы;
- пополнять глобальные normalization-библиотеки живыми entity-именами;
- строить скрытые “памяти компании” вне runtime-сессии.
Допустимо:
- использовать runtime-сессионный контекст диалога (`followup context`) без записи в глобальные словари.
## 5) Критерии переносимости между компаниями
Система считается переносимой, если:
- новая база подключается без code change в resolver/intent logic;
- меняются только live-данные MCP, а не кодовые словари;
- question-bank остается валиден (с ожидаемыми различиями factual/limited по данным).
## 6) Антипаттерны (нельзя делать)
- Добавлять company alias map в `src/services/*` с реальными названиями контрагентов.
- Перекладывать проблему резолвинга в hardcoded `if company == ...`.
- Подмешивать deep-analysis ответ в address factual-блок без явного route handoff.
- Поднимать “временные” exceptions, которые ломают stage-контракт.
## 7) Техническая дисциплина кода
Новая логика должна ложиться в явные stage-модули:
- decompose
- resolve
- execute
- compose
- diagnostics
Если функция не относится к stage - это smell и повод к вынесению.
## 8) Как подключать LLM decompose
LLM на первом этапе нужен не для “знания компании”, а для структурной интерпретации вопроса.
LLM должен возвращать схему-stage-output:
- intent candidates
- shape
- anchor spans
- time scope
- filter hints
- confidence
Дальше все company-specific подтверждается только Resolver/Execute через MCP.
Итог:
- LLM decompose уменьшает NLP-хрупкость;
- не требует жирных живых словарей компаний;
- не нарушает data-agnostic принцип runtime.
@@ -2,11 +2,18 @@
Дата: 2026-03-29
Reference:
- `address_architecture_contract_v1.md` (architecture guardrails and stage boundaries).
## Runtime Policy
- Runtime lane is `data-agnostic`: no hardcoded counterparties/contracts/accounts from one concrete base.
- Acceptance lane is `data-aware`: positive cases are curated after exploratory live pass.
- Address lane remains MCP/live-first, whitelist-only, read-only.
- Runtime execution is MSP-only in production; snapshot usage is explicit fallback only.
- Canonical pipeline boundary: `Decompose -> Resolve -> Execute -> Compose` (no cross-stage leakage).
- LLM decompose stage interprets question structure only; company entities are resolved only in live resolver stage.
## Input Contract
@@ -10,6 +10,9 @@
- какие хвосты висят по договору
- у кого самый большой долг перед нами
- кому больше всего должны мы
- покажи дебиторку по контрагентам на дату
- покажи кредиторку по поставщикам на дату
- что висит по взаиморасчетам на текущую дату
## B. Счета и остатки
@@ -18,6 +21,9 @@
- что висит на 60 счете
- какие документы формируют остаток по 62
- оборот по 60 за период
- раскрой остаток по счету 62 до документов
- покажи сальдо по счету 60.01 на дату
- из чего сложился остаток по 76 счету
## C. Договоры
@@ -25,6 +31,9 @@
- что по договору 15/24
- есть ли долг по договору с Альфой
- какие документы связаны с этим договором
- покажи незакрытые договоры по контрагенту
- какие хвосты по договору №15/24 на дату
- есть ли открытые позиции по договору
## D. Документы
@@ -32,6 +41,9 @@
- покажи документы по договору за период
- найди документ по номеру и дате
- покажи проведенные документы по организации
- какие документы доступны по компании СВК за 2021 год
- выведи документы по клиенту Бета за июль 2020
- покажи документы по поставщику Альфа за весь период
## E. Bank/Payment lookup
@@ -39,24 +51,33 @@
- были ли поступления от Беты
- покажи списания с расчетного счета по договору
- найди оплату на сумму 150000
- покажи банковские операции по контрагенту Альфа
- покажи поступления и списания по клиенту Бета
- выведи bank operations by counterparty Alfa for all time
## F. Drilldown
- кто должен нам и какие документы это формируют
- что висит по Альфе и раскрой по документам
- по 60 счету что висит и раскрой по контрагентам
- какие документы формируют остаток по счету 62 на 2020-07-31
- расшифруй остаток по 60 счету до документов
## G. Составные factual вопросы
- покажи хвосты по Альфе и отдельно по Бете
- кто должен нам и отдельно кому должны мы
- найди долг по договору и покажи документы
- покажи документы по контрагенту и сразу банковские операции
- остаток по счету 60 и какие документы его формируют
## H. Check/verify (still factual)
- проверь, есть ли долг по Альфе
- проверь, есть ли незакрытые документы
- проверь, что висит на 60 счете
- проверь, есть ли открытые позиции по договору
- проверь, есть ли документы по контрагенту за июль 2020
## Правило маршрутизации
@@ -24,6 +24,18 @@
- `llm_normalizer/backend/src/services/assistantRuntimeGuards.ts`
- `llm_normalizer/backend/src/services/answerComposer.ts`
## 2.1) Architecture Reference (mandatory)
Перед любыми изменениями address lane сверяться с:
- `address_architecture_contract_v1.md`
Ключевая рамка:
- `Decompose -> Resolve -> Execute -> Compose`
- runtime не хранит company-specific словари
- company entities подтверждаются только через live resolver/MCP
## 3) To-Be: Separate Address Lane
Новый high-level flow:
@@ -0,0 +1,44 @@
# Address Query Runtime V1 — M2.3d Query Variants Expansion
Дата: 2026-04-01
## Цель шага
Подбить текущий этап M2.3c и расширить вариативность пользовательских формулировок для уже существующих intent'ов без изменения архитектурной рамки.
## Что сделано
1. Расширены сигналы address-mode:
- добавлены entity-токены `компания/организация/поставщик/клиент/партнер` и английские эквиваленты.
2. Расширен intent-resolver:
- добавлены вариации `documents_by_counterparty` и `bank_operations_by_counterparty` для формулировок через поставщика/клиента/компанию;
- добаван loose by-anchor trigger (`по <якорь>`) для short/slang формулировок.
3. Усилен filter-extractor:
- расширен extraction якоря контрагента (`по поставщику`, `по клиенту`, `по партнеру`, `по организации`, `by supplier/customer/client/partner`);
- добавлены all-time варианты (`за весь период`, `за весь срок`, `за всю историю`, `for entire period`, `full history`);
- добавлен month-period extraction (`за июль 2020`, `for july 2020`, `за 07.2020`);
- добавлен fallback extraction по loose phrase (`по свк`).
4. Закрыт регресс из live export:
- `какие доки есть по свк за 2021` больше не уходит в deep/canonical fallback;
- запрос остаётся в `address_query` и резолвится как `list_documents_by_counterparty`.
5. Расширен тестовый контур:
- добавлены новые unit-тесты в `addressQueryRuntimeM23.test.ts` под новые вариации и регрессионный кейс.
## Что НЕ меняли
- Не добавлялись новые intent'ы.
- Не менялась deep-analysis ветка.
- Не добавлялся free-form query builder.
## Проверка
- Команда: `npx vitest tests/addressQueryRuntimeM23.test.ts`
- Результат: `1 file passed, 25 tests passed`
## Следующий шаг
- Запустить dry/live прогон в окне ассистента на расширенном наборе формулировок и зафиксировать non-empty/limited распределение по counterparty/account семействам.
@@ -0,0 +1,24 @@
{
"run_id": "2026-04-01_Address_Query_Runtime_V1_M2_3D_Query_Variants_Expansion",
"comparison": {
"baseline_ref": "HEAD (before M2.3d patch)",
"current_ref": "workspace (after M2.3d patch + regression fix)"
},
"metrics": {
"address_m23_test_cases": {
"before": 15,
"after": 25,
"delta": 10
},
"address_m23_test_failures": {
"before": 0,
"after": 0,
"delta": 0
}
},
"notes": [
"delta reflects additional query-variation coverage for mode, intent, and filters",
"includes regression fix for slang docs phrase: 'какие доки есть по svk за 2021'",
"no architecture-scope expansion (no new intents)"
]
}
@@ -0,0 +1,15 @@
llm_normalizer/backend/src/services/addressQueryClassifier.ts
llm_normalizer/backend/src/services/addressIntentResolver.ts
llm_normalizer/backend/src/services/addressFilterExtractor.ts
llm_normalizer/backend/tests/addressQueryRuntimeM23.test.ts
llm_normalizer/backend/dist/services/addressQueryClassifier.js
llm_normalizer/backend/dist/services/addressIntentResolver.js
llm_normalizer/backend/dist/services/addressFilterExtractor.js
docs/ADDRESS/address_query/question_bank_v1.md
docs/ADDRESS/address_query/README.md
docs/ADDRESS/runs/2026-04-01_Address_Query_Runtime_V1_M2_3D_Query_Variants_Expansion/README.md
docs/ADDRESS/runs/2026-04-01_Address_Query_Runtime_V1_M2_3D_Query_Variants_Expansion/run_summary.json
docs/ADDRESS/runs/2026-04-01_Address_Query_Runtime_V1_M2_3D_Query_Variants_Expansion/before_after_metrics.json
docs/ADDRESS/runs/2026-04-01_Address_Query_Runtime_V1_M2_3D_Query_Variants_Expansion/query_variation_expansion_matrix.md
docs/ADDRESS/runs/2026-04-01_Address_Query_Runtime_V1_M2_3D_Query_Variants_Expansion/smoke_checks.md
docs/ADDRESS/runs/2026-04-01_Address_Query_Runtime_V1_M2_3D_Query_Variants_Expansion/changed_files.txt
@@ -0,0 +1,17 @@
# Query Variation Expansion Matrix (M2.3d)
| area | before | after | validation |
|---|---|---|---|
| address mode entity signals | mostly `контрагент/договор/счет/документ` | added `компания/организация/поставщик/клиент/партнер` (+EN aliases) + `доки/док` slang | `addressQueryRuntimeM23.test.ts` |
| docs/bank intent phrasing | counterparty-centric phrasing | supports company/supplier/customer/client/partner phrasing | `addressQueryRuntimeM23.test.ts` |
| counterparty anchor extraction | basic `контрагент/компания` capture | adds supplier/client/partner/org variants (+EN aliases) + loose `по <якорь>` fallback | `addressQueryRuntimeM23.test.ts` |
| all-time phrase detection | mostly `за все время` | adds `за весь период/срок/всю историю` + EN full-history variants | `addressQueryRuntimeM23.test.ts` |
| month period extraction | range/year extraction | adds month phrases (`за июль 2020`, `for july 2020`, `за 07.2020`) | `addressQueryRuntimeM23.test.ts` |
## Added example phrasings
- `Покажи платежи по поставщику Альфа за июль 2020`
- `Выведи документы по клиенту Бета за 2020-07`
- `Покажи банковские операции по клиенту Бета за весь период`
- `Какие компании есть в базе`
- `Какие доки есть по свк за 2021`
@@ -0,0 +1,32 @@
{
"run_id": "2026-04-01_Address_Query_Runtime_V1_M2_3D_Query_Variants_Expansion",
"date": "2026-04-01",
"stage": "Address Query Runtime V1",
"wave": "M2.3d",
"goal": "Query variants expansion for existing intents + slang/loose-anchor regression fix",
"status": "COMPLETED",
"scope": {
"new_intents": false,
"deep_analysis_changes": false,
"focus": [
"mode signals",
"intent hints",
"counterparty anchor extraction",
"all-time phrase handling",
"month-period extraction",
"slang docs + loose by-anchor handling",
"unit test coverage"
]
},
"checks": {
"test_command": "npx vitest tests/addressQueryRuntimeM23.test.ts",
"test_files_passed": 1,
"tests_passed": 25,
"tests_failed": 0
},
"guardrails": {
"false_factual_rate_target": 0,
"free_form_query_builder": "not_added",
"whitelist_recipe_policy": "unchanged"
}
}
@@ -0,0 +1,13 @@
# Smoke Checks
## Backend tests
- Command: `npx vitest tests/addressQueryRuntimeM23.test.ts`
- Result: PASS
- Details: `1 passed file`, `25 passed tests`, `0 failed`
## Build
- Command: `npm run build`
- Result: PASS
- Details: TypeScript build completed without errors.
File diff suppressed because one or more lines are too long
@@ -0,0 +1,157 @@
Отчет по анализу архива address_query
Инвентаризация разметки 1С, покрытие доменов и статус runtime-сценариев
Источник: архив address_query.zip | Дата документов внутри архива: 2026-03-29
Главный вывод
Архив посвящен не общему налоговому/НДС-контуру, а отдельному runtime-режиму address_query для factual lookup по взаиморасчетам, договорам, документам, банковским операциям и остаткам по счетам.
Масштаб inventory
Обработано 7 039 648 строк из 12 monthly snapshot-файлов за 2020 год, parse errors = 0, найдено 286 уникальных сущностей в 10 family-группах.
Что реально покрыто сейчас
На уровне V1/M2.3c подтверждены прежде всего сценарии по контрагентам и документам; account-сценарии видны, но еще ограничены materialization/account-scope проблемами; contract-сценарии требуют специализированных recipe.
Что с НДС
НДС-сущности и related entities в inventory присутствуют, но в текущий whitelist intents/runtime V1 они не входят как отдельный поддержанный домен.
1. Что находится в архиве
• Главный README описывает пакет как набор документов для перехода к отдельному runtime-режиму `question_mode=address_query`.
• Есть слой системной инвентаризации сущностей 1С по snapshot-корпусу 2020: entity inventory JSON-артефакты, relation/intention support sets, readable summary, run summary.
• Есть продуктовый слой: scenario matrix, query recipes, runtime contracts, integration plan, readiness matrix, question bank, acceptance suites и UI dry-run наборы.
• То есть архив сочетает два уровня: исследование структуры 1С-базы и проектирование прикладного factual-query runtime поверх этой структуры.
2. Структура пакета по смысловым блокам
Блок
Ключевые файлы
Зачем нужен
Инвентаризация 1С
entity_map_1c_2020.md, entity_inventory_*.json, run_summary.json
Показывает, какие сущности есть в snapshot-корпусе, насколько они query-suitable и какие relation patterns обнаружены.
Сценарии и intents
address_scenario_matrix.md, question_bank_v1.md
Фиксирует пользовательские вопросы, intent mapping, приоритеты и expected response types.
Recipe-слой
query_recipes_v1.md, address_runtime_contracts.md
Задает безопасный runtime-контур: intent -> filters -> recipe -> MCP -> factual result.
Интеграция и готовность
runtime_integration_plan.md, runtime_readiness_matrix_v1.md, execution_lineup_v1_2026-03-29.md
Показывает, как это встраивается и какие сценарии уже живы, а какие еще нет.
Acceptance и dry-run
curated_positive_live_suite_v1.md, data_aware_positive_acceptance_suite_v1.md, ui_dry_run_*
Нужны для live-проверки, контроля false factual и ручного прогона поддержанных вопросов.
3. Масштаб и состав inventory по базе 1С
• Источник данных: 12 monthly NDJSON snapshots за 2020 год.
• Обработано 7 039 648 строк без parse errors.
• Найдено 286 сущностей в 10 family-группах.
• Наиболее крупный пласт по строкам - INFORMATION_REGISTER (6,3 млн строк), но адресный runtime строится прежде всего на регистрах, документах, журналах и справочниках.
Family
Сущностей / строк
Приоритет
Комментарий
DOCUMENT
77 / 202 636
все P0
Главный источник document-level factual lookup.
ACCOUNTING_REGISTER
2 / 190 244
оба P0
Ключ к остаткам, хвостам и drilldown по проводкам.
NSI_CATALOG
50 / 140 050
3 P0 / 47 P1
Нужен для договоров, контрагентов и фильтровых резолверов.
DOCUMENT_JOURNAL
12 / 126 868
все P1
Быстрый индекс документов и банковских выписок.
ACCUMULATION_REGISTER
36 / 73 022
все P0
В inventory высоко видимы, но в runtime V1 почти не заведены как отдельные intents.
4. Какие домены реально прорабатываются
• Ключевой продуктовый домен - адресные factual-вопросы по взаиморасчетам и документам, а не произвольная аналитика по всей базе.
• Судя по scenario matrix, question bank и runtime contracts, текущий V1 разбит не по классическим бухгалтерским разделам, а по operational query-доменам.
Домен
Что входит
Статус
Комментарий
Контрагенты и задолженность
payables, receivables, open items by counterparty
ядро V1
Самый зрелый блок; есть curated positive cases и live-with-limits.
Счета и остатки
account balance, balance docs, turnover
частично
Структурно готово, но account-scope/materialization ограничивает стабильные non-empty ответы.
Договоры
open contracts, docs/open items by contract
не дожато
Есть в дизайне, но нужны specialized recipe и resolver path.
Документы и банковские операции
docs by counterparty, bank ops, list by type
ближе к рабочему
Именно здесь подтверждены live non-empty кейсы по counterparty family.
НДС и налоговые сущности
НДС-регистры, счета-фактуры, НДС-документы в inventory
не runtime V1
Есть в инвентаризации, но не заведены как whitelist intents.
5. Какие intents поддержаны по документам
• P0-ядро, зафиксированное в bootstrap report: `list_open_contracts`, `list_payables_counterparties`, `list_receivables_counterparties`, `account_balance_snapshot`, `open_items_by_counterparty_or_contract`.
• Как ближайшее расширение v1.1 перечислены: `list_documents_by_counterparty`, `list_documents_by_contract`, `documents_forming_balance`.
• Фактически в live runtime на момент пакета явно реализованы: `list_documents_by_counterparty`, `bank_operations_by_counterparty`, `documents_forming_balance`.
ID
Сценарий
Статус
Что мешает
AQ-P0-02
payables by counterparty
live, но с ограничениями
Широкие промпты пока дают sparse matches.
AQ-P0-03
receivables by counterparty
live, но с ограничениями
Нужны более точные period hints и anchor refinement.
AQ-P0-04
account balance snapshot
live, но с ограничениями
Строки приходят, но выпадают до materialization.
AQ-P0-05
open items by counterparty
live, но с ограничениями
Нужен явный counterparty anchor для стабильного non-empty.
AQ-P0-07
documents by counterparty
live, но с ограничениями
Есть positive cases, но якоря еще хрупкие.
AQ-P0-07B
bank ops by counterparty
live, но с ограничениями
Позитив подтвержден, но узкие/широкие варианты нестабильны.
AQ-P0-01/06/08
contract-related scenarios
требует спец. recipe
Не хватает contract-aware recipe и contract resolver.
AQ-P0-09
documents forming balance
live, но с ограничениями
Account family still blocked before materialization.
6. Какие сущности являются опорными
• Главная структурная опора - `AccountingRegister_Хозрасчетный_RecordType`: через него идут account, document, organization и часть business drilldown связей.
• Из документов центральны `СписаниеСРасчетногоСчета`, `ПоступлениеНаРасчетныйСчет`, их строки расшифровки платежа, а также `АктСверкиВзаиморасчетов`.
• Из справочников критичен `Catalog_ДоговорыКонтрагентов`; при этом `Catalog_Контрагенты`, `Catalog_Организации`, `Catalog_БанковскиеСчета` формально в triage отмечены как P1, но фактически обязательны для фильтров и resolver-логики.
• Document journals (`ДокументыПоставщиков`, `ДокументыПокупателей`, `БанковскиеВыписки`) играют роль быстрого индексного слоя для list/drilldown сценариев.
7. Что можно сказать про НДС
• В inventory присутствуют НДС-регистры и связанные сущности: `AccumulationRegister_НДСПредъявленный`, `AccumulationRegister_НДСЗаписиКнигиПокупок`, `AccumulationRegister_НДСЗаписиКнигиПродаж`, документы `СчетФактураПолученный`, `СчетФактураВыданный`, `СписаниеНДС`, журнал `РегламентныеДокументыНДС`.
• Однако в scenario matrix, recipe catalog и readiness matrix они не оформлены как отдельный runtime-домен текущего `address_query`.
• Поэтому корректный вывод такой: НДС уже есть в структурной инвентаризации базы, но в текущем пакете это не целевое продуктовое покрытие V1.
8. Ограничения и риски
• Часть labels и entity names в исходном экспорте испорчена cp1251/utf8 mojibake; потребуется финальный decoding/cleanup перед production binding.
• Без business resolvers нельзя надежно переходить от имени контрагента, договора или счета к ID.
• Free-form query builder специально запрещен; доступ предполагается только через whitelist recipe.
• Compound factual вопросы пока только детектируются, но не исполняются как multi-intent decomposition.
• Account-семейство пока не дает стабильный поток до materialization, хотя сырье на входе уже есть.
9. Выводы по текущему состоянию
• Архив уже дает хорошую картину по 1С-сущностям и будущему runtime.
• Сейчас реально прорабатывается не вся база и не весь бухгалтерский домен, а конкретный address-query слой: контрагенты, задолженность, договоры, документы, банковские операции, остатки/расшифровка по счетам.
• Самый зрелый operational блок - counterparty/document lookup.
• Contract-specific и account-specific сценарии структурно готовы, но требуют еще одного цикла реализации и настройки.
• НДС виден в inventory и может стать следующим отдельным доменом, но в данном архиве это пока не активное runtime-покрытие.
10. Практический next step
• Собрать отдельную матрицу: “что есть в inventory” vs “что заведено в intents/recipes” vs “что уже реально работает live”.
• Развести домены на 3 слоя: текущий рабочий V1, design-only backlog и visible-inventory but not productized.
• Отдельно сделать shortlist по НДС/налоговым сущностям, если следующая цель - расширить покрытие за пределы address_query.
Binary file not shown.
@@ -0,0 +1,2 @@
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"><Default Extension="jpeg" ContentType="image/jpeg"/><Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/><Default Extension="xml" ContentType="application/xml"/><Override PartName="/customXml/itemProps1.xml" ContentType="application/vnd.openxmlformats-officedocument.customXmlProperties+xml"/><Override PartName="/docProps/app.xml" ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml"/><Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformats-package.core-properties+xml"/><Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/><Override PartName="/word/fontTable.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml"/><Override PartName="/word/numbering.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml"/><Override PartName="/word/settings.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml"/><Override PartName="/word/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"/><Override PartName="/word/stylesWithEffects.xml" ContentType="application/vnd.ms-word.stylesWithEffects+xml"/><Override PartName="/word/theme/theme1.xml" ContentType="application/vnd.openxmlformats-officedocument.theme+xml"/><Override PartName="/word/webSettings.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.webSettings+xml"/></Types>
@@ -0,0 +1,2 @@
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId3" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/><Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail" Target="docProps/thumbnail.jpeg"/></Relationships>
@@ -0,0 +1,2 @@
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps" Target="itemProps1.xml"/></Relationships>
@@ -0,0 +1,2 @@
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<b:Sources xmlns:b="http://schemas.openxmlformats.org/officeDocument/2006/bibliography" xmlns="http://schemas.openxmlformats.org/officeDocument/2006/bibliography" SelectedStyle="/APA.XSL" StyleName="APA"/>
@@ -0,0 +1,6 @@
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<ds:datastoreItem xmlns:ds="http://schemas.openxmlformats.org/officeDocument/2006/customXml" ds:itemID="{EF278816-EC6F-A645-907D-7F25AECB1D4A}">
<ds:schemaRefs>
<ds:schemaRef ds:uri="http://schemas.openxmlformats.org/officeDocument/2006/bibliography"/>
</ds:schemaRefs>
</ds:datastoreItem>
@@ -0,0 +1,36 @@
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes">
<Template>Normal.dotm</Template>
<TotalTime>0</TotalTime>
<Pages>1</Pages>
<Words>0</Words>
<Characters>0</Characters>
<Application>Microsoft Macintosh Word</Application>
<DocSecurity>0</DocSecurity>
<Lines>0</Lines>
<Paragraphs>0</Paragraphs>
<ScaleCrop>false</ScaleCrop>
<HeadingPairs>
<vt:vector size="2" baseType="variant">
<vt:variant>
<vt:lpstr>Title</vt:lpstr>
</vt:variant>
<vt:variant>
<vt:i4>1</vt:i4>
</vt:variant>
</vt:vector>
</HeadingPairs>
<TitlesOfParts>
<vt:vector size="1" baseType="lpstr">
<vt:lpstr/>
</vt:vector>
</TitlesOfParts>
<Manager/>
<Company/>
<LinksUpToDate>false</LinksUpToDate>
<CharactersWithSpaces>0</CharactersWithSpaces>
<SharedDoc>false</SharedDoc>
<HyperlinkBase/>
<HyperlinksChanged>false</HyperlinksChanged>
<AppVersion>14.0000</AppVersion>
</Properties>
@@ -0,0 +1,2 @@
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><dc:title/><dc:subject/><dc:creator>python-docx</dc:creator><cp:keywords/><dc:description>generated by python-docx</dc:description><cp:lastModifiedBy/><cp:revision>1</cp:revision><dcterms:created xsi:type="dcterms:W3CDTF">2013-12-23T23:15:00Z</dcterms:created><dcterms:modified xsi:type="dcterms:W3CDTF">2013-12-23T23:15:00Z</dcterms:modified><cp:category/></cp:coreProperties>
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

@@ -0,0 +1,2 @@
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/><Relationship Id="rId4" Type="http://schemas.microsoft.com/office/2007/relationships/stylesWithEffects" Target="stylesWithEffects.xml"/><Relationship Id="rId5" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings" Target="settings.xml"/><Relationship Id="rId6" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings" Target="webSettings.xml"/><Relationship Id="rId7" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable" Target="fontTable.xml"/><Relationship Id="rId8" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="theme/theme1.xml"/><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml" Target="../customXml/item1.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering" Target="numbering.xml"/></Relationships>
File diff suppressed because one or more lines are too long
@@ -0,0 +1,61 @@
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<w:fonts xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" mc:Ignorable="w14">
<w:font w:name="Symbol">
<w:panose1 w:val="00000000000000000000"/>
<w:charset w:val="02"/>
<w:family w:val="auto"/>
<w:pitch w:val="variable"/>
<w:sig w:usb0="00000000" w:usb1="10000000" w:usb2="00000000" w:usb3="00000000" w:csb0="80000000" w:csb1="00000000"/>
</w:font>
<w:font w:name="Times New Roman">
<w:panose1 w:val="02020603050405020304"/>
<w:charset w:val="00"/>
<w:family w:val="auto"/>
<w:pitch w:val="variable"/>
<w:sig w:usb0="E0002AFF" w:usb1="C0007841" w:usb2="00000009" w:usb3="00000000" w:csb0="000001FF" w:csb1="00000000"/>
</w:font>
<w:font w:name="Cambria">
<w:panose1 w:val="02040503050406030204"/>
<w:charset w:val="00"/>
<w:family w:val="auto"/>
<w:pitch w:val="variable"/>
<w:sig w:usb0="E00002FF" w:usb1="400004FF" w:usb2="00000000" w:usb3="00000000" w:csb0="0000019F" w:csb1="00000000"/>
</w:font>
<w:font w:name="MS 明朝">
<w:panose1 w:val="00000000000000000000"/>
<w:charset w:val="80"/>
<w:family w:val="roman"/>
<w:notTrueType/>
<w:pitch w:val="fixed"/>
<w:sig w:usb0="00000001" w:usb1="08070000" w:usb2="00000010" w:usb3="00000000" w:csb0="00020000" w:csb1="00000000"/>
</w:font>
<w:font w:name="Calibri">
<w:panose1 w:val="020F0502020204030204"/>
<w:charset w:val="00"/>
<w:family w:val="auto"/>
<w:pitch w:val="variable"/>
<w:sig w:usb0="E10002FF" w:usb1="4000ACFF" w:usb2="00000009" w:usb3="00000000" w:csb0="0000019F" w:csb1="00000000"/>
</w:font>
<w:font w:name="MS ゴシック">
<w:panose1 w:val="00000000000000000000"/>
<w:charset w:val="80"/>
<w:family w:val="modern"/>
<w:notTrueType/>
<w:pitch w:val="fixed"/>
<w:sig w:usb0="00000001" w:usb1="08070000" w:usb2="00000010" w:usb3="00000000" w:csb0="00020000" w:csb1="00000000"/>
</w:font>
<w:font w:name="Courier">
<w:panose1 w:val="02000500000000000000"/>
<w:charset w:val="00"/>
<w:family w:val="auto"/>
<w:pitch w:val="variable"/>
<w:sig w:usb0="00000003" w:usb1="00000000" w:usb2="00000000" w:usb3="00000000" w:csb0="00000001" w:csb1="00000000"/>
</w:font>
<w:font w:name="Arial">
<w:panose1 w:val="020B0604020202020204"/>
<w:charset w:val="00"/>
<w:family w:val="auto"/>
<w:pitch w:val="variable"/>
<w:sig w:usb0="E0002AFF" w:usb1="C0007843" w:usb2="00000009" w:usb3="00000000" w:csb0="000001FF" w:csb1="00000000"/>
</w:font>
</w:fonts>
File diff suppressed because one or more lines are too long
@@ -0,0 +1,2 @@
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<w:settings xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:sl="http://schemas.openxmlformats.org/schemaLibrary/2006/main" mc:Ignorable="w14"><w:zoom w:val="bestFit"/><w:proofState w:spelling="clean" w:grammar="clean"/><w:defaultTabStop w:val="720"/><w:characterSpacingControl w:val="doNotCompress"/><w:savePreviewPicture/><w:compat><w:useFELayout/><w:compatSetting w:name="compatibilityMode" w:uri="http://schemas.microsoft.com/office/word" w:val="14"/><w:compatSetting w:name="overrideTableStyleFontSizeAndJustification" w:uri="http://schemas.microsoft.com/office/word" w:val="1"/><w:compatSetting w:name="enableOpenTypeFeatures" w:uri="http://schemas.microsoft.com/office/word" w:val="1"/><w:compatSetting w:name="doNotFlipMirrorIndents" w:uri="http://schemas.microsoft.com/office/word" w:val="1"/></w:compat><w:rsids><w:rsidRoot w:val="00B47730"/><w:rsid w:val="00034616"/><w:rsid w:val="0006063C"/><w:rsid w:val="0015074B"/><w:rsid w:val="0029639D"/><w:rsid w:val="00326F90"/><w:rsid w:val="00AA1D8D"/><w:rsid w:val="00B47730"/><w:rsid w:val="00CB0664"/><w:rsid w:val="00FC693F"/></w:rsids><m:mathPr><m:mathFont m:val="Cambria Math"/><m:brkBin m:val="before"/><m:brkBinSub m:val="--"/><m:smallFrac m:val="0"/><m:dispDef/><m:lMargin m:val="0"/><m:rMargin m:val="0"/><m:defJc m:val="centerGroup"/><m:wrapIndent m:val="1440"/><m:intLim m:val="subSup"/><m:naryLim m:val="undOvr"/></m:mathPr><w:themeFontLang w:val="en-US" w:eastAsia="ja-JP"/><w:clrSchemeMapping w:bg1="light1" w:t1="dark1" w:bg2="light2" w:t2="dark2" w:accent1="accent1" w:accent2="accent2" w:accent3="accent3" w:accent4="accent4" w:accent5="accent5" w:accent6="accent6" w:hyperlink="hyperlink" w:followedHyperlink="followedHyperlink"/><w:doNotAutoCompressPictures/><w:shapeDefaults><o:shapedefaults v:ext="edit" spidmax="1027"/><o:shapelayout v:ext="edit"><o:idmap v:ext="edit" data="1"/></o:shapelayout></w:shapeDefaults><w:decimalSymbol w:val="."/><w:listSeparator w:val=","/><w14:docId w14:val="24062061"/><w14:defaultImageDpi w14:val="300"/></w:settings>
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,318 @@
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme">
<a:themeElements>
<a:clrScheme name="Office">
<a:dk1>
<a:sysClr val="windowText" lastClr="000000"/>
</a:dk1>
<a:lt1>
<a:sysClr val="window" lastClr="FFFFFF"/>
</a:lt1>
<a:dk2>
<a:srgbClr val="1F497D"/>
</a:dk2>
<a:lt2>
<a:srgbClr val="EEECE1"/>
</a:lt2>
<a:accent1>
<a:srgbClr val="4F81BD"/>
</a:accent1>
<a:accent2>
<a:srgbClr val="C0504D"/>
</a:accent2>
<a:accent3>
<a:srgbClr val="9BBB59"/>
</a:accent3>
<a:accent4>
<a:srgbClr val="8064A2"/>
</a:accent4>
<a:accent5>
<a:srgbClr val="4BACC6"/>
</a:accent5>
<a:accent6>
<a:srgbClr val="F79646"/>
</a:accent6>
<a:hlink>
<a:srgbClr val="0000FF"/>
</a:hlink>
<a:folHlink>
<a:srgbClr val="800080"/>
</a:folHlink>
</a:clrScheme>
<a:fontScheme name="Office">
<a:majorFont>
<a:latin typeface="Calibri"/>
<a:ea typeface=""/>
<a:cs typeface=""/>
<a:font script="Jpan" typeface="MS ゴシック"/>
<a:font script="Hang" typeface="맑은 고딕"/>
<a:font script="Hans" typeface="宋体"/>
<a:font script="Hant" typeface="新細明體"/>
<a:font script="Arab" typeface="Times New Roman"/>
<a:font script="Hebr" typeface="Times New Roman"/>
<a:font script="Thai" typeface="Angsana New"/>
<a:font script="Ethi" typeface="Nyala"/>
<a:font script="Beng" typeface="Vrinda"/>
<a:font script="Gujr" typeface="Shruti"/>
<a:font script="Khmr" typeface="MoolBoran"/>
<a:font script="Knda" typeface="Tunga"/>
<a:font script="Guru" typeface="Raavi"/>
<a:font script="Cans" typeface="Euphemia"/>
<a:font script="Cher" typeface="Plantagenet Cherokee"/>
<a:font script="Yiii" typeface="Microsoft Yi Baiti"/>
<a:font script="Tibt" typeface="Microsoft Himalaya"/>
<a:font script="Thaa" typeface="MV Boli"/>
<a:font script="Deva" typeface="Mangal"/>
<a:font script="Telu" typeface="Gautami"/>
<a:font script="Taml" typeface="Latha"/>
<a:font script="Syrc" typeface="Estrangelo Edessa"/>
<a:font script="Orya" typeface="Kalinga"/>
<a:font script="Mlym" typeface="Kartika"/>
<a:font script="Laoo" typeface="DokChampa"/>
<a:font script="Sinh" typeface="Iskoola Pota"/>
<a:font script="Mong" typeface="Mongolian Baiti"/>
<a:font script="Viet" typeface="Times New Roman"/>
<a:font script="Uigh" typeface="Microsoft Uighur"/>
<a:font script="Geor" typeface="Sylfaen"/>
</a:majorFont>
<a:minorFont>
<a:latin typeface="Cambria"/>
<a:ea typeface=""/>
<a:cs typeface=""/>
<a:font script="Jpan" typeface="MS 明朝"/>
<a:font script="Hang" typeface="맑은 고딕"/>
<a:font script="Hans" typeface="宋体"/>
<a:font script="Hant" typeface="新細明體"/>
<a:font script="Arab" typeface="Arial"/>
<a:font script="Hebr" typeface="Arial"/>
<a:font script="Thai" typeface="Cordia New"/>
<a:font script="Ethi" typeface="Nyala"/>
<a:font script="Beng" typeface="Vrinda"/>
<a:font script="Gujr" typeface="Shruti"/>
<a:font script="Khmr" typeface="DaunPenh"/>
<a:font script="Knda" typeface="Tunga"/>
<a:font script="Guru" typeface="Raavi"/>
<a:font script="Cans" typeface="Euphemia"/>
<a:font script="Cher" typeface="Plantagenet Cherokee"/>
<a:font script="Yiii" typeface="Microsoft Yi Baiti"/>
<a:font script="Tibt" typeface="Microsoft Himalaya"/>
<a:font script="Thaa" typeface="MV Boli"/>
<a:font script="Deva" typeface="Mangal"/>
<a:font script="Telu" typeface="Gautami"/>
<a:font script="Taml" typeface="Latha"/>
<a:font script="Syrc" typeface="Estrangelo Edessa"/>
<a:font script="Orya" typeface="Kalinga"/>
<a:font script="Mlym" typeface="Kartika"/>
<a:font script="Laoo" typeface="DokChampa"/>
<a:font script="Sinh" typeface="Iskoola Pota"/>
<a:font script="Mong" typeface="Mongolian Baiti"/>
<a:font script="Viet" typeface="Arial"/>
<a:font script="Uigh" typeface="Microsoft Uighur"/>
<a:font script="Geor" typeface="Sylfaen"/>
</a:minorFont>
</a:fontScheme>
<a:fmtScheme name="Office">
<a:fillStyleLst>
<a:solidFill>
<a:schemeClr val="phClr"/>
</a:solidFill>
<a:gradFill rotWithShape="1">
<a:gsLst>
<a:gs pos="0">
<a:schemeClr val="phClr">
<a:tint val="50000"/>
<a:satMod val="300000"/>
</a:schemeClr>
</a:gs>
<a:gs pos="35000">
<a:schemeClr val="phClr">
<a:tint val="37000"/>
<a:satMod val="300000"/>
</a:schemeClr>
</a:gs>
<a:gs pos="100000">
<a:schemeClr val="phClr">
<a:tint val="15000"/>
<a:satMod val="350000"/>
</a:schemeClr>
</a:gs>
</a:gsLst>
<a:lin ang="16200000" scaled="1"/>
</a:gradFill>
<a:gradFill rotWithShape="1">
<a:gsLst>
<a:gs pos="0">
<a:schemeClr val="phClr">
<a:tint val="100000"/>
<a:shade val="100000"/>
<a:satMod val="130000"/>
</a:schemeClr>
</a:gs>
<a:gs pos="100000">
<a:schemeClr val="phClr">
<a:tint val="50000"/>
<a:shade val="100000"/>
<a:satMod val="350000"/>
</a:schemeClr>
</a:gs>
</a:gsLst>
<a:lin ang="16200000" scaled="0"/>
</a:gradFill>
</a:fillStyleLst>
<a:lnStyleLst>
<a:ln w="9525" cap="flat" cmpd="sng" algn="ctr">
<a:solidFill>
<a:schemeClr val="phClr">
<a:shade val="95000"/>
<a:satMod val="105000"/>
</a:schemeClr>
</a:solidFill>
<a:prstDash val="solid"/>
</a:ln>
<a:ln w="25400" cap="flat" cmpd="sng" algn="ctr">
<a:solidFill>
<a:schemeClr val="phClr"/>
</a:solidFill>
<a:prstDash val="solid"/>
</a:ln>
<a:ln w="38100" cap="flat" cmpd="sng" algn="ctr">
<a:solidFill>
<a:schemeClr val="phClr"/>
</a:solidFill>
<a:prstDash val="solid"/>
</a:ln>
</a:lnStyleLst>
<a:effectStyleLst>
<a:effectStyle>
<a:effectLst>
<a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0">
<a:srgbClr val="000000">
<a:alpha val="38000"/>
</a:srgbClr>
</a:outerShdw>
</a:effectLst>
</a:effectStyle>
<a:effectStyle>
<a:effectLst>
<a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0">
<a:srgbClr val="000000">
<a:alpha val="35000"/>
</a:srgbClr>
</a:outerShdw>
</a:effectLst>
</a:effectStyle>
<a:effectStyle>
<a:effectLst>
<a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0">
<a:srgbClr val="000000">
<a:alpha val="35000"/>
</a:srgbClr>
</a:outerShdw>
</a:effectLst>
<a:scene3d>
<a:camera prst="orthographicFront">
<a:rot lat="0" lon="0" rev="0"/>
</a:camera>
<a:lightRig rig="threePt" dir="t">
<a:rot lat="0" lon="0" rev="1200000"/>
</a:lightRig>
</a:scene3d>
<a:sp3d>
<a:bevelT w="63500" h="25400"/>
</a:sp3d>
</a:effectStyle>
</a:effectStyleLst>
<a:bgFillStyleLst>
<a:solidFill>
<a:schemeClr val="phClr"/>
</a:solidFill>
<a:gradFill rotWithShape="1">
<a:gsLst>
<a:gs pos="0">
<a:schemeClr val="phClr">
<a:tint val="40000"/>
<a:satMod val="350000"/>
</a:schemeClr>
</a:gs>
<a:gs pos="40000">
<a:schemeClr val="phClr">
<a:tint val="45000"/>
<a:shade val="99000"/>
<a:satMod val="350000"/>
</a:schemeClr>
</a:gs>
<a:gs pos="100000">
<a:schemeClr val="phClr">
<a:shade val="20000"/>
<a:satMod val="255000"/>
</a:schemeClr>
</a:gs>
</a:gsLst>
<a:path path="circle">
<a:fillToRect l="50000" t="-80000" r="50000" b="180000"/>
</a:path>
</a:gradFill>
<a:gradFill rotWithShape="1">
<a:gsLst>
<a:gs pos="0">
<a:schemeClr val="phClr">
<a:tint val="80000"/>
<a:satMod val="300000"/>
</a:schemeClr>
</a:gs>
<a:gs pos="100000">
<a:schemeClr val="phClr">
<a:shade val="30000"/>
<a:satMod val="200000"/>
</a:schemeClr>
</a:gs>
</a:gsLst>
<a:path path="circle">
<a:fillToRect l="50000" t="50000" r="50000" b="50000"/>
</a:path>
</a:gradFill>
</a:bgFillStyleLst>
</a:fmtScheme>
</a:themeElements>
<a:objectDefaults>
<a:spDef>
<a:spPr/>
<a:bodyPr/>
<a:lstStyle/>
<a:style>
<a:lnRef idx="1">
<a:schemeClr val="accent1"/>
</a:lnRef>
<a:fillRef idx="3">
<a:schemeClr val="accent1"/>
</a:fillRef>
<a:effectRef idx="2">
<a:schemeClr val="accent1"/>
</a:effectRef>
<a:fontRef idx="minor">
<a:schemeClr val="lt1"/>
</a:fontRef>
</a:style>
</a:spDef>
<a:lnDef>
<a:spPr/>
<a:bodyPr/>
<a:lstStyle/>
<a:style>
<a:lnRef idx="2">
<a:schemeClr val="accent1"/>
</a:lnRef>
<a:fillRef idx="0">
<a:schemeClr val="accent1"/>
</a:fillRef>
<a:effectRef idx="1">
<a:schemeClr val="accent1"/>
</a:effectRef>
<a:fontRef idx="minor">
<a:schemeClr val="tx1"/>
</a:fontRef>
</a:style>
</a:lnDef>
</a:objectDefaults>
<a:extraClrSchemeLst/>
</a:theme>
@@ -0,0 +1,5 @@
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<w:webSettings xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" mc:Ignorable="w14">
<w:allowPNG/>
<w:doNotSaveAsSingleFile/>
</w:webSettings>
Binary file not shown.
@@ -0,0 +1,157 @@
Отчет по анализу архива address_query
Инвентаризация разметки 1С, покрытие доменов и статус runtime-сценариев
Источник: архив address_query.zip | Дата документов внутри архива: 2026-03-29
Главный вывод
Архив посвящен не общему налоговому/НДС-контуру, а отдельному runtime-режиму address_query для factual lookup по взаиморасчетам, договорам, документам, банковским операциям и остаткам по счетам.
Масштаб inventory
Обработано 7 039 648 строк из 12 monthly snapshot-файлов за 2020 год, parse errors = 0, найдено 286 уникальных сущностей в 10 family-группах.
Что реально покрыто сейчас
На уровне V1/M2.3c подтверждены прежде всего сценарии по контрагентам и документам; account-сценарии видны, но еще ограничены materialization/account-scope проблемами; contract-сценарии требуют специализированных recipe.
Что с НДС
НДС-сущности и related entities в inventory присутствуют, но в текущий whitelist intents/runtime V1 они не входят как отдельный поддержанный домен.
1. Что находится в архиве
• Главный README описывает пакет как набор документов для перехода к отдельному runtime-режиму `question_mode=address_query`.
• Есть слой системной инвентаризации сущностей 1С по snapshot-корпусу 2020: entity inventory JSON-артефакты, relation/intention support sets, readable summary, run summary.
• Есть продуктовый слой: scenario matrix, query recipes, runtime contracts, integration plan, readiness matrix, question bank, acceptance suites и UI dry-run наборы.
• То есть архив сочетает два уровня: исследование структуры 1С-базы и проектирование прикладного factual-query runtime поверх этой структуры.
2. Структура пакета по смысловым блокам
Блок
Ключевые файлы
Зачем нужен
Инвентаризация 1С
entity_map_1c_2020.md, entity_inventory_*.json, run_summary.json
Показывает, какие сущности есть в snapshot-корпусе, насколько они query-suitable и какие relation patterns обнаружены.
Сценарии и intents
address_scenario_matrix.md, question_bank_v1.md
Фиксирует пользовательские вопросы, intent mapping, приоритеты и expected response types.
Recipe-слой
query_recipes_v1.md, address_runtime_contracts.md
Задает безопасный runtime-контур: intent -> filters -> recipe -> MCP -> factual result.
Интеграция и готовность
runtime_integration_plan.md, runtime_readiness_matrix_v1.md, execution_lineup_v1_2026-03-29.md
Показывает, как это встраивается и какие сценарии уже живы, а какие еще нет.
Acceptance и dry-run
curated_positive_live_suite_v1.md, data_aware_positive_acceptance_suite_v1.md, ui_dry_run_*
Нужны для live-проверки, контроля false factual и ручного прогона поддержанных вопросов.
3. Масштаб и состав inventory по базе 1С
• Источник данных: 12 monthly NDJSON snapshots за 2020 год.
• Обработано 7 039 648 строк без parse errors.
• Найдено 286 сущностей в 10 family-группах.
• Наиболее крупный пласт по строкам - INFORMATION_REGISTER (6,3 млн строк), но адресный runtime строится прежде всего на регистрах, документах, журналах и справочниках.
Family
Сущностей / строк
Приоритет
Комментарий
DOCUMENT
77 / 202 636
все P0
Главный источник document-level factual lookup.
ACCOUNTING_REGISTER
2 / 190 244
оба P0
Ключ к остаткам, хвостам и drilldown по проводкам.
NSI_CATALOG
50 / 140 050
3 P0 / 47 P1
Нужен для договоров, контрагентов и фильтровых резолверов.
DOCUMENT_JOURNAL
12 / 126 868
все P1
Быстрый индекс документов и банковских выписок.
ACCUMULATION_REGISTER
36 / 73 022
все P0
В inventory высоко видимы, но в runtime V1 почти не заведены как отдельные intents.
4. Какие домены реально прорабатываются
• Ключевой продуктовый домен - адресные factual-вопросы по взаиморасчетам и документам, а не произвольная аналитика по всей базе.
• Судя по scenario matrix, question bank и runtime contracts, текущий V1 разбит не по классическим бухгалтерским разделам, а по operational query-доменам.
Домен
Что входит
Статус
Комментарий
Контрагенты и задолженность
payables, receivables, open items by counterparty
ядро V1
Самый зрелый блок; есть curated positive cases и live-with-limits.
Счета и остатки
account balance, balance docs, turnover
частично
Структурно готово, но account-scope/materialization ограничивает стабильные non-empty ответы.
Договоры
open contracts, docs/open items by contract
не дожато
Есть в дизайне, но нужны specialized recipe и resolver path.
Документы и банковские операции
docs by counterparty, bank ops, list by type
ближе к рабочему
Именно здесь подтверждены live non-empty кейсы по counterparty family.
НДС и налоговые сущности
НДС-регистры, счета-фактуры, НДС-документы в inventory
не runtime V1
Есть в инвентаризации, но не заведены как whitelist intents.
5. Какие intents поддержаны по документам
• P0-ядро, зафиксированное в bootstrap report: `list_open_contracts`, `list_payables_counterparties`, `list_receivables_counterparties`, `account_balance_snapshot`, `open_items_by_counterparty_or_contract`.
• Как ближайшее расширение v1.1 перечислены: `list_documents_by_counterparty`, `list_documents_by_contract`, `documents_forming_balance`.
• Фактически в live runtime на момент пакета явно реализованы: `list_documents_by_counterparty`, `bank_operations_by_counterparty`, `documents_forming_balance`.
ID
Сценарий
Статус
Что мешает
AQ-P0-02
payables by counterparty
live, но с ограничениями
Широкие промпты пока дают sparse matches.
AQ-P0-03
receivables by counterparty
live, но с ограничениями
Нужны более точные period hints и anchor refinement.
AQ-P0-04
account balance snapshot
live, но с ограничениями
Строки приходят, но выпадают до materialization.
AQ-P0-05
open items by counterparty
live, но с ограничениями
Нужен явный counterparty anchor для стабильного non-empty.
AQ-P0-07
documents by counterparty
live, но с ограничениями
Есть positive cases, но якоря еще хрупкие.
AQ-P0-07B
bank ops by counterparty
live, но с ограничениями
Позитив подтвержден, но узкие/широкие варианты нестабильны.
AQ-P0-01/06/08
contract-related scenarios
требует спец. recipe
Не хватает contract-aware recipe и contract resolver.
AQ-P0-09
documents forming balance
live, но с ограничениями
Account family still blocked before materialization.
6. Какие сущности являются опорными
• Главная структурная опора - `AccountingRegister_Хозрасчетный_RecordType`: через него идут account, document, organization и часть business drilldown связей.
• Из документов центральны `СписаниеСРасчетногоСчета`, `ПоступлениеНаРасчетныйСчет`, их строки расшифровки платежа, а также `АктСверкиВзаиморасчетов`.
• Из справочников критичен `Catalog_ДоговорыКонтрагентов`; при этом `Catalog_Контрагенты`, `Catalog_Организации`, `Catalog_БанковскиеСчета` формально в triage отмечены как P1, но фактически обязательны для фильтров и resolver-логики.
• Document journals (`ДокументыПоставщиков`, `ДокументыПокупателей`, `БанковскиеВыписки`) играют роль быстрого индексного слоя для list/drilldown сценариев.
7. Что можно сказать про НДС
• В inventory присутствуют НДС-регистры и связанные сущности: `AccumulationRegister_НДСПредъявленный`, `AccumulationRegister_НДСЗаписиКнигиПокупок`, `AccumulationRegister_НДСЗаписиКнигиПродаж`, документы `СчетФактураПолученный`, `СчетФактураВыданный`, `СписаниеНДС`, журнал `РегламентныеДокументыНДС`.
• Однако в scenario matrix, recipe catalog и readiness matrix они не оформлены как отдельный runtime-домен текущего `address_query`.
• Поэтому корректный вывод такой: НДС уже есть в структурной инвентаризации базы, но в текущем пакете это не целевое продуктовое покрытие V1.
8. Ограничения и риски
• Часть labels и entity names в исходном экспорте испорчена cp1251/utf8 mojibake; потребуется финальный decoding/cleanup перед production binding.
• Без business resolvers нельзя надежно переходить от имени контрагента, договора или счета к ID.
• Free-form query builder специально запрещен; доступ предполагается только через whitelist recipe.
• Compound factual вопросы пока только детектируются, но не исполняются как multi-intent decomposition.
• Account-семейство пока не дает стабильный поток до materialization, хотя сырье на входе уже есть.
9. Выводы по текущему состоянию
• Архив уже дает хорошую картину по 1С-сущностям и будущему runtime.
• Сейчас реально прорабатывается не вся база и не весь бухгалтерский домен, а конкретный address-query слой: контрагенты, задолженность, договоры, документы, банковские операции, остатки/расшифровка по счетам.
• Самый зрелый operational блок - counterparty/document lookup.
• Contract-specific и account-specific сценарии структурно готовы, но требуют еще одного цикла реализации и настройки.
• НДС виден в inventory и может стать следующим отдельным доменом, но в данном архиве это пока не активное runtime-покрытие.
10. Практический next step
• Собрать отдельную матрицу: “что есть в inventory” vs “что заведено в intents/recipes” vs “что уже реально работает live”.
• Развести домены на 3 слоя: текущий рабочий V1, design-only backlog и visible-inventory but not productized.
• Отдельно сделать shortlist по НДС/налоговым сущностям, если следующая цель - расширить покрытие за пределы address_query.
@@ -0,0 +1,42 @@
# ADDRESS Query Production Pack V2
Дата: 2026-03-30
## Назначение
Этот пакет расширяет исходный `address_query` архив до production-oriented слоя:
- фиксирует полный доменный контур;
- раскладывает покрытие по intent/recipe/filter;
- добавляет массовый банк пользовательских формулировок в разных диалектах;
- задает acceptance-пакет для live проверки и дальнейшей доработки runtime.
## Что внутри
- `prod_domain_expansion_report.md` — итоговый аналитический отчет и стратегия доведения до prod.
- `address_domain_matrix_v2.md` — целевая матрица доменов/интентов/рецептов.
- `query_paraphrase_bank_v2.md` — расширенный банк формулировок по всем доменам.
- `question_bank_massive_v2.json` — машиночитаемый банк вопросов для NCP/MCP/LLM-routing.
- `resolver_normalization_spec_v2.md` — спецификация нормализации фильтров и синонимов.
- `production_acceptance_pack_v2.md` — критерии приемки для live-runtime.
- `execution_backlog_v2.md` — последовательность внедрения до prod-ready.
- `domain_gap_register_v2.md` — регистр пробелов между текущим runtime и целевым продом.
## Ключевой принцип
Проблема должна решаться не точечной ручной настройкой под отдельные вопросы, а слоем:
`dialect variants -> canonical intent -> required filters -> recipe -> MCP -> factual output`.
## Объем
- intent'ов: 13
- вопросов/парафраз: 234
- доменов: 8
## Совместимость со стилем исходного архива
Пакет сохранен в том же формате, что и исходный архив:
- markdown-документы;
- таблицы intent/recipe/filter;
- отдельный question bank;
- acceptance/readiness артефакты.
@@ -0,0 +1,28 @@
# Address Domain Matrix V2 (Prod Target)
Дата: 2026-03-30 Режим: `question_mode=address_query` (production extension)
## Scope
Этот слой охватывает direct factual lookup, агрегаты, drilldown и point-lookup по документам.
## Matrix
| scenario_id | domain | intent | recipe_id | required_filters | optional_filters | current_status | target_status | expected_response_type | priority |
|---|---|---|---|---|---|---|---|---|---|
| AQ-P0-01 | `contracts` | `list_open_contracts` | `address.open_contracts.by_asof` | `as_of_date` | `organization, counterparty, limit, sort` | STRUCTURALLY_VISIBLE / REQUIRES_SPECIALIZED_RECIPE | PROD_READY | `FACTUAL_LIST` | P0 |
| AQ-P0-02 | `debt` | `list_payables_counterparties` | `address.payables.counterparty_totals` | `as_of_date` | `organization, account, limit, sort` | STRUCTURALLY_VISIBLE / PLANNED | PROD_READY | `FACTUAL_SUMMARY` | P0 |
| AQ-P0-03 | `debt` | `list_receivables_counterparties` | `address.receivables.counterparty_totals` | `as_of_date` | `organization, account, limit, sort` | STRUCTURALLY_VISIBLE / PLANNED | PROD_READY | `FACTUAL_SUMMARY` | P0 |
| AQ-P0-04 | `accounts` | `account_balance_snapshot` | `address.account.balance_snapshot` | `account, as_of_date` | `organization, limit, sort` | STRUCTURALLY_VISIBLE / LIVE_QUERYABLE_WITH_LIMITS | PROD_READY | `FACTUAL_SUMMARY` | P0 |
| AQ-P0-05 | `open_items` | `open_items_by_counterparty` | `address.open_items.by_counterparty` | `counterparty, as_of_date` | `organization, contract, account, limit` | STRUCTURALLY_VISIBLE / LIVE_QUERYABLE_WITH_LIMITS | PROD_READY | `FACTUAL_LIST` | P0 |
| AQ-P0-06 | `open_items` | `open_items_by_contract` | `address.open_items.by_contract` | `contract, as_of_date` | `organization, counterparty, account, limit` | STRUCTURALLY_VISIBLE / REQUIRES_SPECIALIZED_RECIPE | PROD_READY | `FACTUAL_LIST` | P0 |
| AQ-P0-07 | `documents` | `list_documents_by_counterparty` | `address.documents.by_counterparty` | `counterparty, period_from, period_to` | `document_type, organization, limit, sort` | STRUCTURALLY_VISIBLE / LIVE_QUERYABLE_WITH_LIMITS | PROD_READY | `FACTUAL_LIST` | P0 |
| AQ-P0-07B | `bank_ops` | `bank_operations_by_counterparty` | `address.bank_ops.by_counterparty` | `counterparty` | `period_from, period_to, organization, limit, sort` | STRUCTURALLY_VISIBLE / LIVE_QUERYABLE_WITH_LIMITS | PROD_READY | `FACTUAL_LIST` | P0 |
| AQ-P0-08 | `documents` | `list_documents_by_contract` | `address.documents.by_contract` | `contract, period_from, period_to` | `document_type, organization, limit, sort` | STRUCTURALLY_VISIBLE / REQUIRES_SPECIALIZED_RECIPE | PROD_READY | `FACTUAL_LIST` | P0 |
| AQ-P0-09 | `drilldown` | `documents_forming_balance` | `address.balance.drilldown_documents` | `account, as_of_date` | `organization, counterparty, contract, limit` | STRUCTURALLY_VISIBLE / LIVE_QUERYABLE_WITH_LIMITS | PROD_READY | `FACTUAL_LIST` | P0 |
| AQ-P1-10 | `accounts` | `account_turnover_snapshot` | `address.account.turnover_snapshot` | `account, period_from, period_to` | `organization, counterparty, limit` | STRUCTURALLY_VISIBLE / PLANNED | PROD_READY | `FACTUAL_SUMMARY` | P1 |
| AQ-P1-11 | `documents` | `list_documents_by_type` | `address.documents.by_type` | `document_type, period_from, period_to` | `organization, counterparty, contract, limit` | STRUCTURALLY_VISIBLE / PLANNED | PROD_READY | `FACTUAL_LIST` | P1 |
| AQ-P1-12 | `document_lookup` | `find_document_by_number_and_date` | `address.document.lookup_by_number_date` | `document_number, document_date` | `document_type, organization, counterparty` | STRUCTURALLY_VISIBLE / NEW | PROD_READY | `FACTUAL_LIST` | P1 |
## Production Design Rules
- Для каждого intent должен существовать минимум один canonical recipe.
- Для каждого intent должны поддерживаться разговорные, бухгалтерские и сокращенные формулировки.
- Missing-filter fallback всегда явный: `LIMITED_WITH_REASON`, без ложного factual.
- Resolver работает отдельно от recipe и не зашивается в тексты примеров.
- Составные factual вопросы должны распадаться на подзапросы только после стабилизации single-intent покрытия.
@@ -0,0 +1,21 @@
# Domain Gap Register V2
Дата: 2026-03-30
## Регистр пробелов между текущим runtime и target prod
| domain | intent | current_gap | prod action |
|---|---|---|---|
| `contracts` | `list_open_contracts` | нет стабильного runtime recipe / resolver path | Нужен стабильный resolver по договору и единая логика open/closed. |
| `debt` | `list_payables_counterparties` | intent структурно описан, но не доведен до live-runtime | Ключевое покрытие бухгалтерского жаргона: кредиторка, задолженность перед поставщиками, долг поставщикам. |
| `debt` | `list_receivables_counterparties` | intent структурно описан, но не доведен до live-runtime | Нужны варианты: дебиторка, нам должны, покупатели должны, долг нам. |
| `accounts` | `account_balance_snapshot` | есть частичная live-проходимость, но недостаточная устойчивость по диалектам/anchor variants | Главный блокер — account scope/materialization. |
| `open_items` | `open_items_by_counterparty` | есть частичная live-проходимость, но недостаточная устойчивость по диалектам/anchor variants | Нужно покрыть жаргон: хвосты, незакрытое, висяк, остатки по взаиморасчетам. |
| `open_items` | `open_items_by_contract` | нет стабильного runtime recipe / resolver path | Требуется двухшаговый resolver contract->focused recipe. |
| `documents` | `list_documents_by_counterparty` | есть частичная live-проходимость, но недостаточная устойчивость по диалектам/anchor variants | Нужно держать разные диалекты: по поставщику, по клиенту, по контре, движения по контрагенту. |
| `bank_ops` | `bank_operations_by_counterparty` | есть частичная live-проходимость, но недостаточная устойчивость по диалектам/anchor variants | Варианты: оплаты, платежи, списания, поступления, банк по контрагенту. |
| `documents` | `list_documents_by_contract` | нет стабильного runtime recipe / resolver path | Нужна явная связка document <-> contract и фильтр по договорному идентификатору. |
| `drilldown` | `documents_forming_balance` | есть частичная live-проходимость, но недостаточная устойчивость по диалектам/anchor variants | Здесь особенно важны формулировки ‘расшифруй остаток’, ‘из чего сложился остаток’. |
| `accounts` | `account_turnover_snapshot` | intent структурно описан, но не доведен до live-runtime | Нужны варианты с оборотами, движением, дебет/кредит оборотами. |
| `documents` | `list_documents_by_type` | intent структурно описан, но не доведен до live-runtime | Важно распознавать русские и 1С-имена типа документа. |
| `document_lookup` | `find_document_by_number_and_date` | intent структурно описан, но не доведен до live-runtime | Берется прямо из question_bank_v1, полезно как частый пользовательский паттерн. |
@@ -0,0 +1,60 @@
# Execution Backlog V2
Дата: 2026-03-30
## Принцип приоритезации
Сначала доводим до устойчивого prod те интенты, где:
- уже есть structural support;
- уже видны живые строки или близкий доступ к ним;
- высокий бизнес-спрос;
- много пользовательских вариантов формулировок.
## Wave 1 — Stabilize current liveable intents
1. `list_documents_by_counterparty`
2. `bank_operations_by_counterparty`
3. `documents_forming_balance`
4. `account_balance_snapshot`
Что делаем:
- расширяем paraphrase bank;
- включаем account token normalization;
- добавляем resolver confidence audit;
- собираем positive + negative curated cases.
## Wave 2 — Close core accounting gap
5. `list_payables_counterparties`
6. `list_receivables_counterparties`
7. `list_open_contracts`
8. `open_items_by_counterparty`
9. `open_items_by_contract`
Что делаем:
- фиксируем recipe white-list;
- готовим отдельный resolver слой по договору/контрагенту;
- вводим явный open-items taxonomy;
- проверяем account/account-family joins.
## Wave 3 — Expand discoverability
10. `list_documents_by_contract`
11. `account_turnover_snapshot`
12. `list_documents_by_type`
13. `find_document_by_number_and_date`
Что делаем:
- point lookup path;
- type resolver;
- унификация периодных фильтров;
- корпус live acceptance.
## Definition of Done для каждого intent
- 10+ устойчивых формулировок;
- canonical filters извлекаются стабильно;
- selected recipe детерминирован;
- есть curated positive evidence;
- negative twins безопасны;
- documented limitation taxonomy закрыта.
@@ -0,0 +1,10 @@
README.md
address_domain_matrix_v2.md
domain_gap_register_v2.md
execution_backlog_v2.md
manifest.txt
prod_domain_expansion_report.md
production_acceptance_pack_v2.md
query_paraphrase_bank_v2.md
question_bank_massive_v2.json
resolver_normalization_spec_v2.md
@@ -0,0 +1,110 @@
# Address Query Production Expansion Report
Дата: 2026-03-30
## 1) Что именно решает этот пакет
Исходный архив хорошо описывает V1 runtime и фиксирует стартовый набор сценариев. Главная проблема, обозначенная пользователем, лежит не только в recipe-слое, а в связке:
`вариант формулировки -> intent -> filters -> resolver -> recipe`
Поэтому для доведения до prod недостаточно добавлять отдельные кейсы вручную. Нужно массовое покрытие домена через корпус формулировок и явные контракты нормализации.
## 2) Какой production target предлагается
### Production target = не “понимает один вопрос”, а:
- распознает 10+ естественных формулировок на intent;
- одинаково держит нейтральный, бухгалтерский и разговорный диалект;
- не разваливается от короткой/грязной формулировки;
- извлекает одинаковые canonical filters из разных phrasing;
- либо отдает factual, либо честно возвращает `LIMITED_WITH_REASON`.
## 3) Домены, которые надо считать целевыми
На базе исходного архива и question bank целевой контур такой:
1. задолженность / дебиторка / кредиторка;
2. открытые позиции / хвосты;
3. остатки по счетам;
4. обороты по счетам;
5. договоры;
6. документы по контрагенту;
7. документы по договору;
8. документы по типу;
9. банковские операции;
10. drilldown “какими документами сформирован остаток”;
11. point lookup документа по номеру/дате.
## 4) Что было слабым местом в исходном V1
- Сильнее всего был проработан counterparty/documents контур.
- Account family была частично видна, но упиралась в materialization/account-scope.
- Contract-family требовала специализированный resolver/recipe path.
- Массового корпуса диалектных формулировок не было: question bank был правильный по смыслу, но слишком компактный для продового routing.
## 5) Что добавлено в этот пакет
### A. Domain matrix V2
Фиксирует полный target-контур с required/optional filters и target recipe.
### B. Massive paraphrase bank
Дает корпус из 200+ формулировок, которые можно:
- использовать для декомпозиции и роутинга;
- пускать в automated batch acceptance;
- превращать в curated live suites.
### C. Normalization spec
Фиксирует, как переводить “контра/поставщик/клиент”, “хвост/остаток/сальдо”, “кредиторка/дебиторка” в stable intent/filter space.
### D. Production acceptance
Переводит качество из “кажется, местами работает” в измеримый acceptance по intent, диалекту и resolver quality.
## 6) Практическая стратегия внедрения
### Шаг 1. Freeze canonical intents
Не расширять бесконечно список intent'ов. Сначала закрепить канонический набор.
### Шаг 2. Attach paraphrase bank to normalizer tests
Каждая формулировка должна маппиться в один intent и один filter-contract.
### Шаг 3. Separate resolver failures from recipe failures
Сейчас часть “падений” пользователь видит как общую ошибку. В проде нужно видеть:
- не найден якорь;
- найден неоднозначно;
- recipe не поддерживает shape;
- raw rows есть, но materialization drops them.
### Шаг 4. Curated positive evidence
По каждому intent нужны реальные non-empty live кейсы. Без этого можно проверить только безопасность, но не полезность.
## 7) Рекомендуемая производственная последовательность
### Первая волна
- `list_documents_by_counterparty`
- `bank_operations_by_counterparty`
- `documents_forming_balance`
- `account_balance_snapshot`
### Вторая волна
- `list_payables_counterparties`
- `list_receivables_counterparties`
- `list_open_contracts`
- `open_items_by_counterparty`
- `open_items_by_contract`
### Третья волна
- `list_documents_by_contract`
- `account_turnover_snapshot`
- `list_documents_by_type`
- `find_document_by_number_and_date`
## 8) Ключевой управленческий вывод
Для этой задачи нужен не разовый набор “правильных вопросов”, а production corpus:
- intent matrix;
- resolver spec;
- massive paraphrase bank;
- acceptance pack.
Именно это позволяет перестать лечить каждый диалект вручную и перейти к системной доводке покрытия по доменам.
@@ -0,0 +1,92 @@
# Production Acceptance Pack V2
Дата: 2026-03-30
## Цель
Довести `address_query` до production-ready состояния на уровне:
- routing;
- intent detection;
- filter extraction;
- resolver robustness;
- factual stability;
- zero false factual.
## Обязательные suite'ы
### A. Routing & Intent Suite
Проверяет:
- mode routing;
- canonical intent resolution;
- detection of unsupported/causal queries;
- no deep-analysis regression.
### B. Dialect Robustness Suite
Проверяет:
- один и тот же intent в 10+ формулировках;
- бухгалтерский жаргон;
- разговорный диалект;
- сокращенные формулировки;
- уточняющие хвосты (`на сегодня`, `за период`, `по поставщику`).
### C. Resolver Robustness Suite
Проверяет:
- контрагент по полному имени;
- контрагент по короткому имени;
- договор по номеру;
- счет в разных форматах;
- тип документа по русскому и системному имени.
### D. Positive Evidence Suite
Проверяет:
- non-empty factual на curated live cases;
- стабильность recipe-level non-empty yield;
- отсутствие false factual.
### E. Negative Safety Suite
Проверяет:
- пустые или неоднозначные случаи возвращают `LIMITED_WITH_REASON`;
- нет молчаливой подмены anchor'а;
- нет ложных документов/сумм.
## Обязательные метрики
- `address_mode_routing_accuracy`
- `address_intent_resolution_rate`
- `dialect_variant_pass_rate`
- `required_filter_resolution_rate`
- `resolver_exact_or_high_confidence_rate`
- `live_call_success_rate`
- `factual_non_empty_rate`
- `false_factual_rate`
- `limited_reason_taxonomy_coverage`
## Целевые пороги
- `address_intent_resolution_rate >= 0.95`
- `dialect_variant_pass_rate >= 0.90`
- `required_filter_resolution_rate >= 0.95`
- `resolver_exact_or_high_confidence_rate >= 0.90`
- `live_call_success_rate >= 0.95`
- `false_factual_rate = 0`
## Минимальный debug contract
- `detected_mode`
- `detected_intent`
- `normalized_question`
- `resolved_filters`
- `missing_filters`
- `selected_recipe`
- resolver block
- MCP flow block
- `response_type`
- `limited_reason_category`
## Правило прод-приемки
Ни один домен не считается production-ready, пока он не прошел:
1. 10+ dialect variants на intent;
2. positive evidence;
3. negative twins;
4. ambiguity handling.
@@ -0,0 +1,359 @@
# Query Paraphrase Bank V2 — Address Query
Дата: 2026-03-30
## Назначение
Этот файл нужен для массовой декомпозиции пользовательских запросов в canonical intent'ы. Для каждого intent даны вариации в разных стилях: нейтральный, бухгалтерский, разговорный, сокращенный, операционный.
## AQ-P0-01 — `list_open_contracts`
- domain: `contracts`
- recipe: `address.open_contracts.by_asof`
- required filters: `as_of_date`
- optional filters: `organization, counterparty, limit, sort`
- goal: Показать незакрытые договоры на дату с суммами и контрагентом.
- какие договоры не закрыты на 2020-07-31
- покажи незакрытые договоры на 2020-07-31
- что из договоров висит открытым на 2020-07-31
- есть ли открытые договоры на 2020-07-31
- выгрузи договоры с остатком на 2020-07-31
- по каким договорам на 2020-07-31 еще нет закрытия
- дай список незакрытых договоров на 2020-07-31
- какие договоры остаются открытыми на 2020-07-31
- какие договоры болтаются незакрытыми на 2020-07-31
- покажи договоры, по которым есть хвост на 2020-07-31
- какие договоры в базе не закрыты на 2020-07-31
- что по открытым договорам на 2020-07-31
- сформируй перечень открытых договоров на 2020-07-31
- есть незакрытые договоры по состоянию на 2020-07-31
- какие договоры не схлопнулись на 2020-07-31
- по каким договорам висят остатки на 2020-07-31
- какие договоры не сведены на 2020-07-31
- открой договоры со сальдо на 2020-07-31
## AQ-P0-02 — `list_payables_counterparties`
- domain: `debt`
- recipe: `address.payables.counterparty_totals`
- required filters: `as_of_date`
- optional filters: `organization, account, limit, sort`
- goal: Определить, кому компания должна на дату.
- кому мы должны на 2020-07-31
- по кому у нас кредиторка на 2020-07-31
- покажи задолженность перед контрагентами на 2020-07-31
- какие поставщики ждут оплату на 2020-07-31
- кому должны денег по состоянию на 2020-07-31
- у кого перед нами нет оплаты? нет, наоборот: кому должны мы на 2020-07-31
- выведи кредиторскую задолженность на 2020-07-31
- кому нужно платить на 2020-07-31
- какие долги перед поставщиками висят на 2020-07-31
- контрагенты, которым мы должны на 2020-07-31
- по кому висит наш долг на 2020-07-31
- дай список кредиторов на 2020-07-31
- какая задолженность у нас перед поставщиками на 2020-07-31
- кому организация должна по взаиморасчетам на 2020-07-31
- раскрой кредиторку на 2020-07-31
- покажи кому мы должны денег по базе на 2020-07-31
- у каких контрагентов у нас минус на 2020-07-31
- по каким контрагентам надо закрывать долг на 2020-07-31
## AQ-P0-03 — `list_receivables_counterparties`
- domain: `debt`
- recipe: `address.receivables.counterparty_totals`
- required filters: `as_of_date`
- optional filters: `organization, account, limit, sort`
- goal: Определить, кто должен компании на дату.
- кто должен нам на 2020-07-31
- по кому у нас дебиторка на 2020-07-31
- покажи задолженность контрагентов перед нами на 2020-07-31
- какие покупатели нам должны на 2020-07-31
- кто не оплатил нам на 2020-07-31
- выведи дебиторскую задолженность на 2020-07-31
- кто висит в должниках на 2020-07-31
- какие долги нам торчат на 2020-07-31
- контрагенты, которые должны нам на 2020-07-31
- по кому висит долг нам на 2020-07-31
- дай список должников на 2020-07-31
- какая дебиторка у нас на 2020-07-31
- покажи, кто не закрылся перед нами на 2020-07-31
- кто должен организации по взаиморасчетам на 2020-07-31
- раскрой дебиторку на 2020-07-31
- у каких контрагентов есть долг перед нами на 2020-07-31
- по каким покупателям есть хвост на 2020-07-31
- кого нужно дожимать по оплате на 2020-07-31
## AQ-P0-04 — `account_balance_snapshot`
- domain: `accounts`
- recipe: `address.account.balance_snapshot`
- required filters: `account, as_of_date`
- optional filters: `organization, limit, sort`
- goal: Показать остаток по счету на дату.
- какой остаток по счету 62 на 2020-07-31
- покажи остаток по 62 счету на 2020-07-31
- что висит на счете 62 на 2020-07-31
- дай сальдо по счету 62 на 2020-07-31
- какой хвост на 62 на 2020-07-31
- какой остаток висит по 62 на 2020-07-31
- сколько на 62 счете на 2020-07-31
- сформируй остаток по счету 62 по состоянию на 2020-07-31
- раскрой остаток по счету 62 на 2020-07-31
- покажи сальдо по 62 на 2020-07-31
- что осталось на 62 счете на 2020-07-31
- по счету 62 какой баланс на 2020-07-31
- какой остаток по бухсчету 62 на 2020-07-31
- на 2020-07-31 сколько висит на счете 62
- остаток по плану счетов 62 на 2020-07-31
- какое сальдо по 62 по базе на 2020-07-31
- дай остаток по счету 62 с учетом проводок на 2020-07-31
- что по остатку счета 62 на 2020-07-31
## AQ-P0-05 — `open_items_by_counterparty`
- domain: `open_items`
- recipe: `address.open_items.by_counterparty`
- required filters: `counterparty, as_of_date`
- optional filters: `organization, contract, account, limit`
- goal: Показать хвосты / открытые позиции по контрагенту.
- какие хвосты висят по контрагенту ООО Альфа на 2020-07-31
- что не закрыто по ООО Альфа на 2020-07-31
- покажи открытые позиции по контрагенту ООО Альфа на 2020-07-31
- какие незакрытые взаиморасчеты по ООО Альфа на 2020-07-31
- какие долги/хвосты по ООО Альфа на 2020-07-31
- что висит по контрагенту ООО Альфа на 2020-07-31
- раскрой висяки по ООО Альфа на 2020-07-31
- покажи незакрытое по ООО Альфа на 2020-07-31
- какие остатки по взаиморасчетам с ООО Альфа на 2020-07-31
- есть ли хвосты по ООО Альфа на 2020-07-31
- по ООО Альфа что осталось открытым на 2020-07-31
- дай открытые документы/позиции по ООО Альфа на 2020-07-31
- покажи висящие суммы по ООО Альфа на 2020-07-31
- что не схлопнулось по контрагенту ООО Альфа на 2020-07-31
- по поставщику ООО Альфа какие хвосты на 2020-07-31
- по клиенту ООО Альфа что не закрыто на 2020-07-31
- взаиморасчеты с ООО Альфа: что висит на 2020-07-31
- покажи остатки по контрагенту ООО Альфа на 2020-07-31
## AQ-P0-06 — `open_items_by_contract`
- domain: `open_items`
- recipe: `address.open_items.by_contract`
- required filters: `contract, as_of_date`
- optional filters: `organization, counterparty, account, limit`
- goal: Показать хвосты / открытые позиции по договору.
- какие хвосты висят по договору 15/24 на 2020-07-31
- что не закрыто по договору 15/24 на 2020-07-31
- покажи открытые позиции по договору 15/24 на 2020-07-31
- какие незакрытые взаиморасчеты по договору 15/24 на 2020-07-31
- что висит по договору 15/24 на 2020-07-31
- раскрой висяки по договору 15/24 на 2020-07-31
- покажи незакрытое по договору 15/24 на 2020-07-31
- какие остатки по договору 15/24 на 2020-07-31
- есть ли хвосты по договору 15/24 на 2020-07-31
- по договору 15/24 что осталось открытым на 2020-07-31
- дай открытые документы/позиции по договору 15/24 на 2020-07-31
- покажи висящие суммы по договору 15/24 на 2020-07-31
- что не схлопнулось по договору 15/24 на 2020-07-31
- по договору 15/24 какие хвосты на 2020-07-31
- взаиморасчеты по договору 15/24: что висит на 2020-07-31
- покажи остатки по договору 15/24 на 2020-07-31
- какие позиции не закрыты по договору 15/24 на 2020-07-31
- дай хвосты по договору 15/24 по состоянию на 2020-07-31
## AQ-P0-07 — `list_documents_by_counterparty`
- domain: `documents`
- recipe: `address.documents.by_counterparty`
- required filters: `counterparty, period_from, period_to`
- optional filters: `document_type, organization, limit, sort`
- goal: Показать документы по контрагенту за период.
- покажи документы по контрагенту ООО Альфа за период 2020-07-01..2020-07-31
- дай документы по ООО Альфа за 2020-07-01..2020-07-31
- какие документы были по контрагенту ООО Альфа за 2020-07-01..2020-07-31
- выгрузи документы по ООО Альфа за 2020-07-01..2020-07-31
- покажи движения документов по ООО Альфа за 2020-07-01..2020-07-31
- что за документы проходили по ООО Альфа за 2020-07-01..2020-07-31
- дай первичку по ООО Альфа за 2020-07-01..2020-07-31
- какие документы по поставщику ООО Альфа за 2020-07-01..2020-07-31
- какие документы по клиенту ООО Альфа за 2020-07-01..2020-07-31
- найди документы по контре ООО Альфа за 2020-07-01..2020-07-31
- список документов по ООО Альфа за 2020-07-01..2020-07-31
- покажи все документы по ООО Альфа за 2020-07-01..2020-07-31
- по контрагенту ООО Альфа какие документы были в 2020-07-01..2020-07-31
- по ООО Альфа дай документы за 2020-07-01..2020-07-31
- какие проведенные документы по ООО Альфа за 2020-07-01..2020-07-31
- по поставщику ООО Альфа покажи документы за 2020-07-01..2020-07-31
- по контрагенту ООО Альфа нужна выгрузка документов за 2020-07-01..2020-07-31
- документальный след по ООО Альфа за 2020-07-01..2020-07-31
## AQ-P0-07B — `bank_operations_by_counterparty`
- domain: `bank_ops`
- recipe: `address.bank_ops.by_counterparty`
- required filters: `counterparty`
- optional filters: `period_from, period_to, organization, limit, sort`
- goal: Показать банковские операции по контрагенту.
- покажи банковские операции по контрагенту ООО Альфа за 2020-07-01..2020-07-31
- какие платежи были по ООО Альфа за 2020-07-01..2020-07-31
- были ли оплаты по ООО Альфа за 2020-07-01..2020-07-31
- дай банк по контрагенту ООО Альфа за 2020-07-01..2020-07-31
- покажи движения по банку с ООО Альфа за 2020-07-01..2020-07-31
- какие списания/поступления были по ООО Альфа за 2020-07-01..2020-07-31
- выгрузи банковские документы по ООО Альфа за 2020-07-01..2020-07-31
- покажи платежки по ООО Альфа за 2020-07-01..2020-07-31
- что проходило по расчетному счету с ООО Альфа за 2020-07-01..2020-07-31
- какие оплаты поставщику ООО Альфа были за 2020-07-01..2020-07-31
- какие поступления от ООО Альфа были за 2020-07-01..2020-07-31
- найди банковские операции по контре ООО Альфа за 2020-07-01..2020-07-31
- список оплат по ООО Альфа за 2020-07-01..2020-07-31
- покажи банк по ООО Альфа за 2020-07-01..2020-07-31
- по контрагенту ООО Альфа какие платежи шли в 2020-07-01..2020-07-31
- по ООО Альфа нужна банковская выборка за 2020-07-01..2020-07-31
- были ли платежные движения по ООО Альфа за 2020-07-01..2020-07-31
- все банковские проходы по ООО Альфа за 2020-07-01..2020-07-31
## AQ-P0-08 — `list_documents_by_contract`
- domain: `documents`
- recipe: `address.documents.by_contract`
- required filters: `contract, period_from, period_to`
- optional filters: `document_type, organization, limit, sort`
- goal: Показать документы по договору за период.
- покажи документы по договору 15/24 за период 2020-07-01..2020-07-31
- дай документы по договору 15/24 за 2020-07-01..2020-07-31
- какие документы были по договору 15/24 за 2020-07-01..2020-07-31
- выгрузи документы по договору 15/24 за 2020-07-01..2020-07-31
- что за документы проходили по договору 15/24 за 2020-07-01..2020-07-31
- дай первичку по договору 15/24 за 2020-07-01..2020-07-31
- список документов по договору 15/24 за 2020-07-01..2020-07-31
- покажи все документы по договору 15/24 за 2020-07-01..2020-07-31
- по договору 15/24 какие документы были в 2020-07-01..2020-07-31
- по 15/24 дай документы за 2020-07-01..2020-07-31
- какие проведенные документы по договору 15/24 за 2020-07-01..2020-07-31
- по договору 15/24 покажи документы за 2020-07-01..2020-07-31
- по договору 15/24 нужна выгрузка документов за 2020-07-01..2020-07-31
- документальный след по договору 15/24 за 2020-07-01..2020-07-31
- есть ли документы по договору 15/24 за 2020-07-01..2020-07-31
- покажи движения документов по договору 15/24 за 2020-07-01..2020-07-31
- что оформляли по договору 15/24 за 2020-07-01..2020-07-31
- все документы, связанные с договором 15/24, за 2020-07-01..2020-07-31
## AQ-P0-09 — `documents_forming_balance`
- domain: `drilldown`
- recipe: `address.balance.drilldown_documents`
- required filters: `account, as_of_date`
- optional filters: `organization, counterparty, contract, limit`
- goal: Раскрыть, какими документами сформирован остаток по счету.
- какие документы формируют остаток по счету 62 на 2020-07-31
- расшифруй остаток по счету 62 на 2020-07-31 по документам
- из каких документов сложился остаток по 62 на 2020-07-31
- покажи документы, которые дали остаток по счету 62 на 2020-07-31
- чем сформирован остаток по 62 на 2020-07-31
- какие документы висят в остатке по 62 на 2020-07-31
- раскрой остаток по 62 на 2020-07-31 до документов
- дай документную расшифровку остатка по счету 62 на 2020-07-31
- по счету 62 какие документы формируют сальдо на 2020-07-31
- покажи первичку, которая сидит в остатке 62 на 2020-07-31
- что конкретно образует остаток по 62 на 2020-07-31
- какие регистраторы формируют остаток счета 62 на 2020-07-31
- разложи остаток по счету 62 на 2020-07-31 на документы
- по 62 на 2020-07-31 нужен drilldown до документов
- остаток счета 62 на 2020-07-31: из чего он состоит
- какие документы попали в хвост по счету 62 на 2020-07-31
- раскрой сальдо 62 на 2020-07-31 по документам
- что формирует баланс по счету 62 на 2020-07-31
## AQ-P1-10 — `account_turnover_snapshot`
- domain: `accounts`
- recipe: `address.account.turnover_snapshot`
- required filters: `account, period_from, period_to`
- optional filters: `organization, counterparty, limit`
- goal: Показать обороты по счету за период.
- дай обороты по счету 62 за 2020-07-01..2020-07-31
- покажи движение по счету 62 за 2020-07-01..2020-07-31
- какие обороты по 62 были за 2020-07-01..2020-07-31
- выведи дебет/кредит обороты по счету 62 за 2020-07-01..2020-07-31
- сформируй оборотку по счету 62 за 2020-07-01..2020-07-31
- по счету 62 какие обороты в 2020-07-01..2020-07-31
- дай обороты по бухсчету 62 за 2020-07-01..2020-07-31
- что прошло по счету 62 за 2020-07-01..2020-07-31
- обороты по 62 счету за 2020-07-01..2020-07-31
- покажи обороты счета 62 за 2020-07-01..2020-07-31
- какое движение по 62 за 2020-07-01..2020-07-31
- дай сумму оборотов по 62 за 2020-07-01..2020-07-31
- по 62 раскрой дебетовые и кредитовые обороты за 2020-07-01..2020-07-31
- какие суммы крутились по счету 62 за 2020-07-01..2020-07-31
- покажи оборот по плану счетов 62 за 2020-07-01..2020-07-31
- счет 62: движение за 2020-07-01..2020-07-31
- что было по дебету/кредиту счета 62 за 2020-07-01..2020-07-31
- нужны обороты по 62 за 2020-07-01..2020-07-31
## AQ-P1-11 — `list_documents_by_type`
- domain: `documents`
- recipe: `address.documents.by_type`
- required filters: `document_type, period_from, period_to`
- optional filters: `organization, counterparty, contract, limit`
- goal: Показать документы определенного вида за период.
- дай документы типа СписаниеСРасчетногоСчета за 2020-07-01..2020-07-31
- покажи документы вида СписаниеСРасчетногоСчета за 2020-07-01..2020-07-31
- какие документы СписаниеСРасчетногоСчета есть за 2020-07-01..2020-07-31
- выгрузи документы типа СписаниеСРасчетногоСчета за 2020-07-01..2020-07-31
- список документов СписаниеСРасчетногоСчета за 2020-07-01..2020-07-31
- покажи все СписаниеСРасчетногоСчета за 2020-07-01..2020-07-31
- какие проведенные документы типа СписаниеСРасчетногоСчета были за 2020-07-01..2020-07-31
- документы вида СписаниеСРасчетногоСчета в 2020-07-01..2020-07-31
- по типу СписаниеСРасчетногоСчета покажи документы за 2020-07-01..2020-07-31
- что есть по документам типа СписаниеСРасчетногоСчета за 2020-07-01..2020-07-31
- дай выборку по СписаниеСРасчетногоСчета за 2020-07-01..2020-07-31
- покажи реестр СписаниеСРасчетногоСчета за 2020-07-01..2020-07-31
- по виду документа СписаниеСРасчетногоСчета нужна выгрузка за 2020-07-01..2020-07-31
- какие экземпляры СписаниеСРасчетногоСчета проходили за 2020-07-01..2020-07-31
- документы 1С типа СписаниеСРасчетногоСчета за 2020-07-01..2020-07-31
- найди документы СписаниеСРасчетногоСчета за 2020-07-01..2020-07-31
- выведи журнал по СписаниеСРасчетногоСчета за 2020-07-01..2020-07-31
- какие документы этого типа были оформлены за 2020-07-01..2020-07-31
## AQ-P1-12 — `find_document_by_number_and_date`
- domain: `document_lookup`
- recipe: `address.document.lookup_by_number_date`
- required filters: `document_number, document_date`
- optional filters: `document_type, organization, counterparty`
- goal: Найти конкретный документ по номеру и дате.
- найди документ № 000123 от 2020-07-15
- покажи документ номер 000123 от 2020-07-15
- есть ли документ 000123 от 2020-07-15
- отыщи документ № 000123 датой 2020-07-15
- нужен документ 000123 от 2020-07-15
- в базе есть документ 000123 от 2020-07-15
- подними документ номер 000123 от 2020-07-15
- покажи, что за документ 000123 от 2020-07-15
- дай карточку документа 000123 от 2020-07-15
- ищу документ 000123 от 2020-07-15
- найди по номеру 000123 и дате 2020-07-15
- проверь наличие документа 000123 от 2020-07-15
- покажи запись по документу 000123 от 2020-07-15
- где документ 000123 от 2020-07-15
- какой документ проходит под номером 000123 от 2020-07-15
- вытащи документ 000123 от 2020-07-15
- документ номер 000123, дата 2020-07-15
- дай документ по реквизитам: номер 000123, дата 2020-07-15
@@ -0,0 +1,487 @@
{
"generated_at": "2026-03-30",
"package": "address_query_prod_pack_v2",
"total_intents": 13,
"total_questions": 234,
"items": [
{
"scenario_id": "AQ-P0-01",
"domain": "contracts",
"intent": "list_open_contracts",
"recipe_id": "address.open_contracts.by_asof",
"required_filters": [
"as_of_date"
],
"optional_filters": [
"organization",
"counterparty",
"limit",
"sort"
],
"expected_response_type": "FACTUAL_LIST",
"questions": [
"какие договоры не закрыты на 2020-07-31",
"покажи незакрытые договоры на 2020-07-31",
"что из договоров висит открытым на 2020-07-31",
"есть ли открытые договоры на 2020-07-31",
"выгрузи договоры с остатком на 2020-07-31",
"по каким договорам на 2020-07-31 еще нет закрытия",
"дай список незакрытых договоров на 2020-07-31",
"какие договоры остаются открытыми на 2020-07-31",
"какие договоры болтаются незакрытыми на 2020-07-31",
"покажи договоры, по которым есть хвост на 2020-07-31",
"какие договоры в базе не закрыты на 2020-07-31",
"что по открытым договорам на 2020-07-31",
"сформируй перечень открытых договоров на 2020-07-31",
"есть незакрытые договоры по состоянию на 2020-07-31",
"какие договоры не схлопнулись на 2020-07-31",
"по каким договорам висят остатки на 2020-07-31",
"какие договоры не сведены на 2020-07-31",
"открой договоры со сальдо на 2020-07-31"
]
},
{
"scenario_id": "AQ-P0-02",
"domain": "debt",
"intent": "list_payables_counterparties",
"recipe_id": "address.payables.counterparty_totals",
"required_filters": [
"as_of_date"
],
"optional_filters": [
"organization",
"account",
"limit",
"sort"
],
"expected_response_type": "FACTUAL_SUMMARY",
"questions": [
"кому мы должны на 2020-07-31",
"по кому у нас кредиторка на 2020-07-31",
"покажи задолженность перед контрагентами на 2020-07-31",
"какие поставщики ждут оплату на 2020-07-31",
"кому должны денег по состоянию на 2020-07-31",
"у кого перед нами нет оплаты? нет, наоборот: кому должны мы на 2020-07-31",
"выведи кредиторскую задолженность на 2020-07-31",
"кому нужно платить на 2020-07-31",
"какие долги перед поставщиками висят на 2020-07-31",
"контрагенты, которым мы должны на 2020-07-31",
"по кому висит наш долг на 2020-07-31",
"дай список кредиторов на 2020-07-31",
"какая задолженность у нас перед поставщиками на 2020-07-31",
"кому организация должна по взаиморасчетам на 2020-07-31",
"раскрой кредиторку на 2020-07-31",
"покажи кому мы должны денег по базе на 2020-07-31",
"у каких контрагентов у нас минус на 2020-07-31",
"по каким контрагентам надо закрывать долг на 2020-07-31"
]
},
{
"scenario_id": "AQ-P0-03",
"domain": "debt",
"intent": "list_receivables_counterparties",
"recipe_id": "address.receivables.counterparty_totals",
"required_filters": [
"as_of_date"
],
"optional_filters": [
"organization",
"account",
"limit",
"sort"
],
"expected_response_type": "FACTUAL_SUMMARY",
"questions": [
"кто должен нам на 2020-07-31",
"по кому у нас дебиторка на 2020-07-31",
"покажи задолженность контрагентов перед нами на 2020-07-31",
"какие покупатели нам должны на 2020-07-31",
"кто не оплатил нам на 2020-07-31",
"выведи дебиторскую задолженность на 2020-07-31",
"кто висит в должниках на 2020-07-31",
"какие долги нам торчат на 2020-07-31",
"контрагенты, которые должны нам на 2020-07-31",
"по кому висит долг нам на 2020-07-31",
"дай список должников на 2020-07-31",
"какая дебиторка у нас на 2020-07-31",
"покажи, кто не закрылся перед нами на 2020-07-31",
"кто должен организации по взаиморасчетам на 2020-07-31",
"раскрой дебиторку на 2020-07-31",
"у каких контрагентов есть долг перед нами на 2020-07-31",
"по каким покупателям есть хвост на 2020-07-31",
"кого нужно дожимать по оплате на 2020-07-31"
]
},
{
"scenario_id": "AQ-P0-04",
"domain": "accounts",
"intent": "account_balance_snapshot",
"recipe_id": "address.account.balance_snapshot",
"required_filters": [
"account",
"as_of_date"
],
"optional_filters": [
"organization",
"limit",
"sort"
],
"expected_response_type": "FACTUAL_SUMMARY",
"questions": [
"какой остаток по счету 62 на 2020-07-31",
"покажи остаток по 62 счету на 2020-07-31",
"что висит на счете 62 на 2020-07-31",
"дай сальдо по счету 62 на 2020-07-31",
"какой хвост на 62 на 2020-07-31",
"какой остаток висит по 62 на 2020-07-31",
"сколько на 62 счете на 2020-07-31",
"сформируй остаток по счету 62 по состоянию на 2020-07-31",
"раскрой остаток по счету 62 на 2020-07-31",
"покажи сальдо по 62 на 2020-07-31",
"что осталось на 62 счете на 2020-07-31",
"по счету 62 какой баланс на 2020-07-31",
"какой остаток по бухсчету 62 на 2020-07-31",
"на 2020-07-31 сколько висит на счете 62",
"остаток по плану счетов 62 на 2020-07-31",
"какое сальдо по 62 по базе на 2020-07-31",
"дай остаток по счету 62 с учетом проводок на 2020-07-31",
"что по остатку счета 62 на 2020-07-31"
]
},
{
"scenario_id": "AQ-P0-05",
"domain": "open_items",
"intent": "open_items_by_counterparty",
"recipe_id": "address.open_items.by_counterparty",
"required_filters": [
"counterparty",
"as_of_date"
],
"optional_filters": [
"organization",
"contract",
"account",
"limit"
],
"expected_response_type": "FACTUAL_LIST",
"questions": [
"какие хвосты висят по контрагенту ООО Альфа на 2020-07-31",
"что не закрыто по ООО Альфа на 2020-07-31",
"покажи открытые позиции по контрагенту ООО Альфа на 2020-07-31",
"какие незакрытые взаиморасчеты по ООО Альфа на 2020-07-31",
"какие долги/хвосты по ООО Альфа на 2020-07-31",
"что висит по контрагенту ООО Альфа на 2020-07-31",
"раскрой висяки по ООО Альфа на 2020-07-31",
"покажи незакрытое по ООО Альфа на 2020-07-31",
"какие остатки по взаиморасчетам с ООО Альфа на 2020-07-31",
"есть ли хвосты по ООО Альфа на 2020-07-31",
"по ООО Альфа что осталось открытым на 2020-07-31",
"дай открытые документы/позиции по ООО Альфа на 2020-07-31",
"покажи висящие суммы по ООО Альфа на 2020-07-31",
"что не схлопнулось по контрагенту ООО Альфа на 2020-07-31",
"по поставщику ООО Альфа какие хвосты на 2020-07-31",
"по клиенту ООО Альфа что не закрыто на 2020-07-31",
"взаиморасчеты с ООО Альфа: что висит на 2020-07-31",
"покажи остатки по контрагенту ООО Альфа на 2020-07-31"
]
},
{
"scenario_id": "AQ-P0-06",
"domain": "open_items",
"intent": "open_items_by_contract",
"recipe_id": "address.open_items.by_contract",
"required_filters": [
"contract",
"as_of_date"
],
"optional_filters": [
"organization",
"counterparty",
"account",
"limit"
],
"expected_response_type": "FACTUAL_LIST",
"questions": [
"какие хвосты висят по договору 15/24 на 2020-07-31",
"что не закрыто по договору 15/24 на 2020-07-31",
"покажи открытые позиции по договору 15/24 на 2020-07-31",
"какие незакрытые взаиморасчеты по договору 15/24 на 2020-07-31",
"что висит по договору 15/24 на 2020-07-31",
"раскрой висяки по договору 15/24 на 2020-07-31",
"покажи незакрытое по договору 15/24 на 2020-07-31",
"какие остатки по договору 15/24 на 2020-07-31",
"есть ли хвосты по договору 15/24 на 2020-07-31",
"по договору 15/24 что осталось открытым на 2020-07-31",
"дай открытые документы/позиции по договору 15/24 на 2020-07-31",
"покажи висящие суммы по договору 15/24 на 2020-07-31",
"что не схлопнулось по договору 15/24 на 2020-07-31",
"по договору 15/24 какие хвосты на 2020-07-31",
"взаиморасчеты по договору 15/24: что висит на 2020-07-31",
"покажи остатки по договору 15/24 на 2020-07-31",
"какие позиции не закрыты по договору 15/24 на 2020-07-31",
"дай хвосты по договору 15/24 по состоянию на 2020-07-31"
]
},
{
"scenario_id": "AQ-P0-07",
"domain": "documents",
"intent": "list_documents_by_counterparty",
"recipe_id": "address.documents.by_counterparty",
"required_filters": [
"counterparty",
"period_from",
"period_to"
],
"optional_filters": [
"document_type",
"organization",
"limit",
"sort"
],
"expected_response_type": "FACTUAL_LIST",
"questions": [
"покажи документы по контрагенту ООО Альфа за период 2020-07-01..2020-07-31",
"дай документы по ООО Альфа за 2020-07-01..2020-07-31",
"какие документы были по контрагенту ООО Альфа за 2020-07-01..2020-07-31",
"выгрузи документы по ООО Альфа за 2020-07-01..2020-07-31",
"покажи движения документов по ООО Альфа за 2020-07-01..2020-07-31",
"что за документы проходили по ООО Альфа за 2020-07-01..2020-07-31",
"дай первичку по ООО Альфа за 2020-07-01..2020-07-31",
"какие документы по поставщику ООО Альфа за 2020-07-01..2020-07-31",
"какие документы по клиенту ООО Альфа за 2020-07-01..2020-07-31",
"найди документы по контре ООО Альфа за 2020-07-01..2020-07-31",
"список документов по ООО Альфа за 2020-07-01..2020-07-31",
"покажи все документы по ООО Альфа за 2020-07-01..2020-07-31",
"по контрагенту ООО Альфа какие документы были в 2020-07-01..2020-07-31",
"по ООО Альфа дай документы за 2020-07-01..2020-07-31",
"какие проведенные документы по ООО Альфа за 2020-07-01..2020-07-31",
"по поставщику ООО Альфа покажи документы за 2020-07-01..2020-07-31",
"по контрагенту ООО Альфа нужна выгрузка документов за 2020-07-01..2020-07-31",
"документальный след по ООО Альфа за 2020-07-01..2020-07-31"
]
},
{
"scenario_id": "AQ-P0-07B",
"domain": "bank_ops",
"intent": "bank_operations_by_counterparty",
"recipe_id": "address.bank_ops.by_counterparty",
"required_filters": [
"counterparty"
],
"optional_filters": [
"period_from",
"period_to",
"organization",
"limit",
"sort"
],
"expected_response_type": "FACTUAL_LIST",
"questions": [
"покажи банковские операции по контрагенту ООО Альфа за 2020-07-01..2020-07-31",
"какие платежи были по ООО Альфа за 2020-07-01..2020-07-31",
"были ли оплаты по ООО Альфа за 2020-07-01..2020-07-31",
"дай банк по контрагенту ООО Альфа за 2020-07-01..2020-07-31",
"покажи движения по банку с ООО Альфа за 2020-07-01..2020-07-31",
"какие списания/поступления были по ООО Альфа за 2020-07-01..2020-07-31",
"выгрузи банковские документы по ООО Альфа за 2020-07-01..2020-07-31",
"покажи платежки по ООО Альфа за 2020-07-01..2020-07-31",
"что проходило по расчетному счету с ООО Альфа за 2020-07-01..2020-07-31",
"какие оплаты поставщику ООО Альфа были за 2020-07-01..2020-07-31",
"какие поступления от ООО Альфа были за 2020-07-01..2020-07-31",
"найди банковские операции по контре ООО Альфа за 2020-07-01..2020-07-31",
"список оплат по ООО Альфа за 2020-07-01..2020-07-31",
"покажи банк по ООО Альфа за 2020-07-01..2020-07-31",
"по контрагенту ООО Альфа какие платежи шли в 2020-07-01..2020-07-31",
"по ООО Альфа нужна банковская выборка за 2020-07-01..2020-07-31",
"были ли платежные движения по ООО Альфа за 2020-07-01..2020-07-31",
"все банковские проходы по ООО Альфа за 2020-07-01..2020-07-31"
]
},
{
"scenario_id": "AQ-P0-08",
"domain": "documents",
"intent": "list_documents_by_contract",
"recipe_id": "address.documents.by_contract",
"required_filters": [
"contract",
"period_from",
"period_to"
],
"optional_filters": [
"document_type",
"organization",
"limit",
"sort"
],
"expected_response_type": "FACTUAL_LIST",
"questions": [
"покажи документы по договору 15/24 за период 2020-07-01..2020-07-31",
"дай документы по договору 15/24 за 2020-07-01..2020-07-31",
"какие документы были по договору 15/24 за 2020-07-01..2020-07-31",
"выгрузи документы по договору 15/24 за 2020-07-01..2020-07-31",
"что за документы проходили по договору 15/24 за 2020-07-01..2020-07-31",
"дай первичку по договору 15/24 за 2020-07-01..2020-07-31",
"список документов по договору 15/24 за 2020-07-01..2020-07-31",
"покажи все документы по договору 15/24 за 2020-07-01..2020-07-31",
"по договору 15/24 какие документы были в 2020-07-01..2020-07-31",
"по 15/24 дай документы за 2020-07-01..2020-07-31",
"какие проведенные документы по договору 15/24 за 2020-07-01..2020-07-31",
"по договору 15/24 покажи документы за 2020-07-01..2020-07-31",
"по договору 15/24 нужна выгрузка документов за 2020-07-01..2020-07-31",
"документальный след по договору 15/24 за 2020-07-01..2020-07-31",
"есть ли документы по договору 15/24 за 2020-07-01..2020-07-31",
"покажи движения документов по договору 15/24 за 2020-07-01..2020-07-31",
"что оформляли по договору 15/24 за 2020-07-01..2020-07-31",
"все документы, связанные с договором 15/24, за 2020-07-01..2020-07-31"
]
},
{
"scenario_id": "AQ-P0-09",
"domain": "drilldown",
"intent": "documents_forming_balance",
"recipe_id": "address.balance.drilldown_documents",
"required_filters": [
"account",
"as_of_date"
],
"optional_filters": [
"organization",
"counterparty",
"contract",
"limit"
],
"expected_response_type": "FACTUAL_LIST",
"questions": [
"какие документы формируют остаток по счету 62 на 2020-07-31",
"расшифруй остаток по счету 62 на 2020-07-31 по документам",
"из каких документов сложился остаток по 62 на 2020-07-31",
"покажи документы, которые дали остаток по счету 62 на 2020-07-31",
"чем сформирован остаток по 62 на 2020-07-31",
"какие документы висят в остатке по 62 на 2020-07-31",
"раскрой остаток по 62 на 2020-07-31 до документов",
"дай документную расшифровку остатка по счету 62 на 2020-07-31",
"по счету 62 какие документы формируют сальдо на 2020-07-31",
"покажи первичку, которая сидит в остатке 62 на 2020-07-31",
"что конкретно образует остаток по 62 на 2020-07-31",
"какие регистраторы формируют остаток счета 62 на 2020-07-31",
"разложи остаток по счету 62 на 2020-07-31 на документы",
"по 62 на 2020-07-31 нужен drilldown до документов",
"остаток счета 62 на 2020-07-31: из чего он состоит",
"какие документы попали в хвост по счету 62 на 2020-07-31",
"раскрой сальдо 62 на 2020-07-31 по документам",
"что формирует баланс по счету 62 на 2020-07-31"
]
},
{
"scenario_id": "AQ-P1-10",
"domain": "accounts",
"intent": "account_turnover_snapshot",
"recipe_id": "address.account.turnover_snapshot",
"required_filters": [
"account",
"period_from",
"period_to"
],
"optional_filters": [
"organization",
"counterparty",
"limit"
],
"expected_response_type": "FACTUAL_SUMMARY",
"questions": [
"дай обороты по счету 62 за 2020-07-01..2020-07-31",
"покажи движение по счету 62 за 2020-07-01..2020-07-31",
"какие обороты по 62 были за 2020-07-01..2020-07-31",
"выведи дебет/кредит обороты по счету 62 за 2020-07-01..2020-07-31",
"сформируй оборотку по счету 62 за 2020-07-01..2020-07-31",
"по счету 62 какие обороты в 2020-07-01..2020-07-31",
"дай обороты по бухсчету 62 за 2020-07-01..2020-07-31",
"что прошло по счету 62 за 2020-07-01..2020-07-31",
"обороты по 62 счету за 2020-07-01..2020-07-31",
"покажи обороты счета 62 за 2020-07-01..2020-07-31",
"какое движение по 62 за 2020-07-01..2020-07-31",
"дай сумму оборотов по 62 за 2020-07-01..2020-07-31",
"по 62 раскрой дебетовые и кредитовые обороты за 2020-07-01..2020-07-31",
"какие суммы крутились по счету 62 за 2020-07-01..2020-07-31",
"покажи оборот по плану счетов 62 за 2020-07-01..2020-07-31",
"счет 62: движение за 2020-07-01..2020-07-31",
"что было по дебету/кредиту счета 62 за 2020-07-01..2020-07-31",
"нужны обороты по 62 за 2020-07-01..2020-07-31"
]
},
{
"scenario_id": "AQ-P1-11",
"domain": "documents",
"intent": "list_documents_by_type",
"recipe_id": "address.documents.by_type",
"required_filters": [
"document_type",
"period_from",
"period_to"
],
"optional_filters": [
"organization",
"counterparty",
"contract",
"limit"
],
"expected_response_type": "FACTUAL_LIST",
"questions": [
"дай документы типа СписаниеСРасчетногоСчета за 2020-07-01..2020-07-31",
"покажи документы вида СписаниеСРасчетногоСчета за 2020-07-01..2020-07-31",
"какие документы СписаниеСРасчетногоСчета есть за 2020-07-01..2020-07-31",
"выгрузи документы типа СписаниеСРасчетногоСчета за 2020-07-01..2020-07-31",
"список документов СписаниеСРасчетногоСчета за 2020-07-01..2020-07-31",
"покажи все СписаниеСРасчетногоСчета за 2020-07-01..2020-07-31",
"какие проведенные документы типа СписаниеСРасчетногоСчета были за 2020-07-01..2020-07-31",
"документы вида СписаниеСРасчетногоСчета в 2020-07-01..2020-07-31",
"по типу СписаниеСРасчетногоСчета покажи документы за 2020-07-01..2020-07-31",
"что есть по документам типа СписаниеСРасчетногоСчета за 2020-07-01..2020-07-31",
"дай выборку по СписаниеСРасчетногоСчета за 2020-07-01..2020-07-31",
"покажи реестр СписаниеСРасчетногоСчета за 2020-07-01..2020-07-31",
"по виду документа СписаниеСРасчетногоСчета нужна выгрузка за 2020-07-01..2020-07-31",
"какие экземпляры СписаниеСРасчетногоСчета проходили за 2020-07-01..2020-07-31",
"документы 1С типа СписаниеСРасчетногоСчета за 2020-07-01..2020-07-31",
"найди документы СписаниеСРасчетногоСчета за 2020-07-01..2020-07-31",
"выведи журнал по СписаниеСРасчетногоСчета за 2020-07-01..2020-07-31",
"какие документы этого типа были оформлены за 2020-07-01..2020-07-31"
]
},
{
"scenario_id": "AQ-P1-12",
"domain": "document_lookup",
"intent": "find_document_by_number_and_date",
"recipe_id": "address.document.lookup_by_number_date",
"required_filters": [
"document_number",
"document_date"
],
"optional_filters": [
"document_type",
"organization",
"counterparty"
],
"expected_response_type": "FACTUAL_LIST",
"questions": [
"найди документ № 000123 от 2020-07-15",
"покажи документ номер 000123 от 2020-07-15",
"есть ли документ 000123 от 2020-07-15",
"отыщи документ № 000123 датой 2020-07-15",
"нужен документ 000123 от 2020-07-15",
"в базе есть документ 000123 от 2020-07-15",
"подними документ номер 000123 от 2020-07-15",
"покажи, что за документ 000123 от 2020-07-15",
"дай карточку документа 000123 от 2020-07-15",
"ищу документ 000123 от 2020-07-15",
"найди по номеру 000123 и дате 2020-07-15",
"проверь наличие документа 000123 от 2020-07-15",
"покажи запись по документу 000123 от 2020-07-15",
"где документ 000123 от 2020-07-15",
"какой документ проходит под номером 000123 от 2020-07-15",
"вытащи документ 000123 от 2020-07-15",
"документ номер 000123, дата 2020-07-15",
"дай документ по реквизитам: номер 000123, дата 2020-07-15"
]
}
]
}
@@ -0,0 +1,118 @@
# Resolver & Normalization Spec V2
Дата: 2026-03-30
## 1) Общий принцип
LLM/normalizer не пытается сразу вызвать recipe.
Сначала он переводит пользовательскую фразу в canonical intent и нормализованные фильтры.
Цепочка:
`raw_question -> dialect normalization -> intent detection -> filter extraction -> resolver -> recipe selection`
## 2) Синонимы доменных сигналов
### Контрагент
Сигналы:
- контрагент
- поставщик
- клиент
- покупатель
- контра
- организация-партнер
### Договор
Сигналы:
- договор
- контракт
- соглашение
- договорник
- договор с номером
### Остаток / сальдо
Сигналы:
- остаток
- сальдо
- что висит
- хвост
- остаток висит
- баланс по счету
### Дебиторка / кредиторка
Дебиторка:
- кто должен нам
- дебиторка
- долг нам
- задолженность перед нами
Кредиторка:
- кому должны мы
- кредиторка
- наш долг поставщику
- задолженность перед контрагентом
### Банковый контур
Сигналы:
- банк
- платежи
- платежки
- списания
- поступления
- движение по расчетному счету
## 3) Нормализация счетов
Допустимые формы:
- `60`
- `62`
- `60.01`
- `62.01`
Правила:
- удалить лишние слова (`счет`, `счёт`, `бухсчет`, `по счету`);
- сохранить только валидный account token;
- хранить и raw, и normalized форму в debug.
## 4) Нормализация дат и периодов
Поддержать:
- `на сегодня`
- `на текущую дату`
- `на конец месяца`
- `за июль 2020`
- `за период с 01.07.2020 по 31.07.2020`
- `за месяц`
- `за квартал`
Выход:
- `as_of_date`
- либо `period_from + period_to`
## 5) Resolver policy
### Counterparty resolver
- `name -> candidate set`
- exact match > normalized exact > startswith > fuzzy
- если ambiguity_count > 1 и нет явного приоритета, вернуть `LIMITED_WITH_REASON`
### Contract resolver
- поддерживать номер договора, имя договора, пару `контрагент + договор`
- при наличии обоих якорей резолвить договор в контексте контрагента
### Document type resolver
- белый список русских имен и системных 1С-имен:
- `СписаниеСРасчетногоСчета`
- `ПоступлениеНаРасчетныйСчет`
- и др. по фактическому whitelist
## 6) Guardrails
- не допускать свободную генерацию SQL/1С-запросов;
- не подменять отсутствующий фильтр догадкой;
- не заменять by-contract на by-counterparty молча;
- не отдавать пустой factual как будто это найденный результат.