21 KiB
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, а связку из пяти рабочих слоев:
Assistant / living router— решает, идти ли в address/data lane, в data-scope lane или в обычный chat.Address orchestration runtime— собирает predecompose, carryover, continuation contract и orchestration decision.Address exact execution lane— выполняет exact-capability routes черезAddressQueryService.Session memory + navigation state— хранитinvestigation_state,address_navigation_state,result_sets,focus_object,organization/date scope.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 безопасно считать архитектурными инвариантами следующее:
- Exact business routes должны жить как explicit capability/runtime paths, а не как heuristic chat imitation.
- Follow-up continuity должна опираться не только на transcript, но и на structured state.
focus_object,result_set,organization_scope,date_scopeявляются частью архитектуры, а не UX-деталью.- Root context и drilldown context нельзя больше считать одной плоской переменной “контекст разговора”.
- Machine-readable debug/contracts обязательны для объяснимости и bounded hardening.
- 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.mddocs/ARCH/6 - project_and_stage4_full_report_2026-03-28.mddocs/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.mddocs/ARCH/8_audit_artifacts/8 - аудит source_to_proof_по_3_контрольным_вопросам_2026-03-29.mddocs/ARCH/9_audit_artifacts/9 - разведка_структуры_1с_и_связей_через_mcp_по_3_контрольным_вопросам_2026-03-29.mddocs/ARCH/9_audit_artifacts/9F - current_runtime_vs_required_runtime.md
Следующий operational документ:
docs/ARCH/10A - current_assistant_hardening_plan_2026-04-15.md