NODEDC_1C/docs/ARCH/10 - current_assistant_arch...

429 lines
21 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 10 - Текущая архитектура ассистента на 2026-04-15
## 1. Назначение документа
Этот документ фиксирует не историческую эволюцию, а текущий рабочий архитектурный срез ассистента в проекте `NDC_1C`.
Цель документа:
- зафиксировать, какие архитектурные блоки реально участвуют в runtime сейчас;
- отделить текущий работающий контур от ранних проектных отчетов и аудитов;
- дать опорную карту для дальнейшего bounded hardening без разрушения baseline.
Документ не заменяет ранние отчеты в `docs/ARCH`, а накладывается на них как актуальный operational snapshot.
## 2. Как читать `docs/ARCH` после этого обновления
Исторические документы сохраняют свою роль:
- `1-4` — bootstrap, ранний pipeline, MVP и GUI/manual слой;
- `5` — ранний отчет по assistant mode;
- `6` — интегральный статус проекта и Stage 4 на конец марта;
- `7-9` — архитектурные аудиты, gap-регистры, source-to-proof и relation разведка.
Текущий документ нужен для другого:
- не объяснить, как проект развивался;
- а зафиксировать, как именно устроен ассистент сейчас на уровне runtime, state, orchestration и capability routing.
## 3. Executive Summary
На текущем этапе ассистент представляет собой не один monolithic pipeline, а связку из пяти рабочих слоев:
1. `Assistant / living router` — решает, идти ли в address/data lane, в data-scope lane или в обычный chat.
2. `Address orchestration runtime` — собирает predecompose, carryover, continuation contract и orchestration decision.
3. `Address exact execution lane` — выполняет exact-capability routes через `AddressQueryService`.
4. `Session memory + navigation state` — хранит `investigation_state`, `address_navigation_state`, `result_sets`, `focus_object`, `organization/date scope`.
5. `Answer/debug contract layer` — формирует ответ, debug payload, continuation contract и данные для GUI/debug drawer.
Ключевая особенность текущей архитектуры:
- разговорный слой уже не является единственным носителем контекста;
- контекст все больше держится в структурированном session/navigation state;
- exact-capability routes уже существуют как отдельный runtime-контур, а не как побочный продукт общего chat-flow.
## 4. Graphify-срез по кодовой базе
По `graphify-out/GRAPH_REPORT.md` на `2026-04-15`:
- корпус: `473 files`;
- граф: `4865 nodes`, `10622 edges`, `132 communities`;
- среди god nodes находятся:
- `resolveAddressIntent()`;
- `composeFactualReply()`;
- `resolveAssistantOrchestrationDecision()`.
Архитектурно самые важные community:
- `Community 2` — orchestration и `AssistantService`;
- `Community 6` — exact capability/runtime execution, включая `AddressQueryService`;
- `Community 14` — domain cards, domain purity, source gating;
- `Community 17` — navigation state, `focus_object`, `result_sets`, session carryover;
- `Community 20` — address orchestration runtime adapter и follow-up message policy.
Это подтверждает, что текущая система уже раскладывается на отдельные runtime-блоки, а не живет в одном промптовом центре принятия решений.
## 5. Текущая карта runtime
### 5.1 Верхний уровень
Текущий поток запроса выглядит так:
`GUI/API -> AssistantService -> orchestration decision -> address runtime adapter -> AddressQueryService -> compose/debug/session persistence`
На этом уровне уже зафиксированы три разных режима:
- `address_data`;
- `assistant_data_scope`;
- `chat`.
Ключевая точка маршрутизации — `resolveAssistantOrchestrationDecision()` в `llm_normalizer/backend/src/services/assistantService.ts`.
### 5.2 Session memory
Сессионная память не ограничивается простым хранением истории сообщений.
Текущий session store:
- `AssistantSessionStore`;
- `investigation_state`;
- `address_navigation_state`.
Это означает, что архитектурно ассистент уже работает не только на transcript memory, но и на явном структурированном state.
## 6. Orchestration слой
### 6.1 Главный orchestration узел
`AssistantService` является текущим orchestration-ядром ассистента.
Он отвечает за:
- выбор living mode;
- resolution follow-up context;
- построение continuation contracts;
- связывание session memory с runtime execution;
- routing между address lane, data-scope и chat.
На текущем этапе это уже не просто “controller”, а фактический координатор между state, semantics и runtime.
### 6.2 Address orchestration runtime
Для address/data контура вынесен отдельный adapter:
- `assistantAddressOrchestrationRuntimeAdapter.ts`
Он выполняет:
- LLM predecompose или fallback predecompose;
- нормализацию `effectiveMessage`;
- resolution carryover context через `resolveAddressFollowupCarryoverContext()`;
- защиту от неудачных канонизаций через `shouldPreferRawFollowupMessage()`;
- построение `dialogContinuationContract`;
- формирование `addressRuntimeMeta`.
Это важное отличие текущей архитектуры от ранних отчетов:
- predecompose;
- carryover;
- continuation contract;
- orchestration decision
теперь собраны в отдельный runtime-блок, а не размазаны по нескольким ad hoc helper-ам.
## 7. Session state и navigation state
### 7.1 Что реально хранится
`addressNavigationState.ts` фиксирует текущую модель навигационного состояния.
Текущий `session_context` включает:
- `active_result_set_id`;
- `active_focus_object`;
- `last_confirmed_route`;
- `date_scope`:
- `as_of_date`;
- `period_from`;
- `period_to`;
- `organization_scope`.
Отдельно хранятся:
- `result_sets[]`;
- `navigation_history[]`.
### 7.2 Что это значит архитектурно
Текущий диалоговый контекст больше не должен держаться только “в голове модели”.
У системы уже есть структурированные сущности:
- результат ответа как `result_set`;
- выбранный объект как `focus_object`;
- подтвержденный маршрут как `last_confirmed_route`;
- текущий root scope как `organization/date scope`.
Это база для устойчивых drilldown-сценариев.
### 7.3 Как state эволюционирует
`evolveAddressNavigationStateWithAssistantItem()` делает следующее:
- вынимает из assistant reply `detected_intent`, `selected_recipe`, `extracted_filters`;
- строит `result_set_id`;
- при наличии — строит `focus_object`;
- пишет navigation event;
- обновляет active result/focus/route/date/org scope.
Важно:
- `active_focus_object` не затирается автоматически при отсутствии нового focus;
- `organization_scope` и `date_scope` также тянутся как долговременный session context.
## 8. Follow-up и continuation semantics
### 8.1 Carryover контекст
`resolveAddressFollowupCarryoverContext()` сейчас является центральным узлом follow-up логики.
Он собирает carryover из:
- предыдущего address reply;
- navigation state;
- organization clarification state;
- implicit continuation signal;
- selected object / displayed entities;
- inventory root frame.
### 8.2 Root frame и drilldown frame
В текущей реализации уже присутствует различие между:
- `inventory_root`;
- `inventory_drilldown`;
- `generic`.
То есть архитектура уже ушла от полностью плоского carryover.
Фактически в runtime уже живут два уровня:
- root context:
- организация;
- дата/период;
- root intent;
- object/drilldown context:
- item/counterparty/contract/focus object;
- drilldown intent.
### 8.3 Root-only carryover
Отдельно введен режим `carry_root_context` / `root_context_only`.
Он используется в тех местах, где нужно:
- сохранить организацию и temporal scope;
- но не тянуть старый object-level intent в новый доменный вопрос.
Архитектурно это важный шаг: система уже умеет не только продолжать предыдущий вопрос, но и ограничивать глубину carryover.
### 8.4 Continuation contract
`buildAddressDialogContinuationContractV2()` сейчас формирует отдельный machine-readable контракт продолжения.
Он хранит:
- `decision`;
- `decision_reasons`;
- `previous_intent`;
- `target_intent`;
- `intent_selection_mode`;
- `anchor_type`;
- `anchor_value`;
- `implicit_continuation_signal`.
Это уже полноценный runtime artifact, а не побочный debug-комментарий.
## 9. Exact capability runtime
### 9.1 Role of `AddressQueryService`
`AddressQueryService` — текущий exact execution engine для address/data маршрутов.
Основной поток внутри `tryHandle()`:
- `runAddressDecomposeStage()`;
- pre-execution grounding;
- organization clarification / scope resolution;
- requested result mode resolution;
- capability route decision;
- recipe selection;
- exact MCP query execution;
- materialization;
- scoped filtering;
- future/temporal guards;
- limited/factual reply building.
### 9.2 Что изменилось относительно ранних отчетов
Текущий address runtime уже не является “одним generic execute_query на удачу”.
Сейчас в нем есть:
- capability route guard;
- route expectation audit;
- organization clarification path;
- intent-specific filter layer;
- lifecycle detachment semantics;
- historical/broadened retry layers;
- exact/limited result policy.
То есть ранняя картина из `ARCH/5` уже устарела: exact-capability execution есть и он занимает отдельный крупный слой runtime.
### 9.3 Capability policy
`addressCapabilityPolicy.ts` фиксирует точные capability routes.
На текущем этапе в policy явно присутствуют, в частности:
- inventory:
- `inventory_on_hand_as_of_date`;
- `inventory_purchase_provenance_for_item`;
- `inventory_purchase_documents_for_item`;
- `inventory_supplier_stock_overlap_as_of_date`;
- `inventory_sale_trace_for_item`;
- `inventory_purchase_to_sale_chain`;
- `inventory_aging_by_purchase_date`;
- VAT:
- `vat_payable_confirmed_as_of_date`;
- `vat_liability_confirmed_for_tax_period`.
Это важно зафиксировать отдельно:
- capability layer уже живет как explicit policy map;
- она не должна снова расползаться в “общую умность”.
## 10. Data/domain слой
### 10.1 Domain purity
`assistantDataLayer.ts` продолжает играть роль доменного ограничителя и source gate.
В нем присутствуют:
- `domain_scope`;
- `forbidden_cross_domain_leakage`;
- source gating;
- graph traversal profiles;
- live MCP call planning;
- domain card based filtering.
### 10.2 Почему это важно для текущей архитектуры
Даже если текущая задача решается в address exact lane, система уже опирается на более широкий доменный слой:
- domain cards;
- source purity;
- graph-aware retrieval planning;
- forbidden cross-domain leakage rules.
Следовательно, любые новые hardening-решения нельзя строить как локальные regex-патчи в inventory/VAT ветках, если они конфликтуют с domain purity моделями.
## 11. Data source модель
Текущий runtime работает как минимум с двумя типами источников:
- live MCP / `execute_query` и каталожные резолверы;
- snapshot/canonical/risk материалы, участвующие в более широком assistant/data контуре.
Для address exact lane центральным остается live execution, но:
- orchestration уже знает про data-scope и domain routes;
- в проекте сохраняется split между lightweight live path и более широкими доказательными/аналитическими слоями.
## 12. Debug, contracts и observability
Текущая архитектура сильно опирается на machine-readable debug artifacts.
На runtime-уровне зафиксированы:
- `technical_debug_payload_json`;
- `addressRuntimeMeta`;
- `orchestrationContract`;
- `dialogContinuationContract`;
- `route_expectation_*`;
- `capability_id`;
- `selected_recipe`;
- `limited_reason_category`.
Для проекта это уже не “вспомогательная телеметрия”, а часть архитектуры:
- через эти контракты GUI, аудит и domain loop понимают, что именно решила система;
- без них bounded hardening быстро превращается в непрозрачную серию случайных патчей.
## 13. Feature-flag слой
В текущем runtime существенная часть поведения завязана на feature flags.
Ключевые flags, влияющие на архитектуру:
- `FEATURE_ASSISTANT_ADDRESS_QUERY_V1`;
- `FEATURE_ASSISTANT_ADDRESS_QUERY_LIVE_V1`;
- `FEATURE_ASSISTANT_CAPABILITY_ROUTE_GUARD_V1`;
- `FEATURE_ASSISTANT_ROUTE_EXPECTATION_AUDIT_V1`;
- `FEATURE_ASSISTANT_ROUTE_EXPECTATION_HARD_GUARD_V1`;
- `FEATURE_ASSISTANT_INVESTIGATION_STATE_V1`;
- `FEATURE_ASSISTANT_ADDRESS_NAVIGATION_STATE_V1`;
- `FEATURE_ASSISTANT_LIVING_CHAT_ROUTER_V1`;
- `FEATURE_ASSISTANT_STATE_FOLLOWUP_BINDING_V1`;
- `FEATURE_ASSISTANT_CONTRACTS_V11`;
- `FEATURE_ASSISTANT_ANSWER_POLICY_V11`.
Архитектурно это значит:
- текущая система уже modularized;
- но operational profile зависит от конфигурации flags, а не только от кода.
## 14. Что устарело в ранних архитектурных документах
### 14.1 Что больше нельзя считать точным описанием текущего состояния
Ранние документы `ARCH/5` и частично `ARCH/6_global_report` полезны как история, но не как точный snapshot текущего runtime.
Устаревшими в них являются, в частности, представления о том, что:
- assistant mode в основном сводится к answer composer + session memory;
- retrieval plan еще в основном stubbed;
- routing и follow-up существуют как легкая надстройка поверх ответа.
На текущем этапе это уже не так:
- continuation contracts существуют;
- navigation state существует;
- exact capability runtime существует;
- route expectation / capability guard / organization clarification существуют;
- root/drilldown carryover уже встроен в orchestrator.
### 14.2 Как использовать старые документы теперь
Старые отчеты полезны:
- как описание этапов развития;
- как baseline для исторического сравнения;
- как объяснение происхождения guardrails и audit criteria.
Но для описания того, “как работает ассистент сейчас”, опорным должен считаться уже этот документ.
## 15. Текущие архитектурные инварианты
На момент `2026-04-15` безопасно считать архитектурными инвариантами следующее:
1. Exact business routes должны жить как explicit capability/runtime paths, а не как heuristic chat imitation.
2. Follow-up continuity должна опираться не только на transcript, но и на structured state.
3. `focus_object`, `result_set`, `organization_scope`, `date_scope` являются частью архитектуры, а не UX-деталью.
4. Root context и drilldown context нельзя больше считать одной плоской переменной “контекст разговора”.
5. Machine-readable debug/contracts обязательны для объяснимости и bounded hardening.
6. Domain purity и forbidden cross-domain leakage уже являются встроенными guardrails и должны учитываться при любом расширении.
## 16. Текущие ограничения
Несмотря на значительный сдвиг архитектуры, текущая система еще не должна описываться как полностью закрытая production architecture.
Остаются ограничения:
- часть follow-up semantics еще зависит от LLM predecompose и quality canonicalization;
- часть object-level continuity еще удерживается комбинацией transcript + navigation state, а не единым frame engine;
- не все capability routes одинаково зрелые по depth и proof closure;
- hardening по meta-follow-up, pivot semantics и field admissibility еще остается отдельным слоем работы.
## 17. Практический итог
Текущий ассистент уже нельзя описывать как “чат над 1С”.
Более точная формулировка:
`структурированный orchestration runtime + session/navigation state + exact address capability engine + domain/data guardrails`
Именно в этой рамке должны приниматься следующие решения:
- не через новый общий rewrite;
- не через промптовую переумность;
- а через bounded усиление уже существующих архитектурных блоков.
## 18. Связанные документы
Исторический baseline:
- `docs/ARCH/5 - assistant_mode_architecture_report_2026-03-24.md`
- `docs/ARCH/6 - project_and_stage4_full_report_2026-03-28.md`
- `docs/ARCH/6_global_report/Assistant_Mode_GLOBAL_STATUS_2026-03-24.md`
Аудит и gap-анализ:
- `docs/ARCH/7 - аудит архитектуры на 4 этапе/7 - assistant_runtime_ground_truth_audit_2026-03-28.md`
- `docs/ARCH/8_audit_artifacts/8 - аудит source_to_proof_по_3_контрольным_вопросам_2026-03-29.md`
- `docs/ARCH/9_audit_artifacts/9 - разведка_структуры_1с_и_связей_через_mcp_по_3_контрольным_вопросам_2026-03-29.md`
- `docs/ARCH/9_audit_artifacts/9F - current_runtime_vs_required_runtime.md`
Следующий operational документ:
- `docs/ARCH/10A - current_assistant_hardening_plan_2026-04-15.md`