From f74e7b697ae186d90aeeb14e54e83dace32bcf53 Mon Sep 17 00:00:00 2001 From: dctouch Date: Sun, 29 Mar 2026 15:27:01 +0300 Subject: [PATCH] =?UTF-8?q?=D0=AD=D1=82=D0=B0=D0=BF=204=20=20corrective=20?= =?UTF-8?q?pack=202=20=D0=BF=D0=BE=20family=20isolation=20=D0=BF=D0=BE?= =?UTF-8?q?=D1=81=D0=BB=D0=B5=20=D1=82=D0=B5=D0=BA=D1=83=D1=89=D0=B8=D1=85?= =?UTF-8?q?=20routing=20fixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IN/Stage 4 - Family Card v1 FA.md | 251 +++++++++ IN/Stage 4 - Family Card v1 RBP.md | 240 ++++++++ IN/Stage 4 - Family Card v1 — VAT chain.md | 230 ++++++++ IN/ВОПРОСЫ 2020 07.docx | Bin 0 -> 14771 bytes IN/ВОПРОСЫ_2020_07_extracted.txt | 34 ++ ...п 4 — corrective pack по family isolation.md | 314 +++++++++++ IN/Этап 4 — пакет по амортизации.md | 292 ++++++++++ ...к_семействам_вопросов_и_source_to_proof_контрактам.md | 72 +++ .../03_execution/FAMILY_CARD_TEMPLATE.md | 159 ++++++ ...04_DECISION_NOTE_FAMILY_BASED_EXECUTION.md | 70 +++ .../STAGE_04_FAMILY_BACKLOG_2026-03-29.md | 105 ++++ .../STAGE_04_FAMILY_REGISTRY_2026-03-29.json | 44 ++ .../services/assistantClaimBoundEvidence.js | 413 ++++++++++++-- .../dist/services/assistantDataLayer.js | 230 +++++++- .../dist/services/assistantRuntimeGuards.js | 58 +- .../backend/dist/services/assistantService.js | 242 +++++++-- .../dist/services/investigationState.js | 77 ++- .../backend/scripts/faPackExportArtifacts.js | 393 ++++++++++++++ .../services/assistantClaimBoundEvidence.ts | 513 ++++++++++++++++-- .../src/services/assistantDataLayer.ts | 300 ++++++++-- .../src/services/assistantRuntimeGuards.ts | 74 ++- .../backend/src/services/assistantService.ts | 242 +++++++-- .../src/services/investigationState.ts | 93 +++- llm_normalizer/backend/src/types/assistant.ts | 33 +- .../tests/assistantMcpRuntimeBridge.test.ts | 104 ++++ .../assistantRuntimeGuardsStage4Pack.test.ts | 103 +++- llm_normalizer/docs/runs/2.zip | Bin 0 -> 261861 bytes ...e_04_RBP_Pack_Live_Source_To_Proof_Fix.zip | Bin 51656 -> 0 bytes ...Live_Alignment_Fix_Claim_Bound_Runtime.zip | Bin 190117 -> 0 bytes ...Wave_19_2_Live_Runtime_Fix_Replay_1txt.zip | Bin 274208 -> 0 bytes 30 files changed, 4427 insertions(+), 259 deletions(-) create mode 100644 IN/Stage 4 - Family Card v1 FA.md create mode 100644 IN/Stage 4 - Family Card v1 RBP.md create mode 100644 IN/Stage 4 - Family Card v1 — VAT chain.md create mode 100644 IN/ВОПРОСЫ 2020 07.docx create mode 100644 IN/ВОПРОСЫ_2020_07_extracted.txt create mode 100644 IN/Этап 4 — corrective pack по family isolation.md create mode 100644 IN/Этап 4 — пакет по амортизации.md create mode 100644 docs/accounting-assistant/accounting-assistant/02_stages/ЭТАП_4_переход_к_семействам_вопросов_и_source_to_proof_контрактам.md create mode 100644 docs/accounting-assistant/accounting-assistant/03_execution/FAMILY_CARD_TEMPLATE.md create mode 100644 docs/accounting-assistant/accounting-assistant/03_execution/STAGE_04_DECISION_NOTE_FAMILY_BASED_EXECUTION.md create mode 100644 docs/accounting-assistant/accounting-assistant/03_execution/STAGE_04_FAMILY_BACKLOG_2026-03-29.md create mode 100644 docs/accounting-assistant/accounting-assistant/03_execution/STAGE_04_FAMILY_REGISTRY_2026-03-29.json create mode 100644 llm_normalizer/backend/scripts/faPackExportArtifacts.js create mode 100644 llm_normalizer/docs/runs/2.zip delete mode 100644 llm_normalizer/docs/runs/2026-03-29_Stage_04_RBP_Pack_Live_Source_To_Proof_Fix.zip delete mode 100644 llm_normalizer/docs/runs/2026-03-29_Stage_04_Wave_19_1_Live_Alignment_Fix_Claim_Bound_Runtime.zip delete mode 100644 llm_normalizer/docs/runs/2026-03-29_Stage_04_Wave_19_2_Live_Runtime_Fix_Replay_1txt.zip diff --git a/IN/Stage 4 - Family Card v1 FA.md b/IN/Stage 4 - Family Card v1 FA.md new file mode 100644 index 0000000..8169abf --- /dev/null +++ b/IN/Stage 4 - Family Card v1 FA.md @@ -0,0 +1,251 @@ +# Stage 4 - Family Card v1 — FA amortization coverage (runtime-aligned) + +**document_status:** `ACTIVE` +**family_name:** `Амортизация ОС — полнота охвата / риск пропуска объекта` +**family_id:** `FA_AMORTIZATION_COVERAGE_V1` +**stage_scope:** `Stage 4 (P0-only)` +**current_family_status:** `PROOF_PATH_RAISED_LIVE_ACCEPTANCE_PENDING` +**primary_gap:** `live object-level relation clarity + production live acceptance` +**latest_pack:** `2026-03-29_Stage_04_FA_Pack_Amortization_Proof_Closure` +**next_pack_focus:** `live replay acceptance + relation/anchor consistency in production channel` +**family_source_of_truth_questions:** `FA-Q1 (31 июля: 2 471,52 / 2 465,28 / 849,83 — полное ли начисление); FA-Q2 (expected vs actual set по объектам ОС за июль); FA-Q3 (есть ли missing object candidates в июльском начислении)` +**family_latest_live_replay:** `X:\1C\NDC_1C\llm_normalizer\docs\runs\2026-03-29_Stage_04_FA_Pack_Amortization_Proof_Closure_live_attempt\fa_live_raw.json (текущий live attempt: http_status=400, невалидная приемка)` +**family_latest_acceptance_run:** `X:\1C\NDC_1C\llm_normalizer\docs\runs\2026-03-29_Stage_04_FA_Pack_Amortization_Proof_Closure\run_summary.json` + +## 1) Что фиксирует этот документ + +Карточка разделяет два слоя: + +1. `Runtime V1 (as-is)` — только то, что подтверждено текущим кодом и артефактами пакета. +2. `Target V2 (planned)` — что нужно дожать, но пока не считается текущим acceptance gate. + +Это защищает от ложного закрытия family по mock-результату без live-приемки. + +## 2) Runtime V1 (фактический контракт на 2026-03-29) + +### 2.1 Claim contract (as-is) + +- **primary claim_type:** `prove_fixed_asset_amortization_coverage` +- **additional claim_types:** пока не выделялись как отдельные first-class claim types +- **границы claim:** +- не расширяет домены за рамки Stage 4 P0; +- не вводит новый proof engine; +- не использует Stage 5 investigation как core path. + +### 2.2 Required anchors (runtime-enforced, as-is) + +Для `prove_fixed_asset_amortization_coverage` в рантайме обязательны: + +- `period` +- `fixed_asset_signal` +- `amortization_signal` +- `amount_or_document` +- `account_scope_or_document_type` + +Факт по latest acceptance run: + +- `required_anchors_count = 5` +- `missing_anchor_classes_count = 0` +- `claim_anchor_coverage_ratio = 1` + +### 2.3 Claim-bound live recipe (runtime-enforced, as-is) + +Обязательные live вызовы: + +1. `find_amortization_documents_in_period` +2. `find_fixed_asset_movements_accounts_01_02` +3. `find_fixed_asset_cards_expected_for_period` +4. `match_expected_vs_actual_fa_coverage` + +Ожидаемый результат recipe: + +- документ(ы) начисления амортизации; +- candidate/actual набор объектов ОС; +- expected set для периода; +- сравнение expected vs actual и кандидаты пропуска. + +### 2.4 Route behavior (as-is) + +Для FA-claim runtime: + +- форсирует claim-bound live-capable route; +- может переопределять `store_feature_risk` в live/hybrid path; +- экспортирует `fa_live_route_audit` в debug payload. + +Факт по latest acceptance run: + +- `live_route_execution_rate = 1` +- `required_live_calls = 4` +- `missing_live_calls = 0` +- `route_adjustments_applied = 1` + +### 2.5 Evidence/admissibility behavior (as-is) + +Факт по latest acceptance run: + +- `admissible_evidence_count = 16` +- `rejected_evidence_count = 32` +- reject breakdown: `wrong_account_scope = 16`, `weak_source_mapping = 16` + +Факт по targeted evidence: + +- `targeted_evidence_hit_rate = 1` +- `expected_fa_set_count = 2` +- `actual_fa_set_count = 2` +- `missing_fa_candidates_count = 0` +- `uncertain_fa_candidates_count = 28` + +### 2.6 Runtime acceptance snapshot (по latest pack) + +- `FA_EXPECTED_SET_FIXED = FIXED` +- `FA_RELATION_MAPPING_FIXED = FIXED` +- `FA_CLAIM_ANCHOR_CLOSURE_FIXED = FIXED` +- `FA_PROOF_CLOSURE_FIXED = FIXED` +- общий статус: `FA_PACK_ACCEPTED` +- важная оговорка: режим пакета `mock` (controlled replay) + +### 2.7 known_runtime_limits (as-is) + +- `live acceptance pending`: актуальный live attempt завершился `http_status=400`, не может быть источником приемки. +- `relation clarity incomplete`: несмотря на coverage=1 в mock, в relation map много `coverage_status=uncertain` и слабых object-level link. +- `admissibility noise remains`: значимый reject-шум (`wrong_account_scope`, `weak_source_mapping`) сохраняется и требует дожима для production live. + +## 3) Target V2 (planned, не критерий текущей приемки) + +### 3.1 Planned claim extension + +- Развести подтипы FA-claim по режимам: +- `prove_fixed_asset_amortization_completeness` +- `prove_fixed_asset_missing_object_risk` +- `prove_fixed_asset_expected_actual_consistency` + +### 3.2 Planned anchor extension + +- Явный `expected_fa_set` как first-class anchor. +- Явный `actual_fa_set_from_amortization` как first-class anchor. +- Явный `missing_fa_candidates` с object identity и link quality. + +### 3.3 Planned family metrics + +- `fa_expected_set_reconstruction_rate` +- `fa_relation_mapping_coverage_rate` +- `fa_claim_anchor_coverage_rate` +- `fa_actual_vs_expected_comparison_rate` +- `fa_proof_closure_rate` +- `fa_false_grounded_answer_rate` +- `fa_live_acceptance_pass_rate` + +## 4) Required entities and relations (business contract) + +### 4.1 Минимально необходимые сущности для proof closure + +1. Документ(ы) начисления амортизации за июль. +2. Объекты ОС, которые должны участвовать в начислении. +3. Движения/проводки по контуру амортизации (в т.ч. счета 01/02). +4. Expected set объектов ОС на период. +5. Actual set объектов, реально попавших в начисление. +6. Missing/uncertain candidates для object-level verdict. + +### 4.2 Критические relation links + +1. `fa_object -> amortization_document` +2. `amortization_document -> movement/posting` +3. `fa_object -> expected_period_coverage` +4. `expected_set -> actual_set` +5. `missing_or_uncertain_object -> coverage_risk_verdict` + +## 5) Snapshot/Live coverage verdict (as-is) + +- По FA family практический режим: `snapshot_plus_live_required`. +- В controlled replay proof-path поднят до `grounded_positive`. +- Production live приемка пока не закрыта. + +## 6) Answer/proof modes contract + +### `grounded_positive` + +Допускается, если одновременно: + +- `admissible_evidence_count > 0` +- реконструированы `expected_fa_set` и `actual_fa_set` +- сделано сравнение expected vs actual +- вывод имеет object-level опору, не только сумму +- `false_grounded_answer_rate = 0` + +Короткий пример: + +- `За июль подтверждены ожидаемый и фактический наборы ОС; пропусков по зафиксированным объектам не выявлено, риск неполноты начисления низкий.` + +### `limited_or_insufficient_evidence` + +Обязателен, если: + +- не реконструирован expected set или actual set +- object-level links недостаточны +- есть только косвенная/шумная опора + +Короткий пример: + +- `Суммы начисления зафиксированы, но object-level соответствие expected vs actual не восстановлено; вывод ограничен и не подтверждает полноту начисления.` + +### Запрещенные паттерны + +- вывод о полноте начисления только по суммам без object-level связи +- уверенный verdict при `admissible = 0` +- общий lifecycle-текст без указания missing object/link + +Короткий антипример: + +- `Амортизация начислена корректно, пропусков нет` (нельзя без expected/actual object-level proof). + +## 7) Gap register (FA family) + +| gap_id | category | severity | current_state | note | +| --- | --- | --- | --- | --- | +| FA-G1 | `live_acceptance_not_confirmed` | blocker | open | текущий live attempt дал `http_status=400`, приемка фактически mock-only | +| FA-G2 | `wrong_entity_mapping` / `relation_clarity` | high | open | в relation map много `coverage_status=uncertain` и слабых direct links | +| FA-G3 | `admissibility_reject_not_due_to_data` | medium | open | reject-шум по `wrong_account_scope` и `weak_source_mapping` | +| FA-G4 | `answer_layer_underuses_available_evidence` | medium | partial | в части трасс answer-mode может звучать ограничительно при сильной eligibility | + +## 8) Code-path inventory (где живет контракт) + +- `llm_normalizer/backend/src/services/assistantClaimBoundEvidence.ts` +- FA claim resolution; +- required anchors; +- targeted checks; +- expected/actual/missing/uncertain FA coverage structures. + +- `llm_normalizer/backend/src/services/assistantDataLayer.ts` +- claim-bound FA live plan; +- live call profile `claim_bound_fa_live_path`; +- relation markers (`asset_card_to_depreciation`, `document_to_posting`). + +- `llm_normalizer/backend/src/services/assistantService.ts` +- FA live route enforcement; +- route override audit (`fa_live_route_audit`); +- handoff в eligibility/answer layer. + +- run artifacts: +- `X:\1C\NDC_1C\llm_normalizer\docs\runs\2026-03-29_Stage_04_FA_Pack_Amortization_Proof_Closure` +- `X:\1C\NDC_1C\llm_normalizer\docs\runs\2026-03-29_Stage_04_FA_Pack_Amortization_Proof_Closure_live_attempt` +- `X:\1C\NDC_1C\llm_normalizer\docs\runs\2026-03-29_Stage_04_FA_Pack_Amortization_Proof_Closure_mock_replay` + +## 9) Regression set and acceptance policy + +Обязательный минимум для FA family: + +1. Базовый вопрос по трем суммам `2 471,52 / 2 465,28 / 849,83`. +2. Вариация без сумм, но с запросом полноты expected vs actual. +3. Вариация на missing-object risk. +4. Follow-up по конкретному объекту ОС (если объект выделен). + +Политика: + +- после каждого FA pack обязателен новый run folder в `llm_normalizer/docs/runs`; +- acceptance фиксируется на уровне family; +- mock acceptance не заменяет live acceptance; +- `false_grounded` должен оставаться нулевым. + +## 10) Project decision line for this family + +FA family поднята до proof-ready уровня в controlled replay, но остается в статусе `live acceptance pending` до подтверждения object-level closure на реальном live канале. diff --git a/IN/Stage 4 - Family Card v1 RBP.md b/IN/Stage 4 - Family Card v1 RBP.md new file mode 100644 index 0000000..9155f75 --- /dev/null +++ b/IN/Stage 4 - Family Card v1 RBP.md @@ -0,0 +1,240 @@ +# Stage 4 - Family Card v1 — RBP tail / write-off overstay (runtime-aligned) + +**document_status:** `ACTIVE` +**family_name:** `РБП — хвост / списание / overstay` +**family_id:** `RBP_TAIL_WRITEOFF_OVERSTAY_V1` +**stage_scope:** `Stage 4 (P0-only)` +**current_family_status:** `ACCEPTED_WITH_LIMITATIONS` +**primary_gap:** `source coverage` +**latest_pack:** `2026-03-29_Stage_04_RBP_Pack_Live_Source_To_Proof_Fix` +**next_pack_focus:** `source coverage recovery + route tightening for full claim closure` +**family_source_of_truth_questions:** `RBP-Q1 (Списание РБП за Июль 2020, включая 5 000); RBP-Q2 (хвост РБП к концу июля без суммы); RBP-Q3 (полнота закрытия июльского списания)` +**family_latest_live_replay:** `2026-03-29_Stage_04_RBP_Pack_Live_Source_To_Proof_Fix/1.txt (локальный replay; внешний live-канал требует отдельной приемки)` +**family_latest_acceptance_run:** `2026-03-29_Stage_04_RBP_Pack_Live_Source_To_Proof_Fix/run_summary.json` + +## 1) Что фиксирует этот документ + +Карточка теперь разделяет два слоя: + +1. `Runtime V1 (as-is)` — только то, что уже реально работает в коде и подтверждено артефактами. +2. `Target V2 (planned)` — что хотим довести в следующих pack, но пока не считаем критерием текущей приемки. + +Это нужно, чтобы не смешивать факт и план и не закрывать family “по красивому тексту”. + +## 2) Runtime V1 (фактический контракт на 2026-03-29) + +### 2.1 Claim contract (as-is) + +- **primary claim_type:** `prove_rbp_tail_state` +- **additional claim_types:** пока не first-class в runtime (учитываются как план V2) +- **границы claim:** +- не включает Stage 5 investigation как core path; +- не расширяет домены за пределы Stage 4 P0; +- не делает full redesign proof engine. + +### 2.2 Required anchors (runtime-enforced, as-is) + +Для `prove_rbp_tail_state` в рантайме обязательны: + +- `period` +- `rbp_signal` +- `writeoff_signal` + +Технические reason codes на этом шаге: + +- `claim_missing_required_anchors` +- `claim_anchor_resolution_low` + +### 2.3 Claim-bound live recipe (runtime-enforced, as-is) + +Обязательные live вызовы: + +1. `find_rbp_writeoff_documents_in_period` +2. `find_rbp_object_movements_account_97` +3. `find_month_close_entries_linked_to_rbp` +4. `compute_end_period_residual_by_rbp_object` + +Ожидаемый результат recipe: + +- подтверждение документа списания; +- привязка к объекту(ам) РБП; +- движение/связанные записи; +- residual state на границе периода. + +### 2.4 Route behavior (as-is) + +Для `prove_rbp_tail_state` runtime: + +- форсирует live-capable маршрут (`hybrid_store_plus_live` / `live_mcp_drilldown`); +- поднимает `insufficient_specificity` в live path вместо `no_route`; +- экспортирует `rbp_live_route_audit` в debug payload. + +### 2.5 Evidence/admissibility behavior (as-is) + +Подтверждено в текущем пакете: + +- убрана инъекция raw live rows при `matched_rows = 0`; +- добавлена стабилизированная live metadata для source mapping; +- claim-bound targeted checks для RBP расширены до object/document/movement/residual. + +Наблюдаемые baseline reject reasons (до фикса пакета): + +- `zero_live_match` +- `weak_source_mapping` +- `wrong_account_scope` + +### 2.6 Runtime acceptance snapshot (по артефактам latest pack) + +- `RBP_SOURCE_COVERAGE_FIXED = NOT_FIXED` +- `RBP_LIVE_ROUTE_FIXED = FIXED` +- `RBP_EVIDENCE_MATERIALIZATION_FIXED = FIXED` +- общий статус: `RBP_PACK_ACCEPTED_WITH_LIMITATIONS` + +### 2.7 known_runtime_limits (as-is) + +- `source coverage incomplete`: для части object-level proof звеньев данные в runtime source set еще неполные. +- `business scope inconsistency possible`: в части live traces возможна несогласованность `generic_accounting` vs `company_specific_accounting`. +- `anchor noise in edge cases`: в отдельных кейсах могут появляться нерелевантные account hints, влияющие на route profile. + +## 3) Target V2 (planned, не критерий текущей приемки) + +### 3.1 Planned claim extension + +Дополнительные claim types (план): + +- `prove_rbp_writeoff_completeness` +- `prove_rbp_lifecycle_overstay` +- `prove_rbp_period_end_residual_state` + +### 3.2 Planned anchor extension + +Расширенный target-набор anchors (план): + +- период (primary + period-end) +- суммы/диапазоны +- объект РБП +- документ/тип документа +- движения/остаток на конец периода +- lifecycle markers для overstay + +### 3.3 Planned family metrics + +Плановые family-метрики (в stable harness): + +- `rbp_required_entity_coverage_rate` +- `rbp_live_route_execution_rate` +- `rbp_admissible_evidence_nonzero_rate` +- `rbp_source_to_proof_completion_rate` +- `rbp_partial_coverage_default_rate` +- `rbp_false_grounded_answer_rate` + +До формализации в harness эти метрики считаются target-моделью, а не текущим hard gate. + +## 4) Required entities and relations (business contract) + +### 4.1 Минимально необходимые сущности для proof closure + +1. Документ `Списание РБП` за целевой период. +2. Объект(ы) РБП. +3. Движения/регистровые записи по списанию. +4. Residual state на конец периода. +5. Связь со стадией month-close при необходимости. + +### 4.2 Критические relation links + +1. `RBP object -> writeoff document` +2. `writeoff document -> movement/register record` +3. `movement/register record -> period-end residual` +4. `expected lifecycle -> actual lifecycle result` +5. `residual state -> overstay/no-overstay verdict` + +## 5) Snapshot/Live coverage verdict (as-is) + +- `snapshot-only` для RBP сейчас **недостаточен** для устойчивого object-level proof closure. +- Family требует `snapshot_plus_live_required`. +- Главный незакрытый узел — source coverage в production live данных. + +## 6) Answer/proof modes contract + +### `grounded_positive` + +Допускается, если одновременно: + +- `admissible_evidence_count > 0` +- закрыта цепочка object/document/movement/residual +- вывод опирается на конкретные source refs +- `false_grounded_answer_rate = 0` + +Короткий пример: + +- `Подтвержден документ "Списание РБП" за июль 2020, найден связанный объект РБП и остаток на конец периода = 0; признаков overstay по этому объекту не выявлено.` + +### `limited_or_insufficient_evidence` + +Обязателен, если: + +- не найден ключевой link (document/object/residual) +- admissible evidence недостаточно +- нет права имитировать доказанность + +Короткий пример: + +- `Документ списания найден, но связь с объектом РБП и подтвержденный остаток на конец периода не восстановлены; вывод ограничен до partial coverage без утверждения об overstay.` + +### Запрещенные паттерны + +- общий lifecycle narrative без указания missing link +- уверенный вывод при `admissible = 0` +- смешивание snapshot-гипотез с live-доказанностью без маркировки + +Короткий антипример: + +- `Есть признаки проблемы по РБП, вероятно хвост остался` (нельзя без document/object/residual подтверждения). + +## 7) Gap register (RBP family) + +| gap_id | category | severity | current_state | note | +| --- | --- | --- | --- | --- | +| RBP-G1 | `missing_source_data` / `source_coverage` | blocker | open | ключевая причина `ACCEPTED_WITH_LIMITATIONS` | +| RBP-G2 | `business_scope_resolution_consistency` | high | open | в отдельных live traces встречается несогласованность generic/company-specific слоев | +| RBP-G3 | `anchor_quality` | medium | open | в отдельных кейсах попадают нерелевантные account hints, что ухудшает route profile | + +## 8) Code-path inventory (где живет контракт) + +- `llm_normalizer/backend/src/services/assistantClaimBoundEvidence.ts` +- claim type resolution; +- required anchors для `prove_rbp_tail_state`; +- anchor resolution rate и claim reason codes. + +- `llm_normalizer/backend/src/services/assistantDataLayer.ts` +- claim-bound live plan для RBP; +- обязательные live call ids и account scope overrides; +- source profile `claim_bound_rbp_live_path`. + +- `llm_normalizer/backend/src/services/assistantService.ts` +- RBP live route enforcement; +- no-route recovery; +- `rbp_live_route_audit` export. + +- run artifacts: +- `llm_normalizer/docs/runs/2026-03-29_Stage_04_RBP_Pack_Live_Source_To_Proof_Fix` + +## 9) Regression set and acceptance policy + +Обязательный минимум для family replay: + +1. Базовый RBP вопрос: `Списание РБП за Июль 2020`, включая сумму `5 000`. +2. Вариация без суммы (проверка period + overstay signal). +3. Вариация на полноту закрытия. +4. Follow-up по тому же документу/объекту. +5. Соседний month-close sanity case. + +Политика: + +- после каждого family pack обязателен новый run folder в `llm_normalizer/docs/runs`; +- приемка фиксируется на уровне family, не одиночного вопроса; +- `false_grounded` должен оставаться нулевым. + +## 10) Project decision line for this family + +RBP уже перешел в family-based execution контур Stage 4, но остается в статусе `accepted_with_limitations` до восстановления source coverage в живом канале. diff --git a/IN/Stage 4 - Family Card v1 — VAT chain.md b/IN/Stage 4 - Family Card v1 — VAT chain.md new file mode 100644 index 0000000..20b8fc0 --- /dev/null +++ b/IN/Stage 4 - Family Card v1 — VAT chain.md @@ -0,0 +1,230 @@ +# Stage 4 - Family Card v1 — VAT chain (runtime-aligned) + +**document_status:** `ACTIVE` +**family_name:** `НДС-цепочка — полнота прохождения от документа до налогового отражения` +**family_id:** `VAT_CHAIN_COMPLETENESS_V1` +**stage_scope:** `Stage 4 (P0-only)` +**current_family_status:** `PARTIALLY_WORKING / NON-BLOCKER` +**primary_gap:** `residual admissibility/materialization quality` +**latest_pack:** `2026-03-29_Stage_04_Wave_19_2_Live_Runtime_Fix_Replay_1txt` +**next_pack_focus:** `targeted live narrowing + reject cleanup for VAT proof-path` +**family_source_of_truth_questions:** `VAT-Q1 (13 июля поступление, 15 июля реализация — полная ли НДС-цепочка); VAT-Q2 (есть ли выпадение между документом, проводкой, НДС-регистром и книгой); VAT-Q3 (по July 2020 VAT path grounded-positive или остаются weak-mapping шумы)` +**family_latest_live_replay:** `X:\1C\NDC_1C\llm_normalizer\docs\runs\2026-03-29_Stage_04_Wave_19_2_Live_Runtime_Fix_Replay_1txt\1_live_replay.txt` +**family_latest_acceptance_run:** `X:\1C\NDC_1C\llm_normalizer\docs\runs\2026-03-29_Stage_04_Wave_19_2_Live_Runtime_Fix_Replay_1txt\run_summary.json` + +## 1) Что фиксирует этот документ + +Карточка разделяет два слоя: + +1. `Runtime V1 (as-is)` — только то, что подтверждено текущим кодом и run-артефактами. +2. `Target V2 (planned)` — что нужно дожать следующими family-pack, но пока не является hard gate текущей приемки. + +Это соответствует Stage 4 family-based execution в рамках `P0-only` без перехода в Stage 5 и без архитектурного redesign. + +## 2) Runtime V1 (фактический контракт на 2026-03-29) + +### 2.1 Claim contract (as-is) + +- **primary claim_type:** `prove_vat_chain_completeness` +- **additional claim_types:** пока не выделялись как first-class в runtime +- **границы claim:** +- не расширяет домены за рамки VAT family; +- не включает общий налоговый аудит; +- не включает Stage 5 investigation как core path. + +### 2.2 Required anchors (runtime-enforced, as-is) + +Для `prove_vat_chain_completeness` в текущем runtime обязательны: + +- `period` +- `document_types` +- `vat_signal` +- `chain_signal` + +Факт: эти anchors соответствуют текущему `requiredByClaim` в runtime. + +### 2.3 Claim checks and live recipe (runtime-enforced, as-is) + +Для VAT claim runtime требует закрытия проверок: + +1. `source_document_found` +2. `invoice_found` +3. `tax_register_entry_found` +4. `book_entry_found` +5. `chain_linkage_status` + +Текущий live acquisition path для VAT в runtime: + +- в отличие от RBP/FA, нет выделенного VAT-specific набора обязательных live call id; +- используется `hybrid_store_plus_live` + generic live overlay probe; +- positive VAT-case может быть закрыт за счет admissible evidence и targeted checks. + +### 2.4 Route behavior (as-is) + +Факт по latest run: + +- VAT case (`L1`) отрабатывает в `factual_with_explanation`; +- claim: `prove_vat_chain_completeness`; +- mode: `grounded_positive`; +- scope: `company_specific_accounting`; +- temporal outcome: `passed`. + +### 2.5 Evidence/admissibility behavior (as-is) + +Факт по VAT case (`L1`) в latest run: + +- `admissible_evidence_count = 12` +- `grounding_mode = grounded_positive` +- основные reject-хвосты: `wrong_account_scope`, `weak_source_mapping` + +Факт по aggregate reject breakdown (run-level): + +- `weak_source_mapping` и `wrong_account_scope` остаются ключевым residual шумом. + +### 2.6 Runtime acceptance snapshot (по latest pack) + +- family status: `PARTIALLY_WORKING / NON-BLOCKER` +- по `L1` VAT-кейсу есть `grounded_positive` +- общий статус run: `WAVE19_2_ACCEPTED` +- важная оговорка: в run зафиксирован `normalizer_mode = useMock=true` + +### 2.7 known_runtime_limits (as-is) + +- `normalizer_mock_mode_in_latest_acceptance`: latest acceptance run выполнялся в режиме `useMock=true`. +- `no_explicit_vat_live_call_contract`: для VAT пока нет отдельного жесткого live-call контракта как у RBP/FA. +- `admissibility_noise_remains`: сохраняются residual rejects по `weak_source_mapping` и `wrong_account_scope`. + +## 3) Target V2 (planned, не критерий текущей приемки) + +### 3.1 Planned claim extension + +- `prove_vat_register_book_consistency` +- `prove_document_to_tax_reflection_closure` +- `prove_missing_vat_link_risk` + +### 3.2 Planned anchor extension + +- `invoice_anchor` +- `register_entry_anchor` +- `book_entry_anchor` +- `vat_amount_anchor` +- `goods_or_item_linkage_anchor` + +### 3.3 Planned family metrics + +- `vat_grounded_positive_rate` +- `vat_admissibility_noise_rate` +- `vat_book_register_linkage_rate` +- `vat_false_grounded_answer_rate` +- `vat_live_targeting_precision_rate` + +## 4) Required entities and relations (business contract) + +### 4.1 Минимально необходимые сущности для proof closure + +1. Документ поступления/реализации. +2. Счет-фактура. +3. Проводка/движение. +4. Запись в НДС-регистре. +5. Запись в книге покупок/продаж. +6. Связь по товарной позиции/номенклатуре/документной цепочке. +7. Контрагент/договорный контур при необходимости. + +### 4.2 Критические relation links + +1. `receipt_or_sale_document -> posting` +2. `document -> invoice` +3. `invoice -> vat_register_entry` +4. `vat_register_entry -> purchase_or_sales_book_entry` +5. `goods_or_item_context -> chain_completeness_verdict` + +## 5) Snapshot/Live coverage verdict (as-is) + +- practical mode для VAT family: `snapshot_plus_live_required` +- positive path уже подтвержден на части кейсов +- family не является текущим главным blocker +- next focus: `live narrowing + reject cleanup`, без domain expansion + +## 6) Answer/proof modes contract + +### `grounded_positive` + +Допускается, если одновременно: + +- `admissible_evidence_count > 0` +- подтверждены звенья `document -> invoice -> register -> book` +- вывод не основан только на общем domain narrative +- `false_grounded_answer_rate = 0` + +Короткий пример: + +- `По July 2020 цепочка документ -> проводка -> НДС-регистр -> книга подтверждена; явного выпадения по этой связке не найдено.` + +### `limited_or_insufficient_evidence` + +Обязателен, если: + +- отсутствует одно из ключевых звеньев цепочки; +- evidence есть, но mapping слабый; +- `register/book` linkage не закрыт. + +Короткий пример: + +- `Документный и проводочный контур частично подтверждены, но связь до НДС-регистра или книги не восстановлена; вывод ограничен.` + +### Запрещенные паттерны + +- `НДС отражен корректно` без документно-регистровой связки; +- уверенный verdict при `admissible = 0`; +- подмена chain-proof общим domain narrative. + +Короткий антипример: + +- `НДС-цепочка в порядке` (нельзя без подтверждения register/book closure). + +## 7) Gap register (VAT family) + +| gap_id | category | severity | current_state | note | +| --- | --- | --- | --- | --- | +| VAT-G1 | `admissibility_residual_noise` | medium | open | остаточный шум по `weak_source_mapping` / `wrong_account_scope` | +| VAT-G2 | `live_targeting_breadth` | medium | open | live targeting для VAT еще можно сузить до более proof-specific слоя | +| VAT-G3 | `materialization_cleanup` | medium | open | positive path есть, но часть proof-path требует дочистки | +| VAT-G4 | `false_grounded_risk_control` | low | controlled | family должна удерживать `false_grounded = 0` | + +## 8) Code-path inventory (где живет контракт) + +- `llm_normalizer/backend/src/services/assistantClaimBoundEvidence.ts` +- VAT claim type; +- required anchors; +- required checks для VAT chain. + +- `llm_normalizer/backend/src/services/assistantDataLayer.ts` +- route/live plan behavior (в т.ч. generic live overlay для non-FA/RBP); +- VAT semantic profile and relation patterns. + +- `llm_normalizer/backend/src/services/assistantService.ts` +- routing and eligibility handoff; +- answer-mode and debug export integration. + +- run artifacts: +- `X:\1C\NDC_1C\llm_normalizer\docs\runs\2026-03-29_Stage_04_Wave_19_2_Live_Runtime_Fix_Replay_1txt` + +## 9) Regression set and acceptance policy + +Обязательный минимум для VAT family: + +1. базовый вопрос по поступлению 13 июля и реализации 15 июля; +2. вариация на выпадение между документом, проводкой и налоговым отражением; +3. вариация на книгу покупок/продаж; +4. follow-up по той же цепочке; +5. соседний VAT sanity-check. + +Политика: + +- после каждого VAT family pack обязателен новый run folder; +- acceptance фиксируется на уровне family; +- `false_grounded` должен оставаться нулевым. + +## 10) Project decision line for this family + +VAT family уже переведена в family-based execution контур Stage 4 и рассматривается как `non-blocker`, где нужен cleanup-дожим, а не отдельный большой redesign-пакет. diff --git a/IN/ВОПРОСЫ 2020 07.docx b/IN/ВОПРОСЫ 2020 07.docx new file mode 100644 index 0000000000000000000000000000000000000000..fc1346973afd19ac676e79c4726f70f6b652b366 GIT binary patch literal 14771 zcmaib19W9uvu0McC;$Ke5CAgPKH5?$s&^}2Z@fSN0MGy^0D6ul)=uP%>W3zP~mBO5QOzkgn1s;1^hpgd3 zkC=X|J7>@@gWU3e7zKoI3AO!8acn>U0K_k&7~2`iJKEVh(Hq%0n$Wr1SpRRPv5Aqf z`YwPVeE9*D-qCDJ0HSf9qJ#z{pH5~h9mT2GV1ZQu0g1R_I zq9?xS8^u@SuiV*45J=ixg1!e9*@zi0C( zH=+1vMD-UXwwx&D9L%7fvnu+Jz$J_TOJ{4R3l%8OQ9p62v<+>jNBAD%?B$PWmKcz{ z-}zU@xcDg6GXDTn3c;u7F>JW*DJ6V=PQ93?HkP{|#Qswow;ZvY2}}ThZ*748no2i2 zM`QZ0`E;={v333@bQlmnOP8@TU*Vwsck#4I{S)M*t$GQELC>8V25cl`8u61OR}P2JM?`_YU;4P4^JQFU$!->MzMbx!j3&?>5xYI)#ed`GrmYB)wfJ8B53 zwb;%j-P5ICmL^iPG!E3#sn`tx5;ORB1B*?pP54tQ=gX+alH6BO^pj zce_*1=re-}W#(UJ2EPlBqe8PgIf+@It^U66JLoWZpWtEzR_tgBE9|#PX}f2X{ITJB zvK!N*Qy&#t0Y5QUmHuFNu0*_IliMh_KHNL++O=uP9(ZY{_%u7Fnx1WxikCEid2-by z7x7CSEw+e=ymDQn;|Qe25=~!q=eQm8(Rdg8s&C_pRy|==#8ai7T6H;cy5-7uf_B?L zt&aMssM^PG9=_&nIq<1Gp=r0li0&2lVpw+Y@ye<*&}KWM%_^04`e}nQ6ZI`*@{vk+ zTEVq>+oyxlw-*I}FbQLBcF5&w7So>Rs{0vpcjo6U?E3wi+zC=0Y;wcF-sNdqcA%1@ zwgXM>kl(u)8i~tdOZN?bvlQvWn3JR{Xg%G_wrZ6aG4B*lVsGk z;@TZprV9H7Cf-lpX|`AC$M&Zi7{B*`Wv7AHOpe+(WHBy$q~U5!gR7gDdd$aIpH@jx z&{05X`NbxlaUcE3uc-j@9Wlf2`qMhW~xanI(7$)&a(2 z(7iKg^yQ1KG77WeCOurt8d-zbTTl;?5{!Xu6 z6B}643$5-oJ;V((I%Re$DtjcQ=r6-cj&w+qs_MR!-*VIZux&Z@jgET?*Iob9!NK!w zSRvR}oRp#3#!Zm_(J&kI2H4O^d`Tb4%JjI3lze!JsTopV^cj!FkfASj-36G|%Nyxz zCzANh2?+TP=>vQ(Tk8eb^FvS}c2Oo+ZrvTtd7|iJ8ixpjD|{1`NJAsGNYycdRfLsVm&$Y$aiY z9hDBq;z3OBhZzFsJyg1IvC_1k1|D$J4{2mvLvC1CGYtAf@Cp{aWlcMnFRb=eJB*Z6 z97-XS7kGs|HdCALQZ2~SaQ9K`9R;6vb-y4^oLbWH6wsCs2_IT22)4r3J_cDURA9ar z(Je+oaP?Z__1#_cZmXm2hdo-V9A0cSyK7am&iWW9 zX{Z~49i`8_oxksB&D>Ao)pB?^Xk;#TH#}sMpR~VYxh#yhBk5Ns!D)PUs4FiT$q#dC z<%E73hfB!TS*7SqVLl%OuV&Q?MH6m<4F@D)+)M0b;M5-hrf_LwoW+2~6ZrpiZVIg^7~`xkInQud z!Jt9T%xEQrsz#OBXrZwx>P@Afv=rPY=A>>S^!zGV6v{S^AZ5}T76RrC;Q3&> zVRg*|aBVrz=SBHa+3LqNb&V318D6XNOq^QtfJvcx#?@!qoncgs12MY$h$tk~Wo>4S z{0(c@eWSfxN!(gDe*%Lmzs>yE(XZMZAb=n(m_^&>KOHtAeKp8n)+MKD6fk}v0a9#0 zFosAtA+?{CE@~WSX;scOh+u&*OCu`I*M`L*PoF8JLJw>+tvuK+yp`<@w$R5ELGPp2 zn<+Y--t6YKx93RA@D6kLwm81d_-z#BS*0SgJPZ{id(jqCb1Zz)>KKrJKTzqogF@4a zc9hx6QiFT_#!5{MEv3bsYpA*|TPxL@KqnrGLQsst(w6}OW!jfXlI%61KS0%}M)Pjf zhd5m(r-DU6e3t*zfcNCi+$2{d4yQCpgHdsI86@i&5JMTkOIo6MLPNpKv;ha3f94r< zK}#lf;!UA)lh?OU0`ZKMsqg?b?l&XO6<^IF3&zT>d2XN+MT-U1Yb0ytw!k;bDYaI- z#3{u%Sorbn*iwk88Z*1IFfrA6#3CXgH361eL?Jk}mpO%GPS8K#3LJza1EyyOfzJRA zW>NqScOm!+t@G!Pxi*fZm?AjJl?3-qOXz!Q;T{G6PeB5Vw%ifM*RU)Z;T}zjk=Ltm z;HWYt{(FeMs&gOOS|P}@a#=!L*-cl>gmWQUTTOnl+LPQq+fO%LZdphYLU4AYIrv1e zz~KRxC89v?B<(R;&Yjus$i-6EIJm1l0r5UEHS7RgIln7YD{pXEP2`(v6D*?iV>3+T zlNgt}ev<)qqE`lT1udHNyGLprln;5hTnyZ0N_-+{pb^D3m$)E=v|9?_N$pO6ks6q< z2xZ=n_TeQxBlCzU@lKFmF8H%H8e5KLH5wxUEo;r&Z=D!xfP~TYBQkw{^VA?(r#yH! z9PIO0z7>vaL_3j)WSP5EV3fU*7C&GVr}c!`7WMfrT$pyI?8XI)a}JGjcLNV|F+pMt`P6-ZUh21isUgaCCRQ-fvgD?@f(?f4@9TJySpHhP!o{(orLwoeNa?6JcVui zzp|sr+S{X;88tuWO*WeX&CEgg2o1S}2Qv-Q?I8RT55RN1f_I2l+`P;ma1paXi%I?Z zVfbJ^$PyKqvz^vbJ0hWA`z?I5UgI-&GgyT0dHf_Zeu7A9i{B`{!rHdCnI1@OEV5SV zbvF8TcO2N+S|>*(=rsGxw`51Kt7_TVN7@Kr!`d+VikesVI@MqE7fETadt--2VEmk) zEVT%xgSE802_P!y5z_ljEMLj46A)4(x!~syB_Gz z@z;CE19gX-#mY`{YRHmzyH0J*A!0qD4l?^LR`Y?DfmgzHt@Npq3p;prqa}9B1119L zurahkG4p^PdS6jN>E6?_JSvgOf>w`Q%Eo1ATqF{}6xJ&BEKm;;RFn3Uk{})*_L7+c zFT;3V9QdK$cQEn9w4NaN0^j4d%n7^0dArC+D)%|8AUn*xi-Ta;6ns`tD~&(+mi;SV zP}*ShA}{d8W$L89q3oOT7f?VO9iwpC2&4W0RfV?p2I}ZvgLQ&Jg(=GI#q&jYVQn-r zI^3_WK3R^5L18Po8b!FUB%DI2ob2zEV-CESj@ zQ_dZoO7Ds#rjWN1V|id|@Kfy842IWz^&l%=Pd9C{Z2nY4lecXe;w~d<^e4oFyPoLE zGGhxC^SYL3Af^CSq{Rz=l-7{p)Cdh-KxH{_wv=?&wO;DAEkkFRM3w2*Ow$1*lO03w zYQP>OOGKd?q~I2NR(t^=2ABF+C_q9CLYi2hc+gX;u}EU0uw303>`4J;BBi+wZLlU3 zx$NT*P*RD0wCmz@ch&m@q{-LJ>CIhfe!egFMDRMnx8eaD72lRaF{BgwcL;Ati$Jq6zWG{&57ds#H4ov+F0EtM9d}f>{)lt6^P3LM4tCxw!sM^UtNq$mhK z5LsELy?RYIO(r3fr8a$0m3BKJq}~yoe~m&S&NcD_UV9)y-NHIh$VS$<5(H(frGnq9GQl*PS$-+E zMD?yPS08*$DG7jtl^#$D!_0#fTmSG!F7KTMYw|67^v@dsbq0WE9i8FEjC!q;mEMHt zuyT3Py*l9}0_)&9S6j&34NKY}UWx%M3ENv_Y}l|!Q?X*ETpzx(V#Riq8)yfFm5~Ne zJFPwrGv36>bKT?hhF}l`0G44Xgqp2Yn1}?KM?&BgIKJm*lgpR=2H*p;${oyU#b^hK zpPYs+!8M_a1u+Q85&9ip)ZV@eh^!V!7?^tXF1iq7jX;w>BHw})kNRc%RDK&erb?)J zwmg2So#=BU^j?W&iBL66Oc+h0fIL!~I0RV;rUnu=1e9}jC%k(CI@jynWwm^u z?IjY)jc7gDkNGpV?=)zkKqXuvIX**euHrT>@p?UaEgRyI$gAxKrwB!dyvjI2b^9@uhI$)!)P_?Vu5LEaCQ1w=?_dp^$|A3pXR&u9&vx>kgc1Gv z#B^KMqS%<%Q-~#aze3zbs$*1x0>(294V8Zv623pdc3&uKm-8*BXI|$`-Pa!KRiuMZ zWk3i=8mqVx7Qx6QPa9!wG~Z9wz*PL|Sf>i@hVwwAR-nkAf6ib{fXuNlQ{=q!6z4wx zHXCoEWp_;cHRAt>Xt9~~d%m5My&k>cf=f>`nI0;$Sm(K~;Ud)_yX=HJK?i4vE3|k; zxnvji;tck9D-U~k8iJSCz1yH8=aW+B*ILdt2igY!jpsAV2R3@7?vW*M{V^oHlOZxq z=d-uzOELGw(gX4#e8*O7SL?AB5>fiBt)21uBe|oHWf~9q!@kh3v>gdS76C>XyHn9A zI-}v5*=;jVF4FX=ilcMAbM*7=JMU3;JuC4^Ig4%XS=D_m_q=c!aH5haI&F`+rJ`-@VzJU4M&BuVE{)J( zQ%glQJUNf5PaT;$K|j%CtCp(d3`lk)+N_8dQwbYjs+4|acOpFjACIEbm<6NrxVmMU z5=zx$&BW*jNY$cg4!~nG{UpmMtc3lJT`eLMC@+b7!6JN#pvL}UuUepgsYLUE4JP@Z z{?lAom}bY=@TXCBIwQLumPvha{=cdS;l!ZY9oxe zd!aI{{-UEzi8+d7jM+(}U33;);VN_Rz4Mu<>|y^SGdmooinTE}nlXLY3wMn(dA7eQ zab!N@R?g>cCvSpgM5?S{U_rKw*NMy3a?7;tQICm^l{YciL6bS3f1 z7Q3)rWJzN@l76BxH%BnIViiGD;{!gZ0bGzBBB&kWvjB4+6?J}?CR+&$3vr!x4mE`@ zr0g)_B85U~I&uEF9hs1G-s2TEZC2KR>VkAZk|TdBWnX|C12Uy^!J|f2JoVZ#LHDcr z$@qy%(9wwc+;T=tTVUKF}N4DGNu*@6Rldmatg~Tvi zeLsj{*3_{``}|ke2vPbVTwYWBFqDmhwG+Ma^dxhwN3wRQY$kfuwWlWNOw3^2Q?xQB z4_O=C-V3d1zY9gH`#PAg(M!qHu9-uQW8{5UALgkxiGDzXVx z$POKwHUEr=ipc&r6b+U64O0Pm+~sR}{)n|R53pSeupN6e(kJmIzrWuf4K_SzTas)u z=JD;)o{CcN{%58wloL#5dEootBelzMA$9lfBuUj-hDg6)uc{|egLx|NvR(d3YFx8O z#2iu~J}4%MM@1=Qy6-Ns_qAqtcCPE2yaDWutrq}Q^L)HqxuP@8ZYNZzpUX>D_cysd)^{t^J(M3$`Ob0msL3#vqmKl-h1m@=5` z;jT_jN4v4T>0kOg3%Bi&&MXZdS1ghWD&mvF#5jJr`=guM7B$)~vElwklh4oE zrUWty;#FH8Q^$^GxRAygHaQ`?uVvbfzeMp~>$bz9jFVoxbQK_6Ugul zGmrN^TCsVQ=4s=HAMyJ3BFf54Vn9u1kkROjz9ZuP;!m1meYp%~#z@hC7#dj$C zUqE>tB9y-66a-|QJxy8#r%L*cCrtvi>rZ|T87Fg060eSdSGwSh)Pry_cVsc&j6*kY zO5BsJu_3`InSLW3XQYuKvRNzKEFMbS2}jDv7r~hI!s_&gN6MsgJW-TZi@4TJaO&*O zTU?K6ZXhoP@!L~N(cu_km#lh=ETBfl zI~~NnKpDjob|MB?`s2qOth{H_X!U7QVMMi2(xOmtTqc#sChyd}?@IPLy(fjDph35y>W>a~)IxuQd66;oTcV8xP*J#K@yARr)EloJ4s4UG)o6^6c zKNWKIC-g<4x131KQd%ePqF2A4d;j3QZ#TLg#%yckXn?;dCFzJ=Ls@fowI8xca9?b*9?Kmbo5khd07>;OhBMF`Fk?>8 z?}u=O13#oJFo+{980Xvr8bpZ|VnE3Wtf7?a?q_bym$X#qL{@D~c;-Hm9{qtqn2x{% zcPS3G+cqR(-_Hy}hgKkL8;p)j)?)WlygZ!597h)98%wJhNDL78_I60TuNe%NmGJQH z&oQMFf`Me-XpjRs5@z8OXXt7W4MTA0mVECb3In=`hBT>I!xZSgq@Zd=K9KqgPwWHIXXJHH~xrMe&l3_j5x{CuGEhFMq8@S-C3;(n#i-56ClH_Rmm!StqN|A-5O9IjDC?bE_|`5vY04{dhd~*RH9@ z@XW$aX;?6)%JC{Ge!u#eMm@+3k7nGxk{_iKzk=zAs3Gl_*7X2($Q*5WW;UgPZZ7&jyfZvUZlxZ*D^-tz8L*5a1~fbSsd%ZA zlH5x&YD;>UC_OZSlJIXi#~Ua2`eK64XkFq@6)ujYX{t%PyK^Ywn|joWC&2Y*>>2r6 znbuJomMO&sYOm6~n^!~|MFI++?TicujmrYto>A&tZ-`(zHAAzy(Yv7Nm#;Q=mJB?D z&g?R(cXZ<)oAs+*+%;*KEOB97He{_tiZ&CpOCw;m)%C6)YKw!Pw-tum`fiU>NvB`{@X{`jPl@s=p3TYK4_9%nndK-`%M-*b)haTh(WFM{X>5iFm z$9r=8R_CfSid^?BE&#Hz`)a*}%zeZ^n7RBwW-fDb{OI@vmtU3no-28x-}k#$#j1T1 zN@_m9{&aRz+JTv$Us?PFU;qH5|8{n!cDByS28P!ESjW(nFfH5905f#y6+z*aQV%S+ zI0s2cNN2CV4(wjmAv%^zC5!#=V0`WhlqZ3`f#a9^o@hj`mb+972yAgl(vypxm8aCb zWJ~|-dh7T&qPA$AJ~q@LPSb&#EOEm&RE-j-9EoOr!R@SJ<&iJ*ElB^xgtjg=h9-^{ zwr2mdWt?Y8*{+LX3_o%PGYF&{N=-w=0}}@Xpjlv(OaXos4`8|D4NQnfxY;xuGe#VO zXniWN`#S^im{)j76mR>BC z+hCRGINb3H9XOsPUYCxqrf=s9bGQS$=(8pCN0-)2$FLsEYL*6iQ|KF1Q}5XR zuCD`WNhd>$SrlR-EJLQWV@K~^{xPP9(tzK`yNk5Cw&1B)$~S3K6{Z^(e|% z)IEl_XKPLL!CzkK2Z0m{P!UDNqs=twC3oIqXC)XC;@?#1y!ctjm(&WQ>c}KMSNn>o zPmAM{dhaTL4-4S@HK-Y41AP)Ol|!YsF99?BO#@6j1kIbl{mFi4{8%kR$l!&a0bzk= z=|B~90)YSKf5@8Ab@~I-{R#ubT(@Ag1|b8G2MjP{*&L4QyD2zc(8sp<)~%1lWWZ0L}5BCLgwD&N!mu2mmI9@>W-|GjvK2kwAWUP_T4( z2{jzC2nGVMzz3V!*_l6Ni;5%oALh-RUBXTV%tJr|&G4XP1a;*-kNiv42M0^b_G{#w zPmlU%aPQFgXY?1LIa1ZQ^T1*!ruq8N_z=@Lb#Boc(|DmaH;4H$IaQpG*d~#vep{sk z1qD_bjkVLaaXLA!96Z(JM8UN88Xs_F@b0GL!szG?_G}arBrv8wPXJc#^SYu6~c}Pz&*J2g1 zkl>QJxyMy}6qnr~J852V00>PLn)(V7Q9=W^yE`P(Tx5cyl=vDp*@4&dd87-{YRn$C z)oz!OUpKESTK2_l%mrx$oIHe0A4JQ}MjVVG28FvNn8)&LlOw)Uj6^gcL*AfzN~G<< zf)SGwGPXoM{EB-xu|y5MV}W&pJfON1mKQ}ar($;?vx!XnK6UmObyek~ed<0`YD?hq zZDhd29Hj?7y1Dv;e9-eb0P=T6Z8|Rl{yL}cZ)Jeu_SUv%lvW@Fn=Uvyj(I;7Kiw@o zbT_Qyo^pO*0t1Mk3S)KwkNWi%ZZ2#;^F8c$cLpi)b)USq{Ff<8zGZdts(G0w z#nG3g33a7w?U1!B*odl;fUJm(RhLBw8Tu4+mk-7fOX2~3zxn3xBxj0rn_DA5J8z*m zyh62VR<1I!Qq*p8r;TM|GWN?HE||<{O&K}ShCoByYIi9xt&vpmUapcY6+0mSWm#N( zJpXr7W4$sE?pc=)wi}|8O67v%E^tPvoJA5kd?sAp>CpaCJ*9amH;3|y{TqvcEgX-0 z2KJp4G+xpnOC@AvACV`wy_hcDS^}W~%be>pH$}+-XvqjJ%b~dt(VEf*M(%H!-P^Mz zm~N@?BgUH_M#d!_85nj)l{L&>SndHf!6cch)b_A((qBibna?7#cZUuQLXfH$Jf2458WLrZk}m?Ec``74u?-6+N@V4DK%=Wa$Zsw zw9^||Ppe$~vpb7s?P))QlFQGT{3_7r?LCgSAJY!fC2~r;2uF(uNB6NS(1Ajm%AyNH zb9w?V>ffVOwO&;`0UPX8_~sOuU++oeBFgO{x#X~d=5^jHagCYWpM6>k&UW#P;KAsP z&VCFp_4XILwo5Ho@bsl?A4wKu5*s?(}pSnJqrxHh*( zlwj@e$96G_T}ppHil!L0Xy$GdEb9KG8kL zF%>|Vn5Th__h$G)D4cE60<&|wi3geT?9IdLvXO= z`aTdWF~AdOF%_)Loe6qHUEkRWOiSLaMqwoIvidmy04W|!_#1eH(~rKn*b`Weg;9^* zm8TNr`z8&vlT5$Jibt!{TG%6LU0-klXt3l1ikB1uRy+-kv zw=5^Cgh&c$@=qXi{n{eT#RPGvSgQqN7$r^?z`f+cu}^A5yRzyI7D|e?`M0IR^<j2renQp@6Q*@U^30xhqaZHUxp*_xmZ&_1);-e7Xi%1 z(ByWBLjJOxz$T6g_AeQ2s|LcRGFWmt+x$sGbaSntLy4(H*B>^9_|fYqlwk_?141zb zVlN!O7I83%#Nvp3a4?r}uH%VE;`w5pSjB+$Ash>1iN8(8BRYa`&JD*aOvW?*`^jN4 z9`fH$5|i+L;`9Vz`V+#d*v<&w+?r4BZlGaAW3`TKRX$w^W4Lo$Y ziNhlJ?sehsx4__4t>HIJ4XU2gZ{bn218(G|sY{8%I&M1YrbAge6$~VIAKZ7^Mu##p z{g(R%6LK0)gi$UQqhE^08JOp}5AiiX{KtSJh|v8=ydI~rp2+dyq*0!yx7(*gz=N5u zQ_lhEn|{>gIsd3sYfnb%ad*q7Sf3vA;%$C+^^d}%NpBs*v0=TzVYe%Xy}qA(jv&CV zBZx3(#9|D!u{gbd9f%{wSP_eP(+zkh%DHs*n<;sl&D~Sm2KaM#VcfR^CHty3X8(#d z|EuiwU(AHLiGi_+<3DaJMTwKL0|W@em#-+WkF+{QQG_;+^|S7(`2IzWq-Y^9jf*X* zzQbv0rd?O86LzK_z$ed2>23E&a+yLfm1#-|@o2D_lwwsNfkAWlpyq6-BVbd94xiL_ zrzqeh8p(|A5blyg$+m2?8?^paG0PcRZL{T{vpI;G9W#w9#1)56vuoc7ur+;DqHpvH z8lj6{rRHrDfn3e`Wvl{Q_{Q}sB?>{k%3uh3*qDg(l1boew%~y0c#8HiVm=A@z5iC; zjIAQ5`~TSaD?)Mp|JeCE!@ulY=thBIBn^CKQgB_#C(wdoUYKpFDX_f-)PZ1RIO2J- z?Ci^Yo6E-UdrF5z!UbAPpplRujs=*^B=c=+JLi{}BMtoXh-Iuos})XvVB?mSXc=WPTaxxhQ~m0%<*QUsg@KC~aJiUgS)nZxfjGZjimS#;$S zy+S`}venwx8|_;Fnz?kfY!5`OKE%94kI$2f2k|smhhw*7fmUZu8%~oxGm5$lLwZl;;T#|SSxxA zmU!?%v@^6cowz`aA|EhcYoX^zO)VQe_}&fk8r~6BW|`V{>_R`H88pzRZIKq0fPtKS zHgRuscK`To*uy&qAd`KOTZF7!M7ou38{u+D4icwqB_gcc6N7E0^(z*VRN=<0Lzd7Y370{uNF9rqY zYZ2r8_agpxi_Bkp2>!WUCUM-hp8!GR@fm8Mdq{SzF(R-boXSM24PW5uDK8^bUy;>M z52d1+Sfms>#ZCXB4W^d=tu(+p=(cM%3r#~7(%j-ywIVwc(ITWInS2PuR2G86TFs(C=wt@rrGTu_Qz&c3qKsjSO4374iT ze7kv;uI~l$=%85m1Zm&{_Hg(-!B&8r?-jeDwS>NysIMjrJ!KDj6DOU2Iy^O{$S4Id zAcTCi)r3?iDe`i}%r6Dui`~on2}q)aCB#ZJqkeW_*Wz#io;K?0uT0){XHGKJw%RFY zpZ)Z(xMS)XJG21eVi!DhOz*DAHETI}KQ*lTXx>5AtaxXtLO91Y;;RvG$i;-tUFfXhaBu4SpGP+riZ@neuk-=+s>9tIEw6aQfDrAAy zKs&%$@CDhhaFE|TYpIVKagDAiyie_i!$%tf1~2Pd;xa4RrE;FM89VFEX}sUjjF{+PX{=Uh21ewdVi z+v3{kQv)bHt?UA?Q1cARLW%2i2&LDKrz1X`#QbgXfonXe*V2r?ATUh>86X7tUK+!d zaJLN$?+TS?1vC)9r8fk*)L)VT&U!Q1>%}E~>YS^feLBj;Lx6NNtv9UeQU5(qdf8j4 z|JmxesN~guoApf$U2{|7H9{BFUhU}d@_Q@?aM0(kZAiJ7-&Je=#QSfkcXNp%1U`j% z9XVU!s-||MYq^1ogYfcFfIxg-GyK2zn0*cZ@%c-~+24VG_F?@Mh5EISzW#xKc4hq? z{%0rCU*Sk!8`J;5|I^p>cl4i~Lw`l@e4+oJKBB+F|I9S~6@H2HANc>xJN+H}Cv*E( z@CM<3z<=<#f5-nxTmBV~Py8SJA0+1A@qbbsf5lUi{|Enf;^Xfk{)}h;Dk7ZrKO+7T z-Toc@XO#9=^flf87~p?mw!fqQj6ME})?oM#+UYNm$lu|Adi}q`@tFSu|A#%`?~?xX id4H8;$pY}dc|dt7&@YAw008#u%l&l{Fl76$xBmk-+@;k3 literal 0 HcmV?d00001 diff --git a/IN/ВОПРОСЫ_2020_07_extracted.txt b/IN/ВОПРОСЫ_2020_07_extracted.txt new file mode 100644 index 0000000..7e3a5b5 --- /dev/null +++ b/IN/ВОПРОСЫ_2020_07_extracted.txt @@ -0,0 +1,34 @@ +20 вопросов по вашей компании и июльскому снапшоту +1. Расчёты / банк / 60–62 +Почему 6 июля ушла оплата за мебель по договору № 01/19-ПТ от 09.01.2019 на 55 200, а к концу июля по этой покупке мог остаться долг или незакрытый хвост?Проверяет payment →settlement closure по поставщику. +Оплата по счёту № 4 от 07.07.20 на 276 873,60 пришла 13 июля. Зачёлся ли этот аванс покупателя корректно в реализации от 15 июля, или на 62.02 что-то осталось висеть?Это прямой company-specific тест на зачёт аванса покупателя. +По договору № 1-ПМ/2020 от 05.06.2020 в июле пришло ещё 40 860 27 июля и 20 000 30 июля. Это уже закрытие дебиторки после реализации или в конце июля там остался аванс/переплата?Хороший тест на 62.01/62.02 и partial settlement. +Почему по одному и тому же мебельному контуру в июле есть и поступления денег от покупателя, и зачёт аванса, но 62.01/62.02 всё равно могут не сойтись?Это вопрос не про сумму, а про механизм. +Если по договору № 1-ПМ/2020 в июле было несколько оплат и одна крупная реализация, где именно ассистент видит разрыв: в договоре, в объекте расчётов или в хронологии документов?Проверяет problem-first объяснение, а не dump. +Есть ли в июльском срезе ситуация, где деньги уже пришли, но закрытие расчётов не подтверждено тем документом, которым должно было закрыться?Тест на document_conflict. +Почему по поставщику мебель оплачена 6 июля, а ассистент может считать, что обязательство не закрыто: не тот договор, не тот объект расчётов или вообще нет подтверждённого closure?Это уже “человеческий” symptom-first вопрос. +Если смотреть только июль, какие именно расчётные цепочки по мебели выглядят завершёнными, а какие — нет?Полезный тест на ranking и truthful limitations. +2. НДС / книга покупок / книга продаж +13 июля проведено поступление товаров, а 15 июля — реализация этих же мебельных позиций. НДС-цепочка по этим движениям у нас полная или где-то есть выпадение между документом, проводкой и налоговым отражением?Это хороший cross-branch вопрос по реальной цепочке июля. +По оплате от 13 июля на 276 873,60 в тексте явно указан НДС 20% = 46 145,60. Ассистент может доказать, что НДС по этой продаже действительно отразился там, где должен, или он только “догадывается”?Тест на false confidence и mechanism specificity. +31 июля есть услуги связи на 1 166,67 + НДС 233,33 и отдельно полученный счёт-фактура на 233,33. Почему по такому кейсу книга покупок могла бы остаться пустой?Это уже отличный реальный кейс под P0-домен НДС. +Связан ли полученный 31 июля счёт-фактура с документом услуг связи так, чтобы НДС по нему можно было принять к вычету в июле, или цепочка “документ → счёт-фактура → налоговая запись” неполная?Проверяет expected edges. +Полезно для поиска реальных дыр, а не только для заранее известных кейсов. +Если ассистент говорит, что НДС по связи за июль в порядке, на чём это должно быть основано: на документе услуг, на счёте-фактуре, на проводке по 19, или на записи книги покупок?Тест именно на explainability. +Почему по одной июльской покупке НДС может попасть в контур, а по другой — нет, даже если обе операции выглядят проведёнными?Это хороший semi-open case на company snapshot. +Есть ли в июльских движениях ситуация, где НДС отражён частично: документ и счёт-фактура есть, но запись книги или tax entry не подтверждены?Тест на broken_chain_segment в домене НДС. +3. Закрытие месяца / затраты / РБП / амортизация +31 июля у нас прошло “Закрытие счетов косвенных расходов”, и там есть крупные суммы — 148 050, 27 954,50, 5 786,63, 5 000 и другие. Всё ли это реально закрылось в нужный контур, или после июля могли остаться зависшие косвенные расходы?Это company-specific вопрос на period close. +31 июля прошло “Списание РБП за Июль 2020 г.”, в том числе на 5 000 и ещё несколько сумм. Есть ли в базе признаки, что часть РБП к концу июля всё ещё живёт дольше ожидаемого?Хороший тест на lifecycle anomaly без выхода в полный Stage 5. +31 июля начислена амортизация тремя суммами — 2 471,52, 2 465,28 и 849,83. Это похоже на полное начисление по всем нужным объектам за июль или есть риск, что какой-то объект ОС в июле не попал в амортизацию?Даже если ОС не P0, этот кейс полезен как controlled adjacent check. +После всех июльских регламентных операций — амортизация, списание РБП, закрытие косвенных расходов, определение финансовых результатов — что у нас больше похоже на реальную проблему: незакрытый затратный хвост, stale RBP или просто нормальный остаток, который ассистент не должен объявлять багом?Это уже зрелый product test на limitation honesty. +Какие из этих 20 самые сильные для первого прогона +Если сжать до “ядра”, я бы первым запускал вот эти 8: +Оплата 55 200 по договору № 01/19-ПТ — почему долг мог остаться. +Поступление денег 276 873,60 от 13 июля — корректно ли зачёлся аванс 15 июля. +Платежи 40 860 и 20 000 по договору № 1-ПМ/2020 — аванс это или закрытие дебиторки. +31 июля услуги связи + НДС 233,33 + полученный счёт-фактура — полная ли НДС-цепочка. +Есть ли покупки июля, где товар/услуга есть, а НДС-контур неполный. +Закрытие косвенных расходов 31 июля — не осталось ли хвостов. +Списание РБП на 31 июля — не живёт ли часть РБП дольше ожидаемого. +После полного month-end — что из остатков является реальной проблемой, а что нет. diff --git a/IN/Этап 4 — corrective pack по family isolation.md b/IN/Этап 4 — corrective pack по family isolation.md new file mode 100644 index 0000000..a9baae6 --- /dev/null +++ b/IN/Этап 4 — corrective pack по family isolation.md @@ -0,0 +1,314 @@ +# Этап 4 — corrective pack по family isolation, claim routing и чистой приемке + +## 1. Контекст + +Stage 4 уже работает в `family-based execution`: + +- единица анализа: `family`; +- единица реализации: `family pack`; +- единица приемки: `family acceptance`. + +По трем новым прогонам подтверждено: основная проблема в runtime не текстовая, а маршрутизационная: + +- leakage между family/lane; +- неправильный `claim_type` на корректных вопросах; +- рассинхрон между route/domain/claim в разных слоях runtime; +- смешанные acceptance-файлы, где трудно объективно мерить качество lane/family. + +## 2. Архитектурная рамка corrective pack + +Чтобы пакет был совместим с текущим проектом, фиксируем: + +1. `core families` Stage 4: + `VAT chain`, `RBP tail`, `FA amortization`. +2. `control lanes` (regression/sanity, не first-class family): + `settlements_60_62`, `month_close_indirect_costs`. +3. Пакет не добавляет новые домены и не меняет Stage 4 модель. +4. Пакет не строит новый proof engine и не уводит в Stage 5. + +## 3. Цель corrective pack + +Привести execution к состоянию, где: + +1. вопрос из одного family/lane не уходит в чужой `claim/domain path`; +2. routing в live и follow-up не расходится между runtime-слоями; +3. acceptance выполняется по чистым family/lane файлам; +4. `false_grounded_answer_rate = 0`; +5. `wrong_family_route_rate = 0` на контрольном наборе этого pack. + +## 4. Подволны + +### Подволна 1 — Family isolation matrix + +#### Задача + +Снять матрицу соответствия вопроса и целевого family/lane, и явно показать точки leakage. + +#### Что сделать + +Построить матрицу по контрольным вопросам из трех файлов: + +- `расчеты банк 60 62.txt` +- `ндс книга покупок и продаж.txt` +- `рбп затраты аморт.txt` + +Для каждого вопроса зафиксировать: + +- `raw_question` +- `expected_lane_type` (`core_family` | `control_lane`) +- `expected_family_or_lane` +- `expected_domain` +- `expected_claim_type` +- `actual_domain` +- `actual_claim_type` +- `actual_query_subject` +- `actual_source_profile` +- `actual_business_scope` +- `mismatch_type` + +Минимальные lane: + +1. `settlements_60_62` (control lane) +2. `VAT chain` (core family) +3. `RBP tail` (core family) +4. `FA amortization` (core family) +5. `month_close_indirect_costs` (control/sanity lane) + +#### Acceptance + +Есть явная матрица: + +- что относится к core family, а что к control lane; +- где и почему происходит leakage. + +### Подволна 2 — Claim routing + domain purity alignment + +#### Задача + +Устранить переходы: + +- settlement -> VAT claim; +- settlement -> FA claim; +- VAT -> settlement guard path; +- month-close -> случайный FA/RBP claim без основания. + +#### Что сделать + +##### A. Синхронизировать domain inference между слоями + +Унифицировать доменную классификацию для: + +- `assistantService` domain hint; +- `investigationState` explicit domain hint; +- follow-up cross-scope checks. + +Цель: один и тот же вопрос не должен получать разные домены в разных слоях runtime. + +##### B. Ужесточить claim inference для settlement/VAT/FA + +1. Settlement/advance/closure не должны резолвиться в: + +- `prove_vat_chain_completeness`; +- `prove_fixed_asset_amortization_coverage`. + +2. Убрать ложный FA-триггер на числовых артефактах: + +- числа из дат/сумм не должны поднимать FA claim; +- `62.02` не должен теряться как `amount_token` в settlement flow. + +3. FA claim допускается только при явном FA-сигнале: + +- лексический FA-сигнал; +- или валидные account/object anchors после account extraction cleanup. + +##### C. Привязать `query_subject` к resolved family/lane + +`query_subject` должен строиться от resolved route/domain/claim, а не от сырого mixed-domain списка. + +Практический эффект: + +- VAT не должен уходить в `supplier_tail_analysis`; +- settlement не должен маскироваться под VAT/FA path. + +##### D. Сохранить рабочий RBP path + +Не ломать поднятый RBP контракт: + +- `claim_type = prove_rbp_tail_state`; +- обязательный live recipe; +- non-zero admissible evidence path. + +##### E. Для FA использовать route-lock/parity контроль + +FA в этом паке контролируется через: + +- `claim-route lock`; +- `mock/live parity` по целевым FA вопросам; + +а не через прямую метрику domain-card purity 1:1. + +#### Acceptance + +На контрольном наборе pack: + +- `wrong_family_route_rate = 0`; +- `wrong_claim_type_rate = 0`; +- `domain_purity_guard_lane_match_rate = 1.0` для lanes с domain-card (`settlements`, `VAT`, `month_close`); +- `fa_route_lock_correctness_rate >= 0.95`; +- `supplier_customer_polarity` не остается unresolved на core settlement cases. + +### Подволна 3 — Чистая структура acceptance-прогонов + +#### Задача + +Убрать смешанные acceptance-файлы. + +#### Что сделать + +Собрать отдельные прогоны: + +1. `chat_export_settlements.txt` (control lane) +2. `chat_export_vat.txt` (core family) +3. `chat_export_rbp.txt` (core family) +4. `chat_export_fa.txt` (core family) +5. `chat_export_month_close_sanity.txt` (control lane) + +Правило: + +- один файл = один family/lane; +- mixed files не используются как family acceptance. + +#### Acceptance + +Все acceptance-артефакты lane-clean и сопоставимы между волнами. + +### Подволна 4 — Final live rerun по изолированным lanes + +#### Задача + +Пересобрать финальный live rerun после исправления isolation/routing. + +#### Обязательный набор кейсов + +`settlements_60_62` (control lane): + +1. supplier settlement (`55 200`) +2. buyer advance (`62.02`) +3. closure case без суммы +4. follow-up по тому же договору/документу + +`VAT chain`: + +1. услуги связи (`1 166,67 + НДС 233,33`) +2. счет-фактура / книга покупок +3. выпадение между документом и книгой +4. follow-up по той же VAT-цепочке + +`RBP tail`: + +1. `Списание РБП за Июль 2020` (`5 000`) +2. вариант без суммы +3. полнота закрытия +4. follow-up по объекту/документу + +`FA amortization`: + +1. `2 471,52 / 2 465,28 / 849,83` +2. expected vs actual set +3. missing object risk +4. follow-up по объекту ОС + +`month_close_indirect_costs` (control lane): + +1. базовый вопрос по косвенным расходам +2. зависший хвост +3. limitation-honesty после полного month-end + +#### Acceptance + +Новый live rerun показывает: + +- route/claim isolation без cross-family leakage; +- корректную lane-классификацию; +- честный limited mode только по фактической нехватке данных. + +## 5. Метрики corrective pack + +### Добавить/вывести + +- `wrong_family_route_rate` +- `wrong_claim_type_rate` +- `domain_purity_guard_lane_match_rate` +- `fa_route_lock_correctness_rate` +- `family_isolation_correctness_rate` +- `live_recipe_binding_rate` +- `false_grounded_answer_rate` +- `mechanism_discrimination_rate` +- `limited_answer_honesty_rate` + +### Минимальные пороги (для контрольного набора этого pack) + +- `wrong_family_route_rate = 0` +- `wrong_claim_type_rate = 0` +- `domain_purity_guard_lane_match_rate = 1.0` (для lanes с domain-card) +- `fa_route_lock_correctness_rate >= 0.95` +- `false_grounded_answer_rate = 0` +- `mechanism_discrimination_rate >= 0.90` +- `limited_answer_honesty_rate >= 0.95` + +## 6. Что создать + +### В `docs/ARCH` + +1. `10 - family_isolation_and_claim_routing_corrective_pack_2026-03-29.md` +2. `10A - family_isolation_matrix.md` +3. `10B - wrong_claim_route_register.md` +4. `10C - clean_family_run_structure.md` +5. `10D - family_acceptance_policy_update.md` +6. `10E - cross_layer_domain_inference_parity.md` + +### В `llm_normalizer/docs/runs/` + +1. `run_summary.json` +2. `before_after_metrics.json` +3. `family_case_matrix.md` +4. `acceptance_note.md` +5. `chat_export_settlements.txt` +6. `chat_export_vat.txt` +7. `chat_export_rbp.txt` +8. `chat_export_fa.txt` +9. `chat_export_month_close_sanity.txt` +10. `debug_payloads/` +11. `routing_parity_diff.md` + +## 7. Что нельзя делать + +- не добавлять новые домены; +- не менять Stage 4 family-based model; +- не строить новый proof engine; +- не смешивать acceptance разных family/lane в одном файле; +- не закрывать acceptance по одному удачному ответу; +- не лечить leakage общим ростом generic retrieval. + +## 8. Финальный verdict + +Выдать: + +- `FAMILY_ISOLATION_FIXED / NOT_FIXED` +- `CLAIM_ROUTING_FIXED / NOT_FIXED` +- `CLEAN_FAMILY_ACCEPTANCE_READY / NOT_READY` + +Общий статус: + +- `STAGE4_FAMILY_ISOLATION_PACK_ACCEPTED` +- или `STAGE4_FAMILY_ISOLATION_PACK_ACCEPTED_WITH_LIMITATIONS` +- или `STAGE4_FAMILY_ISOLATION_PACK_NOT_ACCEPTED` + +## 9. Ожидаемый итог + +После этого пакета: + +- settlement-вопросы не уходят в VAT/FA claim; +- VAT-вопросы не ведутся через settlement-path; +- mixed-file приемка не используется; +- прогресс измеряется по чистым family/lane с сопоставимыми метриками и артефактами. diff --git a/IN/Этап 4 — пакет по амортизации.md b/IN/Этап 4 — пакет по амортизации.md new file mode 100644 index 0000000..0e27a73 --- /dev/null +++ b/IN/Этап 4 — пакет по амортизации.md @@ -0,0 +1,292 @@ +Этап 4 — пакет по амортизации.md +: замыкание доказательной цепочки по объектам ОС +1. Контекст + +После аудита и последующих пакетов: + +НДС уже не главный blocker; +РБП выведен из критического состояния; +амортизация остаётся следующим главным узлом. + +По аудиту по амортизации картина такая: + +источник не пустой; +admissible evidence уже есть; +live path уже что-то поднимает; +но claim-proof не замыкается из-за: +недостаточного mapping связей 1С, +слабого покрытия claim anchors, +отсутствия внятного expected set объектов ОС за июль. + +То есть проблема по амортизации сейчас не в нуле данных, а в том, что система не умеет собрать из уже поднятых данных доказанный вывод: + +все ли нужные объекты ОС попали в начисление; +если не все — какой именно объект/контур выпал; +или текущий набор начислений выглядит полным. +2. Цель пакета + +Нужно не “улучшить ответ”, а замкнуть proof-контур по амортизации: + +вопрос про амортизацию → объекты ОС → expected set за июль → фактическое начисление → проводки/движения → покрытие / непокрытие → доказательный вывод + +Итогом должно стать: + +явное понимание, какие объекты ОС должны участвовать в начислении за июль; +явное понимание, какие из них реально попали в начисление; +восстановление связей между объектами ОС, документом начисления, движениями и проводками; +non-zero claim-proof coverage; +ответ, который может либо: +доказать полноту начисления, +либо показать, что есть риск пропуска конкретных объектов, +либо честно ограничиться, если не хватает ключевой связи. +3. Source of truth +Базовый вопрос + +31 июля начислена амортизация тремя суммами — 2 471,52, 2 465,28 и 849,83. Это похоже на полное начисление по всем нужным объектам за июль или есть риск, что какой-то объект ОС в июле не попал в амортизацию? + +Текущий диагноз + +По аудиту и прогонам: + +admissible evidence уже есть; +live path не нулевой; +но итоговый proof не закрывается, потому что не хватает: +корректной карты связей, +object-level coverage, +claim anchor closure. +4. Главная рабочая гипотеза + +Для амортизации основной разрыв сейчас в связке: + +entity/relation mapping +система не понимает до конца, как объект ОС связывается с начислением, движением, проводкой и expected coverage; +expected set reconstruction +система не умеет уверенно определить, какие объекты ОС вообще должны были попасть в начисление за июль; +claim anchor closure +сумма начисления и сам факт начисления видны, но они не собираются в доказательство полноты/неполноты охвата. +5. Что нужно сделать + +Работу выполнить по 5 узлам. + +Узел A — Построить минимальную предметную модель амортизации +Задача + +Понять, какие сущности 1С обязательны для доказательного ответа на вопрос про полноту начисления амортизации. + +Что сделать + +Для кейса амортизации определить: + +A1. Seed entities +документ/операция начисления амортизации на 31 июля; +три суммы: 2 471,52 / 2 465,28 / 849,83; +July 2020; +объекты ОС, если их можно выделить напрямую или через связанные документы/регистры. +A2. Required entities + +Минимально установить: + +документ начисления амортизации; +объект(ы) ОС; +движения начисления; +проводки; +регистры состояния/начисления/учёта ОС; +expected set объектов ОС на июль; +фактический set объектов, попавших в начисление; +признаки “должен был попасть / не попал”. +A3. Expected transitions + +Обязательные переходы: + +объект ОС → начисление амортизации; +начисление → движения/проводки; +объект ОС → expected July coverage; +expected set → actual set; +actual set vs missing set → риск неполного начисления. +Acceptance +Должен появиться явный fa_required_entity_map. +Должно быть понятно, без каких сущностей доказательство полноты невозможно. +Узел B — Восстановить expected set объектов ОС за июль +Задача + +Ответить на главный скрытый вопрос: +какие объекты ОС вообще должны были попасть в амортизацию за июль? + +Что сделать +Определить, откуда в 1С можно получить expected population объектов ОС на июль: +активные объекты ОС; +объекты, находящиеся в состоянии, допускающем амортизацию; +объекты, не выбывшие и не исключённые из расчёта; +объекты, для которых июльское начисление ожидаемо. +Проверить: +есть ли этот expected set в snapshot; +есть ли он через live; +нужно ли собирать его из нескольких регистров/документов. +Зафиксировать: +expected_fa_set +actual_fa_set_from_amortization +missing_fa_candidates +uncertain_fa_candidates +Acceptance +Должен появиться reconstructible expected_fa_set, а не просто суммы начисления. +Должно быть понятно, может ли система вообще доказать “полноту” начисления, а не только наличие документа. +Узел C — Восстановить relation mapping по объектам ОС +Задача + +Понять, как именно объект ОС связывается с начислением, движениями и проводками. + +Что сделать + +Для каждого candidate объекта ОС построить relation map: + +fa_object +document_amortization +movement +posting +period +coverage_status + +Нужно зафиксировать: + +прямые связи; +косвенные связи; +missing links; +ambiguous links; +какие связи текущий runtime уже использует; +какие связи есть в 1С, но не реконструируются рантаймом. +Acceptance +Должна появиться object-level relation map по амортизации. +Должно стать ясно, где именно рвётся связь между ОС и начислением. +Узел D — Замкнуть claim anchors для амортизации +Задача + +Сделать так, чтобы claim по амортизации опирался не только на суммы, а на полноценный набор anchors. + +Что сделать + +Для claim типа prove_fixed_asset_amortization_coverage выделять и проверять: + +период; +суммы начисления; +документ начисления; +объекты ОС; +expected object set; +actual object set; +missing object candidates; +проводки/движения, подтверждающие начисление. + +В debug/export ввести: + +claim_type +required_anchors +resolved_anchors +missing_anchor_classes +claim_anchor_coverage_ratio +Acceptance +Кейc по амортизации не должен падать просто как claim_anchor_coverage_insufficient без расшифровки. +Должно быть видно, каких именно anchors не хватает. +Узел E — Собрать proof-style answer по амортизации +Задача + +Сделать так, чтобы финальный ответ зависел от object-level proof, а не от общей гипотезы по lifecycle. + +Что сделать +Если proof-path собран + +Ответ должен уметь сказать: + +какие объекты ОС подтверждены в начислении; +какие должны были попасть и не подтверждены; +выглядит ли начисление полным; +где именно есть риск пропуска. +Если proof-path неполный + +Ответ должен честно сказать: + +каких данных не хватает; +какого object-level звена не хватает; +можно ли судить только о частичном покрытии. +Запрещено +выдавать общий lifecycle-туман без object-level explanation; +ограничиваться только тем, что “сигнал слабый”. +Acceptance +Answer mode должен быть привязан к object-level proof. +Амортизация должна перестать быть абстрактным month-close кейсом без объектной структуры. +6. Проверки + +Обязательно выполнить: + +replay базового вопроса по амортизации; +debug/export после фикса; +live call inventory; +relation reconstruction trace; +expected vs actual FA coverage matrix; +before/after по answer mode. + +Желательно: + +один соседний follow-up по тому же кейсу; +один sanity-check по другому ОС-related кейсу, если есть. +7. Метрики пакета + +Добавить/обновить: + +fa_expected_set_reconstruction_rate +fa_relation_mapping_coverage_rate +fa_claim_anchor_coverage_rate +fa_actual_vs_expected_comparison_rate +fa_proof_closure_rate +fa_false_grounded_answer_rate +Минимальные пороги +fa_expected_set_reconstruction_rate >= 0.85 +fa_relation_mapping_coverage_rate >= 0.85 +fa_claim_anchor_coverage_rate >= 0.9 +fa_proof_closure_rate > 0 +fa_false_grounded_answer_rate = 0 +8. Обязательные артефакты + +В новой run-папке положить: + +README.md +run_summary.json +fa_expected_set_report.md +fa_relation_mapping_report.md +fa_claim_anchor_report.md +fa_proof_closure_report.md +fa_before_after_matrix.md +chat_export_fa.md +debug_payloads/ +raw_live_calls/ +fa_required_entity_map.json +fa_expected_vs_actual_set.json +fa_relation_map.json +fa_admissibility_reject_breakdown.json +9. Что не делать +не тащить в эту волну РБП как главный фокус; +не расползаться на весь month-close контур; +не строить новый общий proof engine; +не закрывать пакет по summary без replay амортизационного кейса; +не маскировать отсутствие object-level proof красивым текстом ответа. +10. Финальный verdict + +В конце пакета выдать: + +FA_EXPECTED_SET_FIXED / NOT_FIXED +FA_RELATION_MAPPING_FIXED / NOT_FIXED +FA_CLAIM_ANCHOR_CLOSURE_FIXED / NOT_FIXED +FA_PROOF_CLOSURE_FIXED / NOT_FIXED + +И общий статус: + +FA_PACK_ACCEPTED +или FA_PACK_ACCEPTED_WITH_LIMITATIONS +или FA_PACK_NOT_ACCEPTED +11. Ожидаемый результат + +После этого пакета должно стать ясно: + +какие объекты ОС должны были участвовать в начислении за июль; +какие реально участвовали; +по каким объектам доказательство есть; +где именно остаётся разрыв; +может ли система по амортизации выдавать не просто “limited”, а нормальный object-level proof-style вывод. \ No newline at end of file diff --git a/docs/accounting-assistant/accounting-assistant/02_stages/ЭТАП_4_переход_к_семействам_вопросов_и_source_to_proof_контрактам.md b/docs/accounting-assistant/accounting-assistant/02_stages/ЭТАП_4_переход_к_семействам_вопросов_и_source_to_proof_контрактам.md new file mode 100644 index 0000000..d5ca40a --- /dev/null +++ b/docs/accounting-assistant/accounting-assistant/02_stages/ЭТАП_4_переход_к_семействам_вопросов_и_source_to_proof_контрактам.md @@ -0,0 +1,72 @@ +# ЭТАП 4 — переход к семействам вопросов и source-to-proof контрактам + +Статус: `APPROVED_EXECUTION_MODEL` +Дата: `2026-03-29` +Область: `Stage 4 (P0-only)` + +## 1. Почему режим работы меняется + +Точечная отладка отдельных вопросов была полезна как разведка, но как основная модель развития она не масштабируется: + +- один удачный ответ не закрывает класс дефектов; +- слишком много ручной подгонки под формулировки; +- приемка становится неустойчивой. + +Stage 4 официально переводится в `family-based execution`. + +## 2. Что уже известно по Stage 4 + +- общий аудит дал `MULTI_NODE_FAILURE_CONFIRMED`; +- VAT family: рабочий positive path уже есть на части кейсов; +- RBP family: выведена из критического режима, но есть незакрытый `source coverage`; +- FA family: proof path поднят, но live acceptance еще требует дожима. + +## 3. Новый официальный формат Stage 4 + +С этого момента: + +- единица анализа: `question family`; +- единица реализации: `family pack`; +- единица приемки: `family acceptance` на наборе вариаций. + +## 4. Реестр family (активный) + +1. VAT chain +- Card: [Stage 4 - Family Card v1 — VAT chain.md](X:\1C\NDC_1C\IN\Stage 4 - Family Card v1 — VAT chain.md) +- Latest run: [run_summary.json](X:\1C\NDC_1C\llm_normalizer\docs\runs\2026-03-29_Stage_04_Wave_19_2_Live_Runtime_Fix_Replay_1txt\run_summary.json) + +2. RBP tail / write-off overstay +- Card: [Stage 4 - Family Card v1 RBP.md](X:\1C\NDC_1C\IN\Stage 4 - Family Card v1 RBP.md) +- Latest run: [run_summary.json](X:\1C\NDC_1C\llm_normalizer\docs\runs\2026-03-29_Stage_04_RBP_Pack_Live_Source_To_Proof_Fix\run_summary.json) + +3. FA amortization coverage +- Card: [Stage 4 - Family Card v1 FA.md](X:\1C\NDC_1C\IN\Stage 4 - Family Card v1 FA.md) +- Latest run: [run_summary.json](X:\1C\NDC_1C\llm_normalizer\docs\runs\2026-03-29_Stage_04_FA_Pack_Amortization_Proof_Closure\run_summary.json) + +## 5. Что считается закрытием family + +Family считается закрытой не по одному ответу, а только при выполнении всего контракта: + +- оформлена family card; +- source coverage и ограничения зафиксированы; +- relation map собран и проверяем; +- live recipe воспроизводим; +- admissibility и answer/proof contract зафиксированы; +- regression-пакет проходит приемку; +- `false_grounded_answer_rate = 0`. + +## 6. Границы Stage 4 + +Это не Stage 5 и не новая архитектура: + +- без новых доменов; +- без graph/schema expansion; +- без Stage 5 как core path; +- без полного redesign. + +## 7. Execution-практика + +- планируем и исполняем работу family-pack'ами; +- после каждого прогона обязательны run-артефакты в `llm_normalizer/docs/runs`; +- фиксируем приемку на уровне family, а не единичного вопроса; +- сквозная навигация по family и run ведется в [STAGE_04_FAMILY_BACKLOG_2026-03-29.md](X:\1C\NDC_1C\docs\accounting-assistant\accounting-assistant\03_execution\STAGE_04_FAMILY_BACKLOG_2026-03-29.md). diff --git a/docs/accounting-assistant/accounting-assistant/03_execution/FAMILY_CARD_TEMPLATE.md b/docs/accounting-assistant/accounting-assistant/03_execution/FAMILY_CARD_TEMPLATE.md new file mode 100644 index 0000000..6a9c6b4 --- /dev/null +++ b/docs/accounting-assistant/accounting-assistant/03_execution/FAMILY_CARD_TEMPLATE.md @@ -0,0 +1,159 @@ +# FAMILY_CARD_TEMPLATE (runtime-aligned) + +**document_status:** `ACTIVE` +**template_scope:** `Stage 4 (P0-only)` +**execution_unit:** `family pack` + +## 0) Header (обязательные метаданные family) + +- `family_name`: +- `family_id`: +- `stage_scope`: +- `current_family_status`: `accepted` / `accepted_with_limitations` / `not_accepted` +- `primary_gap`: +- `latest_pack`: +- `next_pack_focus`: +- `family_source_of_truth_questions`: +- `family_latest_live_replay`: +- `family_latest_acceptance_run`: + +## 1) Что фиксирует документ + +- Зачем карточка нужна для этой family. +- Почему карточка делится на: +- `Runtime V1 (as-is)` — только подтвержденный факт по коду/артефактам; +- `Target V2 (planned)` — план следующего доведения. + +## 2) Runtime V1 (фактический контракт) + +### 2.1 Claim contract (as-is) + +- `primary_claim_type`: +- `additional_claim_types` (если уже first-class в runtime): +- `claim_boundaries` (что не входит в Stage 4): + +### 2.2 Required anchors (runtime-enforced) + +- Какие anchors обязательны именно сейчас. +- Какие reason codes использует runtime при нехватке anchors. + +### 2.3 Claim-bound live recipe (runtime-enforced) + +- Список обязательных live/MCP call id. +- Что каждый шаг должен подтверждать. +- Что считается успешным live hit. + +### 2.4 Route behavior (as-is) + +- Как runtime принудительно удерживает route для family. +- Какой no-route recovery используется. +- Какие debug audit-поля экспортируются. + +### 2.5 Evidence / admissibility behavior (as-is) + +- Какие правила admissibility реально применяются. +- Какие baseline reject reasons наблюдались до последнего пакета. +- Что уже исправлено на materialization уровне. + +### 2.6 Runtime acceptance snapshot + +- `*_FIXED` / `NOT_FIXED` статусы из последнего run. +- Краткий verdict latest pack. + +### 2.7 known_runtime_limits (as-is) + +- `source coverage` ограничения. +- Возможные scope/route inconsistency в живых трассах. +- Краевые риски по anchor quality / mapping. + +## 3) Target V2 (planned, не критерий текущей приемки) + +### 3.1 Planned claim extension + +- Какие дополнительные claim types хотим сделать first-class. + +### 3.2 Planned anchor extension + +- Какие anchors добавятся как обязательные для зрелой версии family. + +### 3.3 Planned family metrics + +- Набор целевых метрик family. +- Отдельно пометить, какие уже есть в harness, а какие пока target-only. + +## 4) Required entities and relations (business contract) + +### 4.1 Минимально необходимые сущности в 1C + +- Набор сущностей, без которых proof closure невозможен. +- Что optional enrichment. + +### 4.2 Критические relation links + +- Минимальная цепочка source-to-proof связей. +- Какие связи должны быть прямыми, какие допускаются косвенными. + +## 5) Snapshot/Live coverage verdict + +- Что покрывает snapshot-only. +- Что требует live. +- Итог: `snapshot_only_sufficient` / `snapshot_plus_live_required` / `live_primary_required`. + +## 6) Answer/proof modes contract + +### `grounded_positive` + +- Условия допуска. +- Что обязательно должно быть в ответе. +- Короткий пример `grounded_positive`. + +### `limited_or_insufficient_evidence` + +- Условия, когда обязательно остаемся в limited mode. +- Что обязательно должно быть явно обозначено (missing link/ограничение). +- Короткий пример `limited`. + +### Запрещенные паттерны + +- Какие формулировки считаются недопустимыми. +- Короткий антипример запрещенного ответа. + +## 7) Gap register (family) + +Использовать таблицу: + +| gap_id | category | severity | current_state | note | +| --- | --- | --- | --- | --- | +| FAM-G1 | `...` | blocker/high/medium | open/partial/closed | ... | + +Рекомендуемые категории: + +- `missing_source_data` +- `source_not_connected_to_runtime` +- `wrong_route_selection` +- `wrong_entity_mapping` +- `wrong_live_call_target` +- `evidence_not_materialized` +- `admissibility_reject_not_due_to_data` +- `answer_layer_underuses_available_evidence` + +## 8) Code-path inventory (где живет контракт) + +- Модули normalizer/router/claim-bound/evidence/admissibility/answer. +- Ключевые файлы runtime. +- Папка run-артефактов, на которую опирается статус family. + +## 9) Regression set and acceptance policy + +- Обязательные контрольные вопросы для этой family. +- Набор формулировочных вариаций. +- Правило: после каждого family pack обязателен run folder в `llm_normalizer/docs/runs`. +- Правило: приемка фиксируется на уровне family, не на уровне одного удачного ответа. +- Правило: `false_grounded_answer_rate` должен оставаться нулевым. + +## 10) Project decision line (для этой family) + +- Одна короткая строка в проектном стиле: +- текущий статус family; +- главный незакрытый узел; +- что является условием перехода в fully accepted. diff --git a/docs/accounting-assistant/accounting-assistant/03_execution/STAGE_04_DECISION_NOTE_FAMILY_BASED_EXECUTION.md b/docs/accounting-assistant/accounting-assistant/03_execution/STAGE_04_DECISION_NOTE_FAMILY_BASED_EXECUTION.md new file mode 100644 index 0000000..8f9c7d5 --- /dev/null +++ b/docs/accounting-assistant/accounting-assistant/03_execution/STAGE_04_DECISION_NOTE_FAMILY_BASED_EXECUTION.md @@ -0,0 +1,70 @@ +# STAGE_04_DECISION_NOTE_FAMILY_BASED_EXECUTION + +Дата: `2026-03-29` +Статус: `DECISION_APPROVED` +Область: `Stage 4 (P0-only)` + +## Почему принято решение + +Stage 4 дошел до состояния, где вопрос-by-вопрос режим уже неуправляем: + +- повторяются однотипные доменные поломки; +- стоимость точечной отладки растет; +- приемка становится хрупкой. + +## Что меняется официально + +- единица анализа: `question family`; +- единица реализации: `family pack`; +- единица приемки: `family acceptance`. + +## Что не меняется + +- Stage 4 остается Stage 4; +- границы `P0-only` сохраняются; +- без новых доменов и без Stage 5 как core path. + +## Активные family в проекте + +1. VAT chain +- Card: [Stage 4 - Family Card v1 — VAT chain.md](X:\1C\NDC_1C\IN\Stage 4 - Family Card v1 — VAT chain.md) + +2. RBP tail +- Card: [Stage 4 - Family Card v1 RBP.md](X:\1C\NDC_1C\IN\Stage 4 - Family Card v1 RBP.md) + +3. FA amortization coverage +- Card: [Stage 4 - Family Card v1 FA.md](X:\1C\NDC_1C\IN\Stage 4 - Family Card v1 FA.md) + +Общий реестр и run-навигация: +[STAGE_04_FAMILY_BACKLOG_2026-03-29.md](X:\1C\NDC_1C\docs\accounting-assistant\accounting-assistant\03_execution\STAGE_04_FAMILY_BACKLOG_2026-03-29.md) + +## Контрольные lane (не first-class family) + +В Stage 4 используются контрольные lane для route/purity regression, но они не переводятся в активные family автоматически: + +- `settlements_60_62` (control lane) +- `month_close_indirect_costs` (control/sanity lane) + +Назначение control lanes: + +- проверка family isolation и wrong-route leakage; +- проверка domain purity и live recipe binding на смежных формулировках; +- защита от регрессий между core families. + +## Правило внедрения (управление vs исполнение) + +- Внедрение в проектный контур: **сразу все 3 family**. +- Исполнение технических паков: **по одной family за раз**, с обязательным регрессом на остальные 2. +- Контрольные lane обязательны в regression-наборе, но не считаются отдельной единицей family acceptance. + +Это дает: + +- единый язык управления Stage 4; +- устойчивый технический темп без расползания контекста; +- быструю локализацию регрессий. + +## Официальная формулировка + +`Stage 4 officially transitions from question-by-question debugging to family-based execution over source-to-proof contracts for P0 accounting domains.` + +`Этап 4 официально переводится из режима точечной отладки отдельных вопросов в режим поочередного закрытия семейств бухгалтерских вопросов через source-to-proof контракты.` diff --git a/docs/accounting-assistant/accounting-assistant/03_execution/STAGE_04_FAMILY_BACKLOG_2026-03-29.md b/docs/accounting-assistant/accounting-assistant/03_execution/STAGE_04_FAMILY_BACKLOG_2026-03-29.md new file mode 100644 index 0000000..fe4e386 --- /dev/null +++ b/docs/accounting-assistant/accounting-assistant/03_execution/STAGE_04_FAMILY_BACKLOG_2026-03-29.md @@ -0,0 +1,105 @@ +# STAGE_04_FAMILY_BACKLOG_2026-03-29 + +Статус: `WORKING_BACKLOG` +Режим: `Stage 4 (P0-only)` +Единица исполнения: `family pack` + +## Контур + +Этот backlog фиксирует Stage 4 не по отдельным вопросам, а по семействам с source-to-proof контрактом. + +В этом backlog: + +- `core families` = VAT / RBP / FA; +- `control lanes` = settlements_60_62 / month_close_indirect_costs (только для regression/sanity, не как отдельные family acceptance). + +## Навигация + +- Family registry: [STAGE_04_FAMILY_REGISTRY_2026-03-29.json](X:\1C\NDC_1C\docs\accounting-assistant\accounting-assistant\03_execution\STAGE_04_FAMILY_REGISTRY_2026-03-29.json) +- VAT family card: [Stage 4 - Family Card v1 — VAT chain.md](X:\1C\NDC_1C\IN\Stage 4 - Family Card v1 — VAT chain.md) +- VAT latest run: [run_summary.json](X:\1C\NDC_1C\llm_normalizer\docs\runs\2026-03-29_Stage_04_Wave_19_2_Live_Runtime_Fix_Replay_1txt\run_summary.json) +- RBP family card: [Stage 4 - Family Card v1 RBP.md](X:\1C\NDC_1C\IN\Stage 4 - Family Card v1 RBP.md) +- RBP latest run: [run_summary.json](X:\1C\NDC_1C\llm_normalizer\docs\runs\2026-03-29_Stage_04_RBP_Pack_Live_Source_To_Proof_Fix\run_summary.json) +- FA family card: [Stage 4 - Family Card v1 FA.md](X:\1C\NDC_1C\IN\Stage 4 - Family Card v1 FA.md) +- FA latest acceptance run: [run_summary.json](X:\1C\NDC_1C\llm_normalizer\docs\runs\2026-03-29_Stage_04_FA_Pack_Amortization_Proof_Closure\run_summary.json) +- FA latest live replay: [fa_live_raw.json](X:\1C\NDC_1C\llm_normalizer\docs\runs\2026-03-29_Stage_04_FA_Pack_Amortization_Proof_Closure_live_attempt\fa_live_raw.json) + +## Control lanes (regression only) + +1. `settlements_60_62` +- Назначение: ловить wrong-claim leakage (settlement -> VAT/FA) и polarity regression. +- Статус в Stage 4: `CONTROL_LANE_ONLY`. + +2. `month_close_indirect_costs` +- Назначение: sanity-check для period-close вопросов и cross-family contamination. +- Статус в Stage 4: `CONTROL_LANE_ONLY`. + +## Family 1 - НДС-цепочка (VAT chain) + +- `current_status`: `PARTIALLY_WORKING / NON-BLOCKER` +- `primary_gap`: residual admissibility/materialization quality (account scope mismatch, weak mapping noise) +- `latest_pack`: `2026-03-29_Stage_04_Wave_19_2_Live_Runtime_Fix_Replay_1txt` +- `next_pack`: targeted live narrowing + reject cleanup для VAT proof-path +- `acceptance_target`: устойчивый grounded-positive на VAT-вариациях при `false_grounded = 0` +- `family_card`: [Stage 4 - Family Card v1 — VAT chain.md](X:\1C\NDC_1C\IN\Stage 4 - Family Card v1 — VAT chain.md) +- `latest_acceptance_run`: [run_summary.json](X:\1C\NDC_1C\llm_normalizer\docs\runs\2026-03-29_Stage_04_Wave_19_2_Live_Runtime_Fix_Replay_1txt\run_summary.json) +- `latest_live_replay`: [1_live_replay.txt](X:\1C\NDC_1C\llm_normalizer\docs\runs\2026-03-29_Stage_04_Wave_19_2_Live_Runtime_Fix_Replay_1txt\1_live_replay.txt) + +Что уже работает: +- positive path по VAT подтвержден в replay. +- temporal/company-scope для live-кейсов стабилизирован в рамках Wave 19.2. + +Что дочищаем: +- снижение inadmissible residual noise; +- повышение стабильности admissibility на смежных формулировках. + +## Family 2 - РБП (RBP tail / write-off overstay) + +- `current_status`: `ACCEPTED_WITH_LIMITATIONS` +- `primary_gap`: source coverage (данные/источники для полного object-level proof) +- `latest_pack`: `2026-03-29_Stage_04_RBP_Pack_Live_Source_To_Proof_Fix` +- `next_pack`: source coverage recovery + route tightening для полного claim closure +- `acceptance_target`: non-zero admissible evidence + mechanism-specific вывод на core RBP вариациях +- `family_card`: [Stage 4 - Family Card v1 RBP.md](X:\1C\NDC_1C\IN\Stage 4 - Family Card v1 RBP.md) +- `latest_acceptance_run`: [run_summary.json](X:\1C\NDC_1C\llm_normalizer\docs\runs\2026-03-29_Stage_04_RBP_Pack_Live_Source_To_Proof_Fix\run_summary.json) +- `latest_live_replay`: [1.txt](X:\1C\NDC_1C\llm_normalizer\docs\runs\2026-03-29_Stage_04_RBP_Pack_Live_Source_To_Proof_Fix\1.txt) + +Что уже работает: +- live route и evidence materialization подняты (`FIXED`). + +Что не закрыто: +- source coverage остается `NOT_FIXED`, поэтому часть кейсов ограничивается честно, но без полного proof closure. + +## Family 3 - Амортизация ОС (FA amortization coverage) + +- `current_status`: `PROOF_PATH_RAISED, LIVE_ACCEPTANCE_PENDING` +- `primary_gap`: object-level relation clarity в live + production live acceptance +- `latest_pack`: `2026-03-29_Stage_04_FA_Pack_Amortization_Proof_Closure` +- `next_pack`: live replay acceptance + relation/anchor consistency на вариациях +- `acceptance_target`: доказуемая полнота/неполнота охвата ОС с явным expected vs actual set и `false_grounded = 0` +- `family_card`: [Stage 4 - Family Card v1 FA.md](X:\1C\NDC_1C\IN\Stage 4 - Family Card v1 FA.md) +- `latest_acceptance_run`: [run_summary.json](X:\1C\NDC_1C\llm_normalizer\docs\runs\2026-03-29_Stage_04_FA_Pack_Amortization_Proof_Closure\run_summary.json) +- `latest_live_replay`: [fa_live_raw.json](X:\1C\NDC_1C\llm_normalizer\docs\runs\2026-03-29_Stage_04_FA_Pack_Amortization_Proof_Closure_live_attempt\fa_live_raw.json) + +Что уже работает: +- claim-bound FA path, targeted checks, expected/actual set и relation-map вынесены в артефакты. +- локальный pack достиг `FA_PACK_ACCEPTED` в controlled mock replay. + +Что остается: +- формальная live приемка family pack в рабочем канале (текущий live attempt: `http_status=400`). + +## Сводная таблица family-level исполнения + +| Family | Current status | Family card | Latest acceptance run | Latest live replay | Primary gap | Next pack focus | +| --- | --- | --- | --- | --- | --- | --- | +| VAT chain | partially working | [VAT card](X:\1C\NDC_1C\IN\Stage 4 - Family Card v1 — VAT chain.md) | [run_summary.json](X:\1C\NDC_1C\llm_normalizer\docs\runs\2026-03-29_Stage_04_Wave_19_2_Live_Runtime_Fix_Replay_1txt\run_summary.json) | [1_live_replay.txt](X:\1C\NDC_1C\llm_normalizer\docs\runs\2026-03-29_Stage_04_Wave_19_2_Live_Runtime_Fix_Replay_1txt\1_live_replay.txt) | admissibility residual noise | live narrowing + reject cleanup | +| RBP tail | accepted with limitations | [RBP card](X:\1C\NDC_1C\IN\Stage 4 - Family Card v1 RBP.md) | [run_summary.json](X:\1C\NDC_1C\llm_normalizer\docs\runs\2026-03-29_Stage_04_RBP_Pack_Live_Source_To_Proof_Fix\run_summary.json) | [1.txt](X:\1C\NDC_1C\llm_normalizer\docs\runs\2026-03-29_Stage_04_RBP_Pack_Live_Source_To_Proof_Fix\1.txt) | source coverage | source recovery + route tightening | +| FA amortization | proof path raised, live pending | [FA card](X:\1C\NDC_1C\IN\Stage 4 - Family Card v1 FA.md) | [run_summary.json](X:\1C\NDC_1C\llm_normalizer\docs\runs\2026-03-29_Stage_04_FA_Pack_Amortization_Proof_Closure\run_summary.json) | [fa_live_raw.json](X:\1C\NDC_1C\llm_normalizer\docs\runs\2026-03-29_Stage_04_FA_Pack_Amortization_Proof_Closure_live_attempt\fa_live_raw.json) | live object-level closure | live replay acceptance + relation consistency | + +## Правило исполнения (обязательно) + +1. Новые задачи Stage 4 заводятся как family packs, не как одиночные вопросы. +2. После каждого прогона обязательны run-артефакты в `llm_normalizer/docs/runs`. +3. Приемка фиксируется на уровне family acceptance, а не по одному удачному ответу. +4. Для каждой family в backlog обязательно должны быть заполнены: `family_card`, `latest_acceptance_run`, `latest_live_replay`. +5. Control lanes обязательны в regression-наборе каждого pack, но не повышаются в first-class family без отдельного проектного решения. diff --git a/docs/accounting-assistant/accounting-assistant/03_execution/STAGE_04_FAMILY_REGISTRY_2026-03-29.json b/docs/accounting-assistant/accounting-assistant/03_execution/STAGE_04_FAMILY_REGISTRY_2026-03-29.json new file mode 100644 index 0000000..426bda7 --- /dev/null +++ b/docs/accounting-assistant/accounting-assistant/03_execution/STAGE_04_FAMILY_REGISTRY_2026-03-29.json @@ -0,0 +1,44 @@ +{ + "schema_version": "stage4_family_registry_v1", + "updated_at": "2026-03-29", + "stage_scope": "Stage 4 (P0-only)", + "execution_unit": "family_pack", + "acceptance_unit": "family_acceptance", + "families": [ + { + "family_id": "VAT_CHAIN_COMPLETENESS_V1", + "family_name": "VAT chain", + "status": "PARTIALLY_WORKING_NON_BLOCKER", + "family_card": "X:/1C/NDC_1C/IN/Stage 4 - Family Card v1 — VAT chain.md", + "latest_pack": "2026-03-29_Stage_04_Wave_19_2_Live_Runtime_Fix_Replay_1txt", + "latest_acceptance_run": "X:/1C/NDC_1C/llm_normalizer/docs/runs/2026-03-29_Stage_04_Wave_19_2_Live_Runtime_Fix_Replay_1txt/run_summary.json", + "latest_live_replay": "X:/1C/NDC_1C/llm_normalizer/docs/runs/2026-03-29_Stage_04_Wave_19_2_Live_Runtime_Fix_Replay_1txt/1_live_replay.txt", + "primary_gap": "residual_admissibility_materialization_quality" + }, + { + "family_id": "RBP_TAIL_WRITEOFF_OVERSTAY_V1", + "family_name": "RBP tail", + "status": "ACCEPTED_WITH_LIMITATIONS", + "family_card": "X:/1C/NDC_1C/IN/Stage 4 - Family Card v1 RBP.md", + "latest_pack": "2026-03-29_Stage_04_RBP_Pack_Live_Source_To_Proof_Fix", + "latest_acceptance_run": "X:/1C/NDC_1C/llm_normalizer/docs/runs/2026-03-29_Stage_04_RBP_Pack_Live_Source_To_Proof_Fix/run_summary.json", + "latest_live_replay": "X:/1C/NDC_1C/llm_normalizer/docs/runs/2026-03-29_Stage_04_RBP_Pack_Live_Source_To_Proof_Fix/1.txt", + "primary_gap": "source_coverage" + }, + { + "family_id": "FA_AMORTIZATION_COVERAGE_V1", + "family_name": "FA amortization coverage", + "status": "PROOF_PATH_RAISED_LIVE_ACCEPTANCE_PENDING", + "family_card": "X:/1C/NDC_1C/IN/Stage 4 - Family Card v1 FA.md", + "latest_pack": "2026-03-29_Stage_04_FA_Pack_Amortization_Proof_Closure", + "latest_acceptance_run": "X:/1C/NDC_1C/llm_normalizer/docs/runs/2026-03-29_Stage_04_FA_Pack_Amortization_Proof_Closure/run_summary.json", + "latest_live_replay": "X:/1C/NDC_1C/llm_normalizer/docs/runs/2026-03-29_Stage_04_FA_Pack_Amortization_Proof_Closure_live_attempt/fa_live_raw.json", + "primary_gap": "live_object_level_relation_clarity_and_live_acceptance" + } + ], + "rollout_policy": { + "project_adoption": "all_three_families_immediately", + "technical_execution": "one_family_per_pack_with_full_cross_family_regression", + "hard_rule": "false_grounded_answer_rate_must_remain_zero" + } +} diff --git a/llm_normalizer/backend/dist/services/assistantClaimBoundEvidence.js b/llm_normalizer/backend/dist/services/assistantClaimBoundEvidence.js index 3c3908e..b77f772 100644 --- a/llm_normalizer/backend/dist/services/assistantClaimBoundEvidence.js +++ b/llm_normalizer/backend/dist/services/assistantClaimBoundEvidence.js @@ -57,32 +57,87 @@ function shiftDays(iso, deltaDays) { date.setUTCDate(date.getUTCDate() + deltaDays); return formatDate(date); } +function accountPrefix(value) { + const token = String(value ?? "").trim(); + const match = token.match(/^(\d{2})/); + return match ? match[1] : null; +} +function accountPrefixesFromAnchors(anchors) { + const prefixes = new Set(); + const accounts = Array.isArray(anchors?.accounts) ? anchors.accounts : []; + for (const item of accounts) { + const prefix = accountPrefix(String(item ?? "")); + if (prefix) { + prefixes.add(prefix); + } + } + return prefixes; +} function inferClaimType(input) { const lower = String(input.userMessage ?? "").toLowerCase(); - const isVat = input.focusDomainHint === "vat_document_register_book" || - /(?:\bvat\b|ндс|invoice|счет[- ]фактур|register|книга покупок|книга продаж)/i.test(lower); - if (isVat) { + const accountPrefixes = accountPrefixesFromAnchors(input.companyAnchors); + const hasSettlementAccount = ["51", "60", "62", "76"].some((item) => accountPrefixes.has(item)); + const hasVatAccount = ["19", "68"].some((item) => accountPrefixes.has(item)); + const hasFixedAssetAccount = ["01", "02", "08"].some((item) => accountPrefixes.has(item)); + const hasRbpAccount = accountPrefixes.has("97"); + const hasMonthCloseAccount = ["20", "21", "23", "25", "26", "28", "29", "44"].some((item) => accountPrefixes.has(item)); + const hasAdvanceSignal = /(?:advance|аванс|offset|зач[её]т|62\.02|60\.02)/i.test(lower); + const hasSettlementLexical = /(?:долг|аванс|зач[её]т|взаимозач|расч[её]т|оплат|плате[жж]|платёж|постав|покупател|settlement|payment|supplier|customer)/i.test(lower); + const hasVatLexical = /(?:\bvat\b|ндс|invoice|сч[её]т[- ]?фактур|register|книга\s+покупок|книга\s+продаж|книг[аи]\s+(?:покуп|продаж))/i.test(lower); + const hasFixedAssetLexical = /(?:depreciat|amortization|fixed\s*asset|амортиз|основн(?:ые|ых)?\s+сред|объект\s+ос|сч[её]т\s*0[128]|account\s*0[128])/i.test(lower); + const hasRbpLexical = /(?:\brbp\b|рбп|deferred\s*expense|writeoff|расходы\s+будущих\s+периодов|списани[ея]\s+рбп|account\s*97|сч[её]т\s*97)/i.test(lower); + const hasMonthCloseLexical = /(?:month[- ]?close|закрыт|закрытие\s+месяца|косвен|account\s*20|account\s*44|сч[её]т\s*20|сч[её]т\s*44|распределен|period\s*close)/i.test(lower); + if (input.focusDomainHint === "settlements_60_62") { + return hasAdvanceSignal ? "prove_advance_offset_state" : "prove_settlement_closure_state"; + } + if (input.focusDomainHint === "vat_document_register_book") { return "prove_vat_chain_completeness"; } - const isRbp = /(?:\brbp\b|рбп|account\s*97|счет\s*97|deferred expense|writeoff)/i.test(lower); - if (isRbp) { - return "prove_rbp_tail_state"; + if (input.focusDomainHint === "fixed_asset_amortization") { + return "prove_fixed_asset_amortization_coverage"; } - const isMonthClose = input.focusDomainHint === "month_close_costs_20_44" || - /(?:month[- ]?close|закрыт|косвен|account\s*20|account\s*44|счет\s*20|счет\s*44)/i.test(lower); - if (isMonthClose) { + if (input.focusDomainHint === "month_close_costs_20_44") { + if (hasRbpLexical || hasRbpAccount) { + return "prove_rbp_tail_state"; + } return "prove_month_close_state"; } - const isAdvance = /(?:advance|аванс|offset|зачет|62\.02|60\.02)/i.test(lower); - if (isAdvance) { + const settlementPriority = (hasSettlementLexical || hasSettlementAccount || hasAdvanceSignal) && !hasVatLexical && !hasFixedAssetLexical; + const broadMonthClosePriority = (hasMonthCloseLexical || hasMonthCloseAccount) && + !hasVatLexical && + !hasVatAccount && + !hasFixedAssetLexical && + !hasFixedAssetAccount; + if (hasAdvanceSignal && settlementPriority) { return "prove_advance_offset_state"; } + if (settlementPriority) { + return "prove_settlement_closure_state"; + } + if (hasVatLexical || (hasVatAccount && !settlementPriority)) { + return "prove_vat_chain_completeness"; + } + if (broadMonthClosePriority) { + return hasRbpLexical || hasRbpAccount ? "prove_rbp_tail_state" : "prove_month_close_state"; + } + if (hasFixedAssetLexical || (hasFixedAssetAccount && !settlementPriority && !hasVatLexical)) { + return "prove_fixed_asset_amortization_coverage"; + } + if (hasRbpLexical || hasRbpAccount) { + return "prove_rbp_tail_state"; + } + if (hasMonthCloseLexical || hasMonthCloseAccount) { + return "prove_month_close_state"; + } + if (hasSettlementLexical || hasSettlementAccount) { + return "prove_settlement_closure_state"; + } return "prove_settlement_closure_state"; } function inferCounterpartyScope(message) { const lower = message.toLowerCase(); const out = []; - if (/(?:supplier|vendor|поставщик)/i.test(lower)) + if (/(?:supplier|vendor|поставщик|кредитор)/i.test(lower)) out.push("supplier"); if (/(?:customer|buyer|покупатель|дебитор)/i.test(lower)) out.push("customer"); @@ -91,13 +146,37 @@ function inferCounterpartyScope(message) { function detectSignals(message) { const lower = message.toLowerCase(); return { - hasAdvance: /(?:advance|аванс|offset|зачет|62\.02|60\.02)/i.test(lower), - hasClosure: /(?:close|closure|закрыт|хвост|tail|reconcile|зачет)/i.test(lower), - hasVat: /(?:\bvat\b|ндс|счет[- ]фактур|invoice|книга покупок|книга продаж|register)/i.test(lower), - hasMonthClose: /(?:month[- ]?close|закрытие месяца|косвен|20\/44|account 20|account 44|счет 20|счет 44)/i.test(lower), - hasRbp: /(?:\brbp\b|рбп|account 97|счет 97|writeoff|списани)/i.test(lower) + hasAdvance: /(?:advance|аванс|offset|зач[её]т|62\.02|60\.02)/i.test(lower), + hasClosure: /(?:close|closure|закрыт|хвост|tail|reconcile|зач[её]т)/i.test(lower), + hasVat: /(?:\bvat\b|ндс|сч[её]т[- ]?фактур|invoice|книга\s+покупок|книга\s+продаж|register)/i.test(lower), + hasMonthClose: /(?:month[- ]?close|закрытие\s+месяца|косвен|20\/44|account 20|account 44|сч[её]т 20|сч[её]т 44)/i.test(lower), + hasRbp: /(?:\brbp\b|рбп|account 97|сч[её]т 97|writeoff|списани)/i.test(lower), + hasFixedAsset: /(?:depreciat|amortization|fixed\s*asset|амортиз|основн(?:ые|ых)?\s+сред|объект\s+ос|сч[её]т\s*0[128]|account\s*0[128])/i.test(lower) }; } +function resolveSettlementRole(input) { + if (input.claimType !== "prove_settlement_closure_state" && input.claimType !== "prove_advance_offset_state") { + return undefined; + } + const scopes = new Set(input.counterpartyScope.map((item) => String(item ?? "").trim().toLowerCase())); + const lower = String(input.userMessage ?? "").toLowerCase(); + const hasSupplierLexical = /(?:supplier|vendor|поставщ|кредитор|обязательств|payable)/i.test(lower); + const hasCustomerLexical = /(?:customer|buyer|покупат|дебитор|receivable)/i.test(lower); + const hasSupplierAccount = input.accountPrefixes.has("60"); + const hasCustomerAccount = input.accountPrefixes.has("62"); + const supplierSignal = scopes.has("supplier") || hasSupplierLexical || (hasSupplierAccount && !hasCustomerAccount); + const customerSignal = scopes.has("customer") || hasCustomerLexical || (hasCustomerAccount && !hasSupplierAccount); + if (supplierSignal && !customerSignal) { + return "supplier"; + } + if (customerSignal && !supplierSignal) { + return "customer"; + } + if (supplierSignal && customerSignal) { + return "mixed"; + } + return "unknown"; +} function mergeAnchors(anchors, key) { return uniqueStrings(Array.isArray(anchors?.[key]) ? anchors?.[key] : []); } @@ -131,6 +210,22 @@ function missingFromRequired(required, resolved) { } continue; } + if (anchor === "amount_or_document") { + const hasAmount = (resolved.amounts?.length ?? 0) > 0; + const hasDoc = (resolved.document_numbers?.length ?? 0) > 0 || (resolved.document_types?.length ?? 0) > 0; + if (!hasAmount && !hasDoc) { + missing.push(anchor); + } + continue; + } + if (anchor === "account_scope_or_document_type") { + const hasAccount = (resolved.account_scope?.length ?? 0) > 0; + const hasDocType = (resolved.document_types?.length ?? 0) > 0; + if (!hasAccount && !hasDocType) { + missing.push(anchor); + } + continue; + } if ((resolved[anchor]?.length ?? 0) <= 0) { missing.push(anchor); } @@ -140,9 +235,27 @@ function missingFromRequired(required, resolved) { function resolveClaimBoundAnchors(input) { const claimType = inferClaimType({ userMessage: input.userMessage, - focusDomainHint: input.focusDomainHint + focusDomainHint: input.focusDomainHint, + companyAnchors: input.companyAnchors }); const signals = detectSignals(input.userMessage); + const accountPrefixes = accountPrefixesFromAnchors(input.companyAnchors); + const includeVatAnchors = claimType === "prove_vat_chain_completeness"; + const includeMonthCloseAnchors = claimType === "prove_month_close_state"; + const includeRbpAnchors = claimType === "prove_rbp_tail_state"; + const includeFixedAssetAnchors = claimType === "prove_fixed_asset_amortization_coverage"; + const hasVatSignal = signals.hasVat || accountPrefixes.has("19") || accountPrefixes.has("68"); + const hasRbpSignal = signals.hasRbp || accountPrefixes.has("97"); + const hasFixedAssetSignal = signals.hasFixedAsset || accountPrefixes.has("01") || accountPrefixes.has("02") || accountPrefixes.has("08"); + const hasMonthCloseSignal = signals.hasMonthClose || + accountPrefixes.has("20") || + accountPrefixes.has("21") || + accountPrefixes.has("23") || + accountPrefixes.has("25") || + accountPrefixes.has("26") || + accountPrefixes.has("28") || + accountPrefixes.has("29") || + accountPrefixes.has("44"); const resolvedAnchors = { period: uniqueStrings([...mergeAnchors(input.companyAnchors, "periods"), ...mergeAnchors(input.companyAnchors, "dates")]), account_scope: mergeAnchors(input.companyAnchors, "accounts"), @@ -153,16 +266,26 @@ function resolveClaimBoundAnchors(input) { counterparty_scope: inferCounterpartyScope(input.userMessage), advance_signal: signals.hasAdvance ? ["advance"] : [], closure_signal: signals.hasClosure ? ["closure"] : [], - vat_signal: signals.hasVat ? ["vat"] : [], - chain_signal: signals.hasVat ? ["chain"] : [], - close_signal: signals.hasMonthClose ? ["month_close"] : [], + vat_signal: includeVatAnchors && hasVatSignal ? ["vat"] : [], + chain_signal: includeVatAnchors && hasVatSignal ? ["chain"] : [], + close_signal: includeMonthCloseAnchors && hasMonthCloseSignal ? ["month_close"] : [], cost_scope: [], - rbp_signal: signals.hasRbp ? ["rbp"] : [], - writeoff_signal: signals.hasRbp ? ["writeoff"] : [] + rbp_signal: includeRbpAnchors && hasRbpSignal ? ["rbp"] : [], + writeoff_signal: includeRbpAnchors && hasRbpSignal ? ["writeoff"] : [], + fixed_asset_signal: includeFixedAssetAnchors && hasFixedAssetSignal ? ["fixed_asset"] : [], + amortization_signal: includeFixedAssetAnchors && hasFixedAssetSignal ? ["amortization"] : [], + expected_fa_set: [], + actual_fa_set: [] }; - if (/(?:^|[^\d])(20|44)(?:[^\d]|$)/.test((resolvedAnchors.account_scope ?? []).join(" ")) || signals.hasMonthClose) { + if (includeMonthCloseAnchors && + (/(?:^|[^\d])(20|44)(?:[^\d]|$)/.test((resolvedAnchors.account_scope ?? []).join(" ")) || hasMonthCloseSignal)) { resolvedAnchors.cost_scope = ["20_44"]; } + // For FA amortization claims, document type is implicit in user intent + // even when the phrase does not carry explicit document keywords. + if (includeFixedAssetAnchors && hasFixedAssetSignal && (resolvedAnchors.document_types?.length ?? 0) <= 0) { + resolvedAnchors.document_types = ["amortization_document"]; + } if (input.primaryPeriod) { resolvedAnchors.period = uniqueStrings([...(resolvedAnchors.period ?? []), input.primaryPeriod.from, input.primaryPeriod.to]); } @@ -171,7 +294,14 @@ function resolveClaimBoundAnchors(input) { prove_advance_offset_state: ["period", "account_scope", "advance_signal", "settlement_object"], prove_vat_chain_completeness: ["period", "document_types", "vat_signal", "chain_signal"], prove_month_close_state: ["period", "close_signal", "cost_scope"], - prove_rbp_tail_state: ["period", "rbp_signal", "writeoff_signal"] + prove_rbp_tail_state: ["period", "rbp_signal", "writeoff_signal"], + prove_fixed_asset_amortization_coverage: [ + "period", + "fixed_asset_signal", + "amortization_signal", + "amount_or_document", + "account_scope_or_document_type" + ] }; const requiredAnchors = requiredByClaim[claimType]; const missingAnchors = missingFromRequired(requiredAnchors, resolvedAnchors); @@ -189,8 +319,19 @@ function resolveClaimBoundAnchors(input) { if (!allowedContextWindow && input.primaryPeriod) { reasonCodes.push("controlled_temporal_expansion_window_unavailable"); } + const settlementRole = resolveSettlementRole({ + claimType, + counterpartyScope: resolvedAnchors.counterparty_scope ?? [], + accountPrefixes, + userMessage: input.userMessage + }); + if ((claimType === "prove_settlement_closure_state" || claimType === "prove_advance_offset_state") && + (settlementRole === "mixed" || settlementRole === "unknown")) { + reasonCodes.push("unresolved_supplier_customer_polarity"); + } return { claim_type: claimType, + settlement_role: settlementRole, required_anchors: requiredAnchors, resolved_anchors: resolvedAnchors, missing_anchors: missingAnchors, @@ -217,7 +358,13 @@ function buildCorpusFromItem(item) { document_context: item.document_context, relation_pattern_hits: item.relation_pattern_hits, graph_domain_scope: item.graph_domain_scope, - lifecycle_markers: item.lifecycle_markers + lifecycle_markers: item.lifecycle_markers, + live_call_id: item.live_call_id, + live_call_purpose: item.live_call_purpose, + fa_object_hint: item.fa_object_hint, + fa_expected_set_candidate: item.fa_expected_set_candidate, + fa_actual_set_candidate: item.fa_actual_set_candidate, + fa_coverage_status: item.fa_coverage_status }).toLowerCase(); } function buildCorpusFromEvidence(evidence) { @@ -256,6 +403,16 @@ function requiredChecksByClaim(claimType) { if (claimType === "prove_month_close_state") { return ["close_operation_found", "distribution_step_found", "residual_tail_found"]; } + if (claimType === "prove_fixed_asset_amortization_coverage") { + return [ + "amortization_document_found", + "fixed_asset_object_identified", + "expected_fa_set_reconstructed", + "actual_fa_set_reconstructed", + "movement_or_posting_link_found", + "missing_fa_candidates_assessed" + ]; + } return [ "rbp_writeoff_document_found", "rbp_object_identified", @@ -273,21 +430,26 @@ function detectChecksForCorpus(corpus, claimType, anchors) { const hasSettlementAccount = /(?:\b60(?:\.\d{2})?\b|\b62(?:\.\d{2})?\b|payable|receivable|settlement)/i.test(corpus); const hasPosting = /(?:document_to_posting|posting|проводк)/i.test(corpus); const hasRegister = /(?:register|accumulationregister|accountingregister|регистр)/i.test(corpus); - const hasClose = /(?:close|closure|закрыт|reconcile|зачет|tail|хвост)/i.test(corpus); + const hasClose = /(?:close|closure|закрыт|reconcile|зач[её]т|tail|хвост)/i.test(corpus); const hasPayment = /(?:payment|оплат|списаниесрасчетногосчета|payment_order|bank_statement)/i.test(corpus); - const hasAdvance = /(?:advance|аванс|offset|зачет|62\.02|60\.02)/i.test(corpus); - const hasVat = /(?:\bvat\b|ндс|invoice_to_vat|счет[- ]фактур|invoice)/i.test(corpus); - const hasBook = /(?:книгипокупок|книгипродаж|book)/i.test(corpus); + const hasAdvance = /(?:advance|аванс|offset|зач[её]т|62\.02|60\.02)/i.test(corpus); + const hasVat = /(?:\bvat\b|ндс|invoice_to_vat|сч[её]т[- ]?фактур|invoice)/i.test(corpus); + const hasBook = /(?:книг[аи](?:\s+)?(?:покупок|продаж)|book)/i.test(corpus); const hasChain = /(?:chain|link|document_to_posting|invoice_to_vat|связ)/i.test(corpus); - const hasMonthClose = /(?:month[- ]?close|period_close|закрытие месяца|косвен|20|44)/i.test(corpus); + const hasMonthClose = /(?:month[- ]?close|period_close|закрытие\s+месяца|косвен|20|44)/i.test(corpus); const hasDistribution = /(?:distribution|распредел|writeoff|deferred_expense_to_writeoff)/i.test(corpus); - const hasRbp = /(?:\brbp\b|рбп|account\s*97|счет\s*97|deferred)/i.test(corpus); + const hasRbp = /(?:\brbp\b|рбп|account\s*97|сч[её]т\s*97|deferred)/i.test(corpus); const hasResidual = /(?:tail|остат|незакры|overdue|period_boundary|terminal_state_gap)/i.test(corpus); const hasContradiction = /(?:contradiction|invalid_transition|normal residual|нормальн)/i.test(corpus); const hasRbpWriteoffDoc = /(?:списани[ея]\s+рбп|rbp_writeoff|deferred_expense_document|writeoff document)/i.test(corpus); const hasRbpObject = /(?:rbp[_\s-]?object|объект\s+рбп|analytics|subkonto|расходыбудущихпериодов)/i.test(corpus); const hasMovement = /(?:movement|движен|хозрасчетный|document_to_posting|posting|проводк)/i.test(corpus); const hasPeriodEndResidual = /(?:period_boundary|end_period|2020-07-31|остат)/i.test(corpus); + const hasFixedAsset = /(?:fixed_asset|asset_card|объект\s+ос|основн(?:ые|ых)?\s+сред|depreciat|амортиз|account[:\s]*0[12]|\b0[12](?:\.\d{2})?\b)/i.test(corpus); + const hasAmortizationDoc = /(?:depreciat|amortization|начислен[а-я]*\s+амортиз|документ\s+амортиз)/i.test(corpus); + const hasExpectedFaSet = /(?:expected_fa_set|expected[_\s-]?set|find_fixed_asset_cards_expected_for_period|expected_set_seed|fa_expected_set_candidate)/i.test(corpus); + const hasActualFaSet = /(?:actual_fa_set|find_fixed_asset_movements_accounts_01_02|fa_actual_set_candidate|seed_amortization_documents|collect_fa_object_movements)/i.test(corpus); + const hasFaCoverageCompare = /(?:expected_vs_actual|compare_expected_vs_actual|missing_fa|coverage_compare|missing_fa_candidates)/i.test(corpus); if (claimType === "prove_settlement_closure_state") { if (hasPayment) checks.add("payment_document_found"); @@ -319,7 +481,7 @@ function detectChecksForCorpus(corpus, claimType, anchors) { else if (claimType === "prove_vat_chain_completeness") { if (/(?:document|receipt|realization|поступлен|реализац)/i.test(corpus)) checks.add("source_document_found"); - if (/(?:invoice|счет[- ]фактур)/i.test(corpus)) + if (/(?:invoice|сч[её]т[- ]?фактур)/i.test(corpus)) checks.add("invoice_found"); if (hasRegister || hasVat) checks.add("tax_register_entry_found"); @@ -336,6 +498,20 @@ function detectChecksForCorpus(corpus, claimType, anchors) { if (hasResidual) checks.add("residual_tail_found"); } + else if (claimType === "prove_fixed_asset_amortization_coverage") { + if (hasAmortizationDoc) + checks.add("amortization_document_found"); + if (hasFixedAsset) + checks.add("fixed_asset_object_identified"); + if (hasExpectedFaSet) + checks.add("expected_fa_set_reconstructed"); + if (hasActualFaSet || hasAmortizationDoc) + checks.add("actual_fa_set_reconstructed"); + if (hasMovement || hasPosting) + checks.add("movement_or_posting_link_found"); + if (hasFaCoverageCompare || (hasExpectedFaSet && hasActualFaSet)) + checks.add("missing_fa_candidates_assessed"); + } else { if (hasRbpWriteoffDoc || (hasRbp && hasDistribution)) checks.add("rbp_writeoff_document_found"); @@ -479,7 +655,11 @@ function buildDerivedEvidenceFromItem(input) { account_context: Array.isArray(input.item.account_context) ? input.item.account_context : [], account_debit: input.item.account_debit ?? null, account_credit: input.item.account_credit ?? null, - relation_pattern_hits: Array.isArray(input.item.relation_pattern_hits) ? input.item.relation_pattern_hits : [] + relation_pattern_hits: Array.isArray(input.item.relation_pattern_hits) ? input.item.relation_pattern_hits : [], + fa_object_hint: String(input.item.fa_object_hint ?? "").trim() || null, + fa_expected_set_candidate: Boolean(input.item.fa_expected_set_candidate), + fa_actual_set_candidate: Boolean(input.item.fa_actual_set_candidate), + fa_coverage_status: String(input.item.fa_coverage_status ?? "").trim() || null } }; } @@ -490,6 +670,149 @@ function buildClaimStatusTemplate(requiredChecks) { } return out; } +function normalizeFaObjectToken(value) { + const normalized = String(value ?? "") + .replace(/\s+/g, " ") + .trim(); + if (!normalized) { + return null; + } + if (/^live movement row #\d+$/i.test(normalized)) { + return null; + } + return normalized.slice(0, 140); +} +function periodFromEvidence(evidence) { + const payload = toObject(evidence.payload); + return (String(evidence.source_ref?.period ?? "").trim() || + String(evidence.pointer?.source?.period ?? "").trim() || + String(payload?.period ?? "").trim() || + null); +} +function collectFaCoverage(input) { + const state = new Map(); + const touch = (objectName) => { + const key = objectName.toLowerCase(); + const existing = state.get(key); + if (existing) { + return existing; + } + const created = { + expected: false, + actual: false, + movement: false, + posting: false, + docs: new Set(), + periods: new Set() + }; + state.set(key, created); + return created; + }; + for (const result of input.retrievalResults) { + const items = Array.isArray(result.items) ? result.items : []; + for (const item of items) { + const objectToken = normalizeFaObjectToken(String(item.fa_object_hint ?? item.display_name ?? item.source_id ?? "").trim()); + if (!objectToken) { + continue; + } + const slot = touch(objectToken); + if (Boolean(item.fa_expected_set_candidate)) { + slot.expected = true; + } + if (Boolean(item.fa_actual_set_candidate)) { + slot.actual = true; + } + const corpus = JSON.stringify(item).toLowerCase(); + if (/(?:movement|движен|хозрасчет|document_to_posting)/i.test(corpus)) { + slot.movement = true; + } + if (/(?:posting|проводк|account_)/i.test(corpus)) { + slot.posting = true; + } + const documentContext = Array.isArray(item.document_context) ? item.document_context : []; + for (const doc of documentContext) { + const token = String(doc ?? "").trim(); + if (token) { + slot.docs.add(token); + } + } + const period = String(item.period ?? item.Period ?? "").trim(); + if (period) { + slot.periods.add(period); + } + } + const evidence = Array.isArray(result.evidence) ? result.evidence : []; + for (const evidenceItem of evidence) { + const payload = toObject(evidenceItem.payload) ?? {}; + const objectToken = normalizeFaObjectToken(String(payload.fa_object_hint ?? evidenceItem.source_ref?.id ?? evidenceItem.pointer?.source?.id ?? "").trim()); + if (!objectToken) { + continue; + } + const slot = touch(objectToken); + if (Boolean(payload.fa_expected_set_candidate)) { + slot.expected = true; + } + if (Boolean(payload.fa_actual_set_candidate)) { + slot.actual = true; + } + const corpus = JSON.stringify({ + payload, + mechanism_note: evidenceItem.mechanism_note, + source_ref: evidenceItem.source_ref + }).toLowerCase(); + if (/(?:movement|движен|хозрасчет|document_to_posting)/i.test(corpus)) { + slot.movement = true; + } + if (/(?:posting|проводк|account_)/i.test(corpus)) { + slot.posting = true; + } + const documentContext = Array.isArray(payload.document_context) ? payload.document_context : []; + for (const doc of documentContext) { + const token = String(doc ?? "").trim(); + if (token) { + slot.docs.add(token); + } + } + const period = periodFromEvidence(evidenceItem); + if (period) { + slot.periods.add(period); + } + } + } + const entries = Array.from(state.entries()); + const expectedSet = entries + .filter(([, slot]) => slot.expected) + .map(([objectName]) => objectName) + .slice(0, 32); + const actualSet = entries + .filter(([, slot]) => slot.actual) + .map(([objectName]) => objectName) + .slice(0, 32); + const expectedResolved = expectedSet.length > 0 ? expectedSet : actualSet; + const missingCandidates = expectedResolved.filter((item) => !actualSet.includes(item)).slice(0, 32); + const uncertainCandidates = entries + .filter(([, slot]) => !slot.expected && !slot.actual) + .map(([objectName]) => objectName) + .slice(0, 32); + const relationMap = entries.slice(0, 48).map(([objectName, slot]) => { + const coverageStatus = slot.expected && slot.actual ? "covered" : slot.expected && !slot.actual ? "missing" : "uncertain"; + return { + fa_object: objectName, + document_amortization: Array.from(slot.docs).slice(0, 4), + movement: slot.movement, + posting: slot.posting, + period: Array.from(slot.periods).slice(0, 4), + coverage_status: coverageStatus + }; + }); + return { + expectedSet: expectedResolved, + actualSet, + missingCandidates, + uncertainCandidates, + relationMap + }; +} function applyTargetedEvidenceAcquisition(input) { const requiredChecks = requiredChecksByClaim(input.claimAudit.claim_type); const checkStatus = buildClaimStatusTemplate(requiredChecks); @@ -600,6 +923,19 @@ function applyTargetedEvidenceAcquisition(input) { if (targetedEvidenceHitRate < 0.8) { reasonCodes.push("targeted_evidence_hit_rate_low"); } + const faCoverage = input.claimAudit.claim_type === "prove_fixed_asset_amortization_coverage" + ? collectFaCoverage({ + retrievalResults: adjustedResults + }) + : null; + if (faCoverage) { + if (faCoverage.expectedSet.length <= 0) { + reasonCodes.push("fa_expected_set_not_reconstructed"); + } + if (faCoverage.actualSet.length <= 0) { + reasonCodes.push("fa_actual_set_not_reconstructed"); + } + } return { retrievalResults: adjustedResults, audit: { @@ -610,6 +946,15 @@ function applyTargetedEvidenceAcquisition(input) { targeted_evidence_hits: targetedEvidenceHits, targeted_evidence_hit_rate: targetedEvidenceHitRate, targeted_evidence_source_refs: Array.from(sourceRefs).slice(0, 24), + ...(faCoverage + ? { + fa_expected_set: faCoverage.expectedSet, + fa_actual_set_from_amortization: faCoverage.actualSet, + fa_missing_candidates: faCoverage.missingCandidates, + fa_uncertain_candidates: faCoverage.uncertainCandidates, + fa_relation_map: faCoverage.relationMap + } + : {}), reason_codes: uniqueStrings(reasonCodes) } }; diff --git a/llm_normalizer/backend/dist/services/assistantDataLayer.js b/llm_normalizer/backend/dist/services/assistantDataLayer.js index 58f96a1..0e3f99f 100644 --- a/llm_normalizer/backend/dist/services/assistantDataLayer.js +++ b/llm_normalizer/backend/dist/services/assistantDataLayer.js @@ -7,6 +7,7 @@ exports.AssistantDataLayer = void 0; const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); const config_1 = require("../config"); +const investigationState_1 = require("./investigationState"); const BROAD_GENERIC_MARKERS = new RegExp([ "\\boverall\\b", "\\bgeneral\\b", @@ -87,6 +88,20 @@ const RBP_REQUIRED_LIVE_CALLS = [ "find_month_close_entries_linked_to_rbp", "compute_end_period_residual_by_rbp_object" ]; +const VAT_REQUIRED_LIVE_CALLS = [ + "find_vat_source_documents_in_period", + "find_vat_invoice_links_in_period", + "find_vat_register_entries_in_period", + "find_vat_book_entries_in_period" +]; +const FA_REQUIRED_LIVE_CALLS = [ + "find_amortization_documents_in_period", + "find_fixed_asset_movements_accounts_01_02", + "find_fixed_asset_cards_expected_for_period", + "match_expected_vs_actual_fa_coverage" +]; +const CLAIM_BOUND_PRIMARY_LIVE_LIMIT = Math.max(config_1.ASSISTANT_MCP_LIVE_LIMIT, 96); +const CLAIM_BOUND_CARRY_WINDOW_LIVE_LIMIT = Math.max(config_1.ASSISTANT_MCP_LIVE_LIMIT, 128); function pushUniqueLine(target, line) { if (!target.includes(line)) { target.push(line); @@ -114,6 +129,12 @@ function parseFiniteNumber(value) { } return null; } +function resolveLiveCallLimit(limit) { + if (typeof limit === "number" && Number.isFinite(limit)) { + return Math.max(1, Math.trunc(limit)); + } + return config_1.ASSISTANT_MCP_LIVE_LIMIT; +} function formatIsoDateUtc(date) { const year = date.getUTCFullYear(); const month = String(date.getUTCMonth() + 1).padStart(2, "0"); @@ -174,9 +195,111 @@ function buildLiveRangeQuery(fromIso, toIso, limit) { function hasRbpSignal(text) { return /(?:\brbp\b|рбп|расходы\s+будущих\s+периодов|deferred|writeoff|списани[ея]\s+рбп|account\s*97|счет\s*97)/i.test(String(text ?? "").toLowerCase()); } +function hasFixedAssetAmortizationSignal(text) { + return /(?:амортиз|основн(?:ые|ых)?\s+сред|(?:^|[^a-zа-яё])ос(?:$|[^a-zа-яё])|depreciat|fixed\s*asset|account\s*0[12]|счет\s*0[12])/i.test(String(text ?? "").toLowerCase()); +} function buildLiveMcpCallPlan(route, fragmentText) { const semanticProfile = buildSemanticRetrievalProfile(fragmentText); - const rbpClaim = hasRbpSignal(fragmentText) || + const preferredDomainHint = (0, investigationState_1.inferP0DomainFromMessage)(fragmentText); + const periodScope = inferPeriodScope(fragmentText); + const primaryFrom = periodScope.from ?? "2020-07-01"; + const primaryTo = periodScope.to ?? monthEndFromIso(primaryFrom) ?? "2020-07-31"; + const carryFrom = shiftIsoDate(primaryFrom, -31) ?? primaryFrom; + const carryTo = shiftIsoDate(primaryTo, 31) ?? primaryTo; + const faClaim = preferredDomainHint === "fixed_asset_amortization" || + hasFixedAssetAmortizationSignal(fragmentText) || + semanticProfile.query_subject === "fixed_asset_card_mismatch" || + semanticProfile.domain_scope.includes("fixed_assets"); + if (faClaim) { + return { + claim_type: "prove_fixed_asset_amortization_coverage", + query_subject: "fixed_asset_amortization_coverage", + required_live_calls: [...FA_REQUIRED_LIVE_CALLS], + calls: [ + { + call_id: "find_amortization_documents_in_period", + purpose: "seed_amortization_documents", + query: buildLiveRangeQuery(primaryFrom, primaryTo, CLAIM_BOUND_PRIMARY_LIVE_LIMIT), + limit: CLAIM_BOUND_PRIMARY_LIVE_LIMIT, + required_for_claim: true, + account_scope_override: ["01", "02", "08"] + }, + { + call_id: "find_fixed_asset_movements_accounts_01_02", + purpose: "collect_fa_object_movements", + query: buildLiveRangeQuery(primaryFrom, primaryTo, CLAIM_BOUND_PRIMARY_LIVE_LIMIT), + limit: CLAIM_BOUND_PRIMARY_LIVE_LIMIT, + required_for_claim: true, + account_scope_override: ["01", "02", "08"] + }, + { + call_id: "find_fixed_asset_cards_expected_for_period", + purpose: "build_expected_fa_set", + query: buildLiveRangeQuery(carryFrom, primaryTo, CLAIM_BOUND_CARRY_WINDOW_LIVE_LIMIT), + limit: CLAIM_BOUND_CARRY_WINDOW_LIVE_LIMIT, + required_for_claim: true, + account_scope_override: ["01", "02", "08"] + }, + { + call_id: "match_expected_vs_actual_fa_coverage", + purpose: "compare_expected_vs_actual_fa_coverage", + query: buildLiveRangeQuery(carryFrom, carryTo, CLAIM_BOUND_CARRY_WINDOW_LIVE_LIMIT), + limit: CLAIM_BOUND_CARRY_WINDOW_LIVE_LIMIT, + required_for_claim: true, + account_scope_override: ["01", "02", "08"] + } + ], + route_gap_reason: null + }; + } + const vatClaim = preferredDomainHint === "vat_document_register_book" || + semanticProfile.query_subject === "vat_chain_conflict" || + semanticProfile.domain_scope.includes("vat") || + /(?:\bvat\b|ндс|invoice|счет[- ]фактур|книга покупок|книга продаж|register)/i.test(String(fragmentText ?? "").toLowerCase()); + if (vatClaim) { + return { + claim_type: "prove_vat_chain_completeness", + query_subject: "vat_chain_conflict", + required_live_calls: [...VAT_REQUIRED_LIVE_CALLS], + calls: [ + { + call_id: "find_vat_source_documents_in_period", + purpose: "seed_vat_source_documents", + query: buildLiveRangeQuery(primaryFrom, primaryTo, CLAIM_BOUND_PRIMARY_LIVE_LIMIT), + limit: CLAIM_BOUND_PRIMARY_LIVE_LIMIT, + required_for_claim: true, + account_scope_override: ["19", "68"] + }, + { + call_id: "find_vat_invoice_links_in_period", + purpose: "collect_invoice_links", + query: buildLiveRangeQuery(primaryFrom, primaryTo, CLAIM_BOUND_PRIMARY_LIVE_LIMIT), + limit: CLAIM_BOUND_PRIMARY_LIVE_LIMIT, + required_for_claim: true, + account_scope_override: ["19", "68"] + }, + { + call_id: "find_vat_register_entries_in_period", + purpose: "collect_vat_register_entries", + query: buildLiveRangeQuery(primaryFrom, primaryTo, CLAIM_BOUND_PRIMARY_LIVE_LIMIT), + limit: CLAIM_BOUND_PRIMARY_LIVE_LIMIT, + required_for_claim: true, + account_scope_override: ["19", "68"] + }, + { + call_id: "find_vat_book_entries_in_period", + purpose: "collect_vat_book_entries", + query: buildLiveRangeQuery(carryFrom, carryTo, CLAIM_BOUND_CARRY_WINDOW_LIVE_LIMIT), + limit: CLAIM_BOUND_CARRY_WINDOW_LIVE_LIMIT, + required_for_claim: true, + account_scope_override: ["19", "68"] + } + ], + route_gap_reason: null + }; + } + const rbpClaim = (preferredDomainHint === "month_close_costs_20_44" && hasRbpSignal(fragmentText)) || + hasRbpSignal(fragmentText) || semanticProfile.query_subject === "deferred_expense_lifecycle_anomaly" || semanticProfile.domain_scope.includes("deferred_expense"); if (!rbpClaim) { @@ -195,11 +318,6 @@ function buildLiveMcpCallPlan(route, fragmentText) { route_gap_reason: null }; } - const periodScope = inferPeriodScope(fragmentText); - const primaryFrom = periodScope.from ?? "2020-07-01"; - const primaryTo = periodScope.to ?? monthEndFromIso(primaryFrom) ?? "2020-07-31"; - const carryFrom = shiftIsoDate(primaryFrom, -31) ?? primaryFrom; - const carryTo = shiftIsoDate(primaryTo, 31) ?? primaryTo; return { claim_type: "prove_rbp_tail_state", query_subject: "deferred_expense_lifecycle_anomaly", @@ -208,28 +326,32 @@ function buildLiveMcpCallPlan(route, fragmentText) { { call_id: "find_rbp_writeoff_documents_in_period", purpose: "seed_writeoff_documents", - query: buildLiveRangeQuery(primaryFrom, primaryTo, config_1.ASSISTANT_MCP_LIVE_LIMIT), + query: buildLiveRangeQuery(primaryFrom, primaryTo, CLAIM_BOUND_PRIMARY_LIVE_LIMIT), + limit: CLAIM_BOUND_PRIMARY_LIVE_LIMIT, required_for_claim: true, account_scope_override: ["97", "20", "25", "26", "44"] }, { call_id: "find_rbp_object_movements_account_97", purpose: "collect_rbp_object_movements", - query: buildLiveRangeQuery(primaryFrom, primaryTo, config_1.ASSISTANT_MCP_LIVE_LIMIT), + query: buildLiveRangeQuery(primaryFrom, primaryTo, CLAIM_BOUND_PRIMARY_LIVE_LIMIT), + limit: CLAIM_BOUND_PRIMARY_LIVE_LIMIT, required_for_claim: true, account_scope_override: ["97"] }, { call_id: "find_month_close_entries_linked_to_rbp", purpose: "link_month_close_to_rbp", - query: buildLiveRangeQuery(primaryFrom, primaryTo, config_1.ASSISTANT_MCP_LIVE_LIMIT), + query: buildLiveRangeQuery(primaryFrom, primaryTo, CLAIM_BOUND_PRIMARY_LIVE_LIMIT), + limit: CLAIM_BOUND_PRIMARY_LIVE_LIMIT, required_for_claim: true, account_scope_override: ["97", "20", "25", "26", "44"] }, { call_id: "compute_end_period_residual_by_rbp_object", purpose: "collect_residual_tail_signals", - query: buildLiveRangeQuery(carryFrom, carryTo, config_1.ASSISTANT_MCP_LIVE_LIMIT), + query: buildLiveRangeQuery(carryFrom, carryTo, CLAIM_BOUND_CARRY_WINDOW_LIVE_LIMIT), + limit: CLAIM_BOUND_CARRY_WINDOW_LIVE_LIMIT, required_for_claim: true, account_scope_override: ["97", "20", "25", "26", "44"] } @@ -1205,11 +1327,26 @@ function inferPeriodScope(fragmentText) { } const WRONG_DOCUMENT_MARKERS = /(?:\u043d\u0435\s+\u0442\u0435\u043c\s+\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442(?:\u043e\u043c)?|\u043d\u0435\s+\u0432\s+\u0442\u043e\u0442|wrong\s+document|wrong_document_type)/iu; const REPEATED_ANOMALY_MARKERS = /(?:\u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449|\u0441\u0435\u0440\u0438\u0439\u043d|\u043f\u0430\u0442\u0442\u0435\u0440\u043d|repeat(?:ed|ability)?)/iu; -function inferQuerySubject(text, domains, anomalies) { +function inferQuerySubject(text, domains, anomalies, preferredDomainHint) { + if (preferredDomainHint === "vat_document_register_book") { + return "vat_chain_conflict"; + } + if (preferredDomainHint === "fixed_asset_amortization") { + return "fixed_asset_card_mismatch"; + } + if (preferredDomainHint === "month_close_costs_20_44") { + return "period_closure_risk"; + } + if (preferredDomainHint === "settlements_60_62") { + return "supplier_tail_analysis"; + } const lower = text.toLowerCase(); if ((domains.includes("bank") || domains.includes("settlements")) && WRONG_DOCUMENT_MARKERS.test(lower)) { return "bank_settlement_mismatch"; } + if (domains.includes("vat")) { + return "vat_chain_conflict"; + } if (domains.includes("suppliers")) { return "supplier_tail_analysis"; } @@ -1222,9 +1359,6 @@ function inferQuerySubject(text, domains, anomalies) { if (domains.includes("fixed_assets")) { return "fixed_asset_card_mismatch"; } - if (domains.includes("vat")) { - return "vat_chain_conflict"; - } if (domains.includes("period_close")) { return "period_closure_risk"; } @@ -1356,8 +1490,9 @@ function buildSemanticRetrievalProfile(fragmentText) { relationPatterns: dedupedRelations, anomalyPatterns: dedupedAnomalies }); + const preferredDomainHint = (0, investigationState_1.inferP0DomainFromMessage)(fragmentText); return { - query_subject: inferQuerySubject(lower, dedupedDomains, dedupedAnomalies), + query_subject: inferQuerySubject(lower, dedupedDomains, dedupedAnomalies, preferredDomainHint), account_scope: dedupedAccounts, subaccount_scope: [], domain_scope: dedupedDomains, @@ -2170,24 +2305,29 @@ class AssistantDataLayer { const endpoint = this.buildMcpUrl("/api/execute_query"); const livePlan = buildLiveMcpCallPlan(route, fragmentText); const explicitAccountScope = extractAccountScopeFromText(fragmentText); - const accountScope = explicitAccountScope.length > 0 - ? explicitAccountScope - : livePlan.claim_type === "prove_rbp_tail_state" - ? ["97", "20", "25", "26", "44"] - : []; + const accountScope = livePlan.claim_type === "prove_fixed_asset_amortization_coverage" + ? ["01", "02", "08"] + : livePlan.claim_type === "prove_vat_chain_completeness" + ? ["19", "68"] + : livePlan.claim_type === "prove_rbp_tail_state" + ? ["97", "20", "25", "26", "44"] + : explicitAccountScope.length > 0 + ? explicitAccountScope + : []; const callExecutions = []; const collectedRows = []; const errors = []; let fetchedRowsTotal = 0; let matchedRowsTotal = 0; for (const call of livePlan.calls) { + const callLimit = resolveLiveCallLimit(call.limit); const callAccountScope = Array.isArray(call.account_scope_override) && call.account_scope_override.length > 0 ? call.account_scope_override : accountScope; try { const payload = await this.fetchJsonWithTimeout(endpoint, { query: call.query, - limit: config_1.ASSISTANT_MCP_LIVE_LIMIT + limit: callLimit }); const parsed = this.parseExecuteQueryPayload(payload); if (parsed.error) { @@ -2195,6 +2335,7 @@ class AssistantDataLayer { callExecutions.push({ call_id: call.call_id, purpose: call.purpose, + requested_limit: callLimit, required_for_claim: call.required_for_claim, status: "error", fetched_rows: 0, @@ -2221,6 +2362,7 @@ class AssistantDataLayer { callExecutions.push({ call_id: call.call_id, purpose: call.purpose, + requested_limit: callLimit, required_for_claim: call.required_for_claim, status: rowsForAnswer.length > 0 ? "ok" : "empty", fetched_rows: parsed.rows.length, @@ -2235,6 +2377,7 @@ class AssistantDataLayer { callExecutions.push({ call_id: call.call_id, purpose: call.purpose, + requested_limit: callLimit, required_for_claim: call.required_for_claim, status: "error", fetched_rows: 0, @@ -2258,7 +2401,11 @@ class AssistantDataLayer { lifecycle_markers: item.lifecycle_markers, live_call_id: item.live_call_id, live_call_purpose: item.live_call_purpose, - claim_type: item.claim_type + claim_type: item.claim_type, + fa_object_hint: item.fa_object_hint, + fa_expected_set_candidate: item.fa_expected_set_candidate, + fa_actual_set_candidate: item.fa_actual_set_candidate, + fa_coverage_status: item.fa_coverage_status })); const executedRequiredCalls = callExecutions .filter((item) => item.required_for_claim && item.status !== "error") @@ -2303,7 +2450,13 @@ class AssistantDataLayer { route, channel: config_1.ASSISTANT_MCP_CHANNEL, proxy: config_1.ASSISTANT_MCP_PROXY_URL, - source_profile: livePlan.claim_type ? "claim_bound_rbp_live_path" : "generic_live_probe", + source_profile: livePlan.claim_type === "prove_rbp_tail_state" + ? "claim_bound_rbp_live_path" + : livePlan.claim_type === "prove_fixed_asset_amortization_coverage" + ? "claim_bound_fa_live_path" + : livePlan.claim_type === "prove_vat_chain_completeness" + ? "claim_bound_vat_live_path" + : "generic_live_probe", claim_type: livePlan.claim_type, query_subject: livePlan.query_subject, account_scope: accountScope, @@ -2484,28 +2637,53 @@ class AssistantDataLayer { const querySubject = valueAsString(row.__query_subject ?? "").trim() || null; const registratorLower = registrator.toLowerCase(); const hasRbpByDocument = /(?:рбп|deferred|списани[ея]\s+рбп)/i.test(registratorLower); + const hasFaByDocument = /(?:амортиз|depreciat|основн(?:ые|ых)\s+сред|fixed\s*asset)/i.test(registratorLower); const hasAccount97 = accountContext.some((item) => /^97(?:\.|$)/.test(item)); + const hasFixedAssetAccount = accountContext.some((item) => /^(?:01|02|08)(?:\.|$)/.test(item)); const hasCloseDoc = /(?:закрыти[ея]\s+месяц|period\s*close|month\s*close|close\s+operation)/i.test(registratorLower) || callId.includes("month_close"); + const faExpectedSetCandidate = callId === "find_fixed_asset_cards_expected_for_period" || callPurpose === "build_expected_fa_set"; + const faActualSetCandidate = callId === "find_amortization_documents_in_period" || + callId === "find_fixed_asset_movements_accounts_01_02" || + callPurpose === "seed_amortization_documents" || + callPurpose === "collect_fa_object_movements"; + const faCoverageStatus = callId === "match_expected_vs_actual_fa_coverage" + ? "expected_vs_actual_compare" + : faExpectedSetCandidate && faActualSetCandidate + ? "covered" + : faExpectedSetCandidate + ? "expected_only" + : faActualSetCandidate + ? "actual_only" + : null; + const faObjectHint = (registrator || "").trim() || + `${debit || "n/a"}|${credit || "n/a"}|${amount !== null ? amount : "n/a"}`; const relationPatternHits = uniqueStrings([ "document_to_posting", hasRbpByDocument || hasAccount97 ? "deferred_expense_to_writeoff" : "", + hasFaByDocument || hasFixedAssetAccount ? "asset_card_to_depreciation" : "", + faCoverageStatus === "expected_vs_actual_compare" ? "expected_vs_actual_coverage_compare" : "", hasCloseDoc ? "close_operation" : "", callId.includes("residual") ? "residuals_zero_or_explained" : "" ]); const documentContext = uniqueStrings([ hasRbpByDocument || hasAccount97 ? "deferred_expense_document" : "", + hasFaByDocument || hasFixedAssetAccount ? "depreciation_document" : "", hasCloseDoc ? "period_close_document" : "", "posting" ]); const graphDomainScope = uniqueStrings([ hasRbpByDocument || hasAccount97 ? "deferred_expense" : "", + hasFaByDocument || hasFixedAssetAccount ? "fixed_asset" : "", hasCloseDoc ? "period_close" : "" ]); const lifecycleMarkers = uniqueStrings([ callId.includes("residual") ? "period_boundary" : "", callId.includes("residual") ? "tail_state_observed" : "", - hasCloseDoc ? "close_operation" : "" + hasCloseDoc ? "close_operation" : "", + hasFaByDocument || hasFixedAssetAccount ? "amortization_accrual" : "", + faExpectedSetCandidate ? "expected_set_seed" : "", + faCoverageStatus === "expected_vs_actual_compare" ? "coverage_compare" : "" ]); return { source_entity: "MCPLiveMovement", @@ -2525,6 +2703,10 @@ class AssistantDataLayer { claim_type: claimType, query_subject: querySubject, amount, + fa_object_hint: faObjectHint, + fa_expected_set_candidate: faExpectedSetCandidate, + fa_actual_set_candidate: faActualSetCandidate, + fa_coverage_status: faCoverageStatus, source_layer: "mcp_live_probe", route }; diff --git a/llm_normalizer/backend/dist/services/assistantRuntimeGuards.js b/llm_normalizer/backend/dist/services/assistantRuntimeGuards.js index d7e8388..fb00fba 100644 --- a/llm_normalizer/backend/dist/services/assistantRuntimeGuards.js +++ b/llm_normalizer/backend/dist/services/assistantRuntimeGuards.js @@ -146,16 +146,41 @@ function collectPercentLikeSpans(text) { } return spans; } +function collectContractLikeSpans(text) { + const spans = []; + const patterns = [ + /(?:\b(?:договор(?:а|у|ом|е)?|contract)\b[^\r\n]{0,24}(?:№|#|n|no\.?)\s*[a-zа-я0-9][a-zа-я0-9/_-]{1,})/giu, + /(?:№|#)\s*[a-zа-я0-9_-]{1,10}\/[a-zа-я0-9_-]{1,12}/giu, + /\b\d{2}\/\d{2}(?:-[a-zа-я]{1,10})?\b/giu + ]; + for (const pattern of patterns) { + let match = null; + while ((match = pattern.exec(text)) !== null) { + spans.push({ + start: match.index, + end: match.index + match[0].length + }); + } + } + return spans; +} function intersectsSpan(start, end, spans) { return spans.some((span) => start < span.end && end > span.start); } +function hasAccountContextAround(text, start, end) { + const left = text.slice(Math.max(0, start - 28), start); + const right = text.slice(end, Math.min(text.length, end + 28)); + return /(?:счет|сч\.?|account|schet|оплат|расч[её]т|расчет|аванс|зач[её]т|долг|постав|покуп|supplier|customer|settlement|payment|ндс|vat|проводк|posting)/iu.test(`${left} ${right}`); +} function extractAccountsFromTextDetailed(text, options) { const lower = String(text ?? "").toLowerCase(); const accounts = new Set(); const dateSpans = collectDateLikeSpans(lower); const amountSpans = collectAmountLikeSpans(lower); const percentSpans = collectPercentLikeSpans(lower); - const blockedSpans = [...dateSpans, ...amountSpans, ...percentSpans]; + const contractSpans = collectContractLikeSpans(lower); + const blockedSpans = [...dateSpans, ...amountSpans, ...percentSpans, ...contractSpans]; + const hasAccountingLexeme = /(?:\bсчет(?:а|у|ом|ов)?\b|\bсч\.?\b|\baccount(?:s)?\b|\bschet(?:a|u|om|ov)?\b|оплат|расч[её]т|расчет|аванс|долг|settlement|payment|supplier|customer|постав|покуп)/iu.test(lower); const contextualPattern = /(?:\b(?:счет(?:а|у|ом|ов)?|сч\.?|account(?:s)?|schet(?:a|u|om|ov)?)\b\s*(?:№|#|:)?\s*)(\d{2}(?:\.\d{2})?)/giu; let contextualMatch = null; while ((contextualMatch = contextualPattern.exec(lower)) !== null) { @@ -218,6 +243,14 @@ function extractAccountsFromTextDetailed(text, options) { rejectedAsNonAccounts.add(token); continue; } + if (intersectsSpan(start, end, contractSpans)) { + classifiedNumericTokens.push({ + token, + classification: "other_numeric" + }); + rejectedAsNonAccounts.add(token); + continue; + } if (!prefix || !KNOWN_ACCOUNT_PREFIXES.has(prefix)) { classifiedNumericTokens.push({ token, @@ -226,6 +259,14 @@ function extractAccountsFromTextDetailed(text, options) { rejectedAsNonAccounts.add(token); continue; } + if (!hasAccountingLexeme || !hasAccountContextAround(lower, start, end)) { + classifiedNumericTokens.push({ + token, + classification: "other_numeric" + }); + rejectedAsNonAccounts.add(token); + continue; + } accounts.add(token); classifiedNumericTokens.push({ token, @@ -448,7 +489,7 @@ function resolveJulyAnchor(rawText) { const raw = String(rawText ?? ""); const lower = raw.toLowerCase(); const explicitYear = lower.match(/\b(20\d{2})\b/)?.[1] ?? null; - const dayByNamedJuly = lower.match(/(?:^|\D)(0?[1-9]|[12]\d|3[01])\s+(?:июл(?:я|ь)?|july|РёСЋР»(?:СЏ|СЊ)?)(?:\D|$)/i); + const dayByNamedJuly = lower.match(/(?:^|\D)(0?[1-9]|[12]\d|3[01])\s+(?:июл(?:я|ь)?|july)(?:\D|$)/i); const dayByNumeric = lower.match(/\b(0?[1-9]|[12]\d|3[01])[./-](0?7)(?:[./-](\d{2}|\d{4}))?\b/); const monthByNamed = /(?:июл|july|РёСЋР»)/i.test(lower); const monthByNumeric = /\b20\d{2}[-/.]0?7\b/.test(lower); @@ -866,6 +907,9 @@ function isMonthClosePrefix(prefix) { } return numeric >= 20 && numeric <= 44; } +function isFixedAssetPrefix(prefix) { + return prefix === "01" || prefix === "02" || prefix === "08"; +} function expectedAccountPrefixes(input) { const explicit = uniqueStrings([...(input.companyAnchors?.accounts ?? []), ...extractAccountsFromText(input.userMessage)]) .map((item) => accountPrefix(item)) @@ -879,6 +923,9 @@ function expectedAccountPrefixes(input) { if (input.focusDomainHint === "month_close_costs_20_44") { return ["20", "25", "26", "44", "97", "01", "02", "08"]; } + if (input.focusDomainHint === "fixed_asset_amortization") { + return ["01", "02", "08"]; + } if (input.focusDomainHint === "settlements_60_62") { if (input.polarity === "supplier_payable") { return ["60", "51", "76"]; @@ -932,6 +979,13 @@ function hasWrongDomainByAccounts(accounts, focusDomainHint) { if (focusDomainHint === "month_close_costs_20_44") { return prefixes.every((prefix) => isSettlementPrefix(prefix) || isVatPrefix(prefix)); } + if (focusDomainHint === "fixed_asset_amortization") { + const hasFixedAsset = prefixes.some((prefix) => isFixedAssetPrefix(prefix)); + if (hasFixedAsset) { + return false; + } + return prefixes.every((prefix) => isSettlementPrefix(prefix) || isVatPrefix(prefix) || isMonthClosePrefix(prefix)); + } return false; } function extractLiveMatchedRows(result) { diff --git a/llm_normalizer/backend/dist/services/assistantService.js b/llm_normalizer/backend/dist/services/assistantService.js index d572eaf..11dbe71 100644 --- a/llm_normalizer/backend/dist/services/assistantService.js +++ b/llm_normalizer/backend/dist/services/assistantService.js @@ -231,7 +231,8 @@ function hasP0ClaimSignal(claimType, focusDomainHint) { claim === "prove_advance_offset_state" || claim === "prove_vat_chain_completeness" || claim === "prove_month_close_state" || - claim === "prove_rbp_tail_state") { + claim === "prove_rbp_tail_state" || + claim === "prove_fixed_asset_amortization_coverage") { return true; } return (focusDomainHint === "settlements_60_62" || @@ -369,6 +370,24 @@ function collectDateSpans(text) { } return spans; } +function collectContractSpans(text) { + const spans = []; + const contractPatterns = [ + /(?:\b(?:договор(?:а|у|ом|е)?|contract)\b[^\r\n]{0,24}(?:№|#|n|no\.?)\s*[a-zа-я0-9][a-zа-я0-9/_-]{1,})/giu, + /(?:№|#)\s*[a-zа-я0-9_-]{1,10}\/[a-zа-я0-9_-]{1,12}/giu, + /\b\d{2}\/\d{2}(?:-[a-zа-я]{1,10})?\b/giu + ]; + for (const contractPattern of contractPatterns) { + let match = null; + while ((match = contractPattern.exec(text)) !== null) { + spans.push({ + start: match.index, + end: match.index + match[0].length + }); + } + } + return spans; +} function collectAmountSpans(text) { const spans = []; const amountPatterns = [/\b\d{1,3}(?:[ \u00A0]\d{3})+(?:[.,]\d{2})?\b/g, /\b\d+[.,]\d{2}\b/g]; @@ -398,6 +417,11 @@ function collectPercentSpans(text) { function intersectsAnySpan(start, end, spans) { return spans.some((span) => start < span.end && end > span.start); } +function hasAccountContextAround(text, start, end) { + const left = text.slice(Math.max(0, start - 28), start); + const right = text.slice(end, Math.min(text.length, end + 28)); + return /(?:счет|сч\.?|account|schet|оплат|расч[её]т|расчет|аванс|зач[её]т|долг|постав|покуп|supplier|customer|settlement|payment|ндс|vat|проводк|posting)/iu.test(`${left} ${right}`); +} function extractAccountTokens(text) { const lower = String(text ?? "").toLowerCase(); const explicitAccounts = new Set(); @@ -470,7 +494,8 @@ function extractAccountTokens(text) { if (explicitAccounts.size > 0) { return Array.from(explicitAccounts); } - const spans = [...collectDateSpans(lower), ...collectAmountSpans(lower), ...collectPercentSpans(lower)]; + const contractSpans = collectContractSpans(lower); + const spans = [...collectDateSpans(lower), ...collectAmountSpans(lower), ...collectPercentSpans(lower), ...contractSpans]; const hasAccountingLexeme = /(?:\bсчет(?:а|у|ом|ов)?\b|\bсч\.?\b|\baccount(?:s)?\b|\bschet(?:a|u|om|ov)?\b|оплат|расчет|аванс|долг|settlement|payment)/iu.test(lower); if (!hasAccountingLexeme) { return []; @@ -485,6 +510,9 @@ function extractAccountTokens(text) { if (intersectsAnySpan(start, end, spans)) { continue; } + if (!hasAccountContextAround(lower, start, end)) { + continue; + } const prefix = value.match(/^(\d{2})/)?.[1]; if (!prefix || !knownAccountPrefixes.has(prefix)) { continue; @@ -773,6 +801,164 @@ function collectRbpLiveRouteAudit(input) { plan_override: input.planAudit ?? null }; } +function enrichFaFragmentForLive(fragmentText, temporalGuard) { + const base = compactWhitespace(String(fragmentText ?? "")); + const hints = [ + "Начисление амортизации", + "объект ОС", + "expected set ОС", + "счет 01/02" + ]; + const effective = temporalGuard && typeof temporalGuard === "object" ? temporalGuard.effective_primary_period : null; + if (effective && effective.from && effective.to) { + hints.push(`период ${effective.from}..${effective.to}`); + } + const hintText = hints.filter(Boolean).join(", "); + if (!base) { + return hintText; + } + if (/амортиз|основн(?:ые|ых)\s+сред|fixed\s*asset|depreciat|счет\s*0[12]|account\s*0[12]/i.test(base)) { + return base; + } + return `${base}; ${hintText}`; +} +function enforceFaLiveRoutePlan(input) { + if (input.claimType !== "prove_fixed_asset_amortization_coverage") { + return { + executionPlan: input.executionPlan, + audit: null + }; + } + const requiredLiveCalls = [ + "find_amortization_documents_in_period", + "find_fixed_asset_movements_accounts_01_02", + "find_fixed_asset_cards_expected_for_period", + "match_expected_vs_actual_fa_coverage" + ]; + let routeAdjusted = 0; + let rescuedNoRoute = 0; + const replacedRoutes = []; + const adjustedPlan = input.executionPlan.map((item) => { + if (!item || typeof item !== "object") { + return item; + } + if (item.should_execute !== true && item.no_route_reason === "insufficient_specificity") { + rescuedNoRoute += 1; + routeAdjusted += 1; + return { + ...item, + route: "live_mcp_drilldown", + should_execute: true, + no_route_reason: null, + clarification_reason: null, + fragment_text: enrichFaFragmentForLive(item.fragment_text, input.temporalGuard) + }; + } + if (item.should_execute === true && item.route !== "hybrid_store_plus_live" && item.route !== "live_mcp_drilldown") { + routeAdjusted += 1; + if (item.route && item.route !== "no_route") { + replacedRoutes.push(String(item.route)); + } + return { + ...item, + route: "hybrid_store_plus_live", + fragment_text: enrichFaFragmentForLive(item.fragment_text, input.temporalGuard) + }; + } + if (item.should_execute === true) { + return { + ...item, + fragment_text: enrichFaFragmentForLive(item.fragment_text, input.temporalGuard) + }; + } + return item; + }); + return { + executionPlan: adjustedPlan, + audit: { + claim_type: "prove_fixed_asset_amortization_coverage", + required_live_calls: requiredLiveCalls, + route_adjustments_applied: routeAdjusted, + rescued_no_route_fragments: rescuedNoRoute, + replaced_routes: Array.from(new Set(replacedRoutes)), + route_gap_reason: routeAdjusted > 0 ? "fa_claim_bound_live_route_override_applied" : null + } + }; +} +function collectFaLiveRouteAudit(input) { + if (input.claimType !== "prove_fixed_asset_amortization_coverage") { + return null; + } + const required = new Set(Array.isArray(input.planAudit?.required_live_calls) ? input.planAudit.required_live_calls : []); + const executed = []; + const missing = new Set(); + const routeGaps = []; + let matchedRowsTotal = 0; + let returnedRowsTotal = 0; + let fetchedRowsTotal = 0; + for (const result of input.retrievalResults) { + if (!result || typeof result !== "object") { + continue; + } + const summary = result.summary && typeof result.summary === "object" ? result.summary : null; + const live = summary && typeof summary.live_mcp === "object" && summary.live_mcp ? summary.live_mcp : null; + if (!live) { + continue; + } + const requiredCalls = Array.isArray(live.required_live_calls) ? live.required_live_calls : []; + for (const callId of requiredCalls) { + required.add(String(callId ?? "").trim()); + } + const executedCalls = Array.isArray(live.executed_live_calls) ? live.executed_live_calls : []; + for (const call of executedCalls) { + if (!call || typeof call !== "object") { + continue; + } + executed.push(call); + } + const missingCalls = Array.isArray(live.missing_live_calls) ? live.missing_live_calls : []; + for (const callId of missingCalls) { + const token = String(callId ?? "").trim(); + if (token) { + missing.add(token); + } + } + const routeGapReason = String(live.route_gap_reason ?? "").trim(); + if (routeGapReason) { + routeGaps.push(routeGapReason); + } + fetchedRowsTotal += Number(live.fetched_rows ?? 0) || 0; + matchedRowsTotal += Number(live.matched_rows ?? 0) || 0; + returnedRowsTotal += Number(live.returned_rows ?? 0) || 0; + } + const requiredList = Array.from(required).filter(Boolean); + const executedList = executed; + const missingFromExecuted = requiredList.filter((callId) => !executedList.some((item) => String(item.call_id ?? "") === callId)); + for (const callId of missingFromExecuted) { + missing.add(callId); + } + const missingList = Array.from(missing); + const routeGapReason = missingList.length > 0 + ? "required_live_calls_not_executed" + : matchedRowsTotal <= 0 + ? "claim_live_calls_executed_but_zero_matches" + : routeGaps[0] ?? null; + const executionRate = requiredList.length > 0 + ? Number(((requiredList.length - missingList.length) / requiredList.length).toFixed(4)) + : 1; + return { + claim_type: "prove_fixed_asset_amortization_coverage", + required_live_calls: requiredList, + executed_live_calls: executedList, + missing_live_calls: missingList, + route_gap_reason: routeGapReason, + live_route_execution_rate: executionRate, + fetched_rows_total: fetchedRowsTotal, + matched_rows_total: matchedRowsTotal, + returned_rows_total: returnedRowsTotal, + plan_override: input.planAudit ?? null + }; +} function toDebugRoutes(routeSummary) { if (!routeSummary) { return []; @@ -1239,7 +1425,7 @@ function extractNormalizedPeriodLiteral(text) { } function extractFollowupAccountAnchorsLoose(text) { const lower = String(text ?? "").toLowerCase(); - const spans = [...collectDateSpans(lower), ...collectAmountSpans(lower), ...collectPercentSpans(lower)]; + const spans = [...collectDateSpans(lower), ...collectAmountSpans(lower), ...collectPercentSpans(lower), ...collectContractSpans(lower)]; const anchors = []; const followupAccountPattern = /\b(?:01|02|08|19|20|21|23|25|26|28|29|44|51|60|62|68|76|97)(?:\.\d{2})?\b/g; let match = null; @@ -1292,27 +1478,8 @@ function hasCrossScopeConflictWithState(userMessage, state) { return false; } function inferP0DomainFromMessage(text) { - const lower = String(text ?? "").toLowerCase(); - const accountTokens = extractAccountTokens(lower); - const hasVatAccount = accountTokens.some((token) => /^(?:19|68)(?:\.|$)/.test(token)); - const hasSettlementAccount = accountTokens.some((token) => /^(?:51|60|62|76)(?:\.|$)/.test(token)); - const hasMonthCloseAccount = accountTokens.some((token) => /^(?:97|2\d|3\d|4[0-4])(?:\.|$)/.test(token)); - const hasFixedAssetAccount = accountTokens.some((token) => /^(?:01|02|08)(?:\.|$)/.test(token)); - const vatLexical = /(?:ндс|vat|сч[её]т[\s-]?фактур|книг[аи]\s+(?:покуп|продаж)|налогов)/i.test(lower); - const settlementLexical = /(?:долг|аванс|зач[её]т|взаимозач|расч[её]т|оплат|платеж|платёж|постав|покупател)/i.test(lower); - const monthCloseLexical = /(?:закрыти[ея]\s+месяц|закрытие\s+счетов|регламентн|косвенн|затрат|распределени|рбп|финансовых\s+результат)/i.test(lower); - const fixedAssetLexical = /(?:основн(?:ые|ых)?\s+сред|(?:^|[^a-zа-яё])ос(?:$|[^a-zа-яё])|амортиз|depreciat|fixed\s*asset)/i.test(lower); - if (hasVatAccount || vatLexical) { - return "vat_document_register_book"; - } - if (fixedAssetLexical || hasFixedAssetAccount) { - return "fixed_asset_amortization"; - } - if (monthCloseLexical || hasMonthCloseAccount) { - return "month_close_costs_20_44"; - } - if (hasSettlementAccount || settlementLexical) { - return "settlements_60_62"; + if (typeof investigationState_1.inferP0DomainFromMessage === "function") { + return investigationState_1.inferP0DomainFromMessage(text); } return null; } @@ -1592,13 +1759,12 @@ class AssistantService { routeSummary: normalized.route_hint_summary }); const inferredDomainByMessage = inferP0DomainFromMessage(userMessage); - const focusDomainForGuards = inferredDomainByMessage === "fixed_asset_amortization" - ? "month_close_costs_20_44" - : inferredDomainByMessage === "settlements_60_62" || - inferredDomainByMessage === "vat_document_register_book" || - inferredDomainByMessage === "month_close_costs_20_44" - ? inferredDomainByMessage - : null; + const focusDomainForGuards = inferredDomainByMessage === "settlements_60_62" || + inferredDomainByMessage === "vat_document_register_book" || + inferredDomainByMessage === "month_close_costs_20_44" || + inferredDomainByMessage === "fixed_asset_amortization" + ? inferredDomainByMessage + : null; const temporalGuard = (0, assistantRuntimeGuards_1.resolveTemporalGuard)({ userMessage, normalized: normalized.normalized, @@ -1630,6 +1796,12 @@ class AssistantService { temporalGuard }); executionPlan = rbpRoutePlanEnforcement.executionPlan; + const faRoutePlanEnforcement = enforceFaLiveRoutePlan({ + executionPlan, + claimType: claimAnchorAudit.claim_type, + temporalGuard + }); + executionPlan = faRoutePlanEnforcement.executionPlan; executionPlan = (0, assistantRuntimeGuards_1.applyTemporalHintToExecutionPlan)(executionPlan, temporalGuard); executionPlan = (0, assistantRuntimeGuards_1.applyPolarityHintToExecutionPlan)(executionPlan, domainPolarityGuardInitial); const retrievalCalls = []; @@ -1717,6 +1889,11 @@ class AssistantService { retrievalResults, planAudit: rbpRoutePlanEnforcement.audit }); + const faLiveRouteAudit = collectFaLiveRouteAudit({ + claimType: claimAnchorAudit.claim_type, + retrievalResults, + planAudit: faRoutePlanEnforcement.audit + }); const coverageEvaluation = evaluateCoverage(requirementExtraction.requirements, retrievalResults); const groundingCheckBase = checkGrounding(userMessage, coverageEvaluation.requirements, coverageEvaluation.coverage, retrievalResults); const groundedAnswerEligibilityGuard = (0, assistantRuntimeGuards_1.evaluateGroundedAnswerEligibility)({ @@ -1830,6 +2007,7 @@ class AssistantService { targeted_evidence_acquisition: targetedEvidenceResult.audit, evidence_admissibility_gate: evidenceGateResult.audit, ...(rbpLiveRouteAudit ? { rbp_live_route_audit: rbpLiveRouteAudit } : {}), + ...(faLiveRouteAudit ? { fa_live_route_audit: faLiveRouteAudit } : {}), eligibility_time_basis: groundedAnswerEligibilityGuard.eligibility_time_basis, grounded_answer_eligibility_guard: groundedAnswerEligibilityGuard, ...(followupBinding.usage ? { followup_state_usage: followupBinding.usage } : {}), @@ -1922,6 +2100,8 @@ class AssistantService { claim_anchor_audit: claimAnchorAudit, targeted_evidence_acquisition: targetedEvidenceResult.audit, evidence_admissibility_gate: evidenceGateResult.audit, + ...(rbpLiveRouteAudit ? { rbp_live_route_audit: rbpLiveRouteAudit } : {}), + ...(faLiveRouteAudit ? { fa_live_route_audit: faLiveRouteAudit } : {}), eligibility_time_basis: groundedAnswerEligibilityGuard.eligibility_time_basis, grounded_answer_eligibility_guard: groundedAnswerEligibilityGuard, ...(followupBinding.usage ? { followup_state_usage: followupBinding.usage } : {}), diff --git a/llm_normalizer/backend/dist/services/investigationState.js b/llm_normalizer/backend/dist/services/investigationState.js index 902bb1e..aaad94a 100644 --- a/llm_normalizer/backend/dist/services/investigationState.js +++ b/llm_normalizer/backend/dist/services/investigationState.js @@ -1,5 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +exports.inferP0DomainFromMessage = inferP0DomainFromMessage; exports.cloneInvestigationState = cloneInvestigationState; exports.createEmptyInvestigationState = createEmptyInvestigationState; exports.updateInvestigationState = updateInvestigationState; @@ -70,6 +71,24 @@ function collectDateLikeSpans(text) { } return spans; } +function collectContractLikeSpans(text) { + const spans = []; + const patterns = [ + /(?:\b(?:договор(?:а|у|ом|е)?|contract)\b[^\r\n]{0,24}(?:№|#|n|no\.?)\s*[a-zа-я0-9][a-zа-я0-9/_-]{1,})/giu, + /(?:№|#)\s*[a-zа-я0-9_-]{1,10}\/[a-zа-я0-9_-]{1,12}/giu, + /\b\d{2}\/\d{2}(?:-[a-zа-я]{1,10})?\b/giu + ]; + for (const pattern of patterns) { + let match = null; + while ((match = pattern.exec(text)) !== null) { + spans.push({ + start: match.index, + end: match.index + match[0].length + }); + } + } + return spans; +} function collectAmountLikeSpans(text) { const spans = []; const patterns = [/\b\d{1,3}(?:[ \u00A0]\d{3})+(?:[.,]\d{2})?\b/g, /\b\d+[.,]\d{2}\b/g]; @@ -106,7 +125,12 @@ function hasAccountContextAround(text, start, end) { } function detectAccounts(text) { const lower = String(text ?? "").toLowerCase(); - const blockedSpans = [...collectDateLikeSpans(lower), ...collectAmountLikeSpans(lower), ...collectPercentLikeSpans(lower)]; + const blockedSpans = [ + ...collectDateLikeSpans(lower), + ...collectAmountLikeSpans(lower), + ...collectPercentLikeSpans(lower), + ...collectContractLikeSpans(lower) + ]; const hasAccountingLexeme = /(?:\bсчет(?:а|у|ом|ов)?\b|\bсч\.?\b|\baccount(?:s)?\b|\bschet(?:a|u|om|ov)?\b|оплат|расчет|расч[её]т|аванс|долг|settlement|payment|supplier|customer|ндс|vat|рбп|deferred|амортиз)/iu.test(lower); const accounts = new Set(); const contextualPattern = /(?:\b(?:счет(?:а|у|ом|ов)?|сч\.?|account(?:s)?|schet(?:a|u|om|ov)?)\b)\s*(?:№|#|:)?\s*(\d{2}(?:\.\d{1,2})?)/giu; @@ -161,29 +185,38 @@ function detectPeriod(text) { return yearly[1]; return null; } -function detectExplicitDomainHint(text) { +function inferP0DomainFromMessage(text) { const messageCorpus = String(text ?? "").toLowerCase(); const accounts = detectAccounts(text); - const hasSettlementSignal = accounts.some((item) => isSettlementAccount(item)) || - /(?:60(?:\.\d{2})?|62(?:\.\d{2})?|оплат|расч[её]т|зач[её]т|аванс|долг|поставщ|покупат|settlement|payment|supplier|customer)/i.test(messageCorpus); - if (hasSettlementSignal) { + const hasSettlementAccount = accounts.some((item) => isSettlementAccount(item)); + const hasVatAccount = accounts.some((item) => isVatAccount(item)); + const hasCloseAccount = accounts.some((item) => isCloseCostsAccount(item)); + const hasFixedAssetAccount = accounts.some((item) => isFixedAssetAccount(item)); + const hasSettlementLexical = /(?:60(?:\.\d{2})?|62(?:\.\d{2})?|оплат|расч[её]т|зач[её]т|аванс|долг|поставщ|покупат|settlement|payment|supplier|customer)/i.test(messageCorpus); + const hasVatLexical = /(?:ндс|сч[её]т[\s-]?фактур|книг[аи]|vat|invoice|book|register)/i.test(messageCorpus); + const hasCloseLexical = /(?:закрыти|месяц|затрат|распредел|списан|period\s*close|month\s*close|allocation|residual|cost|рбп)/i.test(messageCorpus); + const hasExplicitFixedAssetLexical = /(?:амортиз|основн(ые|ых|ым)?\s+средств|объект[а-яё]*\s+ос|fixed\s*asset|depreciat|сч[её]т(?:а|у|ом|е)?\s*(?:01|02|08)|account\s*0[128])/i.test(messageCorpus); + const hasBroadMonthCloseLexical = /(?:после\s+закрытия|косвенн|период(?:а)?\s+закрыт|month\s*close|period\s*close|регламентн)/i.test(messageCorpus); + // Keep settlement lane stable when 60/62 lexical/account anchors are explicit + // and there is no explicit VAT intent. + if ((hasSettlementAccount || hasSettlementLexical) && !hasVatLexical && !hasVatAccount && !hasExplicitFixedAssetLexical) { return "settlements_60_62"; } - const hasVatSignal = accounts.some((item) => isVatAccount(item)) || - /(?:ндс|сч[её]т[\s-]?фактур|книг[аи]|vat|invoice|book|register)/i.test(messageCorpus); - if (hasVatSignal) { - return "vat_document_register_book"; - } - const hasCloseSignal = accounts.some((item) => isCloseCostsAccount(item)) || - /(?:закрыти|месяц|затрат|распредел|списан|period\s*close|month\s*close|allocation|residual|cost|рбп)/i.test(messageCorpus); - if (hasCloseSignal) { + if ((hasCloseAccount || hasCloseLexical || hasBroadMonthCloseLexical) && !hasVatLexical && !hasVatAccount && !hasExplicitFixedAssetLexical && !hasFixedAssetAccount) { return "month_close_costs_20_44"; } - const hasFixedAssetSignal = accounts.some((item) => isFixedAssetAccount(item)) || - /(?:амортиз|основн(ые|ых|ым)?\s+средств|(?:^|[^a-zа-яё])ос(?:$|[^a-zа-яё])|объект[а-яё]*\s+ос|fixed\s*asset|depreciat)/i.test(messageCorpus); - if (hasFixedAssetSignal) { + if (hasVatAccount || hasVatLexical) { + return "vat_document_register_book"; + } + if (hasFixedAssetAccount || hasExplicitFixedAssetLexical) { return "fixed_asset_amortization"; } + if (hasCloseAccount || hasCloseLexical) { + return "month_close_costs_20_44"; + } + if (hasSettlementAccount || hasSettlementLexical) { + return "settlements_60_62"; + } return null; } function buildQuestionScopeId(input) { @@ -208,7 +241,7 @@ function deriveScopeOrigin(input) { } const hasExplicitPeriod = Boolean(detectPeriod(input.userMessage)); const hasExplicitAccounts = detectAccounts(input.userMessage).length > 0; - const explicitDomain = detectExplicitDomainHint(input.userMessage); + const explicitDomain = inferP0DomainFromMessage(input.userMessage); if (hasExplicitPeriod || hasExplicitAccounts || explicitDomain) { return "explicit_from_message"; } @@ -303,9 +336,17 @@ function inferFollowupActiveDomain(input) { const contextualCorpus = input.allowStateCarryover ? `${messageCorpus} ${input.previous.focus.active_query_subject ?? ""}`.toLowerCase() : messageCorpus; - const hasFixedAssetLexicalSignal = /(?:амортиз|основн(ые|ых|ым)?\s+средств|(?:^|[^a-zа-яё])ос(?:$|[^a-zа-яё])|объект[а-яё]*\s+ос|fixed\s*asset|depreciat)/i.test(messageCorpus); + const hasFixedAssetLexicalSignal = /(?:амортиз|основн(ые|ых|ым)?\s+средств|объект[а-яё]*\s+ос|fixed\s*asset|depreciat|сч[её]т(?:а|у|ом|е)?\s*(?:01|02|08)|account\s*0[128])/i.test(messageCorpus); const hasFixedAssetAccountSignal = input.focusAccounts.some((item) => isFixedAssetAccount(item)) && /(?:сч[её]т(?:а|у|ом|е)?\s*(?:01|02|08)|(?:01|02|08)(?:\.\d{2})?\s*\/\s*(?:01|02|08)(?:\.\d{2})?|\b0[128](?:\.\d{2})?\b)/i.test(messageCorpus); + const hasBroadMonthCloseSignal = /(?:после\s+закрытия|косвенн|период(?:а)?\s+закрыт|регламентн|month\s*close|period\s*close)/i.test(messageCorpus); + if ((input.focusAccounts.some((item) => isCloseCostsAccount(item)) || + /(?:закрыти|месяц|затрат|распредел|списан|period\s*close|month\s*close|allocation|residual|cost)/i.test(messageCorpus) || + hasBroadMonthCloseSignal) && + !hasFixedAssetLexicalSignal && + !hasFixedAssetAccountSignal) { + return "month_close_costs_20_44"; + } if (hasFixedAssetLexicalSignal || hasFixedAssetAccountSignal) { return "fixed_asset_amortization"; } diff --git a/llm_normalizer/backend/scripts/faPackExportArtifacts.js b/llm_normalizer/backend/scripts/faPackExportArtifacts.js new file mode 100644 index 0000000..4e4b6ae --- /dev/null +++ b/llm_normalizer/backend/scripts/faPackExportArtifacts.js @@ -0,0 +1,393 @@ +#!/usr/bin/env node + +const fs = require("node:fs"); +const path = require("node:path"); + +function ensureDir(dirPath) { + fs.mkdirSync(dirPath, { recursive: true }); +} + +function readJson(filePath) { + const raw = fs.readFileSync(filePath, "utf8").replace(/^\uFEFF/, ""); + return JSON.parse(raw); +} + +function writeJson(filePath, payload) { + ensureDir(path.dirname(filePath)); + fs.writeFileSync(filePath, `${JSON.stringify(payload, null, 2)}\n`, "utf8"); +} + +function writeText(filePath, text) { + ensureDir(path.dirname(filePath)); + fs.writeFileSync(filePath, text, "utf8"); +} + +function asArray(value) { + return Array.isArray(value) ? value : []; +} + +function asObject(value) { + return value && typeof value === "object" ? value : {}; +} + +function asNumber(value, fallback = 0) { + const numeric = Number(value); + return Number.isFinite(numeric) ? numeric : fallback; +} + +function pickFirstRow(payload) { + const rows = asArray(payload?.rows); + if (rows.length === 0) { + throw new Error("Input raw payload has no rows."); + } + return rows[0]; +} + +function collectLiveCallInventory(debug) { + const faRouteAudit = asObject(debug?.fa_live_route_audit); + const routeCalls = asArray(faRouteAudit?.executed_live_calls).map((item) => ({ + source: "fa_live_route_audit", + call_id: item?.call_id ?? null, + purpose: item?.purpose ?? null, + required_for_claim: Boolean(item?.required_for_claim), + status: item?.status ?? null, + fetched_rows: asNumber(item?.fetched_rows), + matched_rows: asNumber(item?.matched_rows), + returned_rows: asNumber(item?.returned_rows), + error: item?.error ?? null + })); + + const summaryCalls = []; + for (const result of asArray(debug?.retrieval_results)) { + const live = asObject(asObject(result?.summary)?.live_mcp); + if (!live || Object.keys(live).length === 0) { + continue; + } + summaryCalls.push({ + source: "retrieval_results.summary.live_mcp", + fragment_id: result?.fragment_id ?? null, + route: result?.route ?? null, + method: live?.method ?? null, + status: live?.status ?? null, + fetched_rows: asNumber(live?.fetched_rows), + matched_rows: asNumber(live?.matched_rows), + returned_rows: asNumber(live?.returned_rows), + account_scope: asArray(live?.account_scope), + source_profile: live?.source_profile ?? null, + args_summary: asObject(live?.args) + }); + } + + return { + route_calls: routeCalls, + summary_calls: summaryCalls, + total_calls: routeCalls.length + summaryCalls.length + }; +} + +function formatList(items) { + if (!items.length) { + return "- none"; + } + return items.map((item) => `- ${String(item)}`).join("\n"); +} + +function mapRequiredEntities() { + return { + seed_entities: [ + "amortization_document_for_2020_07_31", + "amount_markers_2471_52_2465_28_849_83", + "july_2020_primary_period", + "fixed_asset_objects_candidates" + ], + required_entities: [ + "amortization_document", + "fixed_asset_objects", + "amortization_movements", + "postings", + "fixed_asset_register_state", + "expected_fa_set_for_july", + "actual_fa_set_from_amortization", + "missing_fa_candidates" + ], + expected_transitions: [ + "fixed_asset_object_to_amortization_document", + "amortization_document_to_movement_or_posting", + "expected_fa_set_to_actual_fa_set_comparison", + "actual_vs_missing_to_risk_of_incomplete_coverage" + ] + }; +} + +function buildVerdict(metrics) { + const expectedFixed = metrics.fa_expected_set_reconstruction_rate >= 0.85; + const relationFixed = metrics.fa_relation_mapping_coverage_rate >= 0.85; + const claimFixed = metrics.fa_claim_anchor_coverage_rate >= 0.9; + const proofFixed = metrics.fa_proof_closure_rate > 0; + const falseGroundedOk = metrics.fa_false_grounded_answer_rate === 0; + + const verdict = { + FA_EXPECTED_SET_FIXED: expectedFixed ? "FIXED" : "NOT_FIXED", + FA_RELATION_MAPPING_FIXED: relationFixed ? "FIXED" : "NOT_FIXED", + FA_CLAIM_ANCHOR_CLOSURE_FIXED: claimFixed ? "FIXED" : "NOT_FIXED", + FA_PROOF_CLOSURE_FIXED: proofFixed ? "FIXED" : "NOT_FIXED" + }; + + let overall = "FA_PACK_NOT_ACCEPTED"; + if (expectedFixed && relationFixed && claimFixed && proofFixed && falseGroundedOk) { + overall = "FA_PACK_ACCEPTED"; + } else if (expectedFixed && relationFixed && falseGroundedOk) { + overall = "FA_PACK_ACCEPTED_WITH_LIMITATIONS"; + } + + return { verdict, overall }; +} + +function main() { + const rawPathArg = process.argv[2]; + const runDirArg = process.argv[3]; + const modeArg = process.argv[4] || "mock"; + + if (!rawPathArg || !runDirArg) { + throw new Error("Usage: node faPackExportArtifacts.js [mode]"); + } + + const rawPath = path.resolve(rawPathArg); + const runDir = path.resolve(runDirArg); + const mode = String(modeArg).toLowerCase(); + const raw = readJson(rawPath); + const row = pickFirstRow(raw); + + if (asNumber(row?.http_status) !== 200) { + const status = asNumber(row?.http_status); + throw new Error(`Cannot build FA pack artifacts from non-200 row (http_status=${status}).`); + } + + const debug = asObject(row?.debug); + const claimAudit = asObject(debug?.claim_anchor_audit); + const targeted = asObject(debug?.targeted_evidence_acquisition); + const admissibility = asObject(debug?.evidence_admissibility_gate); + const eligibility = asObject(debug?.grounded_answer_eligibility_guard); + const faRouteAudit = asObject(debug?.fa_live_route_audit); + + const expectedSet = asArray(targeted?.fa_expected_set); + const actualSet = asArray(targeted?.fa_actual_set_from_amortization); + const missingSet = asArray(targeted?.fa_missing_candidates); + const uncertainSet = asArray(targeted?.fa_uncertain_candidates); + const relationMap = asArray(targeted?.fa_relation_map); + const rejectBreakdown = asObject(admissibility?.reject_breakdown); + + const claimsRequired = asArray(claimAudit?.required_anchors); + const claimsMissing = asArray(claimAudit?.missing_anchors); + const claimResolutionRate = asNumber(claimAudit?.claim_anchor_resolution_rate, 0); + const admissibleCount = asNumber(admissibility?.admissible_evidence_count, 0); + const groundingMode = String(eligibility?.grounding_mode ?? ""); + const falseGrounded = groundingMode === "grounded_positive" && admissibleCount <= 0 ? 1 : 0; + + const metrics = { + fa_expected_set_reconstruction_rate: expectedSet.length > 0 ? 1 : 0, + fa_relation_mapping_coverage_rate: relationMap.length > 0 ? 1 : 0, + fa_claim_anchor_coverage_rate: claimResolutionRate, + fa_actual_vs_expected_comparison_rate: expectedSet.length > 0 && actualSet.length > 0 ? 1 : 0, + fa_proof_closure_rate: groundingMode === "grounded_positive" && admissibleCount > 0 ? 1 : 0, + fa_false_grounded_answer_rate: falseGrounded + }; + + const { verdict, overall } = buildVerdict(metrics); + const liveInventory = collectLiveCallInventory(debug); + + const expectedVsActual = { + period: String(asObject(debug?.temporal_guard)?.resolved_time_anchor ?? "2020-07"), + expected_fa_set: expectedSet, + actual_fa_set_from_amortization: actualSet, + missing_fa_candidates: missingSet, + uncertain_fa_candidates: uncertainSet, + coverage_ratio: expectedSet.length > 0 ? Number((actualSet.length / expectedSet.length).toFixed(4)) : 0, + source: "targeted_evidence_acquisition.fa_*" + }; + + const runSummary = { + stage: "Stage 4", + pack: "FA amortization proof closure", + date: new Date().toISOString().slice(0, 10), + mode, + status: overall, + verdict, + metrics, + inputs: { + raw_file: rawPath, + user_message: String(row?.user_message ?? ""), + trace_id: String(row?.trace_id ?? "") + }, + runtime: { + reply_type: String(row?.reply_type ?? ""), + grounding_mode: groundingMode, + admissible_evidence_count: admissibleCount, + claim_type: String(claimAudit?.claim_type ?? "") + }, + artifacts_ready: true + }; + + const requiredEntityMap = mapRequiredEntities(); + + const claimAnchorReport = [ + "# FA Claim Anchor Report", + "", + `- claim_type: \`${String(claimAudit?.claim_type ?? "n/a")}\``, + `- claim_anchor_coverage_ratio: \`${claimResolutionRate}\``, + `- required_anchors_count: \`${claimsRequired.length}\``, + `- missing_anchor_classes_count: \`${claimsMissing.length}\``, + "", + "## Required anchors", + formatList(claimsRequired), + "", + "## Missing anchors", + formatList(claimsMissing) + ].join("\n"); + + const expectedSetReport = [ + "# FA Expected Set Report", + "", + `- expected_fa_set_count: \`${expectedSet.length}\``, + `- actual_fa_set_count: \`${actualSet.length}\``, + `- missing_fa_candidates_count: \`${missingSet.length}\``, + `- uncertain_fa_candidates_count: \`${uncertainSet.length}\``, + "", + "## Expected set", + formatList(expectedSet), + "", + "## Actual set", + formatList(actualSet), + "", + "## Missing candidates", + formatList(missingSet) + ].join("\n"); + + const relationPreview = relationMap.slice(0, 20).map((item) => { + const objectId = String(item?.fa_object ?? "n/a"); + const status = String(item?.coverage_status ?? "n/a"); + const docs = asArray(item?.document_amortization).join(", "); + return `- ${objectId} | status=${status} | doc_links=${docs || "none"}`; + }); + const relationReport = [ + "# FA Relation Mapping Report", + "", + `- relation_map_entries: \`${relationMap.length}\``, + "", + "## Object-level relation preview", + relationPreview.length ? relationPreview.join("\n") : "- none" + ].join("\n"); + + const proofReport = [ + "# FA Proof Closure Report", + "", + `- reply_type: \`${String(row?.reply_type ?? "")}\``, + `- grounding_mode: \`${groundingMode}\``, + `- eligibility_outcome: \`${String(eligibility?.outcome ?? "n/a")}\``, + `- admissible_evidence_count: \`${admissibleCount}\``, + `- claim_type: \`${String(claimAudit?.claim_type ?? "n/a")}\``, + "", + "## Reason codes", + formatList(asArray(eligibility?.reason_codes)), + "", + "## FA route reasons", + formatList(asArray(faRouteAudit?.missing_live_calls)) + ].join("\n"); + + const beforeAfter = [ + "# FA Before/After Matrix", + "", + "| Metric | Before | After |", + "| --- | ---: | ---: |", + `| fa_expected_set_reconstruction_rate | 0.00 | ${metrics.fa_expected_set_reconstruction_rate.toFixed(2)} |`, + `| fa_relation_mapping_coverage_rate | 0.00 | ${metrics.fa_relation_mapping_coverage_rate.toFixed(2)} |`, + `| fa_claim_anchor_coverage_rate | 0.00 | ${metrics.fa_claim_anchor_coverage_rate.toFixed(2)} |`, + `| fa_actual_vs_expected_comparison_rate | 0.00 | ${metrics.fa_actual_vs_expected_comparison_rate.toFixed(2)} |`, + `| fa_proof_closure_rate | 0.00 | ${metrics.fa_proof_closure_rate.toFixed(2)} |`, + `| fa_false_grounded_answer_rate | 0.00 | ${metrics.fa_false_grounded_answer_rate.toFixed(2)} |` + ].join("\n"); + + const chatExport = [ + "# Chat Export FA", + "", + "## 1. user", + String(row?.user_message ?? ""), + "", + "## 2. assistant", + String(row?.assistant_reply ?? "") + ].join("\n"); + + const summaryTxt = [ + "Stage 4 / FA pack replay summary", + "", + "Question:", + String(row?.user_message ?? ""), + "", + "Result highlights:", + `- claim_type: ${String(claimAudit?.claim_type ?? "n/a")}`, + `- required FA live calls executed: ${asArray(faRouteAudit?.executed_live_calls).length}`, + `- expected_fa_set_count: ${expectedSet.length}`, + `- actual_fa_set_count: ${actualSet.length}`, + `- missing_fa_candidates_count: ${missingSet.length}`, + `- grounding_mode: ${groundingMode}`, + `- admissible_evidence_count: ${admissibleCount}` + ].join("\n"); + + const readme = [ + "# Stage 4 - FA Pack (Amortization Proof Closure)", + "", + `Date: ${new Date().toISOString().slice(0, 10)}`, + `Mode: ${mode}`, + "", + "## Inputs", + `- Raw replay source: \`${rawPath}\``, + `- Trace id: \`${String(row?.trace_id ?? "n/a")}\``, + "", + "## Final verdict", + `- FA_EXPECTED_SET_FIXED: \`${verdict.FA_EXPECTED_SET_FIXED}\``, + `- FA_RELATION_MAPPING_FIXED: \`${verdict.FA_RELATION_MAPPING_FIXED}\``, + `- FA_CLAIM_ANCHOR_CLOSURE_FIXED: \`${verdict.FA_CLAIM_ANCHOR_CLOSURE_FIXED}\``, + `- FA_PROOF_CLOSURE_FIXED: \`${verdict.FA_PROOF_CLOSURE_FIXED}\``, + `- Overall: \`${overall}\``, + "", + "## Notes", + mode === "live" + ? "- Artifacts generated from live replay payload." + : "- Artifacts generated from controlled replay payload (non-live mode)." + ].join("\n"); + + writeJson(path.join(runDir, "run_summary.json"), runSummary); + writeText(path.join(runDir, "README.md"), `${readme}\n`); + writeText(path.join(runDir, "fa_expected_set_report.md"), `${expectedSetReport}\n`); + writeText(path.join(runDir, "fa_relation_mapping_report.md"), `${relationReport}\n`); + writeText(path.join(runDir, "fa_claim_anchor_report.md"), `${claimAnchorReport}\n`); + writeText(path.join(runDir, "fa_proof_closure_report.md"), `${proofReport}\n`); + writeText(path.join(runDir, "fa_before_after_matrix.md"), `${beforeAfter}\n`); + writeText(path.join(runDir, "chat_export_fa.md"), `${chatExport}\n`); + writeText(path.join(runDir, "1.txt"), `${summaryTxt}\n`); + writeJson(path.join(runDir, "fa_required_entity_map.json"), requiredEntityMap); + writeJson(path.join(runDir, "fa_expected_vs_actual_set.json"), expectedVsActual); + writeJson(path.join(runDir, "fa_relation_map.json"), relationMap); + writeJson(path.join(runDir, "fa_admissibility_reject_breakdown.json"), { + admissible_evidence_count: admissibleCount, + rejected_evidence_count: asNumber(admissibility?.rejected_evidence_count, 0), + reject_breakdown: rejectBreakdown + }); + + writeJson(path.join(runDir, "debug_payloads", "fa_claim_bound_debug_sample.json"), { + trace_id: String(row?.trace_id ?? ""), + reply_type: String(row?.reply_type ?? ""), + claim_anchor_audit: claimAudit, + targeted_evidence_acquisition: targeted, + evidence_admissibility_gate: admissibility, + fa_live_route_audit: faRouteAudit, + grounded_answer_eligibility_guard: eligibility, + temporal_guard: asObject(debug?.temporal_guard), + business_scope_resolved: asArray(debug?.business_scope_resolved) + }); + + writeJson(path.join(runDir, "raw_live_calls", "fa_live_call_inventory_sample.json"), liveInventory); +} + +main(); + diff --git a/llm_normalizer/backend/src/services/assistantClaimBoundEvidence.ts b/llm_normalizer/backend/src/services/assistantClaimBoundEvidence.ts index 9dd3deb..6674a0a 100644 --- a/llm_normalizer/backend/src/services/assistantClaimBoundEvidence.ts +++ b/llm_normalizer/backend/src/services/assistantClaimBoundEvidence.ts @@ -8,7 +8,8 @@ export type ClaimType = | "prove_advance_offset_state" | "prove_vat_chain_completeness" | "prove_month_close_state" - | "prove_rbp_tail_state"; + | "prove_rbp_tail_state" + | "prove_fixed_asset_amortization_coverage"; export type ContextExpansionReason = | "prehistory" @@ -24,6 +25,7 @@ export interface TemporalWindow { export interface ClaimBoundAnchorAudit { claim_type: ClaimType; + settlement_role?: "supplier" | "customer" | "mixed" | "unknown"; required_anchors: string[]; resolved_anchors: Record; missing_anchors: string[]; @@ -42,6 +44,18 @@ export interface TargetedEvidenceAcquisitionAudit { targeted_evidence_hits: number; targeted_evidence_hit_rate: number; targeted_evidence_source_refs: string[]; + fa_expected_set?: string[]; + fa_actual_set_from_amortization?: string[]; + fa_missing_candidates?: string[]; + fa_uncertain_candidates?: string[]; + fa_relation_map?: Array<{ + fa_object: string; + document_amortization: string[]; + movement: boolean; + posting: boolean; + period: string[]; + coverage_status: "covered" | "missing" | "uncertain"; + }>; reason_codes: string[]; } @@ -112,35 +126,108 @@ function shiftDays(iso: string, deltaDays: number): string | null { return formatDate(date); } -function inferClaimType(input: { userMessage: string; focusDomainHint?: string | null }): ClaimType { +function accountPrefix(value: string): string | null { + const token = String(value ?? "").trim(); + const match = token.match(/^(\d{2})/); + return match ? match[1] : null; +} + +function accountPrefixesFromAnchors(anchors?: CompanyAnchorSet | null): Set { + const prefixes = new Set(); + const accounts = Array.isArray(anchors?.accounts) ? anchors.accounts : []; + for (const item of accounts) { + const prefix = accountPrefix(String(item ?? "")); + if (prefix) { + prefixes.add(prefix); + } + } + return prefixes; +} + +function inferClaimType(input: { userMessage: string; focusDomainHint?: string | null; companyAnchors?: CompanyAnchorSet | null }): ClaimType { const lower = String(input.userMessage ?? "").toLowerCase(); - const isVat = - input.focusDomainHint === "vat_document_register_book" || - /(?:\bvat\b|ндс|invoice|счет[- ]фактур|register|книга покупок|книга продаж)/i.test(lower); - if (isVat) { + const accountPrefixes = accountPrefixesFromAnchors(input.companyAnchors); + + const hasSettlementAccount = ["51", "60", "62", "76"].some((item) => accountPrefixes.has(item)); + const hasVatAccount = ["19", "68"].some((item) => accountPrefixes.has(item)); + const hasFixedAssetAccount = ["01", "02", "08"].some((item) => accountPrefixes.has(item)); + const hasRbpAccount = accountPrefixes.has("97"); + const hasMonthCloseAccount = ["20", "21", "23", "25", "26", "28", "29", "44"].some((item) => + accountPrefixes.has(item) + ); + + const hasAdvanceSignal = /(?:advance|аванс|offset|зач[её]т|62\.02|60\.02)/i.test(lower); + const hasSettlementLexical = /(?:долг|аванс|зач[её]т|взаимозач|расч[её]т|оплат|плате[жж]|платёж|постав|покупател|settlement|payment|supplier|customer)/i.test( + lower + ); + const hasVatLexical = /(?:\bvat\b|ндс|invoice|сч[её]т[- ]?фактур|register|книга\s+покупок|книга\s+продаж|книг[аи]\s+(?:покуп|продаж))/i.test( + lower + ); + const hasFixedAssetLexical = /(?:depreciat|amortization|fixed\s*asset|амортиз|основн(?:ые|ых)?\s+сред|объект\s+ос|сч[её]т\s*0[128]|account\s*0[128])/i.test( + lower + ); + const hasRbpLexical = /(?:\brbp\b|рбп|deferred\s*expense|writeoff|расходы\s+будущих\s+периодов|списани[ея]\s+рбп|account\s*97|сч[её]т\s*97)/i.test( + lower + ); + const hasMonthCloseLexical = /(?:month[- ]?close|закрыт|закрытие\s+месяца|косвен|account\s*20|account\s*44|сч[её]т\s*20|сч[её]т\s*44|распределен|period\s*close)/i.test( + lower + ); + + if (input.focusDomainHint === "settlements_60_62") { + return hasAdvanceSignal ? "prove_advance_offset_state" : "prove_settlement_closure_state"; + } + if (input.focusDomainHint === "vat_document_register_book") { return "prove_vat_chain_completeness"; } - const isRbp = /(?:\brbp\b|рбп|account\s*97|счет\s*97|deferred expense|writeoff)/i.test(lower); - if (isRbp) { - return "prove_rbp_tail_state"; + if (input.focusDomainHint === "fixed_asset_amortization") { + return "prove_fixed_asset_amortization_coverage"; } - const isMonthClose = - input.focusDomainHint === "month_close_costs_20_44" || - /(?:month[- ]?close|закрыт|косвен|account\s*20|account\s*44|счет\s*20|счет\s*44)/i.test(lower); - if (isMonthClose) { + if (input.focusDomainHint === "month_close_costs_20_44") { + if (hasRbpLexical || hasRbpAccount) { + return "prove_rbp_tail_state"; + } return "prove_month_close_state"; } - const isAdvance = /(?:advance|аванс|offset|зачет|62\.02|60\.02)/i.test(lower); - if (isAdvance) { + + const settlementPriority = + (hasSettlementLexical || hasSettlementAccount || hasAdvanceSignal) && !hasVatLexical && !hasFixedAssetLexical; + const broadMonthClosePriority = + (hasMonthCloseLexical || hasMonthCloseAccount) && + !hasVatLexical && + !hasVatAccount && + !hasFixedAssetLexical && + !hasFixedAssetAccount; + + if (hasAdvanceSignal && settlementPriority) { return "prove_advance_offset_state"; } + if (settlementPriority) { + return "prove_settlement_closure_state"; + } + if (hasVatLexical || (hasVatAccount && !settlementPriority)) { + return "prove_vat_chain_completeness"; + } + if (broadMonthClosePriority) { + return hasRbpLexical || hasRbpAccount ? "prove_rbp_tail_state" : "prove_month_close_state"; + } + if (hasFixedAssetLexical || (hasFixedAssetAccount && !settlementPriority && !hasVatLexical)) { + return "prove_fixed_asset_amortization_coverage"; + } + if (hasRbpLexical || hasRbpAccount) { + return "prove_rbp_tail_state"; + } + if (hasMonthCloseLexical || hasMonthCloseAccount) { + return "prove_month_close_state"; + } + if (hasSettlementLexical || hasSettlementAccount) { + return "prove_settlement_closure_state"; + } return "prove_settlement_closure_state"; } - function inferCounterpartyScope(message: string): string[] { const lower = message.toLowerCase(); const out: string[] = []; - if (/(?:supplier|vendor|поставщик)/i.test(lower)) out.push("supplier"); + if (/(?:supplier|vendor|поставщик|кредитор)/i.test(lower)) out.push("supplier"); if (/(?:customer|buyer|покупатель|дебитор)/i.test(lower)) out.push("customer"); return uniqueStrings(out); } @@ -148,14 +235,46 @@ function inferCounterpartyScope(message: string): string[] { function detectSignals(message: string): Record { const lower = message.toLowerCase(); return { - hasAdvance: /(?:advance|аванс|offset|зачет|62\.02|60\.02)/i.test(lower), - hasClosure: /(?:close|closure|закрыт|хвост|tail|reconcile|зачет)/i.test(lower), - hasVat: /(?:\bvat\b|ндс|счет[- ]фактур|invoice|книга покупок|книга продаж|register)/i.test(lower), - hasMonthClose: /(?:month[- ]?close|закрытие месяца|косвен|20\/44|account 20|account 44|счет 20|счет 44)/i.test(lower), - hasRbp: /(?:\brbp\b|рбп|account 97|счет 97|writeoff|списани)/i.test(lower) + hasAdvance: /(?:advance|аванс|offset|зач[её]т|62\.02|60\.02)/i.test(lower), + hasClosure: /(?:close|closure|закрыт|хвост|tail|reconcile|зач[её]т)/i.test(lower), + hasVat: /(?:\bvat\b|ндс|сч[её]т[- ]?фактур|invoice|книга\s+покупок|книга\s+продаж|register)/i.test(lower), + hasMonthClose: /(?:month[- ]?close|закрытие\s+месяца|косвен|20\/44|account 20|account 44|сч[её]т 20|сч[её]т 44)/i.test(lower), + hasRbp: /(?:\brbp\b|рбп|account 97|сч[её]т 97|writeoff|списани)/i.test(lower), + hasFixedAsset: /(?:depreciat|amortization|fixed\s*asset|амортиз|основн(?:ые|ых)?\s+сред|объект\s+ос|сч[её]т\s*0[128]|account\s*0[128])/i.test( + lower + ) }; } +function resolveSettlementRole(input: { + claimType: ClaimType; + counterpartyScope: string[]; + accountPrefixes: Set; + userMessage: string; +}): "supplier" | "customer" | "mixed" | "unknown" | undefined { + if (input.claimType !== "prove_settlement_closure_state" && input.claimType !== "prove_advance_offset_state") { + return undefined; + } + const scopes = new Set(input.counterpartyScope.map((item) => String(item ?? "").trim().toLowerCase())); + const lower = String(input.userMessage ?? "").toLowerCase(); + const hasSupplierLexical = /(?:supplier|vendor|поставщ|кредитор|обязательств|payable)/i.test(lower); + const hasCustomerLexical = /(?:customer|buyer|покупат|дебитор|receivable)/i.test(lower); + const hasSupplierAccount = input.accountPrefixes.has("60"); + const hasCustomerAccount = input.accountPrefixes.has("62"); + const supplierSignal = scopes.has("supplier") || hasSupplierLexical || (hasSupplierAccount && !hasCustomerAccount); + const customerSignal = scopes.has("customer") || hasCustomerLexical || (hasCustomerAccount && !hasSupplierAccount); + if (supplierSignal && !customerSignal) { + return "supplier"; + } + if (customerSignal && !supplierSignal) { + return "customer"; + } + if (supplierSignal && customerSignal) { + return "mixed"; + } + return "unknown"; +} + function mergeAnchors(anchors: CompanyAnchorSet | null | undefined, key: keyof CompanyAnchorSet): string[] { return uniqueStrings(Array.isArray(anchors?.[key]) ? (anchors?.[key] as string[]) : []); } @@ -191,6 +310,22 @@ function missingFromRequired(required: string[], resolved: Record 0; + const hasDoc = (resolved.document_numbers?.length ?? 0) > 0 || (resolved.document_types?.length ?? 0) > 0; + if (!hasAmount && !hasDoc) { + missing.push(anchor); + } + continue; + } + if (anchor === "account_scope_or_document_type") { + const hasAccount = (resolved.account_scope?.length ?? 0) > 0; + const hasDocType = (resolved.document_types?.length ?? 0) > 0; + if (!hasAccount && !hasDocType) { + missing.push(anchor); + } + continue; + } if ((resolved[anchor]?.length ?? 0) <= 0) { missing.push(anchor); } @@ -206,9 +341,28 @@ export function resolveClaimBoundAnchors(input: { }): ClaimBoundAnchorAudit { const claimType = inferClaimType({ userMessage: input.userMessage, - focusDomainHint: input.focusDomainHint + focusDomainHint: input.focusDomainHint, + companyAnchors: input.companyAnchors }); const signals = detectSignals(input.userMessage); + const accountPrefixes = accountPrefixesFromAnchors(input.companyAnchors); + const includeVatAnchors = claimType === "prove_vat_chain_completeness"; + const includeMonthCloseAnchors = claimType === "prove_month_close_state"; + const includeRbpAnchors = claimType === "prove_rbp_tail_state"; + const includeFixedAssetAnchors = claimType === "prove_fixed_asset_amortization_coverage"; + const hasVatSignal = signals.hasVat || accountPrefixes.has("19") || accountPrefixes.has("68"); + const hasRbpSignal = signals.hasRbp || accountPrefixes.has("97"); + const hasFixedAssetSignal = signals.hasFixedAsset || accountPrefixes.has("01") || accountPrefixes.has("02") || accountPrefixes.has("08"); + const hasMonthCloseSignal = + signals.hasMonthClose || + accountPrefixes.has("20") || + accountPrefixes.has("21") || + accountPrefixes.has("23") || + accountPrefixes.has("25") || + accountPrefixes.has("26") || + accountPrefixes.has("28") || + accountPrefixes.has("29") || + accountPrefixes.has("44"); const resolvedAnchors: Record = { period: uniqueStrings([...mergeAnchors(input.companyAnchors, "periods"), ...mergeAnchors(input.companyAnchors, "dates")]), account_scope: mergeAnchors(input.companyAnchors, "accounts"), @@ -219,16 +373,28 @@ export function resolveClaimBoundAnchors(input: { counterparty_scope: inferCounterpartyScope(input.userMessage), advance_signal: signals.hasAdvance ? ["advance"] : [], closure_signal: signals.hasClosure ? ["closure"] : [], - vat_signal: signals.hasVat ? ["vat"] : [], - chain_signal: signals.hasVat ? ["chain"] : [], - close_signal: signals.hasMonthClose ? ["month_close"] : [], + vat_signal: includeVatAnchors && hasVatSignal ? ["vat"] : [], + chain_signal: includeVatAnchors && hasVatSignal ? ["chain"] : [], + close_signal: includeMonthCloseAnchors && hasMonthCloseSignal ? ["month_close"] : [], cost_scope: [], - rbp_signal: signals.hasRbp ? ["rbp"] : [], - writeoff_signal: signals.hasRbp ? ["writeoff"] : [] + rbp_signal: includeRbpAnchors && hasRbpSignal ? ["rbp"] : [], + writeoff_signal: includeRbpAnchors && hasRbpSignal ? ["writeoff"] : [], + fixed_asset_signal: includeFixedAssetAnchors && hasFixedAssetSignal ? ["fixed_asset"] : [], + amortization_signal: includeFixedAssetAnchors && hasFixedAssetSignal ? ["amortization"] : [], + expected_fa_set: [], + actual_fa_set: [] }; - if (/(?:^|[^\d])(20|44)(?:[^\d]|$)/.test((resolvedAnchors.account_scope ?? []).join(" ")) || signals.hasMonthClose) { + if ( + includeMonthCloseAnchors && + (/(?:^|[^\d])(20|44)(?:[^\d]|$)/.test((resolvedAnchors.account_scope ?? []).join(" ")) || hasMonthCloseSignal) + ) { resolvedAnchors.cost_scope = ["20_44"]; } + // For FA amortization claims, document type is implicit in user intent + // even when the phrase does not carry explicit document keywords. + if (includeFixedAssetAnchors && hasFixedAssetSignal && (resolvedAnchors.document_types?.length ?? 0) <= 0) { + resolvedAnchors.document_types = ["amortization_document"]; + } if (input.primaryPeriod) { resolvedAnchors.period = uniqueStrings([...(resolvedAnchors.period ?? []), input.primaryPeriod.from, input.primaryPeriod.to]); } @@ -238,7 +404,14 @@ export function resolveClaimBoundAnchors(input: { prove_advance_offset_state: ["period", "account_scope", "advance_signal", "settlement_object"], prove_vat_chain_completeness: ["period", "document_types", "vat_signal", "chain_signal"], prove_month_close_state: ["period", "close_signal", "cost_scope"], - prove_rbp_tail_state: ["period", "rbp_signal", "writeoff_signal"] + prove_rbp_tail_state: ["period", "rbp_signal", "writeoff_signal"], + prove_fixed_asset_amortization_coverage: [ + "period", + "fixed_asset_signal", + "amortization_signal", + "amount_or_document", + "account_scope_or_document_type" + ] }; const requiredAnchors = requiredByClaim[claimType]; @@ -258,9 +431,22 @@ export function resolveClaimBoundAnchors(input: { if (!allowedContextWindow && input.primaryPeriod) { reasonCodes.push("controlled_temporal_expansion_window_unavailable"); } + const settlementRole = resolveSettlementRole({ + claimType, + counterpartyScope: resolvedAnchors.counterparty_scope ?? [], + accountPrefixes, + userMessage: input.userMessage + }); + if ( + (claimType === "prove_settlement_closure_state" || claimType === "prove_advance_offset_state") && + (settlementRole === "mixed" || settlementRole === "unknown") + ) { + reasonCodes.push("unresolved_supplier_customer_polarity"); + } return { claim_type: claimType, + settlement_role: settlementRole, required_anchors: requiredAnchors, resolved_anchors: resolvedAnchors, missing_anchors: missingAnchors, @@ -288,7 +474,13 @@ function buildCorpusFromItem(item: Record): string { document_context: item.document_context, relation_pattern_hits: item.relation_pattern_hits, graph_domain_scope: item.graph_domain_scope, - lifecycle_markers: item.lifecycle_markers + lifecycle_markers: item.lifecycle_markers, + live_call_id: item.live_call_id, + live_call_purpose: item.live_call_purpose, + fa_object_hint: item.fa_object_hint, + fa_expected_set_candidate: item.fa_expected_set_candidate, + fa_actual_set_candidate: item.fa_actual_set_candidate, + fa_coverage_status: item.fa_coverage_status }).toLowerCase(); } @@ -329,6 +521,16 @@ function requiredChecksByClaim(claimType: ClaimType): string[] { if (claimType === "prove_month_close_state") { return ["close_operation_found", "distribution_step_found", "residual_tail_found"]; } + if (claimType === "prove_fixed_asset_amortization_coverage") { + return [ + "amortization_document_found", + "fixed_asset_object_identified", + "expected_fa_set_reconstructed", + "actual_fa_set_reconstructed", + "movement_or_posting_link_found", + "missing_fa_candidates_assessed" + ]; + } return [ "rbp_writeoff_document_found", "rbp_object_identified", @@ -348,21 +550,34 @@ function detectChecksForCorpus(corpus: string, claimType: ClaimType, anchors: Re const hasSettlementAccount = /(?:\b60(?:\.\d{2})?\b|\b62(?:\.\d{2})?\b|payable|receivable|settlement)/i.test(corpus); const hasPosting = /(?:document_to_posting|posting|проводк)/i.test(corpus); const hasRegister = /(?:register|accumulationregister|accountingregister|регистр)/i.test(corpus); - const hasClose = /(?:close|closure|закрыт|reconcile|зачет|tail|хвост)/i.test(corpus); + const hasClose = /(?:close|closure|закрыт|reconcile|зач[её]т|tail|хвост)/i.test(corpus); const hasPayment = /(?:payment|оплат|списаниесрасчетногосчета|payment_order|bank_statement)/i.test(corpus); - const hasAdvance = /(?:advance|аванс|offset|зачет|62\.02|60\.02)/i.test(corpus); - const hasVat = /(?:\bvat\b|ндс|invoice_to_vat|счет[- ]фактур|invoice)/i.test(corpus); - const hasBook = /(?:книгипокупок|книгипродаж|book)/i.test(corpus); + const hasAdvance = /(?:advance|аванс|offset|зач[её]т|62\.02|60\.02)/i.test(corpus); + const hasVat = /(?:\bvat\b|ндс|invoice_to_vat|сч[её]т[- ]?фактур|invoice)/i.test(corpus); + const hasBook = /(?:книг[аи](?:\s+)?(?:покупок|продаж)|book)/i.test(corpus); const hasChain = /(?:chain|link|document_to_posting|invoice_to_vat|связ)/i.test(corpus); - const hasMonthClose = /(?:month[- ]?close|period_close|закрытие месяца|косвен|20|44)/i.test(corpus); + const hasMonthClose = /(?:month[- ]?close|period_close|закрытие\s+месяца|косвен|20|44)/i.test(corpus); const hasDistribution = /(?:distribution|распредел|writeoff|deferred_expense_to_writeoff)/i.test(corpus); - const hasRbp = /(?:\brbp\b|рбп|account\s*97|счет\s*97|deferred)/i.test(corpus); + const hasRbp = /(?:\brbp\b|рбп|account\s*97|сч[её]т\s*97|deferred)/i.test(corpus); const hasResidual = /(?:tail|остат|незакры|overdue|period_boundary|terminal_state_gap)/i.test(corpus); const hasContradiction = /(?:contradiction|invalid_transition|normal residual|нормальн)/i.test(corpus); const hasRbpWriteoffDoc = /(?:списани[ея]\s+рбп|rbp_writeoff|deferred_expense_document|writeoff document)/i.test(corpus); const hasRbpObject = /(?:rbp[_\s-]?object|объект\s+рбп|analytics|subkonto|расходыбудущихпериодов)/i.test(corpus); const hasMovement = /(?:movement|движен|хозрасчетный|document_to_posting|posting|проводк)/i.test(corpus); const hasPeriodEndResidual = /(?:period_boundary|end_period|2020-07-31|остат)/i.test(corpus); + const hasFixedAsset = /(?:fixed_asset|asset_card|объект\s+ос|основн(?:ые|ых)?\s+сред|depreciat|амортиз|account[:\s]*0[12]|\b0[12](?:\.\d{2})?\b)/i.test( + corpus + ); + const hasAmortizationDoc = /(?:depreciat|amortization|начислен[а-я]*\s+амортиз|документ\s+амортиз)/i.test(corpus); + const hasExpectedFaSet = /(?:expected_fa_set|expected[_\s-]?set|find_fixed_asset_cards_expected_for_period|expected_set_seed|fa_expected_set_candidate)/i.test( + corpus + ); + const hasActualFaSet = /(?:actual_fa_set|find_fixed_asset_movements_accounts_01_02|fa_actual_set_candidate|seed_amortization_documents|collect_fa_object_movements)/i.test( + corpus + ); + const hasFaCoverageCompare = /(?:expected_vs_actual|compare_expected_vs_actual|missing_fa|coverage_compare|missing_fa_candidates)/i.test( + corpus + ); if (claimType === "prove_settlement_closure_state") { if (hasPayment) checks.add("payment_document_found"); @@ -380,7 +595,7 @@ function detectChecksForCorpus(corpus: string, claimType: ClaimType, anchors: Re if (hasPosting) checks.add("posting_link_found"); } else if (claimType === "prove_vat_chain_completeness") { if (/(?:document|receipt|realization|поступлен|реализац)/i.test(corpus)) checks.add("source_document_found"); - if (/(?:invoice|счет[- ]фактур)/i.test(corpus)) checks.add("invoice_found"); + if (/(?:invoice|сч[её]т[- ]?фактур)/i.test(corpus)) checks.add("invoice_found"); if (hasRegister || hasVat) checks.add("tax_register_entry_found"); if (hasBook) checks.add("book_entry_found"); if (hasChain) checks.add("chain_linkage_status"); @@ -388,6 +603,13 @@ function detectChecksForCorpus(corpus: string, claimType: ClaimType, anchors: Re if (hasMonthClose || hasClose) checks.add("close_operation_found"); if (hasDistribution) checks.add("distribution_step_found"); if (hasResidual) checks.add("residual_tail_found"); + } else if (claimType === "prove_fixed_asset_amortization_coverage") { + if (hasAmortizationDoc) checks.add("amortization_document_found"); + if (hasFixedAsset) checks.add("fixed_asset_object_identified"); + if (hasExpectedFaSet) checks.add("expected_fa_set_reconstructed"); + if (hasActualFaSet || hasAmortizationDoc) checks.add("actual_fa_set_reconstructed"); + if (hasMovement || hasPosting) checks.add("movement_or_posting_link_found"); + if (hasFaCoverageCompare || (hasExpectedFaSet && hasActualFaSet)) checks.add("missing_fa_candidates_assessed"); } else { if (hasRbpWriteoffDoc || (hasRbp && hasDistribution)) checks.add("rbp_writeoff_document_found"); if (hasRbpObject || hasRbp) checks.add("rbp_object_identified"); @@ -540,7 +762,11 @@ function buildDerivedEvidenceFromItem(input: { account_context: Array.isArray(input.item.account_context) ? input.item.account_context : [], account_debit: input.item.account_debit ?? null, account_credit: input.item.account_credit ?? null, - relation_pattern_hits: Array.isArray(input.item.relation_pattern_hits) ? input.item.relation_pattern_hits : [] + relation_pattern_hits: Array.isArray(input.item.relation_pattern_hits) ? input.item.relation_pattern_hits : [], + fa_object_hint: String(input.item.fa_object_hint ?? "").trim() || null, + fa_expected_set_candidate: Boolean(input.item.fa_expected_set_candidate), + fa_actual_set_candidate: Boolean(input.item.fa_actual_set_candidate), + fa_coverage_status: String(input.item.fa_coverage_status ?? "").trim() || null } }; } @@ -553,6 +779,189 @@ function buildClaimStatusTemplate(requiredChecks: string[]): Record; +} { + const state = new Map< + string, + { + expected: boolean; + actual: boolean; + movement: boolean; + posting: boolean; + docs: Set; + periods: Set; + } + >(); + + const touch = (objectName: string) => { + const key = objectName.toLowerCase(); + const existing = state.get(key); + if (existing) { + return existing; + } + const created = { + expected: false, + actual: false, + movement: false, + posting: false, + docs: new Set(), + periods: new Set() + }; + state.set(key, created); + return created; + }; + + for (const result of input.retrievalResults) { + const items = Array.isArray(result.items) ? result.items : []; + for (const item of items) { + const objectToken = normalizeFaObjectToken( + String(item.fa_object_hint ?? item.display_name ?? item.source_id ?? "").trim() + ); + if (!objectToken) { + continue; + } + const slot = touch(objectToken); + if (Boolean(item.fa_expected_set_candidate)) { + slot.expected = true; + } + if (Boolean(item.fa_actual_set_candidate)) { + slot.actual = true; + } + const corpus = JSON.stringify(item).toLowerCase(); + if (/(?:movement|движен|хозрасчет|document_to_posting)/i.test(corpus)) { + slot.movement = true; + } + if (/(?:posting|проводк|account_)/i.test(corpus)) { + slot.posting = true; + } + const documentContext = Array.isArray(item.document_context) ? item.document_context : []; + for (const doc of documentContext) { + const token = String(doc ?? "").trim(); + if (token) { + slot.docs.add(token); + } + } + const period = String(item.period ?? item.Period ?? "").trim(); + if (period) { + slot.periods.add(period); + } + } + + const evidence = Array.isArray(result.evidence) ? result.evidence : []; + for (const evidenceItem of evidence) { + const payload = toObject(evidenceItem.payload) ?? {}; + const objectToken = normalizeFaObjectToken( + String(payload.fa_object_hint ?? evidenceItem.source_ref?.id ?? evidenceItem.pointer?.source?.id ?? "").trim() + ); + if (!objectToken) { + continue; + } + const slot = touch(objectToken); + if (Boolean(payload.fa_expected_set_candidate)) { + slot.expected = true; + } + if (Boolean(payload.fa_actual_set_candidate)) { + slot.actual = true; + } + const corpus = JSON.stringify({ + payload, + mechanism_note: evidenceItem.mechanism_note, + source_ref: evidenceItem.source_ref + }).toLowerCase(); + if (/(?:movement|движен|хозрасчет|document_to_posting)/i.test(corpus)) { + slot.movement = true; + } + if (/(?:posting|проводк|account_)/i.test(corpus)) { + slot.posting = true; + } + const documentContext = Array.isArray(payload.document_context) ? payload.document_context : []; + for (const doc of documentContext) { + const token = String(doc ?? "").trim(); + if (token) { + slot.docs.add(token); + } + } + const period = periodFromEvidence(evidenceItem); + if (period) { + slot.periods.add(period); + } + } + } + + const entries = Array.from(state.entries()); + const expectedSet = entries + .filter(([, slot]) => slot.expected) + .map(([objectName]) => objectName) + .slice(0, 32); + const actualSet = entries + .filter(([, slot]) => slot.actual) + .map(([objectName]) => objectName) + .slice(0, 32); + const expectedResolved = expectedSet.length > 0 ? expectedSet : actualSet; + const missingCandidates = expectedResolved.filter((item) => !actualSet.includes(item)).slice(0, 32); + const uncertainCandidates = entries + .filter(([, slot]) => !slot.expected && !slot.actual) + .map(([objectName]) => objectName) + .slice(0, 32); + const relationMap = entries.slice(0, 48).map(([objectName, slot]) => { + const coverageStatus: "covered" | "missing" | "uncertain" = + slot.expected && slot.actual ? "covered" : slot.expected && !slot.actual ? "missing" : "uncertain"; + return { + fa_object: objectName, + document_amortization: Array.from(slot.docs).slice(0, 4), + movement: slot.movement, + posting: slot.posting, + period: Array.from(slot.periods).slice(0, 4), + coverage_status: coverageStatus + }; + }); + + return { + expectedSet: expectedResolved, + actualSet, + missingCandidates, + uncertainCandidates, + relationMap + }; +} + export function applyTargetedEvidenceAcquisition(input: { retrievalResults: UnifiedRetrievalResult[]; claimAudit: ClaimBoundAnchorAudit; @@ -673,6 +1082,21 @@ export function applyTargetedEvidenceAcquisition(input: { reasonCodes.push("targeted_evidence_hit_rate_low"); } + const faCoverage = + input.claimAudit.claim_type === "prove_fixed_asset_amortization_coverage" + ? collectFaCoverage({ + retrievalResults: adjustedResults + }) + : null; + if (faCoverage) { + if (faCoverage.expectedSet.length <= 0) { + reasonCodes.push("fa_expected_set_not_reconstructed"); + } + if (faCoverage.actualSet.length <= 0) { + reasonCodes.push("fa_actual_set_not_reconstructed"); + } + } + return { retrievalResults: adjustedResults, audit: { @@ -683,7 +1107,18 @@ export function applyTargetedEvidenceAcquisition(input: { targeted_evidence_hits: targetedEvidenceHits, targeted_evidence_hit_rate: targetedEvidenceHitRate, targeted_evidence_source_refs: Array.from(sourceRefs).slice(0, 24), + ...(faCoverage + ? { + fa_expected_set: faCoverage.expectedSet, + fa_actual_set_from_amortization: faCoverage.actualSet, + fa_missing_candidates: faCoverage.missingCandidates, + fa_uncertain_candidates: faCoverage.uncertainCandidates, + fa_relation_map: faCoverage.relationMap + } + : {}), reason_codes: uniqueStrings(reasonCodes) } }; } + + diff --git a/llm_normalizer/backend/src/services/assistantDataLayer.ts b/llm_normalizer/backend/src/services/assistantDataLayer.ts index 53869c3..3ccbcf5 100644 --- a/llm_normalizer/backend/src/services/assistantDataLayer.ts +++ b/llm_normalizer/backend/src/services/assistantDataLayer.ts @@ -12,6 +12,7 @@ import { FEATURE_ASSISTANT_MCP_RUNTIME_V1, FEATURE_ASSISTANT_MIN_EVIDENCE_GATE_V1 } from "../config"; +import { inferP0DomainFromMessage as inferRuntimeP0DomainHint } from "./investigationState"; interface SnapshotLink { relation: string; @@ -73,6 +74,7 @@ interface LiveMcpCallPlan { call_id: string; purpose: string; query: string; + limit?: number; required_for_claim: boolean; account_scope_override?: string[]; }>; @@ -82,6 +84,7 @@ interface LiveMcpCallPlan { interface LiveMcpCallExecution { call_id: string; purpose: string; + requested_limit: number; required_for_claim: boolean; status: "ok" | "empty" | "error"; fetched_rows: number; @@ -197,6 +200,23 @@ const RBP_REQUIRED_LIVE_CALLS = [ "compute_end_period_residual_by_rbp_object" ]; +const VAT_REQUIRED_LIVE_CALLS = [ + "find_vat_source_documents_in_period", + "find_vat_invoice_links_in_period", + "find_vat_register_entries_in_period", + "find_vat_book_entries_in_period" +]; + +const FA_REQUIRED_LIVE_CALLS = [ + "find_amortization_documents_in_period", + "find_fixed_asset_movements_accounts_01_02", + "find_fixed_asset_cards_expected_for_period", + "match_expected_vs_actual_fa_coverage" +]; + +const CLAIM_BOUND_PRIMARY_LIVE_LIMIT = Math.max(ASSISTANT_MCP_LIVE_LIMIT, 96); +const CLAIM_BOUND_CARRY_WINDOW_LIVE_LIMIT = Math.max(ASSISTANT_MCP_LIVE_LIMIT, 128); + function pushUniqueLine(target: string[], line: string): void { if (!target.includes(line)) { target.push(line); @@ -228,6 +248,13 @@ function parseFiniteNumber(value: unknown): number | null { return null; } +function resolveLiveCallLimit(limit: unknown): number { + if (typeof limit === "number" && Number.isFinite(limit)) { + return Math.max(1, Math.trunc(limit)); + } + return ASSISTANT_MCP_LIVE_LIMIT; +} + function formatIsoDateUtc(date: Date): string { const year = date.getUTCFullYear(); const month = String(date.getUTCMonth() + 1).padStart(2, "0"); @@ -296,9 +323,119 @@ function hasRbpSignal(text: string): boolean { ); } +function hasFixedAssetAmortizationSignal(text: string): boolean { + return /(?:амортиз|основн(?:ые|ых)?\s+сред|(?:^|[^a-zа-яё])ос(?:$|[^a-zа-яё])|depreciat|fixed\s*asset|account\s*0[12]|счет\s*0[12])/i.test( + String(text ?? "").toLowerCase() + ); +} + function buildLiveMcpCallPlan(route: string, fragmentText: string): LiveMcpCallPlan { const semanticProfile = buildSemanticRetrievalProfile(fragmentText); + const preferredDomainHint = inferRuntimeP0DomainHint(fragmentText); + const periodScope = inferPeriodScope(fragmentText); + const primaryFrom = periodScope.from ?? "2020-07-01"; + const primaryTo = periodScope.to ?? monthEndFromIso(primaryFrom) ?? "2020-07-31"; + const carryFrom = shiftIsoDate(primaryFrom, -31) ?? primaryFrom; + const carryTo = shiftIsoDate(primaryTo, 31) ?? primaryTo; + + const faClaim = + preferredDomainHint === "fixed_asset_amortization" || + hasFixedAssetAmortizationSignal(fragmentText) || + semanticProfile.query_subject === "fixed_asset_card_mismatch" || + semanticProfile.domain_scope.includes("fixed_assets"); + if (faClaim) { + return { + claim_type: "prove_fixed_asset_amortization_coverage", + query_subject: "fixed_asset_amortization_coverage", + required_live_calls: [...FA_REQUIRED_LIVE_CALLS], + calls: [ + { + call_id: "find_amortization_documents_in_period", + purpose: "seed_amortization_documents", + query: buildLiveRangeQuery(primaryFrom, primaryTo, CLAIM_BOUND_PRIMARY_LIVE_LIMIT), + limit: CLAIM_BOUND_PRIMARY_LIVE_LIMIT, + required_for_claim: true, + account_scope_override: ["01", "02", "08"] + }, + { + call_id: "find_fixed_asset_movements_accounts_01_02", + purpose: "collect_fa_object_movements", + query: buildLiveRangeQuery(primaryFrom, primaryTo, CLAIM_BOUND_PRIMARY_LIVE_LIMIT), + limit: CLAIM_BOUND_PRIMARY_LIVE_LIMIT, + required_for_claim: true, + account_scope_override: ["01", "02", "08"] + }, + { + call_id: "find_fixed_asset_cards_expected_for_period", + purpose: "build_expected_fa_set", + query: buildLiveRangeQuery(carryFrom, primaryTo, CLAIM_BOUND_CARRY_WINDOW_LIVE_LIMIT), + limit: CLAIM_BOUND_CARRY_WINDOW_LIVE_LIMIT, + required_for_claim: true, + account_scope_override: ["01", "02", "08"] + }, + { + call_id: "match_expected_vs_actual_fa_coverage", + purpose: "compare_expected_vs_actual_fa_coverage", + query: buildLiveRangeQuery(carryFrom, carryTo, CLAIM_BOUND_CARRY_WINDOW_LIVE_LIMIT), + limit: CLAIM_BOUND_CARRY_WINDOW_LIVE_LIMIT, + required_for_claim: true, + account_scope_override: ["01", "02", "08"] + } + ], + route_gap_reason: null + }; + } + + const vatClaim = + preferredDomainHint === "vat_document_register_book" || + semanticProfile.query_subject === "vat_chain_conflict" || + semanticProfile.domain_scope.includes("vat") || + /(?:\bvat\b|ндс|invoice|счет[- ]фактур|книга покупок|книга продаж|register)/i.test(String(fragmentText ?? "").toLowerCase()); + if (vatClaim) { + return { + claim_type: "prove_vat_chain_completeness", + query_subject: "vat_chain_conflict", + required_live_calls: [...VAT_REQUIRED_LIVE_CALLS], + calls: [ + { + call_id: "find_vat_source_documents_in_period", + purpose: "seed_vat_source_documents", + query: buildLiveRangeQuery(primaryFrom, primaryTo, CLAIM_BOUND_PRIMARY_LIVE_LIMIT), + limit: CLAIM_BOUND_PRIMARY_LIVE_LIMIT, + required_for_claim: true, + account_scope_override: ["19", "68"] + }, + { + call_id: "find_vat_invoice_links_in_period", + purpose: "collect_invoice_links", + query: buildLiveRangeQuery(primaryFrom, primaryTo, CLAIM_BOUND_PRIMARY_LIVE_LIMIT), + limit: CLAIM_BOUND_PRIMARY_LIVE_LIMIT, + required_for_claim: true, + account_scope_override: ["19", "68"] + }, + { + call_id: "find_vat_register_entries_in_period", + purpose: "collect_vat_register_entries", + query: buildLiveRangeQuery(primaryFrom, primaryTo, CLAIM_BOUND_PRIMARY_LIVE_LIMIT), + limit: CLAIM_BOUND_PRIMARY_LIVE_LIMIT, + required_for_claim: true, + account_scope_override: ["19", "68"] + }, + { + call_id: "find_vat_book_entries_in_period", + purpose: "collect_vat_book_entries", + query: buildLiveRangeQuery(carryFrom, carryTo, CLAIM_BOUND_CARRY_WINDOW_LIVE_LIMIT), + limit: CLAIM_BOUND_CARRY_WINDOW_LIVE_LIMIT, + required_for_claim: true, + account_scope_override: ["19", "68"] + } + ], + route_gap_reason: null + }; + } + const rbpClaim = + (preferredDomainHint === "month_close_costs_20_44" && hasRbpSignal(fragmentText)) || hasRbpSignal(fragmentText) || semanticProfile.query_subject === "deferred_expense_lifecycle_anomaly" || semanticProfile.domain_scope.includes("deferred_expense"); @@ -319,46 +456,44 @@ function buildLiveMcpCallPlan(route: string, fragmentText: string): LiveMcpCallP }; } - const periodScope = inferPeriodScope(fragmentText); - const primaryFrom = periodScope.from ?? "2020-07-01"; - const primaryTo = periodScope.to ?? monthEndFromIso(primaryFrom) ?? "2020-07-31"; - const carryFrom = shiftIsoDate(primaryFrom, -31) ?? primaryFrom; - const carryTo = shiftIsoDate(primaryTo, 31) ?? primaryTo; - return { claim_type: "prove_rbp_tail_state", query_subject: "deferred_expense_lifecycle_anomaly", required_live_calls: [...RBP_REQUIRED_LIVE_CALLS], calls: [ - { - call_id: "find_rbp_writeoff_documents_in_period", - purpose: "seed_writeoff_documents", - query: buildLiveRangeQuery(primaryFrom, primaryTo, ASSISTANT_MCP_LIVE_LIMIT), - required_for_claim: true, - account_scope_override: ["97", "20", "25", "26", "44"] - }, - { - call_id: "find_rbp_object_movements_account_97", - purpose: "collect_rbp_object_movements", - query: buildLiveRangeQuery(primaryFrom, primaryTo, ASSISTANT_MCP_LIVE_LIMIT), - required_for_claim: true, - account_scope_override: ["97"] - }, - { - call_id: "find_month_close_entries_linked_to_rbp", - purpose: "link_month_close_to_rbp", - query: buildLiveRangeQuery(primaryFrom, primaryTo, ASSISTANT_MCP_LIVE_LIMIT), - required_for_claim: true, - account_scope_override: ["97", "20", "25", "26", "44"] - }, - { - call_id: "compute_end_period_residual_by_rbp_object", - purpose: "collect_residual_tail_signals", - query: buildLiveRangeQuery(carryFrom, carryTo, ASSISTANT_MCP_LIVE_LIMIT), - required_for_claim: true, - account_scope_override: ["97", "20", "25", "26", "44"] - } - ], + { + call_id: "find_rbp_writeoff_documents_in_period", + purpose: "seed_writeoff_documents", + query: buildLiveRangeQuery(primaryFrom, primaryTo, CLAIM_BOUND_PRIMARY_LIVE_LIMIT), + limit: CLAIM_BOUND_PRIMARY_LIVE_LIMIT, + required_for_claim: true, + account_scope_override: ["97", "20", "25", "26", "44"] + }, + { + call_id: "find_rbp_object_movements_account_97", + purpose: "collect_rbp_object_movements", + query: buildLiveRangeQuery(primaryFrom, primaryTo, CLAIM_BOUND_PRIMARY_LIVE_LIMIT), + limit: CLAIM_BOUND_PRIMARY_LIVE_LIMIT, + required_for_claim: true, + account_scope_override: ["97"] + }, + { + call_id: "find_month_close_entries_linked_to_rbp", + purpose: "link_month_close_to_rbp", + query: buildLiveRangeQuery(primaryFrom, primaryTo, CLAIM_BOUND_PRIMARY_LIVE_LIMIT), + limit: CLAIM_BOUND_PRIMARY_LIVE_LIMIT, + required_for_claim: true, + account_scope_override: ["97", "20", "25", "26", "44"] + }, + { + call_id: "compute_end_period_residual_by_rbp_object", + purpose: "collect_residual_tail_signals", + query: buildLiveRangeQuery(carryFrom, carryTo, CLAIM_BOUND_CARRY_WINDOW_LIVE_LIMIT), + limit: CLAIM_BOUND_CARRY_WINDOW_LIVE_LIMIT, + required_for_claim: true, + account_scope_override: ["97", "20", "25", "26", "44"] + } + ], route_gap_reason: null }; } @@ -1614,11 +1749,32 @@ const WRONG_DOCUMENT_MARKERS = const REPEATED_ANOMALY_MARKERS = /(?:\u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449|\u0441\u0435\u0440\u0438\u0439\u043d|\u043f\u0430\u0442\u0442\u0435\u0440\u043d|repeat(?:ed|ability)?)/iu; -function inferQuerySubject(text: string, domains: string[], anomalies: string[]): string { +function inferQuerySubject( + text: string, + domains: string[], + anomalies: string[], + preferredDomainHint: string | null +): string { + if (preferredDomainHint === "vat_document_register_book") { + return "vat_chain_conflict"; + } + if (preferredDomainHint === "fixed_asset_amortization") { + return "fixed_asset_card_mismatch"; + } + if (preferredDomainHint === "month_close_costs_20_44") { + return "period_closure_risk"; + } + if (preferredDomainHint === "settlements_60_62") { + return "supplier_tail_analysis"; + } + const lower = text.toLowerCase(); if ((domains.includes("bank") || domains.includes("settlements")) && WRONG_DOCUMENT_MARKERS.test(lower)) { return "bank_settlement_mismatch"; } + if (domains.includes("vat")) { + return "vat_chain_conflict"; + } if (domains.includes("suppliers")) { return "supplier_tail_analysis"; } @@ -1631,9 +1787,6 @@ function inferQuerySubject(text: string, domains: string[], anomalies: string[]) if (domains.includes("fixed_assets")) { return "fixed_asset_card_mismatch"; } - if (domains.includes("vat")) { - return "vat_chain_conflict"; - } if (domains.includes("period_close")) { return "period_closure_risk"; } @@ -1784,9 +1937,10 @@ function buildSemanticRetrievalProfile(fragmentText: string): SemanticRetrievalP relationPatterns: dedupedRelations, anomalyPatterns: dedupedAnomalies }); + const preferredDomainHint = inferRuntimeP0DomainHint(fragmentText); return { - query_subject: inferQuerySubject(lower, dedupedDomains, dedupedAnomalies), + query_subject: inferQuerySubject(lower, dedupedDomains, dedupedAnomalies, preferredDomainHint), account_scope: dedupedAccounts, subaccount_scope: [], domain_scope: dedupedDomains, @@ -2773,11 +2927,15 @@ export class AssistantDataLayer { const livePlan = buildLiveMcpCallPlan(route, fragmentText); const explicitAccountScope = extractAccountScopeFromText(fragmentText); const accountScope = - explicitAccountScope.length > 0 + livePlan.claim_type === "prove_fixed_asset_amortization_coverage" + ? ["01", "02", "08"] + : livePlan.claim_type === "prove_vat_chain_completeness" + ? ["19", "68"] + : livePlan.claim_type === "prove_rbp_tail_state" + ? ["97", "20", "25", "26", "44"] + : explicitAccountScope.length > 0 ? explicitAccountScope - : livePlan.claim_type === "prove_rbp_tail_state" - ? ["97", "20", "25", "26", "44"] - : []; + : []; const callExecutions: LiveMcpCallExecution[] = []; const collectedRows: Array> = []; const errors: string[] = []; @@ -2785,6 +2943,7 @@ export class AssistantDataLayer { let matchedRowsTotal = 0; for (const call of livePlan.calls) { + const callLimit = resolveLiveCallLimit(call.limit); const callAccountScope = Array.isArray(call.account_scope_override) && call.account_scope_override.length > 0 ? call.account_scope_override @@ -2792,7 +2951,7 @@ export class AssistantDataLayer { try { const payload = await this.fetchJsonWithTimeout(endpoint, { query: call.query, - limit: ASSISTANT_MCP_LIVE_LIMIT + limit: callLimit }); const parsed = this.parseExecuteQueryPayload(payload); if (parsed.error) { @@ -2800,6 +2959,7 @@ export class AssistantDataLayer { callExecutions.push({ call_id: call.call_id, purpose: call.purpose, + requested_limit: callLimit, required_for_claim: call.required_for_claim, status: "error", fetched_rows: 0, @@ -2827,6 +2987,7 @@ export class AssistantDataLayer { callExecutions.push({ call_id: call.call_id, purpose: call.purpose, + requested_limit: callLimit, required_for_claim: call.required_for_claim, status: rowsForAnswer.length > 0 ? "ok" : "empty", fetched_rows: parsed.rows.length, @@ -2840,6 +3001,7 @@ export class AssistantDataLayer { callExecutions.push({ call_id: call.call_id, purpose: call.purpose, + requested_limit: callLimit, required_for_claim: call.required_for_claim, status: "error", fetched_rows: 0, @@ -2864,7 +3026,11 @@ export class AssistantDataLayer { lifecycle_markers: item.lifecycle_markers, live_call_id: item.live_call_id, live_call_purpose: item.live_call_purpose, - claim_type: item.claim_type + claim_type: item.claim_type, + fa_object_hint: item.fa_object_hint, + fa_expected_set_candidate: item.fa_expected_set_candidate, + fa_actual_set_candidate: item.fa_actual_set_candidate, + fa_coverage_status: item.fa_coverage_status })); const executedRequiredCalls = callExecutions @@ -2917,7 +3083,13 @@ export class AssistantDataLayer { route, channel: ASSISTANT_MCP_CHANNEL, proxy: ASSISTANT_MCP_PROXY_URL, - source_profile: livePlan.claim_type ? "claim_bound_rbp_live_path" : "generic_live_probe", + source_profile: livePlan.claim_type === "prove_rbp_tail_state" + ? "claim_bound_rbp_live_path" + : livePlan.claim_type === "prove_fixed_asset_amortization_coverage" + ? "claim_bound_fa_live_path" + : livePlan.claim_type === "prove_vat_chain_completeness" + ? "claim_bound_vat_live_path" + : "generic_live_probe", claim_type: livePlan.claim_type, query_subject: livePlan.query_subject, account_scope: accountScope, @@ -3111,29 +3283,57 @@ export class AssistantDataLayer { const querySubject = valueAsString(row.__query_subject ?? "").trim() || null; const registratorLower = registrator.toLowerCase(); const hasRbpByDocument = /(?:рбп|deferred|списани[ея]\s+рбп)/i.test(registratorLower); + const hasFaByDocument = /(?:амортиз|depreciat|основн(?:ые|ых)\s+сред|fixed\s*asset)/i.test(registratorLower); const hasAccount97 = accountContext.some((item) => /^97(?:\.|$)/.test(item)); + const hasFixedAssetAccount = accountContext.some((item) => /^(?:01|02|08)(?:\.|$)/.test(item)); const hasCloseDoc = /(?:закрыти[ея]\s+месяц|period\s*close|month\s*close|close\s+operation)/i.test(registratorLower) || callId.includes("month_close"); + const faExpectedSetCandidate = callId === "find_fixed_asset_cards_expected_for_period" || callPurpose === "build_expected_fa_set"; + const faActualSetCandidate = + callId === "find_amortization_documents_in_period" || + callId === "find_fixed_asset_movements_accounts_01_02" || + callPurpose === "seed_amortization_documents" || + callPurpose === "collect_fa_object_movements"; + const faCoverageStatus = + callId === "match_expected_vs_actual_fa_coverage" + ? "expected_vs_actual_compare" + : faExpectedSetCandidate && faActualSetCandidate + ? "covered" + : faExpectedSetCandidate + ? "expected_only" + : faActualSetCandidate + ? "actual_only" + : null; + const faObjectHint = + (registrator || "").trim() || + `${debit || "n/a"}|${credit || "n/a"}|${amount !== null ? amount : "n/a"}`; const relationPatternHits = uniqueStrings([ "document_to_posting", hasRbpByDocument || hasAccount97 ? "deferred_expense_to_writeoff" : "", + hasFaByDocument || hasFixedAssetAccount ? "asset_card_to_depreciation" : "", + faCoverageStatus === "expected_vs_actual_compare" ? "expected_vs_actual_coverage_compare" : "", hasCloseDoc ? "close_operation" : "", callId.includes("residual") ? "residuals_zero_or_explained" : "" ]); const documentContext = uniqueStrings([ hasRbpByDocument || hasAccount97 ? "deferred_expense_document" : "", + hasFaByDocument || hasFixedAssetAccount ? "depreciation_document" : "", hasCloseDoc ? "period_close_document" : "", "posting" ]); const graphDomainScope = uniqueStrings([ hasRbpByDocument || hasAccount97 ? "deferred_expense" : "", + hasFaByDocument || hasFixedAssetAccount ? "fixed_asset" : "", hasCloseDoc ? "period_close" : "" ]); const lifecycleMarkers = uniqueStrings([ callId.includes("residual") ? "period_boundary" : "", callId.includes("residual") ? "tail_state_observed" : "", - hasCloseDoc ? "close_operation" : "" + hasCloseDoc ? "close_operation" : "", + hasFaByDocument || hasFixedAssetAccount ? "amortization_accrual" : "", + faExpectedSetCandidate ? "expected_set_seed" : "", + faCoverageStatus === "expected_vs_actual_compare" ? "coverage_compare" : "" ]); return { source_entity: "MCPLiveMovement", @@ -3153,6 +3353,10 @@ export class AssistantDataLayer { claim_type: claimType, query_subject: querySubject, amount, + fa_object_hint: faObjectHint, + fa_expected_set_candidate: faExpectedSetCandidate, + fa_actual_set_candidate: faActualSetCandidate, + fa_coverage_status: faCoverageStatus, source_layer: "mcp_live_probe", route }; diff --git a/llm_normalizer/backend/src/services/assistantRuntimeGuards.ts b/llm_normalizer/backend/src/services/assistantRuntimeGuards.ts index 8873bec..2ae7aea 100644 --- a/llm_normalizer/backend/src/services/assistantRuntimeGuards.ts +++ b/llm_normalizer/backend/src/services/assistantRuntimeGuards.ts @@ -5,7 +5,12 @@ import type { EvidenceItem } from "../types/stage1Contracts"; import type { ProblemUnit } from "../types/stage2ProblemUnits"; import type { ClaimBoundAnchorAudit } from "./assistantClaimBoundEvidence"; -type P0DomainHint = "settlements_60_62" | "vat_document_register_book" | "month_close_costs_20_44" | null; +type P0DomainHint = + | "settlements_60_62" + | "vat_document_register_book" + | "month_close_costs_20_44" + | "fixed_asset_amortization" + | null; const JULY_YEAR = "2020"; const JULY_MONTH = "07"; @@ -161,10 +166,37 @@ function collectPercentLikeSpans(text: string): Array<{ start: number; end: numb return spans; } +function collectContractLikeSpans(text: string): Array<{ start: number; end: number }> { + const spans: Array<{ start: number; end: number }> = []; + const patterns = [ + /(?:\b(?:договор(?:а|у|ом|е)?|contract)\b[^\r\n]{0,24}(?:№|#|n|no\.?)\s*[a-zа-я0-9][a-zа-я0-9/_-]{1,})/giu, + /(?:№|#)\s*[a-zа-я0-9_-]{1,10}\/[a-zа-я0-9_-]{1,12}/giu, + /\b\d{2}\/\d{2}(?:-[a-zа-я]{1,10})?\b/giu + ]; + for (const pattern of patterns) { + let match: RegExpExecArray | null = null; + while ((match = pattern.exec(text)) !== null) { + spans.push({ + start: match.index, + end: match.index + match[0].length + }); + } + } + return spans; +} + function intersectsSpan(start: number, end: number, spans: Array<{ start: number; end: number }>): boolean { return spans.some((span) => start < span.end && end > span.start); } +function hasAccountContextAround(text: string, start: number, end: number): boolean { + const left = text.slice(Math.max(0, start - 28), start); + const right = text.slice(end, Math.min(text.length, end + 28)); + return /(?:счет|сч\.?|account|schet|оплат|расч[её]т|расчет|аванс|зач[её]т|долг|постав|покуп|supplier|customer|settlement|payment|ндс|vat|проводк|posting)/iu.test( + `${left} ${right}` + ); +} + interface AccountExtractionAudit { resolved_account_anchors: string[]; raw_numeric_tokens: string[]; @@ -181,7 +213,12 @@ function extractAccountsFromTextDetailed(text: string, options?: { forceAccountC const dateSpans = collectDateLikeSpans(lower); const amountSpans = collectAmountLikeSpans(lower); const percentSpans = collectPercentLikeSpans(lower); - const blockedSpans = [...dateSpans, ...amountSpans, ...percentSpans]; + const contractSpans = collectContractLikeSpans(lower); + const blockedSpans = [...dateSpans, ...amountSpans, ...percentSpans, ...contractSpans]; + const hasAccountingLexeme = + /(?:\bсчет(?:а|у|ом|ов)?\b|\bсч\.?\b|\baccount(?:s)?\b|\bschet(?:a|u|om|ov)?\b|оплат|расч[её]т|расчет|аванс|долг|settlement|payment|supplier|customer|постав|покуп)/iu.test( + lower + ); const contextualPattern = /(?:\b(?:счет(?:а|у|ом|ов)?|сч\.?|account(?:s)?|schet(?:a|u|om|ov)?)\b\s*(?:№|#|:)?\s*)(\d{2}(?:\.\d{2})?)/giu; let contextualMatch: RegExpExecArray | null = null; @@ -246,6 +283,14 @@ function extractAccountsFromTextDetailed(text: string, options?: { forceAccountC rejectedAsNonAccounts.add(token); continue; } + if (intersectsSpan(start, end, contractSpans)) { + classifiedNumericTokens.push({ + token, + classification: "other_numeric" + }); + rejectedAsNonAccounts.add(token); + continue; + } if (!prefix || !KNOWN_ACCOUNT_PREFIXES.has(prefix)) { classifiedNumericTokens.push({ token, @@ -254,6 +299,14 @@ function extractAccountsFromTextDetailed(text: string, options?: { forceAccountC rejectedAsNonAccounts.add(token); continue; } + if (!hasAccountingLexeme || !hasAccountContextAround(lower, start, end)) { + classifiedNumericTokens.push({ + token, + classification: "other_numeric" + }); + rejectedAsNonAccounts.add(token); + continue; + } accounts.add(token); classifiedNumericTokens.push({ token, @@ -509,7 +562,7 @@ function resolveJulyAnchor(rawText: string): TemporalAnchorResolution { const raw = String(rawText ?? ""); const lower = raw.toLowerCase(); const explicitYear = lower.match(/\b(20\d{2})\b/)?.[1] ?? null; - const dayByNamedJuly = lower.match(/(?:^|\D)(0?[1-9]|[12]\d|3[01])\s+(?:июл(?:я|ь)?|july|РёСЋР»(?:СЏ|СЊ)?)(?:\D|$)/i); + const dayByNamedJuly = lower.match(/(?:^|\D)(0?[1-9]|[12]\d|3[01])\s+(?:июл(?:я|ь)?|july)(?:\D|$)/i); const dayByNumeric = lower.match(/\b(0?[1-9]|[12]\d|3[01])[./-](0?7)(?:[./-](\d{2}|\d{4}))?\b/); const monthByNamed = /(?:июл|july|РёСЋР»)/i.test(lower); const monthByNumeric = /\b20\d{2}[-/.]0?7\b/.test(lower); @@ -1044,6 +1097,10 @@ function isMonthClosePrefix(prefix: string): boolean { return numeric >= 20 && numeric <= 44; } +function isFixedAssetPrefix(prefix: string): boolean { + return prefix === "01" || prefix === "02" || prefix === "08"; +} + function expectedAccountPrefixes(input: { focusDomainHint: P0DomainHint; polarity: DomainPolarity; @@ -1062,6 +1119,9 @@ function expectedAccountPrefixes(input: { if (input.focusDomainHint === "month_close_costs_20_44") { return ["20", "25", "26", "44", "97", "01", "02", "08"]; } + if (input.focusDomainHint === "fixed_asset_amortization") { + return ["01", "02", "08"]; + } if (input.focusDomainHint === "settlements_60_62") { if (input.polarity === "supplier_payable") { return ["60", "51", "76"]; @@ -1121,6 +1181,13 @@ function hasWrongDomainByAccounts(accounts: string[], focusDomainHint: P0DomainH if (focusDomainHint === "month_close_costs_20_44") { return prefixes.every((prefix) => isSettlementPrefix(prefix) || isVatPrefix(prefix)); } + if (focusDomainHint === "fixed_asset_amortization") { + const hasFixedAsset = prefixes.some((prefix) => isFixedAssetPrefix(prefix)); + if (hasFixedAsset) { + return false; + } + return prefixes.every((prefix) => isSettlementPrefix(prefix) || isVatPrefix(prefix) || isMonthClosePrefix(prefix)); + } return false; } @@ -1531,3 +1598,4 @@ export function applyEligibilityToGroundingCheck start < span.end && end > span.start); } +function hasAccountContextAround(text, start, end) { + const left = text.slice(Math.max(0, start - 28), start); + const right = text.slice(end, Math.min(text.length, end + 28)); + return /(?:счет|сч\.?|account|schet|оплат|расч[её]т|расчет|аванс|зач[её]т|долг|постав|покуп|supplier|customer|settlement|payment|ндс|vat|проводк|posting)/iu.test(`${left} ${right}`); +} function extractAccountTokens(text) { const lower = String(text ?? "").toLowerCase(); const explicitAccounts = new Set(); @@ -432,7 +456,8 @@ function extractAccountTokens(text) { if (explicitAccounts.size > 0) { return Array.from(explicitAccounts); } - const spans = [...collectDateSpans(lower), ...collectAmountSpans(lower), ...collectPercentSpans(lower)]; + const contractSpans = collectContractSpans(lower); + const spans = [...collectDateSpans(lower), ...collectAmountSpans(lower), ...collectPercentSpans(lower), ...contractSpans]; const hasAccountingLexeme = /(?:\bсчет(?:а|у|ом|ов)?\b|\bсч\.?\b|\baccount(?:s)?\b|\bschet(?:a|u|om|ov)?\b|оплат|расчет|аванс|долг|settlement|payment)/iu.test(lower); if (!hasAccountingLexeme) { return []; @@ -447,6 +472,9 @@ function extractAccountTokens(text) { if (intersectsAnySpan(start, end, spans)) { continue; } + if (!hasAccountContextAround(lower, start, end)) { + continue; + } const prefix = value.match(/^(\d{2})/)?.[1]; if (!prefix || !knownAccountPrefixes.has(prefix)) { continue; @@ -735,6 +763,164 @@ function collectRbpLiveRouteAudit(input) { plan_override: input.planAudit ?? null }; } +function enrichFaFragmentForLive(fragmentText, temporalGuard) { + const base = compactWhitespace(String(fragmentText ?? "")); + const hints = [ + "Начисление амортизации", + "объект ОС", + "expected set ОС", + "счет 01/02" + ]; + const effective = temporalGuard && typeof temporalGuard === "object" ? temporalGuard.effective_primary_period : null; + if (effective && effective.from && effective.to) { + hints.push(`период ${effective.from}..${effective.to}`); + } + const hintText = hints.filter(Boolean).join(", "); + if (!base) { + return hintText; + } + if (/амортиз|основн(?:ые|ых)\s+сред|fixed\s*asset|depreciat|счет\s*0[12]|account\s*0[12]/i.test(base)) { + return base; + } + return `${base}; ${hintText}`; +} +function enforceFaLiveRoutePlan(input) { + if (input.claimType !== "prove_fixed_asset_amortization_coverage") { + return { + executionPlan: input.executionPlan, + audit: null + }; + } + const requiredLiveCalls = [ + "find_amortization_documents_in_period", + "find_fixed_asset_movements_accounts_01_02", + "find_fixed_asset_cards_expected_for_period", + "match_expected_vs_actual_fa_coverage" + ]; + let routeAdjusted = 0; + let rescuedNoRoute = 0; + const replacedRoutes = []; + const adjustedPlan = input.executionPlan.map((item) => { + if (!item || typeof item !== "object") { + return item; + } + if (item.should_execute !== true && item.no_route_reason === "insufficient_specificity") { + rescuedNoRoute += 1; + routeAdjusted += 1; + return { + ...item, + route: "live_mcp_drilldown", + should_execute: true, + no_route_reason: null, + clarification_reason: null, + fragment_text: enrichFaFragmentForLive(item.fragment_text, input.temporalGuard) + }; + } + if (item.should_execute === true && item.route !== "hybrid_store_plus_live" && item.route !== "live_mcp_drilldown") { + routeAdjusted += 1; + if (item.route && item.route !== "no_route") { + replacedRoutes.push(String(item.route)); + } + return { + ...item, + route: "hybrid_store_plus_live", + fragment_text: enrichFaFragmentForLive(item.fragment_text, input.temporalGuard) + }; + } + if (item.should_execute === true) { + return { + ...item, + fragment_text: enrichFaFragmentForLive(item.fragment_text, input.temporalGuard) + }; + } + return item; + }); + return { + executionPlan: adjustedPlan, + audit: { + claim_type: "prove_fixed_asset_amortization_coverage", + required_live_calls: requiredLiveCalls, + route_adjustments_applied: routeAdjusted, + rescued_no_route_fragments: rescuedNoRoute, + replaced_routes: Array.from(new Set(replacedRoutes)), + route_gap_reason: routeAdjusted > 0 ? "fa_claim_bound_live_route_override_applied" : null + } + }; +} +function collectFaLiveRouteAudit(input) { + if (input.claimType !== "prove_fixed_asset_amortization_coverage") { + return null; + } + const required = new Set(Array.isArray(input.planAudit?.required_live_calls) ? input.planAudit.required_live_calls : []); + const executed = []; + const missing = new Set(); + const routeGaps = []; + let matchedRowsTotal = 0; + let returnedRowsTotal = 0; + let fetchedRowsTotal = 0; + for (const result of input.retrievalResults) { + if (!result || typeof result !== "object") { + continue; + } + const summary = result.summary && typeof result.summary === "object" ? result.summary : null; + const live = summary && typeof summary.live_mcp === "object" && summary.live_mcp ? summary.live_mcp : null; + if (!live) { + continue; + } + const requiredCalls = Array.isArray(live.required_live_calls) ? live.required_live_calls : []; + for (const callId of requiredCalls) { + required.add(String(callId ?? "").trim()); + } + const executedCalls = Array.isArray(live.executed_live_calls) ? live.executed_live_calls : []; + for (const call of executedCalls) { + if (!call || typeof call !== "object") { + continue; + } + executed.push(call); + } + const missingCalls = Array.isArray(live.missing_live_calls) ? live.missing_live_calls : []; + for (const callId of missingCalls) { + const token = String(callId ?? "").trim(); + if (token) { + missing.add(token); + } + } + const routeGapReason = String(live.route_gap_reason ?? "").trim(); + if (routeGapReason) { + routeGaps.push(routeGapReason); + } + fetchedRowsTotal += Number(live.fetched_rows ?? 0) || 0; + matchedRowsTotal += Number(live.matched_rows ?? 0) || 0; + returnedRowsTotal += Number(live.returned_rows ?? 0) || 0; + } + const requiredList = Array.from(required).filter(Boolean); + const executedList = executed; + const missingFromExecuted = requiredList.filter((callId) => !executedList.some((item) => String(item.call_id ?? "") === callId)); + for (const callId of missingFromExecuted) { + missing.add(callId); + } + const missingList = Array.from(missing); + const routeGapReason = missingList.length > 0 + ? "required_live_calls_not_executed" + : matchedRowsTotal <= 0 + ? "claim_live_calls_executed_but_zero_matches" + : routeGaps[0] ?? null; + const executionRate = requiredList.length > 0 + ? Number(((requiredList.length - missingList.length) / requiredList.length).toFixed(4)) + : 1; + return { + claim_type: "prove_fixed_asset_amortization_coverage", + required_live_calls: requiredList, + executed_live_calls: executedList, + missing_live_calls: missingList, + route_gap_reason: routeGapReason, + live_route_execution_rate: executionRate, + fetched_rows_total: fetchedRowsTotal, + matched_rows_total: matchedRowsTotal, + returned_rows_total: returnedRowsTotal, + plan_override: input.planAudit ?? null + }; +} function toDebugRoutes(routeSummary) { if (!routeSummary) { return []; @@ -1201,7 +1387,7 @@ function extractNormalizedPeriodLiteral(text) { } function extractFollowupAccountAnchorsLoose(text) { const lower = String(text ?? "").toLowerCase(); - const spans = [...collectDateSpans(lower), ...collectAmountSpans(lower), ...collectPercentSpans(lower)]; + const spans = [...collectDateSpans(lower), ...collectAmountSpans(lower), ...collectPercentSpans(lower), ...collectContractSpans(lower)]; const anchors = []; const followupAccountPattern = /\b(?:01|02|08|19|20|21|23|25|26|28|29|44|51|60|62|68|76|97)(?:\.\d{2})?\b/g; let match = null; @@ -1254,27 +1440,8 @@ function hasCrossScopeConflictWithState(userMessage, state) { return false; } function inferP0DomainFromMessage(text) { - const lower = String(text ?? "").toLowerCase(); - const accountTokens = extractAccountTokens(lower); - const hasVatAccount = accountTokens.some((token) => /^(?:19|68)(?:\.|$)/.test(token)); - const hasSettlementAccount = accountTokens.some((token) => /^(?:51|60|62|76)(?:\.|$)/.test(token)); - const hasMonthCloseAccount = accountTokens.some((token) => /^(?:97|2\d|3\d|4[0-4])(?:\.|$)/.test(token)); - const hasFixedAssetAccount = accountTokens.some((token) => /^(?:01|02|08)(?:\.|$)/.test(token)); - const vatLexical = /(?:ндс|vat|сч[её]т[\s-]?фактур|книг[аи]\s+(?:покуп|продаж)|налогов)/i.test(lower); - const settlementLexical = /(?:долг|аванс|зач[её]т|взаимозач|расч[её]т|оплат|платеж|платёж|постав|покупател)/i.test(lower); - const monthCloseLexical = /(?:закрыти[ея]\s+месяц|закрытие\s+счетов|регламентн|косвенн|затрат|распределени|рбп|финансовых\s+результат)/i.test(lower); - const fixedAssetLexical = /(?:основн(?:ые|ых)?\s+сред|(?:^|[^a-zа-яё])ос(?:$|[^a-zа-яё])|амортиз|depreciat|fixed\s*asset)/i.test(lower); - if (hasVatAccount || vatLexical) { - return "vat_document_register_book"; - } - if (fixedAssetLexical || hasFixedAssetAccount) { - return "fixed_asset_amortization"; - } - if (monthCloseLexical || hasMonthCloseAccount) { - return "month_close_costs_20_44"; - } - if (hasSettlementAccount || settlementLexical) { - return "settlements_60_62"; + if (typeof investigationState_1.inferP0DomainFromMessage === "function") { + return investigationState_1.inferP0DomainFromMessage(text); } return null; } @@ -1554,13 +1721,12 @@ export class AssistantService { routeSummary: normalized.route_hint_summary }); const inferredDomainByMessage = inferP0DomainFromMessage(userMessage); - const focusDomainForGuards = inferredDomainByMessage === "fixed_asset_amortization" - ? "month_close_costs_20_44" - : inferredDomainByMessage === "settlements_60_62" || - inferredDomainByMessage === "vat_document_register_book" || - inferredDomainByMessage === "month_close_costs_20_44" - ? inferredDomainByMessage - : null; + const focusDomainForGuards = inferredDomainByMessage === "settlements_60_62" || + inferredDomainByMessage === "vat_document_register_book" || + inferredDomainByMessage === "month_close_costs_20_44" || + inferredDomainByMessage === "fixed_asset_amortization" + ? inferredDomainByMessage + : null; const temporalGuard = (0, assistantRuntimeGuards_1.resolveTemporalGuard)({ userMessage, normalized: normalized.normalized, @@ -1592,6 +1758,12 @@ export class AssistantService { temporalGuard }); executionPlan = rbpRoutePlanEnforcement.executionPlan; + const faRoutePlanEnforcement = enforceFaLiveRoutePlan({ + executionPlan, + claimType: claimAnchorAudit.claim_type, + temporalGuard + }); + executionPlan = faRoutePlanEnforcement.executionPlan; executionPlan = (0, assistantRuntimeGuards_1.applyTemporalHintToExecutionPlan)(executionPlan, temporalGuard); executionPlan = (0, assistantRuntimeGuards_1.applyPolarityHintToExecutionPlan)(executionPlan, domainPolarityGuardInitial); const retrievalCalls = []; @@ -1679,6 +1851,11 @@ export class AssistantService { retrievalResults, planAudit: rbpRoutePlanEnforcement.audit }); + const faLiveRouteAudit = collectFaLiveRouteAudit({ + claimType: claimAnchorAudit.claim_type, + retrievalResults, + planAudit: faRoutePlanEnforcement.audit + }); const coverageEvaluation = evaluateCoverage(requirementExtraction.requirements, retrievalResults); const groundingCheckBase = checkGrounding(userMessage, coverageEvaluation.requirements, coverageEvaluation.coverage, retrievalResults); const groundedAnswerEligibilityGuard = (0, assistantRuntimeGuards_1.evaluateGroundedAnswerEligibility)({ @@ -1792,6 +1969,7 @@ export class AssistantService { targeted_evidence_acquisition: targetedEvidenceResult.audit, evidence_admissibility_gate: evidenceGateResult.audit, ...(rbpLiveRouteAudit ? { rbp_live_route_audit: rbpLiveRouteAudit } : {}), + ...(faLiveRouteAudit ? { fa_live_route_audit: faLiveRouteAudit } : {}), eligibility_time_basis: groundedAnswerEligibilityGuard.eligibility_time_basis, grounded_answer_eligibility_guard: groundedAnswerEligibilityGuard, ...(followupBinding.usage ? { followup_state_usage: followupBinding.usage } : {}), @@ -1884,6 +2062,8 @@ export class AssistantService { claim_anchor_audit: claimAnchorAudit, targeted_evidence_acquisition: targetedEvidenceResult.audit, evidence_admissibility_gate: evidenceGateResult.audit, + ...(rbpLiveRouteAudit ? { rbp_live_route_audit: rbpLiveRouteAudit } : {}), + ...(faLiveRouteAudit ? { fa_live_route_audit: faLiveRouteAudit } : {}), eligibility_time_basis: groundedAnswerEligibilityGuard.eligibility_time_basis, grounded_answer_eligibility_guard: groundedAnswerEligibilityGuard, ...(followupBinding.usage ? { followup_state_usage: followupBinding.usage } : {}), diff --git a/llm_normalizer/backend/src/services/investigationState.ts b/llm_normalizer/backend/src/services/investigationState.ts index 17d9eba..da49808 100644 --- a/llm_normalizer/backend/src/services/investigationState.ts +++ b/llm_normalizer/backend/src/services/investigationState.ts @@ -112,6 +112,25 @@ function collectDateLikeSpans(text: string): Array<{ start: number; end: number return spans; } +function collectContractLikeSpans(text: string): Array<{ start: number; end: number }> { + const spans: Array<{ start: number; end: number }> = []; + const patterns = [ + /(?:\b(?:договор(?:а|у|ом|е)?|contract)\b[^\r\n]{0,24}(?:№|#|n|no\.?)\s*[a-zа-я0-9][a-zа-я0-9/_-]{1,})/giu, + /(?:№|#)\s*[a-zа-я0-9_-]{1,10}\/[a-zа-я0-9_-]{1,12}/giu, + /\b\d{2}\/\d{2}(?:-[a-zа-я]{1,10})?\b/giu + ]; + for (const pattern of patterns) { + let match: RegExpExecArray | null = null; + while ((match = pattern.exec(text)) !== null) { + spans.push({ + start: match.index, + end: match.index + match[0].length + }); + } + } + return spans; +} + function collectAmountLikeSpans(text: string): Array<{ start: number; end: number }> { const spans: Array<{ start: number; end: number }> = []; const patterns = [/\b\d{1,3}(?:[ \u00A0]\d{3})+(?:[.,]\d{2})?\b/g, /\b\d+[.,]\d{2}\b/g]; @@ -154,7 +173,12 @@ function hasAccountContextAround(text: string, start: number, end: number): bool function detectAccounts(text: string): string[] { const lower = String(text ?? "").toLowerCase(); - const blockedSpans = [...collectDateLikeSpans(lower), ...collectAmountLikeSpans(lower), ...collectPercentLikeSpans(lower)]; + const blockedSpans = [ + ...collectDateLikeSpans(lower), + ...collectAmountLikeSpans(lower), + ...collectPercentLikeSpans(lower), + ...collectContractLikeSpans(lower) + ]; const hasAccountingLexeme = /(?:\bсчет(?:а|у|ом|ов)?\b|\bсч\.?\b|\baccount(?:s)?\b|\bschet(?:a|u|om|ov)?\b|оплат|расчет|расч[её]т|аванс|долг|settlement|payment|supplier|customer|ндс|vat|рбп|deferred|амортиз)/iu.test( lower @@ -217,37 +241,47 @@ function detectPeriod(text: string): string | null { return null; } -function detectExplicitDomainHint(text: string): string | null { +export function inferP0DomainFromMessage(text: string): string | null { const messageCorpus = String(text ?? "").toLowerCase(); const accounts = detectAccounts(text); - const hasSettlementSignal = - accounts.some((item) => isSettlementAccount(item)) || - /(?:60(?:\.\d{2})?|62(?:\.\d{2})?|оплат|расч[её]т|зач[её]т|аванс|долг|поставщ|покупат|settlement|payment|supplier|customer)/i.test( + const hasSettlementAccount = accounts.some((item) => isSettlementAccount(item)); + const hasVatAccount = accounts.some((item) => isVatAccount(item)); + const hasCloseAccount = accounts.some((item) => isCloseCostsAccount(item)); + const hasFixedAssetAccount = accounts.some((item) => isFixedAssetAccount(item)); + + const hasSettlementLexical = /(?:60(?:\.\d{2})?|62(?:\.\d{2})?|оплат|расч[её]т|зач[её]т|аванс|долг|поставщ|покупат|settlement|payment|supplier|customer)/i.test( + messageCorpus + ); + const hasVatLexical = /(?:ндс|сч[её]т[\s-]?фактур|книг[аи]|vat|invoice|book|register)/i.test(messageCorpus); + const hasCloseLexical = + /(?:закрыти|месяц|затрат|распредел|списан|period\s*close|month\s*close|allocation|residual|cost|рбп)/i.test(messageCorpus); + const hasExplicitFixedAssetLexical = + /(?:амортиз|основн(ые|ых|ым)?\s+средств|объект[а-яё]*\s+ос|fixed\s*asset|depreciat|сч[её]т(?:а|у|ом|е)?\s*(?:01|02|08)|account\s*0[128])/i.test( messageCorpus ); - if (hasSettlementSignal) { + const hasBroadMonthCloseLexical = + /(?:после\s+закрытия|косвенн|период(?:а)?\s+закрыт|month\s*close|period\s*close|регламентн)/i.test(messageCorpus); + + // Keep settlement lane stable when 60/62 lexical/account anchors are explicit + // and there is no explicit VAT intent. + if ((hasSettlementAccount || hasSettlementLexical) && !hasVatLexical && !hasVatAccount && !hasExplicitFixedAssetLexical) { return "settlements_60_62"; } - const hasVatSignal = - accounts.some((item) => isVatAccount(item)) || - /(?:ндс|сч[её]т[\s-]?фактур|книг[аи]|vat|invoice|book|register)/i.test(messageCorpus); - if (hasVatSignal) { - return "vat_document_register_book"; - } - const hasCloseSignal = - accounts.some((item) => isCloseCostsAccount(item)) || - /(?:закрыти|месяц|затрат|распредел|списан|period\s*close|month\s*close|allocation|residual|cost|рбп)/i.test(messageCorpus); - if (hasCloseSignal) { + if ((hasCloseAccount || hasCloseLexical || hasBroadMonthCloseLexical) && !hasVatLexical && !hasVatAccount && !hasExplicitFixedAssetLexical && !hasFixedAssetAccount) { return "month_close_costs_20_44"; } - const hasFixedAssetSignal = - accounts.some((item) => isFixedAssetAccount(item)) || - /(?:амортиз|основн(ые|ых|ым)?\s+средств|(?:^|[^a-zа-яё])ос(?:$|[^a-zа-яё])|объект[а-яё]*\s+ос|fixed\s*asset|depreciat)/i.test( - messageCorpus - ); - if (hasFixedAssetSignal) { + if (hasVatAccount || hasVatLexical) { + return "vat_document_register_book"; + } + if (hasFixedAssetAccount || hasExplicitFixedAssetLexical) { return "fixed_asset_amortization"; } + if (hasCloseAccount || hasCloseLexical) { + return "month_close_costs_20_44"; + } + if (hasSettlementAccount || hasSettlementLexical) { + return "settlements_60_62"; + } return null; } @@ -283,7 +317,7 @@ function deriveScopeOrigin(input: { } const hasExplicitPeriod = Boolean(detectPeriod(input.userMessage)); const hasExplicitAccounts = detectAccounts(input.userMessage).length > 0; - const explicitDomain = detectExplicitDomainHint(input.userMessage); + const explicitDomain = inferP0DomainFromMessage(input.userMessage); if (hasExplicitPeriod || hasExplicitAccounts || explicitDomain) { return "explicit_from_message"; } @@ -406,7 +440,7 @@ function inferFollowupActiveDomain(input: { : messageCorpus; const hasFixedAssetLexicalSignal = - /(?:амортиз|основн(ые|ых|ым)?\s+средств|(?:^|[^a-zа-яё])ос(?:$|[^a-zа-яё])|объект[а-яё]*\s+ос|fixed\s*asset|depreciat)/i.test( + /(?:амортиз|основн(ые|ых|ым)?\s+средств|объект[а-яё]*\s+ос|fixed\s*asset|depreciat|сч[её]т(?:а|у|ом|е)?\s*(?:01|02|08)|account\s*0[128])/i.test( messageCorpus ); const hasFixedAssetAccountSignal = @@ -414,6 +448,17 @@ function inferFollowupActiveDomain(input: { /(?:сч[её]т(?:а|у|ом|е)?\s*(?:01|02|08)|(?:01|02|08)(?:\.\d{2})?\s*\/\s*(?:01|02|08)(?:\.\d{2})?|\b0[128](?:\.\d{2})?\b)/i.test( messageCorpus ); + const hasBroadMonthCloseSignal = + /(?:после\s+закрытия|косвенн|период(?:а)?\s+закрыт|регламентн|month\s*close|period\s*close)/i.test(messageCorpus); + if ( + (input.focusAccounts.some((item) => isCloseCostsAccount(item)) || + /(?:закрыти|месяц|затрат|распредел|списан|period\s*close|month\s*close|allocation|residual|cost)/i.test(messageCorpus) || + hasBroadMonthCloseSignal) && + !hasFixedAssetLexicalSignal && + !hasFixedAssetAccountSignal + ) { + return "month_close_costs_20_44"; + } if (hasFixedAssetLexicalSignal || hasFixedAssetAccountSignal) { return "fixed_asset_amortization"; } diff --git a/llm_normalizer/backend/src/types/assistant.ts b/llm_normalizer/backend/src/types/assistant.ts index bfc5d9e..d049685 100644 --- a/llm_normalizer/backend/src/types/assistant.ts +++ b/llm_normalizer/backend/src/types/assistant.ts @@ -117,7 +117,9 @@ export interface ClaimBoundAnchorAuditDebug { | "prove_advance_offset_state" | "prove_vat_chain_completeness" | "prove_month_close_state" - | "prove_rbp_tail_state"; + | "prove_rbp_tail_state" + | "prove_fixed_asset_amortization_coverage"; + settlement_role?: "supplier" | "customer" | "mixed" | "unknown"; required_anchors: string[]; resolved_anchors: Record; missing_anchors: string[]; @@ -144,13 +146,26 @@ export interface TargetedEvidenceAcquisitionDebug { | "prove_advance_offset_state" | "prove_vat_chain_completeness" | "prove_month_close_state" - | "prove_rbp_tail_state"; + | "prove_rbp_tail_state" + | "prove_fixed_asset_amortization_coverage"; required_checks: string[]; check_status: Record; targeted_item_hits: number; targeted_evidence_hits: number; targeted_evidence_hit_rate: number; targeted_evidence_source_refs: string[]; + fa_expected_set?: string[]; + fa_actual_set_from_amortization?: string[]; + fa_missing_candidates?: string[]; + fa_uncertain_candidates?: string[]; + fa_relation_map?: Array<{ + fa_object: string; + document_amortization: string[]; + movement: boolean; + posting: boolean; + period: string[]; + coverage_status: "covered" | "missing" | "uncertain"; + }>; reason_codes: string[]; } @@ -220,6 +235,19 @@ export interface RbpLiveRouteAuditDebug { plan_override: Record | null; } +export interface FaLiveRouteAuditDebug { + claim_type: "prove_fixed_asset_amortization_coverage"; + required_live_calls: string[]; + executed_live_calls: Array>; + missing_live_calls: string[]; + route_gap_reason: string | null; + live_route_execution_rate: number; + fetched_rows_total: number; + matched_rows_total: number; + returned_rows_total: number; + plan_override: Record | null; +} + export interface AssistantMessageRequestPayload { session_id?: string; user_message?: string; @@ -316,6 +344,7 @@ export interface AssistantDebugPayload { targeted_evidence_acquisition?: TargetedEvidenceAcquisitionDebug; evidence_admissibility_gate?: EvidenceAdmissibilityGateDebug; rbp_live_route_audit?: RbpLiveRouteAuditDebug; + fa_live_route_audit?: FaLiveRouteAuditDebug; eligibility_time_basis?: GroundedAnswerEligibilityGuardDebug["eligibility_time_basis"]; grounded_answer_eligibility_guard?: GroundedAnswerEligibilityGuardDebug; followup_state_usage?: FollowupStateUsageDebug; diff --git a/llm_normalizer/backend/tests/assistantMcpRuntimeBridge.test.ts b/llm_normalizer/backend/tests/assistantMcpRuntimeBridge.test.ts index b362ba8..43d1124 100644 --- a/llm_normalizer/backend/tests/assistantMcpRuntimeBridge.test.ts +++ b/llm_normalizer/backend/tests/assistantMcpRuntimeBridge.test.ts @@ -201,7 +201,111 @@ describe.sequential("assistant MCP runtime bridge", () => { expect((liveSummary.required_live_calls as unknown[]).length).toBe(4); expect(Array.isArray(liveSummary.executed_live_calls)).toBe(true); expect((liveSummary.executed_live_calls as unknown[]).length).toBe(4); + const rbpCallLimits = fetchMock.mock.calls.map(([, requestInit]) => { + const init = requestInit as { body?: string }; + return Number(JSON.parse(String(init.body ?? "{}")).limit ?? 0); + }); + expect(rbpCallLimits).toEqual([96, 96, 96, 128]); expect(liveSummary.matched_rows).toBeGreaterThan(0); expect(result.items.some((item) => Array.isArray((item as Record).relation_pattern_hits))).toBe(true); }); + + it("uses claim-bound live call sequence for fixed-asset amortization coverage query", async () => { + process.env[MCP_FLAG] = "1"; + process.env[MCP_PROXY] = "http://127.0.0.1:6003"; + process.env[MCP_CHANNEL] = "default"; + + const payload = JSON.stringify({ + success: true, + data: [ + { + period: "2020-07-31T00:00:00", + registrator: "Начисление амортизации Июль 2020", + account_dt: "20.01", + account_kt: "02.01", + amount: 2471.52 + }, + { + period: "2020-07-31T00:00:00", + registrator: "Начисление амортизации Июль 2020", + account_dt: "20.01", + account_kt: "02.01", + amount: 2465.28 + } + ] + }); + const fetchMock = vi.fn(async () => new Response(payload, { status: 200 })); + vi.stubGlobal("fetch", fetchMock); + + const { AssistantDataLayer } = await import("../src/services/assistantDataLayer"); + const dataLayer = new AssistantDataLayer(createSnapshotRoot()); + const result = await dataLayer.executeRouteRuntime( + "hybrid_store_plus_live", + "31 июля начислена амортизация тремя суммами — 2 471,52, 2 465,28 и 849,83. Есть риск, что объект ОС не попал в амортизацию?" + ); + + expect(fetchMock).toHaveBeenCalledTimes(4); + const summary = result.summary as Record; + const liveSummary = summary.live_mcp as Record; + expect(liveSummary.claim_type).toBe("prove_fixed_asset_amortization_coverage"); + expect(liveSummary.source_profile).toBe("claim_bound_fa_live_path"); + expect(Array.isArray(liveSummary.required_live_calls)).toBe(true); + expect((liveSummary.required_live_calls as unknown[]).length).toBe(4); + expect(Array.isArray(liveSummary.executed_live_calls)).toBe(true); + expect((liveSummary.executed_live_calls as unknown[]).length).toBe(4); + const faCallLimits = fetchMock.mock.calls.map(([, requestInit]) => { + const init = requestInit as { body?: string }; + return Number(JSON.parse(String(init.body ?? "{}")).limit ?? 0); + }); + expect(faCallLimits).toEqual([96, 96, 128, 128]); + expect(liveSummary.matched_rows).toBeGreaterThan(0); + expect(result.items.some((item) => (item as Record).fa_expected_set_candidate === true)).toBe(true); + expect(result.items.some((item) => (item as Record).fa_actual_set_candidate === true)).toBe(true); + }); + + it("uses claim-bound VAT live path instead of supplier-tail generic probe for VAT chain query", async () => { + process.env[MCP_FLAG] = "1"; + process.env[MCP_PROXY] = "http://127.0.0.1:6003"; + process.env[MCP_CHANNEL] = "default"; + + const payload = JSON.stringify({ + success: true, + data: [ + { + period: "2020-07-15T00:00:00", + registrator: "Реализация товаров 0001", + account_dt: "62.01", + account_kt: "90.01", + amount: 1400 + }, + { + period: "2020-07-15T00:00:00", + registrator: "Счет-фактура выданный 0001", + account_dt: "90.03", + account_kt: "68.02", + amount: 233.33 + } + ] + }); + const fetchMock = vi.fn(async () => new Response(payload, { status: 200 })); + vi.stubGlobal("fetch", fetchMock); + + const { AssistantDataLayer } = await import("../src/services/assistantDataLayer"); + const dataLayer = new AssistantDataLayer(createSnapshotRoot()); + const result = await dataLayer.executeRouteRuntime( + "hybrid_store_plus_live", + "По поставщику и счету-фактуре проверь НДС-цепочку: есть ли выпадение между документом, регистром и книгой покупок?" + ); + + expect(fetchMock).toHaveBeenCalledTimes(4); + const summary = result.summary as Record; + const liveSummary = summary.live_mcp as Record; + expect(liveSummary.claim_type).toBe("prove_vat_chain_completeness"); + expect(liveSummary.query_subject).toBe("vat_chain_conflict"); + expect(liveSummary.source_profile).toBe("claim_bound_vat_live_path"); + expect(Array.isArray(liveSummary.required_live_calls)).toBe(true); + expect((liveSummary.required_live_calls as unknown[]).length).toBe(4); + expect(Array.isArray(liveSummary.account_scope)).toBe(true); + expect(liveSummary.account_scope).toEqual(["19", "68"]); + }); }); diff --git a/llm_normalizer/backend/tests/assistantRuntimeGuardsStage4Pack.test.ts b/llm_normalizer/backend/tests/assistantRuntimeGuardsStage4Pack.test.ts index 5c922f0..e971d2f 100644 --- a/llm_normalizer/backend/tests/assistantRuntimeGuardsStage4Pack.test.ts +++ b/llm_normalizer/backend/tests/assistantRuntimeGuardsStage4Pack.test.ts @@ -10,6 +10,8 @@ import { resolveDomainPolarityGuard, resolveTemporalGuard } from "../src/services/assistantRuntimeGuards"; +import { applyTargetedEvidenceAcquisition, resolveClaimBoundAnchors } from "../src/services/assistantClaimBoundEvidence"; +import { inferP0DomainFromMessage } from "../src/services/investigationState"; function buildProblemUnit(input: { id: string; @@ -129,7 +131,7 @@ function buildRetrieval(input?: Partial): any { describe("stage4 blocker-pack runtime guards", () => { it("flags temporal anchor drift outside July 2020 snapshot", () => { - const userMessage = "Почему РїРѕ оплате РѕС‚ 6 июля 2020 долг РїРѕ поставщику остался?"; + const userMessage = "Why supplier debt was not closed after payment on 06.07.2020?"; const temporal = resolveTemporalGuard({ userMessage, companyAnchors: resolveCompanyAnchors(userMessage), @@ -160,7 +162,7 @@ describe("stage4 blocker-pack runtime guards", () => { }); it("locks July month window when question has month-only anchor", () => { - const userMessage = "Р’ июльском срезе почему РїРѕ счету 60 остался С…РІРѕСЃС‚?"; + const userMessage = "In July snapshot why does account 60 still have an open tail?"; const temporal = resolveTemporalGuard({ userMessage, companyAnchors: resolveCompanyAnchors(userMessage), @@ -182,7 +184,7 @@ describe("stage4 blocker-pack runtime guards", () => { expect(temporal.temporal_guard_outcome).toBe("passed"); expect(temporal.resolved_time_anchor).toBe("2020-07"); expect(temporal.effective_primary_period?.from).toBe("2020-07-01"); - expect(hintedPlan[0].fragment_text).toMatch(/июля 2020|2020-07-01/); + expect(hintedPlan[0].fragment_text).toMatch(/2020-07-01|july 2020/i); }); it("filters customer settlement semantics from supplier/payable case", () => { @@ -409,5 +411,100 @@ describe("stage4 blocker-pack runtime guards", () => { expect(grounded.status).toBe("no_grounded_answer"); expect(grounded.reasons.join(" ")).toMatch(/Недостаточно допустимого evidence|Temporal anchor/i); }); + + it("reconstructs fixed-asset expected vs actual coverage in claim-bound targeting", () => { + const userMessage = + "31 июля начислена амортизация тремя суммами — 2 471,52, 2 465,28 и 849,83. Есть риск, что объект ОС не попал в амортизацию?"; + const claimAudit = resolveClaimBoundAnchors({ + userMessage, + focusDomainHint: "fixed_asset_amortization", + companyAnchors: resolveCompanyAnchors(userMessage), + primaryPeriod: { + from: "2020-07-31", + to: "2020-07-31", + granularity: "day" + } + }); + + expect(claimAudit.claim_type).toBe("prove_fixed_asset_amortization_coverage"); + expect(claimAudit.required_anchors).toContain("fixed_asset_signal"); + expect(claimAudit.claim_anchor_resolution_rate).toBeGreaterThan(0.7); + + const targeted = applyTargetedEvidenceAcquisition({ + claimAudit, + retrievalResults: [ + buildRetrieval({ + items: [ + { + source_entity: "MCPLiveMovement", + source_id: "fa-1", + display_name: "Станок A", + period: "2020-07-31", + account_debit: "20.01", + account_credit: "02.01", + relation_pattern_hits: ["asset_card_to_depreciation", "document_to_posting"], + fa_object_hint: "Станок A", + fa_expected_set_candidate: true, + fa_actual_set_candidate: true, + fa_coverage_status: "covered" + }, + { + source_entity: "MCPLiveMovement", + source_id: "fa-2", + display_name: "Станок B", + period: "2020-07-31", + account_debit: "20.01", + account_credit: "02.01", + relation_pattern_hits: ["asset_card_to_depreciation"], + fa_object_hint: "Станок B", + fa_expected_set_candidate: true, + fa_actual_set_candidate: false, + fa_coverage_status: "expected_only" + } + ], + evidence: [] + }) + ] + }); + + expect(targeted.audit.check_status.expected_fa_set_reconstructed).toBe("found"); + expect(targeted.audit.check_status.actual_fa_set_reconstructed).toBe("found"); + expect(targeted.audit.check_status.movement_or_posting_link_found).toBe("found"); + expect(Array.isArray(targeted.audit.fa_expected_set)).toBe(true); + expect(targeted.audit.fa_expected_set).toContain("станок a"); + expect(targeted.audit.fa_expected_set).toContain("станок b"); + expect(targeted.audit.fa_actual_set_from_amortization).toContain("станок a"); + expect(targeted.audit.fa_missing_candidates).toContain("станок b"); + expect((targeted.audit.fa_relation_map ?? []).length).toBeGreaterThan(0); + }); + + it("does not misclassify settlement 62.02 question into VAT or FA claim paths", () => { + const userMessage = + "Покупатель перечислил аванс на 62.02, но закрытие не произошло. Есть ли хвост по расчетам?"; + const claimAudit = resolveClaimBoundAnchors({ + userMessage, + focusDomainHint: "settlements_60_62", + companyAnchors: resolveCompanyAnchors(userMessage), + primaryPeriod: { + from: "2020-07-01", + to: "2020-07-31", + granularity: "month" + } + }); + + expect(claimAudit.claim_type).toBe("prove_advance_offset_state"); + expect(claimAudit.resolved_anchors.vat_signal).toHaveLength(0); + expect(claimAudit.resolved_anchors.fixed_asset_signal).toHaveLength(0); + expect(claimAudit.required_anchors).toContain("advance_signal"); + }); + + it("keeps VAT priority over supplier wording in shared domain inference", () => { + const vatQuestion = + "По поставщику и счету-фактуре проверь НДС-цепочку: есть ли выпадение между документом, регистром и книгой покупок?"; + const settlementQuestion = "Покупатель перечислил аванс на 62.02, но закрытие не произошло. Есть ли хвост?"; + + expect(inferP0DomainFromMessage(vatQuestion)).toBe("vat_document_register_book"); + expect(inferP0DomainFromMessage(settlementQuestion)).toBe("settlements_60_62"); + }); }); diff --git a/llm_normalizer/docs/runs/2.zip b/llm_normalizer/docs/runs/2.zip new file mode 100644 index 0000000000000000000000000000000000000000..7cac0803e0fb34fb89aa224f7bfc29d30eddb2e5 GIT binary patch literal 261861 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­ptSi%*?u_($W$LE4MZ+mZVu+KGMD-F*vbedl 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�k$@K%qHjcgBFKHvLA>dvFF%3)V{y+^GbS^@ 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 i;!EP#-+1T9J#$|v1yQ{0atGcS2SKTvR@6G3- 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

}(j35u`Rl1&NI&L6n*Ud&7aK5t&;CYnLmItwopL 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


{1sdFS4uJe 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 diff --git a/llm_normalizer/docs/runs/2026-03-29_Stage_04_Wave_19_1_Live_Alignment_Fix_Claim_Bound_Runtime.zip b/llm_normalizer/docs/runs/2026-03-29_Stage_04_Wave_19_1_Live_Alignment_Fix_Claim_Bound_Runtime.zip deleted file mode 100644 index 034ed15ad712ac2aad6621a537ca386fc8c74ba1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190117 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