gantt
title Шкала распределения вероятностей (Шкала секунд = Доли процента x 0.5)
dateFormat HH:mm:ss
axisFormat %S
section Интервалы интентов
p_inventory (0 - 30%) :active, 00:00:00, 00:00:15
p_preparing (30 - 65%) :crit, 00:00:15, 00:00:32
p_consume (65 - 85%) :active, 00:00:32, 00:00:42
p_waste (85 - 100%) :active, 00:00:42, 00:00:50
section Триггер Движка
"xi = 42% -> PREPARING" :milestone, active, 00:00:21, 0d
Архитектурное проектирование и математическое моделирование автономных стохастических симуляторов бизнес-процессов ‘Цифрового холодильника’
Проектирование изолированных Sandbox-сред и рекурсивных моделей изменения параметров для генерации аномальных операционных записей
1 1. Концепция автономного симуляционного полигона (Sandbox)
Настоящий документ содержит архитектурное описание и математический базис Автономного движка цифровой симуляции (Core Simulation Engine). В отличие от классических скриптовых генераторов трафика или эмуляторов нагрузочного тестирования, данная платформа спроектирована как изолированный поведенческий программный полигон (Sandbox), функционирующий в оперативной памяти хост-машины (In-Memory Topology).
Главная задача платформы — имитация обращения к API реального приложения в режиме честного сквозного E2E-тестирования. Симулятор воссоздает операционную реальность АРМ через призму цифровых двойников (digital_employees), генерируя потоки параллельных событий. Единственное отличие от реального пользователя заключается в том, что симулятор изначально не знает данные авторизации. Поэтому рантайм-цикл всегда начинается с Фазы 0 (Шаг 0), на которой метод registry_load_init_creds() выкачивает сырые учетные данные из баз данных, а асинхронный HTTP-клиент User Action Simulator осуществляет легитимную авторизацию ботов в приложении с получением реальных JWT-токенов. Только после этого движок переходит к пошаговому выполнению бизнес-логики, добавляя вероятностные события(стохастика) самого разного поведения.
Время симуляции намеренно синхронизировано для обеспечения максимальной глубины и качества эмуляции (например, 24 часа моделируемых суток сжимаются в 1 час реального времени). Метод execute_macro_cycle_day() разбивает макро-время на изолированные отрезки, а execute_intra_day_tick() нарезает час на секундные конкурентные пулы.
Ключевой инженерный приоритет системы заключается в направленной генерации аномального, деструктивного и «грязного» цифрового следа (коллизии данных, нелинейное поведение, фиктивные списания, сокрытие порчи, умышленный обход логики). Сформированные симулятором массивы логов служат эталонной базой для верификации и стресс-тестирования внешних аналитических контуров: модулей восстановления топологии процессов (Process Mining) и систем внутренних расследований (Forensic Analysis). Внешний целевой бэкенд приложения рассматривается симулятором исключительно как «черный ящик» — приемник DTO-событий.
2 2. Архитектура внутреннего ИТ-домена симулятора
Для достижения миллионных показателей генерации транзакций в секунду и полного исключения сетевого оверхеда1 на дисковый ввод-вывод (IO-Bound задачи), Симулятор развернут как автономный микросервисный домен, изолированный в рамках RAM хост-машины. Внутренние микросервисы “движка” общаются через механизмы межпроцессного взаимодействия (IPC) и оперируют локальными слепками Master Data.
В настоящей публичной документации отображены не все шаги и сценарии для приложения в частности и для системы цифровых симуляторов бизнес-процессов в общем.
2.1 Функциональные микросервисы ядра симуляции
- Core Simulation Orchestrator (Центральный диспетчер): Модуль верхнего уровня, координирующий глобальную шкалу моделируемого времени через методы
execute_macro_cycle_day()иexecute_intra_day_tick(). Он инициализирует сессии и распределяет задачи конкурентного выполнения между специализированными внутренними узлами. - In-Memory Twin Registry Service (Реестр двойников): Локальное хранилище профилей цифровых сотрудников (
TwinRegistry). Инкапсулирует криптографические хэши, SSN, паспорта и статусы электронных цифровых подписей (ЭЦП). На Шаге 0 методregistry_load_init_creds()вычитывает креды ботов, а методregistry_link_twin_state()намертво связывает их с выданными бэкендом JWT-токенами. Самостоятельно обрабатывает ответы внешних SOAP/WSDL-шлюзов имитации государственных ведомств на этапе авторизации, обеспечивая совместимость Sandbox-контура. - Stochastic & Risk Generator (Стохастический процессор): Математическое ядро симулятора (
StochasticGenerator). Отвечает за расчет плотности распределения вероятностей интентов на основе псевдослучайных чисел, векторов привычек и генерацию инцидентов негативного характера. На каждом такте группирует активных ботов в параллельные пакеты. - Dynamic Config Microservice (Диспетчер изменений мвтрициы параметров): Микросервис, управляющий runtime-состоянием матриц параметров (
DynamicConfig). Отвечает за вызов методаconfig_sync_master_data()для суточного обновления SKU, а также на лету изменяет весовые коэффициенты и свойства поведенческих моделей под воздействием рекурсивных петель обратной связи (Feedback Loops) от сгенерированных инцидентов. - User Action Simulator: Программная обёртка для работы с сервисами (
Authorization,Inventory,Affinityи др.). Запрашивает прикладную логику учета, локальные Master Data каталоги номенклатурных позиций (SKU) и технологических карт (рецептов). Переводит внутренние состояния симулятора в валидные индивидуальные DTO-пакеты и асинхронно отправляет их через методыexecute_get_fridge_stock()иexecute_add_product_via_text()во внешний контур.
2.2 Концепция честного сетевого параллелизма и изоляции контекста
Поскольку в реальной бизнес-среде приложением одновременно пользуются несколько сотрудников, симулятор эмулирует конкурентный доступ на уровне сетевого интерфейса. В рамках одного микро-такта, обрабатываемого методом execute_intra_day_tick(), ядро формирует пакет одновременных интентов для группы активных агентов, у которых по циркадным ритмам наступило время активности.
При трансляции интентов в сеть каждый индивидуальный запрос изолируется на уровне прикладного HTTP-клиента User Action Simulator и снабжается персональным контекстом сессии:
- Уникальная трассировка: Каждому вызову присваивается собственный сквозной
request_id(UUIDv4) для изоляции логов на стороне Nginx Edge Gateway. - Атомарная авторизация: Запрос подписывается персональным токеном
Authorization: Bearer <JWT>, полученным ботом при легитном логине и привязанным к RAM-структуре методомregistry_link_twin_state(). - Синхронизация виртуального времени: В заголовках пакета принудительно передается фейковый временной штамп моделируемых суток (
X-Virtual-Timestamp), гарантирующий хронологическую консистентность распределенной записи в целевойtracking_event_logбэкенда.
При таком подходе запросы от нескольких ботов сталкиваются внутри сетевых шлюзов бэкенда одновременно в одну и ту же физическую миллисекунду текущего часа, провоцируя возникновение естественных коллизий состояний (State Collisions), где база данных самостоятельно разруливает перекрестные конфликты человеческого фактора.
3 3. Математическое моделирование интентов и стохастический генератор профилей
Движок симулятора не оперирует жесткими линейными сценариями. Возникновение каждого операционного события в системе — это результат работы стохастического процессора (Stochastic & Risk Generator), который на каждой итерации времени рассчитывает динамическую функцию плотности распределения вероятностей для четырех базовых интентов:
\[\mathbf{I} = \{I_{\text{inventory}}, I_{\text{preparing}}, I_{\text{consume}}, I_{\text{waste}}\}\]
Поскольку симуляция воссоздает реальный параллельный трафик одновременного использования приложения, на одном временном интервале \(t\) в рамках выполнения асинхронного шага execute_intra_day_tick() оркестратор считывает метрики через метод registry_fetch_twin_metrics(). Далее стохастический процессор рассчитывает этот вектор независимо для каждого из активных сотрудников, формируя конкурентную пачку вызовов к сетевому слою.
3.1 Векторизация профилей цифровых двойников (Digital Twins) в симуляторе для FoodLifeCycleApp
Каждый цифровой сотрудник \(\text{DT}_i\) инициализируется в In-Memory реестре как многомерный вектор статических и динамических признаков, определяющих его индивидуальную поведенческую модель во времени:
\[\mathbf{DT}_i = \langle \mathbf{A}_{\text{matrix}}, H_{\text{anxiety}}, P_{\text{impulse}}, F_{\text{night\_owl}}, M_{\text{hunger}} \rangle\]
Где:
\(\mathbf{A}_{\text{matrix}}\) — матрица потребительского аффинити (Consumer Affinity Matrix)[^consumer_affinity_matrix], содержащая локальные весовые коэффициенты приверженности к конкретным номенклатурным позициям (SKU).
\(H_{\text{anxiety}} \in [1.0 \dots 5.0]\) — коэффициент системной тревожности. Определяет частоту проверок остатков еды в “цифровом холодильнике”. Используется и в других сценариях, например: внезапном приеме пищи.
\(P_{\text{impulse}} \in [0.0 \dots 1.0]\) — склонность к незапланированным импульсивным закупкам, искажающая базовые экономические регламенты.
\(F_{\text{night\_owl}} \in \{0, 1\}\) — бинарный флаг циркадного сдвига, активирующий определенное действие (покупки, готовка еды, принятие пищи, выброс мусора) в ночные часы симуляции.
\(M_{\text{hunger}} \in [0.0 \dots 1.0]\) — динамический уровень голода (размеры порций не включены в этот параметр), непрерывно инкрементируемый макро-оркестратором на каждом шаге итерации (по времени) через метод
registry_increment_hunger_vector().И другие параметры.
3.2 Алгоритм стохастического расчета триггера события
На каждой итерации (по времени) симуляции (\(t\)) для каждого активного цифрового двойника “движок” производит расчет вектора вероятностей \(\mathbf{P}(t) = \{p_1, p_2, p_3, p_4\}\), где \(\sum_{k=1}^{4} p_k = 1\). Расчет базовой вероятности выполнения операции приготовления еды (\(p_2 = p_{\text{preparing}}\)) описывается следующей стохастической функцией, вычисляемой последовательно через внутренние методы ядра stochastic_calculate_intents_density() и stochastic_logistic_normalization():
\[p_{\text{preparing}}(t) = f\left(M_{\text{hunger}}(t) \cdot (1 + F_{\text{night\_owl}} \cdot \sin(\omega t)) \cdot \mathbf{A}_{\text{matrix}, i}\right)\]
Где \(f(\cdot)\) — нормирующая логистическая функция, приводящая аргумент к пространству вероятностей \([0 \dots 1]\), а \(\mathbf{A}_{\text{matrix}, i}\) — вектор весовых коэффициентов аффинити текущего агента для целевой группы номенклатур (SKU).
Где \(\omega\) — угловая частота2 моделируемых суток, привязанная к виртуальной метке времени текущего часа симуляции.
После формирования вектора вероятностей стохастический процессор извлекает псевдослучайное число (случайную величину) \(\xi \in [0.0 \dots 1.0]\). Путем проецирования \(\xi\) на кумулятивную шкалу распределения вероятностей “движок” принимает финальное решение о выборе и генерации целевого интента.
Интерактивная схема попадания случайного числа в целевой интент:
Если сгенерированный интент валиден, управление передается в User Action Simulator для сборки индивидуального DTO-пакета через методы execute_get_fridge_stock() или execute_add_product_via_text(). Однако, если стохастический процессор фиксирует критические внутренние лимиты или внешний инцидент, система переходит в контур генерации аномалий и деструктивного поведения.
4 Контур генерации деструктивных аномалий и рекурсивное изменение параметров
Уникальность архитектуры Core Simulation Engine заключается в отказе от генерации линейного, идеально «чистого» трафика. Для полноценного обучения и верификации алгоритмов форензик-анализа (Forensic Analysis) и Process Mining, симулятор должен генерировать контролируемый «грязный» цифровой след, содержащий скрытые аномалии, транзакционные зацикливания и дефекты автоматизации.
Это достигается за счет интеграции двух контуров: генератора инцидентов (Stochastic Risk Loop) и микросервиса динамических изменений (Dynamic Config), связанных сквозной математической рекурсией.
4.1 Контур генерации инцидентов негативного характера (Stochastic Risk Loop)
На каждой итерации имитирующей (сутки/день) стохастический процессор считывает глобальный коэффициент негативного события (negative_event_rate). При пересечении критического порога система принудительно генерирует инцидент негативного характера (ERR-NEGATIVE-ANOMALY). Движок имитирует к примеру три полярных класса деструктивного поведения (только в режиме для предприятия):
- Умышленный фрод и скрытые потери (Hidden Waste): Цифровой двойник имитирует утилизацию дорогостоящих продуктов в обход регламентов АРМ (без голосового отчетов Whisper или ручной фиксации), маскируя финансовый ущерб.
- Фиктивные списания и мошенничество (Fraudulent Allocation): Симуляция списания валидных объемов продуктов в лог потерь (
waste_log) под предлогом истечения сроков (EXPIRED) с целью их последующего скрытого вывода из баланса предприятия (теневая экономика). - Искусственные коллизии данных (State Collisions): Умышленное создание конкурентного доступа, когда агент одновременно отправляет запрос на потребление (
CONSUME) и автоматическое списание по бездействию для одной и той же номенклатурной записи имитируя проверку, заблокирует ли система повторное списание, или позволит списать продукт в минус.
4.2 Механизм математической рекурсии (Runtime Mutation)
Сгенерированное негативное событие не просто отправляется во внешний контур в виде аномального DTO-пакета. Архитектурный паттерн симулятора замыкает этот сигнал обратно на саму систему через рекурсивную обратную связь (Feedback Loop). Когда инцидент зафиксирован, оркестратор инициирует метод config_trigger_cascading_failure(), и Dynamic Config Microservice осуществляет на лету пересчет весовых коэффициентов текущей сессии:
- Эскалация стресс-факторов (Компульсивное поведение): Через вызов метода
config_escalate_stress_factors()коэффициент тревожности двойника (\(H_{\text{anxiety}}\)) мгновенно инкрементируется на заданную величину \(\Delta h\). На следующих итерациях моделируемого времени (\(t+1, t+2\)) это рекурсивно меняет плотность распределения вероятностей интентов в стохастическом процессоре:- Панические покупки (Panic Buying): В контуре
execute_get_fridge_stock()лавинообразно растет склонность к незапланированным спонтанным закупкам продуктов впрок (масштабируется параметрimpulse_prob). “Цифровой двойник” начинает забивать “цифровой холодильник” дублирующими позициями номенклатуры (продуктов), создавая пиковую транзакционную нагрузку на шлюзы бэкенда. - Спонтанное потребление (Stress Eating): В контуре
execute_add_product_via_text()триггерится хаотичный, не привязанный к циркадным ритмам прием пищи. Двойник компульсивно списывает продукты в один клик, “ломая” предиктивные алгоритмы и формируя аномальные “заторы” и зацикливания на картах Process Mining, что является прямым триггером для запуска форензик-аудита.
- Панические покупки (Panic Buying): В контуре
- Изменение матрицы деградации предпочтений (Affinity Degradation):3 Через вызов метода
config_execute_affinity_degradation()происходит частичный сброс весов в локальной матрице \(\mathbf{A}_{\text{matrix}}\) для 恢复целевой номенклатурной группы продуктов (SKU). Цифровой сотрудник «теряет доверие» к интерфейсным подсказкам АРМ, имитируя “когнитивную деградацию”, и начинает совершать хаотичные поисковые запросы в обход панели быстрого подбора, генерируя зацикливания процессов на картах Process Mining.
Мутировавший вектор параметров принудительно возвращается в RAM-профиль двойника через повторный вызов метода registry_link_twin_state(), превращая симулятор в саморегулирующуюся динамическую среду.
5 Общая диаграмма последовательности рекурсивной оркестрации ядра
Ниже представлена диаграмма последовательности, отражающая внутреннюю структуру “движка” и его честное сетевое E2E-взаимодействие с реальным бэкендом (черным ящиком). Схема фиксирует распределение логики между In-Memory RAM вычислениями и асинхронным параллельным пушем индивидуальных запросов:
sequenceDiagram
autonumber
box RGB(240, 245, 255) In-Memory Simulator Core
participant Core as 🧠 CoreOrchestrator
participant Reg as 🗄️ TwinRegistry
participant Stoch as 🎲 StochasticGenerator
participant Conf as 🎛️ DynamicConfig
participant Sim as 🚀 UserActionSimulator
end
box RGB(255, 245, 240) Target Application / DB
participant API as ⚡ FastAPI Backend
end
%% ШАГ 0: СБОР КРЕДОВ И ОПРЕДЕЛЕНИЕ СЦЕНАРИЯ ВЕСОВ
Note over Core, Reg: Шаг 0: Сбор кредов и определение сценария весов
Core->>Reg: registry_init_session(seed, total_days, is_warm_start)
Core->>Reg: registry_load_init_creds(db_connection_uri)
activate Reg
Reg-->>Core: raw_credentials_list (Логины / Пароли / user_id)
deactivate Reg
alt Сценарий А: Холодный старт (Новая сессия)
Core->>Conf: config_initialize_base_matrices(seed)
Conf->>Conf: Математическая генерация стартовых весов по законам распределения
Conf-->>Core: Массив чистых начальных профилей DT_i
else Сценарий Б: Теплый старт (Продолжение сессии)
Core->>Sim: Запрос исторического слепка весов (Snapshot) из внешней БД
Sim->>API: HTTP GET /api/v1/analytics/snapshots
API-->>Sim: JSON c весами на конец прошлых суток (h_anxiety, Affinity и др.)
Sim-->>Core: Массив сохраненных профилей DT_i
end
%% ШАГ 1: СКВОЗНАЯ E2E АВТОРИЗАЦИЯ И ПРИВЯЗКА СОСТОЯНИЙ
Note over Core, API: Шаг 1: Сквозная E2E авторизация и привязка состояний в RAM
loop Для каждого бота в массиве
Core->>Sim: Выполнить легитимный вход (Логин / Пароль)
Sim->>API: HTTP POST /api/v1/auth/login
API-->>Sim: HTTP 200 OK (Реальный JWT-токен сессии)
# Запись JWT вместе с поведенческим вектором в оперативную память
Sim->>Reg: registry_link_twin_state(user_id, jwt_token, twin_profile_weights)
end
%% ВНУТРЕННИЙ ТАКТ С ПАРАЛЛЕЛЬНОЙ СЕТЕВОЙ АТАКОЙ
loop Моделируемые операционные сутки (Virtual Time Loop)
Note over Core, Reg: Шаг 2: Пакетный обсчет весов и интентов внутри RAM (Виртуальная секунда t)
# Пакетное вычитывание из локальной памяти
Core->>Reg: registry_fetch_twin_metrics(all_active_user_ids)
Reg-->>Core: Пакетный массив (Batch) текущих весов 400 двойников из RAM
# Изолированный математический цикл расчета поведения (Внутрипроцессорный рантайм)
loop Для каждого активного двойника в массиве (Логический перебор в памяти)
Core->>Stoch: stochastic_evaluate_next_step(time_context, single_twin_metrics)
activate Stoch
Stoch->>Stoch: stochastic_calculate_intents_density()
Stoch->>Stoch: stochastic_logistic_normalization()
Stoch-->>Core: Результат (Валидный интент или ERR-NEGATIVE-ANOMALY)
deactivate Stoch
# Контур мутаций деструктивного поведения (Рекурсивная петля)
alt Результат == ERR-NEGATIVE-ANOMALY (Бот-вредитель)
Core->>Conf: config_trigger_cascading_failure(user_id)
activate Conf
Conf->>Conf: config_escalate_stress_factors() -> Инкремент h_anxiety
Conf->>Conf: config_execute_affinity_degradation() -> Сброс весов SKU
Conf-->>Core: Мутировавший вектор параметров (Для такта t + 1)
deactivate Conf
# Перезапись измененных деструктивных весов обратно в RAM-профиль бота
Core->>Reg: registry_link_twin_state(user_id, current_jwt_token, mutated_weights)
else Результат == Валидный интент
Stoch-->>Core: Валидный интент (INVENTORY / SUPPLY / CONSUME)
end
end
# Честный сетевой параллелизм (Одновременный асинхронный пуш пачки)
Note over Core, API: Шаг 3: Конкурентный асинхронный пуш в сеть и амортизация нагрузок
par Асинхронный пул httpx.AsyncClient() -> Имитация толпы живых пользователей
Core->>Sim: execute_get_fridge_stock(user_1, token_1)
Sim->>API: HTTP GET /api/v1/inventory/stock/{user_1} [Headers: request_id_1, X-Virtual-Timestamp]
API-->>Sim: HTTP 200 OK (След зафиксирован)
Sim-->>Core: Результат шага Юзера 1
and
Core->>Sim: execute_add_product_via_text(user_2, token_2)
Sim->>API: HTTP POST /api/v1/inventory/add-by-text [Headers: request_id_2, X-Virtual-Timestamp, Payload: user_2]
API-->>Sim: HTTP 202 Accepted (Провокация естественной коллизии 409 Conflict в БД)
Sim-->>Core: Результат шага Юзера 2
and
Core->>Sim: execute_get_fridge_stock(user_400, token_400)
Sim->>API: HTTP GET /api/v1/inventory/stock/{user_400} [Headers: request_id_400, X-Virtual-Timestamp]
API-->>Sim: HTTP 200 OK (След зафиксирован)
Sim-->>Core: Результат шага Юзера 400
end
# Фаза фиксации времени и амортизации дисковой нагрузки
Core->>Reg: registry_increment_hunger_vector(all_active_user_ids)
Core->>Reg: registry_flush_session_states()
Note over Reg: Буферизированный сброс дельт логов на диск в tracking_event_log
end
6 Спецификация шагов внутрисуточного цикла и логика исключений
В настоящей публичной документации отображены не все шаги и сценарии для приложения в частности и для системы цифровых симуляторв бизнес-процессов в общем.
6.1 Шаг 1: Извлечение учетных данных и инициализация авторизационной сессии
Системное действие:
Движок симулятора (Sim Engine) инициализирует стартовую фазу подготовки агентов. До начала трансляции бизнес-логики система обязана получить легитимные доступы. Движок вызывает метод registry_load_init_creds(), который выполняет обращение к внешней PostgreSQL Auth_DB (или топику Kafka) для извлечения верифицированного реестра учетных данных (digital_employees): логинов, паролей и user_id. Метод registry_init_session() формирует исходную карту сессии в RAM, подготавливая ботов к отправке реальных запросов на авторизацию в целевой бэкенд.
Входные параметры контура инициализации
registry_id(UUIDv4): Уникальный токен текущего запущенного процесса симуляции для предотвращения коллизий. [Обязательно]db_connection_uri(String): Строка подключения к базе данных учетных данных сотрудников для вычитывания кредов через драйверasyncpg. [Обязательно]is_warm_start(Boolean): Флаг режима.True— продолжить сессию с загрузкой снапшотов весов из БД,False— холодный старт с генерацией чистых матриц. [Обязательно]
В настоящей публичной документации отображены не все шаги и сценарии для приложения в частности и для системы цифровых симуляторв бизнес-процессов в общем.
6.2 Шаг 2: Стохастическое моделирование и генерация негативных событий
Системное действие:
Движок симулятора запускает генератор случайных чисел на основе распределения вероятностей. На основе локальной матрицы Consumer Affinity (предпочтений и привычек конкретного двойника) и входных векторов циркадных ритмов, метод stochastic_evaluate_next_step() рассчитывает математическую вероятность наступления шага. Архитектура стохастически вбрасывает аномалии поведения и технические инциденты: импульсивное потребление запасов, умышленное сокрытие порчи, симуляция аппаратных сбоев, а также генерация грязных данных для проверки устойчивости аналитического контура форензик-расследований.
Входные параметры агрегации признаков
user_habits(JSONB): Базовая локальная матрица весовых коэффициентов аффинити и предпочтений двойника. [Обязательно]random_variable_xi(Real [0.0…1.0]): Случайное число (псевдорандом) для расчета триггера наступления целевого события через кумулятивную шкалу. [Обязательно]negative_event_rate(Real [0.0…1.0]): Вероятность генерации инцидента негативного характера (фрод, сбой, аномалия списания). [Обязательно]base_day(Date): Моделируемая календарная дата для выравнивания временной шкалы логов. [Обязательно]
Инфраструктурные коды исключений и фиксация аномалий (Error Pipeline)
ERR-STOCH-01 (Singular Probability Error):Сбой свертки весов в методахstochastic_calculate_intents_density()илиstochastic_logistic_normalization(). Математическая модель сгенерировала отрицательную или нулевую вероятность шага.ERR-NEGATIVE-ANOMALY (Forensic Trigger):Контур генерации негативных событий успешно сформировал аномалию (например, зафиксирован факт воровства или фиктивного списания). Движок маркирует DTO-событие тегомCRITICAL_ANOMALYи отправляет в лог, искусственно создавая «цифровой след» для последующего обнаружения BI-модулем через Process Mining.Catch (Exception) -> FALSE: Глобальный перехват критических ошибок памяти при переполнении стека стохастического генератора.
6.3 Шаг 3: Инициализация готовки (execute_add_cook)
Системное действие:
Успешно рассчитав стохастический интент PREPARING и проверив отсутствие критических блокировок в RAM, движок симулятора инициирует асинхронный метод-клиент execute_add_cook(). Данный шаг осуществляет каскадное рецептурное списание продуктов (сырьевых компонентов) на основе зашитых в Master Data рецептов (технологических карт) и текущих индексов голода двойника. Сформированный текстовый DTO-пакет, подписанный легитимным JWT-токеном, “выбрасывается” в сеть для имитации действий реального сотрудника.
Входные параметры контура кулинарной трансформации
recipe_id(UUIDv4): Локальный идентификатор рецепта (технологической карты) из Master Data каталога симулятора в RAM. [Обязательно]sim_hour(Float): Текущий моделируемый виртуальный час сессии (в диапазоне от 0.0 до 23.99) для выравнивания временной шкалы логов в Promtail. [Обязательно]
Инфраструктурные коды исключений (Error Pipeline)
HTTP 504 (Gateway Timeout):Критический отказ, сетевой таймаут или деградация производительности целевого FastAPI бэкенда при обработке текстового ввода.Catch (In-Memory Exception) -> FALSE:Локальный откат итерации в RAM в случае, если виртуальный баланс сырьевых компонентов внутри профиля двойника вTwinRegistryнедостаточен для декомпозиции выбранной рецептурной карты (данный фильтр отключается в режиме генерации деструктивной “теневой” экономики).
6.4 Шаг 4: Инициализация события выброса продукта в мусорку (execute_add_cook)
Системное действие:
“Цифровой двойник” под воздействием накопленного интента p_waste или критической аномалии ERR-NEGATIVE-ANOMALY (фрод/скрытые потери) инициирует отправку DTO-пакета утилизации. В случае умышленного фрода бот маскирует финансовый ущерб, пытаясь списать валидные объемы под предлогом порчи (EXPIRED), формируя «грязный» след для Forensic-анализа. Метод фиксирует шаг, изменяет параметры в RAM и переводит счетчик времени на следующую виртуальную секунду.
Входные параметры контура аудита отходов
inventory_id(UUIDv4): Уникальный суррогатный ключ целевой номенклатурной записи в RAM-реестре текущих запасов двойника. [Обязательно]reason(Enum): Фиксированная причина выбытия, автоматически принимающая значенияSPILL,EXPIRED,LOST. [Обязательно]
Инфраструктурные коды исключений (Error Pipeline)
Data Conflict (HTTP 409 Conflict):Искусственная коллизия человеческого фактора. Попытка деструктивного списания в утиль сущности, которую в эту же физическую миллисекунду другой агент на текущем такте зафиксировал как “СЪЕДЕНО” (CONSUME). Метод перехватывает отказ бэкенда, возвращает статусFALSEand принудительно генерирует запись инцидента в Grafana Loki для фиксации в контуре для последующего аудита.
7 Заключение
Разработанная архитектурная модель Sandbox-полигона представляет собой инфраструктурное решение, устанавливающее единый стандарт shared-периметра. Она обеспечивает эквивалентность операционного следа симулируемых агентов действиям реального пользователя (клиента или персонала), закладывая надежный фундамент для развития систем автоматического аудита и предиктивного моделирования сложных бизнес-систем.
Внедрение модульной In-Memory топологии, изолированной от внешних дисковых задержек на этапе математического вычисления, позволило решить проблему линейного масштабирования симулятора под пиковыми нагрузками. Последовательная оркестрация через вызовы ИТ-контрактов registry_init_session(), registry_fetch_twin_metrics() и execute_intra_day_tick() гарантирует строгую временную детерминированность. Использование стохастического риск-процессора, связанного рекурсивной обратной связью с диспетчером изменения параметров DynamicConfig, обеспечивает генерацию нелинейных, «грязных» массивов телеметрии.
Параллельный пуш индивидуальных E2E-запросов со сквозными request_id и фейковыми временными штампами X-Virtual-Timestamp позволяет воссоздавать естественные коллизии в целевых базах данных. Данный синтетический след является незаменимым инструментом для верификации и обучения алгоритмов форензик-анализа и Process Mining, позволяя выявлять скрытые финансовые потери, саботаж и инфраструктурные заторы до развертывания целевых ИТ-продуктов в промышленную эксплуатацию.
8 Приложение А: Пакетное обновление Master Data (Appendix)
8.1 Регламент синхронизации и пакетного обновления Master Data
Синхронизация справочников между In-Memory памятью симулятора и внешними базами данных PostgreSQL регламентирована для исключения коллизий номенклатуры (SKU) и технологических карт рецептов:
- Пакетное обновление по расписанию (Cron-планировщик): Раз в сутки, на стыке моделируемых макро-суток при выполнении метода
execute_macro_cycle_day(), фоновый планировщик инициализирует обновление Master Data. Оркестратор вызывает методconfig_sync_master_data(), который выполняет прямой асинхронный SQL-запрос кPostgreSQL Business DB. Из таблиц извлекаются свежие справочники номенклатуры и атомарно перезаписываются в RAM-модульTwinRegistry, предотвращая наложение транзакций. Параллельно с этим инициируется эндпоинт/api/v2/analytics/event-logдля пакетного сброса накопленного плоского массива событий за прошедшие операционные сутки в аналитический BI-модуль для построения дерева процессов (Process Tree). - Синхронизация по требованию (Административная панель): Принудительное обновление Master Data может быть инициировано инженером вручную через веб-интерфейс. При активации команды «Синхронизировать Master Data» управляющий слой отправляет запрос в локальный модуль
DynamicConfigядра симулятора. Движок временно приостанавливает генерацию высокочастотных микро-тактовexecute_intra_day_tick()(при длительных симуляциях), повторно вызывает методconfig_sync_master_data(), атомарно вычитывает свежие тикеты модерации из таблицыproduct_moderation_tickets, обновляет локальные RAM-справочники продуктовproducts_catalogи возобновляет стохастический цикл эмуляции.
sequenceDiagram
autonumber
box RGB(240, 245, 255) In-Memory Simulator Core
participant Core as 🧠 CoreOrchestrator
participant Reg as 🗄️ TwinRegistry
participant Stoch as 🎲 StochasticGenerator
participant Conf as 🎛️ DynamicConfig
participant Sim as 🚀 UserActionSimulator
end
box RGB(255, 245, 240) Target Application / DB
participant API as ⚡ FastAPI Backend
end
%% ШАГ 0: СБОР КРЕДОВ И ОПРЕДЕЛЕНИЕ СЦЕНАРИЯ ВЕСОВ
Note over Core, Reg: Шаг 0: Сбор кредов и определение сценария весов
Core->>Reg: registry_init_session(seed, total_days, is_warm_start)
Core->>Sim: Запрос сырых кредов (через REST / Kafka)
Sim-->>Core: Список кредов (Логины / Пароли / user_id)
alt Сценарий А: Холодный старт (Новая сессия)
Core->>Conf: config_initialize_base_matrices(seed)
Conf->>Conf: Математическая генерация стартовых весов по законам распределения
Conf-->>Core: Массив чистых начальных профилей DT_i
else Сценарий Б: Теплый старт (Продолжение сессии)
Core->>Sim: Запрос исторического слепка весов (Snapshot) из внешней БД
Sim->>API: HTTP GET /api/v1/analytics/snapshots
API-->>Sim: JSON c весами на конец прошлых суток (h_anxiety, Affinity и др.)
Sim-->>Core: Массив сохраненных профилей DT_i
end
%% ШАГ 1: СКВОЗНАЯ E2E АВТОРИЗАЦИЯ И ПРИВЯЗКА СОСТОЯНИЙ
Note over Core, API: Шаг 1: Сквозная E2E авторизация и привязка состояний в RAM
loop Для каждого бота в массиве
Core->>Sim: Выполнить легитимный вход (Логин / Пароль)
Sim->>API: HTTP POST /api/v1/auth/login
API-->>Sim: HTTP 200 OK (Реальный JWT-токен сессии)
# Запись JWT вместе с поведенческим вектором в оперативную память
Sim->>Reg: registry_link_twin_state(user_id, jwt_token, twin_profile_weights)
end
%% ВНУТРЕННИЙ ТАКТ С ПАРАЛЛЕЛЬНОЙ СЕТЕВОЙ АТАКОЙ
loop Моделируемые операционные сутки (Virtual Time Loop)
Note over Core, Reg: Шаг 2: Пакетный обсчет весов и интентов внутри RAM (Виртуальная секунда t)
# Пакетное вычитывание из локальной памяти
Core->>Reg: registry_fetch_twin_metrics(all_active_user_ids)
Reg-->>Core: Пакетный массив (Batch) текущих весов 400 двойников из RAM
# Изолированный математический цикл расчета поведения (Внутрипроцессорный рантайм)
loop Для каждого активного двойника в массиве (Логический перебор в памяти)
Core->>Stoch: stochastic_evaluate_next_step(time_context, single_twin_metrics)
activate Stoch
Stoch->>Stoch: stochastic_calculate_intents_density()
Stoch->>Stoch: stochastic_logistic_normalization()
Stoch-->>Core: Результат (Валидный интент или ERR-NEGATIVE-ANOMALY)
deactivate Stoch
# Контур мутаций деструктивного поведения (Рекурсивная петля)
alt Результат == ERR-NEGATIVE-ANOMALY (Бот с деструктивным поведением)
Core->>Conf: config_trigger_cascading_failure(user_id)
activate Conf
Conf->>Conf: config_escalate_stress_factors() -> Инкремент h_anxiety
Conf->>Conf: config_execute_affinity_degradation() -> Сброс весов SKU
Conf-->>Core: Мутировавший вектор параметров (Для такта t + 1)
deactivate Conf
# Перезапись измененных деструктивных весов обратно в RAM-профиль бота
Core->>Reg: registry_link_twin_state(user_id, current_jwt_token, mutated_weights)
else Результат == Валидный интент
Stoch-->>Core: Валидный интент (INVENTORY / SUPPLY / CONSUME)
end
end
# Честный сетевой параллелизм (Одновременный асинхронный пуш пачки)
Note over Core, API: Шаг 3: Конкурентный асинхронный пуш в сеть и амортизация нагрузок
par Асинхронный пул httpx.AsyncClient() -> Имитация толпы живых пользователей
Core->>Sim: execute_get_fridge_stock(user_1, token_1)
Sim->>API: HTTP GET /api/v1/inventory/stock/{user_1} [Headers: request_id_1, X-Virtual-Timestamp]
API-->>Sim: HTTP 200 OK (След зафиксирован)
Sim-->>Core: Результат шага Юзера 1
and
Core->>Sim: execute_add_product_via_text(user_2, token_2)
Sim->>API: HTTP POST /api/v1/inventory/add-by-text [Headers: request_id_2, X-Virtual-Timestamp, Payload: user_2]
API-->>Sim: HTTP 202 Accepted (Провокация естественной коллизии 409 Conflict в БД)
Sim-->>Core: Результат шага Юзера 2
and
Core->>Sim: execute_get_fridge_stock(user_400, token_400)
Sim->>API: HTTP GET /api/v1/inventory/stock/{user_400} [Headers: request_id_400, X-Virtual-Timestamp]
API-->>Sim: HTTP 200 OK (След зафиксирован)
Sim-->>Core: Результат шага Юзера 400
end
# Фаза фиксации времени и амортизации дисковой нагрузки
Core->>Reg: registry_increment_hunger_vector(all_active_user_ids)
Core->>Reg: registry_flush_session_states()
Note over Reg: Буферизированный сброс дельт логов на диск в tracking_event_log
end
Сноски
Транзакционный оверхед (от англ. transactional overhead — транзакционные накладные расходы) — это избыточные затраты вычислительных ресурсов (процессора, памяти, сети, дискового I/O) и времени, которые система тратит на обеспечение атомарности, согласованности, изолированности и надежности передачи или записи данных.↩︎
TBD↩︎
TBD↩︎