# 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`