← Библиотека ЭКВИЛИБРИУМ

ЕДИНЫЙ СОЮЗ оборонная Архитектура

ЕДИНЫЙ СОЮЗ

Интегральная Оборонная Архитектура XXI века

Расширенный стратегический доклад

I. Введение: новая природа конфликта

После World War II война перестала быть исключительно военной.

Сегодня конфликт — это:

Оборона больше не равна армии.

Оборона — это целостность системы.

II. Философия Доктрины Победы

Победа XXI века — это состояние, при котором:

Формула:

Победа = Сдерживание × Суверенитет × Смысл × Развитие

Если любой множитель равен нулю — система уязвима.

III. Архитектура Единого Союза1. Военно-стратегический контур

Задача — гарантированная неотвратимость ответа.

Ключевые элементы:

Принцип: потенциальный конфликт должен быть заранее проигрышным для инициатора.

2. Технологический суверенитет

Кто контролирует технологии — тот определяет правила.

Направления:

Зависимость = стратегический риск.

3. Экономическая устойчивость

Без устойчивой экономики оборона истощается.

Контуры:

4. Смысловая безопасность

Информационный раскол разрушает быстрее ракет.

Необходимы:

Общество должно понимать, ради чего существует Союз.

5. Ноосферная дипломатия

Высший уровень обороны — снижение конфликтности среды.

Принципы:

Цель — создать мир, в котором война нерациональна.

IV. Модель пяти уровней устойчивости Союза

Уровень

Критерий устойчивости

Риск при ослаблении

Военный

Гарантированное сдерживание

Внешняя агрессия

Технологический

Независимые системы

Блокировка развития

Экономический

Самодостаточность

Истощение

Социальный

Доверие и справедливость

Внутренний раскол

Смысловой

Общая миссия

Деградация идентичности


V. Принцип “Оборона через развитие”

Классическая модель:

Сначала безопасность — потом развитие.

Интегральная модель Союза:

Развитие и есть безопасность.

Технологический рывок снижает вероятность конфликта сильнее, чем увеличение численности армии.

VI. Институциональная модель

Все элементы должны работать как единый организм.

VII. Риски XXI века

Оборона должна быть опережающей, а не реактивной.

VIII. Заключение

Единый Союз — это не военный блок. Это архитектура устойчивости.

Победа в XXI веке — это:

Только сочетание этих факторов формирует реальную безопасность.



Проект сопроводительного письма

к докладу “Единый Союз: Интегральная Оборонная Архитектура XXI века”

Уважаемые коллеги,

В условиях трансформации глобальной системы безопасности, ускорения технологических циклов и роста гибридных форм противостояния особую актуальность приобретает переход от фрагментарных мер к целостной архитектуре устойчивости.

В развитие экспертных наработок представляется стратегический доклад

“Единый Союз: Интегральная Оборонная Архитектура XXI века”.

Доклад формирует системный подход к вопросам:

Предлагаемая модель исходит из принципа:

Развитие и есть безопасность.

В докладе оборона рассматривается не только как военный контур, но как совокупность взаимосвязанных элементов: промышленности, науки, образования, информационной политики и международной кооперации.

Особое внимание уделено:

Документ носит экспертно-аналитический характер и предназначен для обсуждения в профессиональном сообществе.

Готовы представить расширенную версию, аналитические приложения и поэтапную дорожную карту реализации.

С уважением,

С. Л. Соколов

Проект письма усиленная версия.

О направлении стратегического доклада по интегральной архитектуре оборонной устойчивости

Уважаемый ________,

В целях развития системного подхода к обеспечению национальной устойчивости направляется аналитический доклад:

«Единый Союз: Интегральная Оборонная Архитектура XXI века»

Документ содержит структурированную модель обороны, основанную на пяти взаимосвязанных контурах и измеримых показателях эффективности.

1. Военно-стратегический контур

Предлагается переход от количественного наращивания к параметрам гарантированной невыгодности агрессии.

Ключевые индикаторы:

  • коэффициент автономности систем управления (% независимости от внешних платформ);
  • устойчивость критической инфраструктуры (время восстановления после инцидента);
  • доля защищённых каналов связи;
  • уровень киберустойчивости (порог отражения атак).

2. Технологический суверенитет

Фокус — снижение критической зависимости от внешних поставщиков.

Предлагаемые целевые параметры:

  • доля отечественных компонентов в критических отраслях;
  • уровень локализации микроэлектроники;
  • независимость программных решений в госсекторе;
  • доля стратегических данных, размещённых в национальных центрах обработки.

3. Экономическая устойчивость

Без экономической базы оборонный потенциал истощается.

Метрики:

  • коэффициент промышленной самодостаточности;
  • продовольственная автономность (% внутреннего обеспечения);
  • диверсификация экспортных направлений;
  • устойчивость расчётных механизмов к внешнему давлению.

4. Когнитивная и социальная устойчивость

Современные конфликты имеют гибридный характер.

Показатели:

  • уровень общественного доверия к институтам;
  • доля граждан, вовлечённых в образовательные программы системного мышления;
  • индекс информационной устойчивости;
  • скорость нейтрализации деструктивных информационных кампаний.

5. Принцип «Оборона через развитие»

Доклад обосновывает стратегию, при которой:

развитие промышленности, науки и образования рассматривается как элемент оборонной системы.

Предлагается синхронизация:

  • промышленной политики,
  • научно-технологического планирования,
  • цифровой трансформации,
  • кадровой стратегии.

Практический результат внедрения модели

  • снижение стратегических рисков;
  • повышение управляемости в кризисных сценариях;
  • формирование устойчивой архитектуры сдерживания;
  • повышение международной субъектности через инфраструктурные проекты.

Доклад носит аналитический характер и предназначен для экспертного рассмотрения. Готовы представить расширенные расчёты, матрицу рисков и поэтапную дорожную карту.

I. Доклад: «Единый Союз: Интегральная Оборонная Архитектура XXI века»

7 ключевых выводов

1. Характер конфликта изменился

Современное противостояние носит гибридный характер: санкции, технологические ограничения, кибератаки, информационное воздействие. Военный контур — лишь один из элементов.

2. Оборона = система взаимосвязанных контуров

Модель включает 5 уровней:

  • Военно-стратегический
  • Технологический
  • Экономический
  • Социально-когнитивный
  • Институционально-координационный

Ослабление любого уровня снижает устойчивость всей системы.

3. Технологическая зависимость — главный риск XXI века

Критическая уязвимость формируется в сферах:

  • микроэлектроники,
  • программного обеспечения,
  • энергетических технологий,
  • цифровой инфраструктуры.

Снижение зависимости — стратегический приоритет.

4. Экономическая устойчивость — условие сдерживания

Без промышленной базы невозможна долгосрочная оборона.

Необходимы:

  • диверсификация торговли,
  • автономные расчётные механизмы,
  • развитие производственных цепочек полного цикла.

5. Когнитивная устойчивость влияет на безопасность напрямую

Информационный раскол общества способен нанести ущерб, сопоставимый с военным ударом. Требуется системная работа с:

  • образованием,
  • медиасредой,
  • культурной политикой.

6. Развитие — это элемент обороны

Инвестиции в:

  • науку,
  • инфраструктуру,
  • цифровое управление,
  • промышленную модернизацию

снижают вероятность конфликта сильнее, чем простое наращивание сил.

7. Цель — не победа в войне, а предотвращение войны

Эффективная архитектура обороны делает агрессию экономически и стратегически бессмысленной.

II. МАТРИЦА РИСКОВ 

(вероятность × ущерб × ответные меры)

№

Риск

Вероятность

Потенциальный ущерб

Ответные меры

1

Технологическая блокада

Высокая

Ограничение развития, зависимость

Локализация критических производств

2

Кибератаки на инфраструктуру

Высокая

Нарушение управления

Создание автономных контуров и резервных систем

3

Санкционное давление

Средняя–высокая

Финансовые потери

Диверсификация расчётных механизмов

4

Информационная дестабилизация

Высокая

Социальная поляризация

Программы медиаграмотности и стратегической коммуникации

5

Демографическое снижение

Средняя

Ослабление кадрового потенциала

Поддержка семейной и образовательной политики

6

Утечка технологических компетенций

Средняя

Потеря научного суверенитета

Инвестиции в НИОКР и кадровые программы

7

Энергетические ограничения

Низкая–средняя

Снижение промышленного потенциала

Развитие автономных энергосистем

Итоговый акцент для письма

В сопроводительном письме можно добавить финальный абзац:

Внедрение интегральной модели оборонной устойчивости позволит перейти от реактивного управления рисками к проактивной архитектуре предотвращения конфликтов.


УСИЛЕННЫЙ РАЗДЕЛ

Экономическая устойчивость как контур обороны

1. Стратегический тезис

Экономика — это не «поддержка» обороны.

Экономика — это фундамент сдерживания.

Исторически устойчивость обеспечивалась не только военной силой, но и индустриальным потенциалом. После World War II ключевым фактором победы стала промышленная мобилизация.

В XXI веке мобилизация = технологическая и финансовая автономность.

2. Ключевые параметры экономической устойчивости

2.1. Промышленная самодостаточность

Целевые показатели (горизонт 5–7 лет):

Контрольная метрика: Индекс промышленной автономности (IPA).

2.2. Финансовая устойчивость

Риски XXI века — это расчётные блокировки и валютная зависимость.

Целевые ориентиры:


Контрольная метрика: Коэффициент финансовой независимости (KFI).

2.3. Энергетическая автономность

Энергия = управляемость. Параметры:

  • ≥ 90% внутреннего энергобаланса за счёт собственных ресурсов;
  • ≥ 20% доли распределённой генерации;
  • резервирование критических объектов (100%).

Метрика: Индекс энергетической устойчивости (IEU).

2.4. Продовольственная безопасность

Продовольствие — фактор социальной стабильности.

Цели:

Метрика: Коэффициент продовольственной автономии (KPA).

2.5. Технологическая добавленная стоимость

Сырьевая модель усиливает уязвимость. Целевой вектор:

  • рост доли продукции с высокой добавленной стоимостью ≥ 50% в структуре экспорта;
  • увеличение расходов на НИОКР до ≥ 3% ВВП;
  • рост доли высокотехнологичных отраслей ≥ 25% ВВП.

Метрика: Индекс технологической глубины (ITG).

3. Институциональные механизмы реализации

  • Центр мониторинга стратегических рисков (квартальный аудит).
  • Координационный совет технологической автономии.
  • Интеграция промышленной политики с образовательной системой.
  • Стратегические производственные кластеры полного цикла.
  • Долгосрочное инвестиционное планирование (горизонт 10–15 лет).

4. Экономическая модель «Оборона через развитие»

Формула:

Экономическая устойчивость = Производство × Технологии × Финансовая автономия × Кадры

Если один элемент ослаблен — система уязвима.

5. Матрица экономических рисков (усиленная версия)


Риск

Вероятность

Ущерб

Приоритет ответа

Технологическая блокировка

Высокая

Критический

Максимальный

Финансовая изоляция

Средняя–высокая

Высокий

Высокий

Логистические ограничения

Средняя

Высокий

Высокий

Сырьевая зависимость

Средняя

Средний

Средний

Демографическое снижение

Средняя

Стратегический

Максимальный



6. Итоговая позиция для письма

Можно добавить финальный акцент:

Экономическая устойчивость рассматривается как элемент национальной оборонной архитектуры, обеспечивающий долгосрочную способность к стратегическому сдерживанию и развитию.



Приложение А. Сценарный анализ устойчивости

Методика

Оцениваем систему по 5 контурам (военный, технологический, экономический, когнитивный, институциональный) через:

Сценарий 1. Оптимистичный

“Управляемая конкуренция + окно развития”

Триггеры

Окно возможностей

Приоритетные действия

Целевой результат

Сценарий 2. Базовый

“Длительное давление + волны ограничений”

Триггеры

Ключевые риски

Приоритетные действия

Целевой результат

Сценарий 3. Стресс

“Резкая эскалация: финансово-технологический разрыв + киберудары”

Триггеры

Профиль ущерба: высокий/критический, особенно в первые 30–90 дней.

Антикризисный контур (что должно быть готово заранее)

Целевой результат: удержание управляемости, предотвращение каскадного отказа инфраструктуры.

Приложение Б. Таблица межотраслевой синхронизации

Идея простая: оборонная устойчивость достигается не отраслью, а стыками (данные ↔ энергия ↔ производство ↔ кадры ↔ логистика ↔ финансы ↔ смысл).

1) Матрица “Контур → Отрасль → Выход → KPI”


Контур

Опорные отрасли

Критический выход

KPI (пример)

Военно-стратегический

связь, спутники, приборостроение

устойчивое управление

время восстановления управления; доля защищённых каналов

Технологический

микроэлектроника, станкостроение, ПО

независимые цепочки

доля локализации; доля отечественного ПО в критсистемах

Экономический

промышленность, энергетика, финансы

ресурсная база

запасы критпозиций; автономность энергобаланса

Когнитивный

образование, медиа, культура

устойчивость общества

индекс доверия; скорость нейтрализации инфокампаний

Институциональный

госуправление, стандартизация

координация

время принятия решений; % проектов с межвед. синхронизацией



2) Таблица “7 ключевых цепочек” (самые важные стыки)


Цепочка

Зачем нужна

Узкое место

Что синхронизировать

Микроэлектроника → связь → управление

управляемость страны

компоненты/фабрики

локализация + стандарты + сертификация

Энергия → промышленность → логистика

устойчивость производства

сети/резерв

распределённая генерация + резервирование объектов

Данные → ИИ → киберзащита

опережающая оборона

кадры/ПО

дата-центры + обучение + протоколы реагирования

Финансы → расчёты → внешняя торговля

устойчивость обмена

клиринг/валюта

альтернативные расчёты + резервы + маршруты

Материалы → химия → машиностроение

производство полного цикла

редкие материалы

складские резервы + переработка + замены

Образование → кадры → НИОКР

технологический рывок

утечка мозгов

гранты + инженерные школы + заказ на НИОКР

Смысл → доверие → мобилизационная готовность

социальная устойчивость

поляризация

коммуникация + культура + медиаграмотность



3) Мини-реестр “Критические зависимости” (шаблон строки)

Это вставляется таблицей в приложение и заполняется по факту:







Приложение В. Стресс-тест устойчивости: 10 критических систем Союза

Шкала

1) Энергосистема (генерация + сети + диспетчеризация)

Порог отказа: потеря ≥ 15% мощности в регионе на > 6 часов, либо нарушение частоты/устойчивости сети.

Каскад: связь → вода/тепло → промышленность → логистика → здравоохранение.

План восстановления

  • 0–24ч: изоляция аварийных сегментов, приоритетное питание критобъектов, ввод резервов (ДГУ/газотурбины), ручные протоколы управления.
  • 24–72ч: перераспределение потоков, запуск распределённой генерации, переброска мобильных подстанций.
  • до 30д: ремонт “узких мест”, создание постоянных резервных схем и складов криткомплектов.

KPI

  • время восстановления критнагрузок (часы);
  • доля критобъектов с резервным питанием (%);
  • время переключения на резервные схемы (мин).

2) Связь и управление (магистрали, спецсвязь, радиосети)

Порог отказа: деградация управляемости > 2 часов (неустойчивые каналы в ключевых звеньях).

Каскад: госуправление → оборона → финансы → логистика.

План восстановления

  • 0–24ч: переход на защищённые резервные каналы, приоритет трафика, отключение компрометированных сегментов.
  • 24–72ч: развёртывание мобильных узлов, спутниковое резервирование, восстановление маршрутизации.
  • до 30д: обновление криптоконтуров, “двойной контур” связи на всех уровнях.

KPI

  • доля защищённых каналов (%);
  • время переключения на резерв (мин);
  • доля автономных узлов связи (%).

3) Финансовая система и расчёты

Порог отказа: невозможность массовых расчётов > 24 часов или заморозка внешних клиринговых каналов.

Каскад: торговля → логистика → социальная напряжённость.

План восстановления

  • 0–24ч: включение резервного контура расчётов (внутренние клиринги), лимитирование рисков, приоритет зарплат/пенсий/критзакупок.
  • 24–72ч: перевод внешних операций в альтернативные механизмы, стабилизация ликвидности.
  • до 30д: расширение автономных платёжных каналов, регламенты “финансовой мобилизации”.

KPI

  • непрерывность выплат населению (%);
  • доля операций, проходящих через резервный контур (%);
  • время восстановления массовых платежей (часы).

4) Логистика и транспорт (ЖД/порты/авто/авиа узлы)

Порог отказа: сбой поставок критгрузов > 72 часов или блокировка ключевых узлов.

Каскад: продовольствие → топливо → промышленность.

План восстановления

  • 0–24ч: переориентация маршрутов, приоритет критгрузов, ввод спецрежима в узлах.
  • 24–72ч: мобилизация резервных перевозчиков, распределение складских резервов.
  • до 30д: создание дублёров маршрутов, контейнерные/складские мощности, “сухие порты”.

KPI

  • доставка критгрузов в SLA (%);
  • время обхода блокированного узла (часы/дни);
  • запас складских резервов (дни покрытия).

5) Продовольствие и агроцепочки

Порог отказа: дефицит базовой корзины в регионе > 7 дней или ценовой шок > заданного коридора.

Каскад: социальная устойчивость → доверие → управляемость.

План восстановления

  • 0–24ч: выпуск резервов, ценовые коридоры на критнабор, приоритетная логистика.
  • 24–72ч: перераспределение по регионам, поддержка производителей/переработки.
  • до 30д: укрепление семенного/кормового фонда, расширение переработки, складская инфраструктура.

KPI

  • дни покрытия стратегрезервом;
  • стабильность цены базовой корзины (% отклонения);
  • доля внутреннего обеспечения (%).

6) Здравоохранение и санитарная готовность

Порог отказа: перегрузка стационаров > 20% мощностей на 2+ недели или дефицит критлекарств.

Каскад: демография → экономика → доверие.

План восстановления

  • 0–24ч: triage-протоколы, перераспределение потоков, мобилизация запасов.
  • 24–72ч: развертывание временных мощностей, логистика лекарств/расходников.
  • до 30д: расширение отечественного производства критпозиций, обновление стандартов.

KPI

  • обеспеченность критпрепаратами (дни);
  • время развёртывания допмощностей (сутки);
  • доля отечественных критмедизделий (%).

7) Госуправление и непрерывность власти

Порог отказа: неспособность принимать/доводить решения на ключевых уровнях > 2 часов.

Каскад: всё.

План восстановления

  • 0–24ч: переход на резервные центры управления, регламенты “управление без ИТ”, приоритетные каналы.
  • 24–72ч: синхронизация уровней, единый штаб инцидента (war room).
  • до 30д: “дублирование управляемости” (центры, кадры, связь, процедуры).

KPI

  • время восстановления цепочки командования;
  • доля органов с резервным управлением (%);
  • частота учений (раз/год).

8) ОПК и промышленная мобилизация

Порог отказа: срыв критпроизводств/комплектующих > 30 дней.

Каскад: военный контур → технологический → внешнеполитический.

План восстановления

  • 0–24ч: инвентаризация критзависимостей, перераспределение мощностей, конверсия линий.
  • 24–72ч: запуск альтернативных поставок/замен, ускоренная сертификация.
  • до 30д: развертывание производств “узких мест”, складские резервы, долгосрочные контракты.

KPI

  • время замещения криткомпонента (мес);
  • доля локализации по критпозиций (%);
  • запас криткомплектующих (мес покрытия).

9) Образование/кадры/НИОКР (инженерный контур)

Порог отказа: устойчивый дефицит ключевых специалистов или утечка компетенций.

Каскад: технологии → промышленность → оборона.

План восстановления

  • 0–24ч: приоритизация ключевых компетенций, “кадровый реестр”.
  • 24–72ч: стимулирующие пакеты, ускоренные программы переподготовки.
  • до 30д: инженерные школы, гранты НИОКР, заказ на прикладные разработки.

KPI

  • выпуск инженеров/год по приоритетам;
  • доля НИОКР от ВВП (%);
  • срок закрытия вакансий в критсферах (дни).

10) Медиа/инфосреда/когнитивная устойчивость

Порог отказа: массовая поляризация, падение доверия ниже критпорога или успешные инфооперации, вызывающие управленческий паралич.

Каскад: социальная устойчивость → госуправление → экономика.

План восстановления

  • 0–24ч: единый центр коммуникации кризиса, быстрый факт-контур, пресечение паники.
  • 24–72ч: разъяснительные кампании, медиаграмотность, работа с лидерами сообществ.
  • до 30д: системная стратегия смысловой безопасности (образование + культура + медиа).

KPI

  • скорость опровержения деструктивного вброса (часы);
  • индекс доверия к институтам;
  • доля населения с базовой медиаграмотностью (%).


Приложение Г. “War Room” — единый штаб инцидента (шаблон структуры)

Состав:

энергия, связь, кибер, финансы, логистика, соцблок, медиа, промышленность.

Единый протокол: 

обнаружение → изоляция → восстановление → пост-анализ.

Режим: 

24/7 при стресс-сценарии, еженедельные учения в базовом режиме.










ПАСПОРТ УСТОЙЧИВОСТИ

(стандарт для критической системы Союза)

1. Идентификация системы

  • Название системы:
  • Контур (военный / технологический / экономический / когнитивный / институциональный):
  • Уровень критичности: I / II / III
  • Ответственный орган/координатор:

2. Целевая функция

Что система обязана обеспечивать при любых условиях? (формулировка в 1–2 строках, без общих слов)

3. Порог отказа (красная зона)

Конкретно:

  • Время деградации:
  • Масштаб:
  • Потеря функционала (%):

4. Резервирование

  • Физический резерв (мощности, склады, оборудование):
  • Информационный резерв (дублирующие каналы):
  • Кадровый резерв:
  • Финансовый резерв:

5. Сценарий реагирования. 0–24 часа

(первые действия) 24–72 часа

(стабилизация) До 30 дней

(восстановление и усиление)

6. KPI устойчивости

  • Время восстановления (RTO):
  • Допустимая потеря данных (RPO):
  • % автономности:
  • Частота стресс-тестов:
  • Индекс готовности (сводный):

7. Уровень зрелости

1 — декларативный

2 — частично реализованный

3 — функционирующий

4 — регулярно тестируемый

5 — устойчивый к стресс-сценарию

Пример 1

Паспорт устойчивости — Энергосистема

Контур: экономико-технологический

Критичность: I

Целевая функция:

Обеспечение непрерывного энергоснабжения критической инфраструктуры и промышленности.

Порог отказа:

Потеря > 15% мощности в регионе на > 6 часов.

Резервирование:

  • 20% распределённой генерации
  • 100% резервирование критических объектов
  • 30 дней запасов ключевых комплектующих

KPI:

  • Время восстановления < 12 часов
  • 95% критобъектов с автономным питанием
  • 2 стресс-теста в год

Пример 2

Паспорт устойчивости — Финансовая система

Контур: экономический

Критичность: I

Целевая функция:

Непрерывность расчётов и социальных выплат.

Порог отказа:

Невозможность массовых операций > 24 часов.

Резервирование:

  • Альтернативный клиринговый механизм
  • 24 месяца покрытия импорта критических позиций
  • 2 независимых дата-центра

KPI:

  • 99% выплат в срок
  • Восстановление массовых платежей < 6 часов
  • Доля автономных расчётов ≥ 70%

Пример 3

Паспорт устойчивости — Связь и управление

Контур: институционально-военный

Критичность: I

Целевая функция:

Гарантированная управляемость на всех уровнях.

Порог отказа:

Нарушение устойчивой связи > 2 часов.

Резервирование:

  • Дублирующие каналы (оптика + спутник + радиорезерв)
  • Резервные центры управления
  • Криптографический двойной контур

KPI:

  • Переключение на резерв < 10 минут
  • 100% ключевых узлов с дублированием
  • Ежеквартальные учения

Как это использовать стратегически

Если документ направляется официально, рекомендую:

  • Сделать 10 паспортов (по всем критическим системам).
  • Свести их в сводную таблицу “Индекс устойчивости Союза”.
  • Ввести ежегодную процедуру аудита.
  • Добавить раздел “динамика показателей за 3 года”.


I. СВОДНЫЙ ИНДЕКС УСТОЙЧИВОСТИ СОЮЗА (SIU)

1. Логика индекса

Устойчивость — это не сумма, а произведение контуров.

Если один контур слабый — вся система уязвима.

Формула: 

SIU = (W × T × E × C × I)^{1/5},

Где:

  • W — Военный контур
  • T — Технологический
  • E — Экономический
  • C — Когнитивный (социальный)
  • I — Институциональный

Каждый контур оценивается по шкале 0–100.

Используется геометрическое среднее, чтобы слабое звено снижало общий показатель.

2. Внутренний расчёт каждого контура

Каждый контур = среднее по 5 параметрам:

Контур

Параметры

W

Сдерживание, автономность управления, резервирование, киберустойчивость, учения

T

Локализация, НИОКР, кадровый резерв, независимость ПО, глубина производства

E

Промышленность, финансы, энергия, продовольствие, логистика

C

Доверие, информационная устойчивость, образование, культурная интеграция, мобилизационная готовность

I

Скорость решений, межотраслевая координация, дублирование центров, аудит рисков, прозрачность KPI

3. Шкала интерпретации

SIU

Уровень

0–40

Уязвимая система

40–60

Частично устойчивая

60–75

Стабильная

75–85

Высокая устойчивость

85–100

Стратегически защищённая

4. Пример расчёта (условный)

W = 78

T = 62

E = 70

C = 65

I = 60

SIU ≈ 66 Вывод: система стабильна, но технологический и институциональный контуры требуют усиления.

II. ДОРОЖНАЯ КАРТА: ПЕРЕХОД 2 → 5

Уровни зрелости

2 — Частично реализовано

3 — Функционирует

4 — Регулярно тестируется

5 — Устойчиво к стресс-сценарию

ЭТАП 1 (0–2 года)

Переход 2 → 3. Цель: Формализовать систему.

  • Утвердить паспорта устойчивости.
  • Ввести единый реестр критических зависимостей.
  • Запустить ежегодный аудит SIU.
  • Создать центр мониторинга рисков.
  • Начать квартальные стресс-тесты.

Результат: система управляется.

ЭТАП 2 (2–5 лет)

Переход 3 → 4. Цель: Проверить систему в практике.

  • Регулярные межотраслевые учения.
  • Дублирование центров управления.
  • Увеличение резервов до нормативных уровней.
  • Локализация 60–75% критических компонентов.
  • Повышение НИОКР ≥ 3% ВВП.

Результат: система выдерживает базовый стресс.

ЭТАП 3 (5–10 лет)

Переход 4 → 5. Цель: Полная стратегическая автономность.

  • Полный двойной контур управления.
  • 80–90% автономности критических отраслей.
  • Устойчивость к финансовой изоляции.
  • Высокий индекс доверия (>75).
  • SIU ≥ 80.

Результат: агрессия становится нерациональной.



III. Контрольный механизм

Раз в год:

  • Пересчёт SIU.
  • Обновление паспортов.
  • Публичный (или закрытый) отчёт по динамике.
  • Корректировка дорожной карты.

Главное

Устойчивость — это не доклад. Это управляемая динамика показателей.

ПЛАТФОРМА «СОЮЗ»

Прототип интерфейса (MVP)

1️⃣ Главный экран — STRATEGIC DASHBOARD

Центральный элемент:

SIU — Сводный индекс устойчивости

Большой круговой индикатор:

  • 0–40 красная зона
  • 40–60 жёлтая
  • 60–75 зелёная
  • 75+ тёмно-зелёная

Под ним — динамика за 12 месяцев.

Справа — 5 контуров

Контур

Индекс

Тренд

Военный

78

↑

Технологический

62

→

Экономический

70

↑

Когнитивный

65

↓

Институциональный

60

→

Клик по каждому — переход к детализации.

2️⃣ Экран контура (пример: Экономический)

Блок 1 — KPI в реальном времени

  • Промышленная автономность (%)
  • Финансовая устойчивость
  • Энергетический баланс
  • Продовольственный индекс
  • Логистическая устойчивость

Каждый — со светофорной индикацией.

Блок 2 — Карта рисков

Матрица: Вероятность × Ущерб

Риски автоматически подсвечиваются при превышении порога.

Блок 3 — Тренды

График 1 / 3 / 5 лет

  • прогноз при текущей динамике.

3️⃣ Модуль “РЕЕСТР ЗАВИСИМОСТЕЙ

Интерфейс:

Фильтр:

  • Отрасль
  • Уровень риска
  • Импортная доля
  • Срок замещения

Таблица:

| Компонент | Риск | Замена | Срок | Резерв |

Система автоматически выделяет критические позиции.

4️⃣ МОДУЛЬ “СТРЕСС-ТЕСТ”

Экран сценариев:

  • Оптимистичный
  • Базовый
  • Стресс

Пользователь выбирает событие:

  • Финансовая блокировка
  • Кибератака
  • Логистический сбой
  • Энергетический инцидент

Система рассчитывает:

  • падение SIU
  • время восстановления
  • каскадные эффекты

5️⃣ WAR ROOM DIGITAL

Режим активируется автоматически при:

  • падении SIU ниже 60
  • превышении порога критического риска

Экран делится на 4 зоны:

  • Карта событий
  • Критические KPI
  • Задачи и решения
  • Таймер реакции

6️⃣ Архитектура уровней доступа

Уровень 1 — Стратегический

Только индексы и сводная аналитика.

Уровень 2 — Операционный

Отраслевые показатели и риски.

Уровень 3 — Технический

Глубокие данные и параметры.

7️⃣ Техническая архитектура MVP

  • Backend: защищённый серверный контур
  • База данных: распределённая
  • Аналитика: модуль расчёта SIU
  • Интерфейс: web + защищённый intranet
  • Логи: непрерывный аудит действий

8️⃣ Минимальный функционал запуска (6–9 месяцев)

  • Расчёт SIU.
  • Дашборд 5 контуров.
  • Паспорта устойчивости.
  • Базовый стресс-тест.
  • Ручной ввод KPI.

Без избыточной сложности.


I. Экономический эффект от роста устойчивости

1. Базовая логика

Устойчивость снижает:

  • премию за риск,
  • волатильность,
  • потери от кризисов,
  • издержки импортозамещения в аварийном режиме.

И увеличивает:

  • инвестиционную привлекательность,
  • глубину переработки,
  • добавленную стоимость,
  • технологическую самостоятельность.

2. Модель влияния на ВВП. 

Разделим эффект на 4 блока:

1️⃣ Снижение кризисных потерь

Исторически кризисы “съедают” 3–8% ВВП в стресс-сценарии.

Повышение SIU с 60 → 80 снижает потери на 30–50%.

Экономия: ≈ 1,5–3% ВВП ежегодно в горизонте 10 лет.

2️⃣ Рост технологической добавленной стоимости

Увеличение доли высокотеха:+10% к структуре экспорта

= +2–3% к ВВП в среднесрочной перспективе.

3️⃣ Снижение финансовых издержек

Устойчивость уменьшает:

  • стоимость заимствований,
  • санкционные потери,
  • утечку капитала.

Оценочный эффект: +0,5–1,5% ВВП.

4️⃣ Инфраструктурный мультипликатор

Инвестиции в:

  • энергетику,
  • цифровизацию,
  • промышленную кооперацию, 
  • дают мультипликатор 1,4–1,8.

3. Суммарный эффект

При переходе SIU 65 → 80: Потенциальный прирост ВВП: +3–6% к базовой траектории в горизонте 7–10 лет.

Главное: устойчивость окупается.


II. Платформа мониторинга “СОЮЗ”

Переходим к цифровому управлению.

Архитектура платформы “СОЮЗ”

1. Цель

Реальный мониторинг устойчивости в режиме 24/7. Не отчёты раз в год. А живая система.

2. Основные модули

МОДУЛЬ 1 — SIU-CORE

  • Автоматический расчёт индекса устойчивости.
  • Дашборд 5 контуров.
  • Динамика за 1–5–10 лет.

МОДУЛЬ 2 — РЕЕСТР КРИТИЧЕСКИХ ЗАВИСИМОСТЕЙ

  • Компонент → отрасль → поставщик → риск.
  • Сигналы при превышении порога.

МОДУЛЬ 3 — СТРЕСС-ТЕСТ ENGINE

  • Моделирование сценариев.
  • Оценка каскадных эффектов.
  • Прогноз времени восстановления.

МОДУЛЬ 4 — KPI МОНИТОРИНГ

  • Энергия.
  • Связь.
  • Финансы.
  • Логистика.
  • Образование.
  • ОПК.

МОДУЛЬ 5 — WAR ROOM DIGITAL

  • Интеграция данных в кризисе.
  • Центр принятия решений.
  • История инцидентов.

3. Технологическая архитектура

Платформа включает:

  • защищённый дата-контур,
  • распределённые узлы,
  • аналитический слой (AI),
  • интерфейс стратегического управления.

4. Уровни доступа

  • Стратегический (сводный индекс).
  • Операционный (отраслевые показатели).
  • Технический (конкретные метрики и тревоги).

5. Этапность внедрения

Этап 1 (1–2 года)

  • Запуск SIU-CORE.
  • Паспорта устойчивости.
  • Базовые стресс-тесты.

Этап 2 (3–5 лет)

  • Интеграция отраслевых данных.
  • Автоматические сигналы.
  • Центр цифрового мониторинга.

Этап 3 (5–10 лет)

  • Полный цифровой двойник устойчивости.
  • Прогнозирование на базе ИИ.
  • Предиктивная защита.

Итоговая связка. Рост SIU →Снижение рисков →Рост инвестиций →Рост ВВП →Усиление устойчивости. Замкнутый цикл.

Data Model (схема данных) платформы “СОЮЗ” для MVP. Это можно сразу отдавать архитектору/разработчику: сущности, связи, поля, правила версионирования и расчёта SIU.

Data Model платформы «СОЮЗ» (MVP)

0) Принципы модели

  • Событийность: всё важное фиксируется как измерение / инцидент / решение / тест.
  • Версионность: паспорта, KPI и пороги имеют версии (чтобы аудит видел историю).
  • Иерархия: Система → Контур → Подсистема → KPI → Измерение.
  • Нормативы vs Факт: отдельно храним целевые значения и фактические измерения.

1) Справочники (core)

1.1 Contour. Контуры устойчивости (5 штук).

  • contour_id (PK)
  • code (W, T, E, C, I)
  • name
  • weight (по умолчанию 0.2)
  • description

1.2 Critical System. 10 критических систем (энергия, связь, финансы…).

  • system_id (PK)
  • name
  • category (energy/comm/finance/…)
  • criticality_level (1/2/3)
  • owner_org
  • region_scope (national/region/local)
  • status (active/archived)


1.3 Subsystem. Подсистемы внутри CriticalSystem.

  • subsystem_id (PK)
  • system_id (FK → CriticalSystem)
  • name
  • description
  • status

1.4 OrgUnit. Организации/подразделения.

  • org_id (PK)
  • name
  • type (operator/regulator/analysis/…)
  • contact_role (не персональные данные, только роль)
  • status

1.5 UserRole (RBAC). Роли доступа.

2) Паспорта устойчивости (версии и контроль)

2.1 ResiliencePassport. Паспорт системы (актуальная “шапка”).

  • passport_id (PK)
  • system_id (FK)
  • contour_id (FK)
  • current_version_id (FK → PassportVersion)
  • maturity_level (1–5)
  • created_at, updated_at

2.2 PassportVersion. Версия паспорта (аудит и изменения).

  • version_id (PK)
  • passport_id (FK)
  • version_no (int)
  • target_function (text)
  • failure_threshold (text + structured fields ниже)
  • rto_target_hours (float)
  • rpo_target_hours (float)
  • autonomy_target_pct (float)
  • test_frequency_per_year (int)
  • approved_by_org (FK → OrgUnit)
  • effective_from, effective_to
  • notes

2.3 FailureThreshold.  (опционально, если нужно структурировать)

  • threshold_id (PK)
  • version_id (FK)
  • metric (e.g. “capacity_loss_pct”, “outage_hours”)
  • operator (>, >=, <…)
  • value (float)
  • unit

2.4 ReserveProfile. Профиль резервов по версии паспорта.

  • reserve_id (PK)
  • version_id (FK)
  • reserve_type (physical/data/people/finance)
  • description
  • coverage_days (float, nullable)
  • capacity_units (nullable)
  • last_verified_at

3) KPI и измерения

3.1 KPI. Справочник KPI.

  • kpi_id (PK)
  • name
  • unit (%, hours, days, index)
  • aggregation (avg/min/max/last/weighted)
  • direction (higher_is_better / lower_is_better)
  • description

3.2 KPIDefinition. Привязка KPI к системе/подсистеме и контуру + нормативы.

  • kpi_def_id (PK)
  • kpi_id (FK)
  • system_id (FK)
  • subsystem_id (FK, nullable)
  • contour_id (FK)
  • target_value (float)
  • warning_value (float)
  • critical_value (float)
  • weight_in_contour (float)  (сумма по контуру = 1.0)
  • effective_from, effective_to
  • source_type (manual/api/import)
  • owner_org (FK)

3.3 Measurement. Фактические измерения KPI.

  • measurement_id (PK)
  • kpi_def_id (FK)
  • timestamp
  • value (float)
  • quality_flag (ok/suspect/missing)
  • ingested_at
  • source_ref (строка: файл/датчик/система)

4) Риски и зависимости

4.1 RiskRegister. Реестр рисков (в т.ч. для матрицы вероятн×ущерб).

  • risk_id (PK)
  • name
  • type (tech/finance/cyber/logistics/info/…)
  • description
  • probability (1–5)
  • impact (1–5)
  • risk_score (computed = prob×impact)
  • owner_org (FK)
  • status (open/mitigating/closed)
  • last_reviewed_at

4.2 DependencyItem. Критические зависимости (компонент/ПО/материал).

  • dep_id (PK)
  • system_id (FK)
  • subsystem_id (FK, nullable)
  • item_name
  • item_type (component/material/software/service)
  • current_source (domestic/foreign/mixed)
  • import_share_pct (float)
  • substitution_plan (text)
  • substitution_due_months (int)
  • reserve_coverage_months (float)
  • risk_level (low/med/high/critical)
  • owner_org (FK)
  • updated_at

5) Инциденты и War Room

5.1 Incident. Инцидент/событие (реальный или учение).

  • incident_id (PK)
  • system_id (FK)
  • incident_type (cyber/outage/supply/finance/info/…)
  • severity (1–5)
  • started_at, ended_at
  • status (open/contained/recovered/closed)
  • summary
  • root_cause (nullable)
  • created_by_role (FK → UserRole)

5.2 IncidentImpact. Каскадный эффект (какие KPI/системы задеты).

  • impact_id (PK)
  • incident_id (FK)
  • kpi_def_id (FK, nullable)
  • affected_system_id (FK, nullable)
  • delta_value (float, nullable)
  • notes

5.3 DecisionLog. Журнал решений War Room.

  • decision_id (PK)
  • incident_id (FK)
  • time
  • decision_text
  • assigned_org (FK)
  • deadline
  • status (planned/in_progress/done)
  • evidence_ref (nullable)

6) Стресс-тесты и сценарии

6.1 Scenario

  • scenario_id (PK)
  • name (optimistic/base/stress + custom)
  • description
  • assumptions (text/json)
  • created_at

6.2 StressTestRun. Запуск теста.

6.3 StressTestResult. Результаты по системам/контурам.

7) Расчёт индексов (SIU)

7.1 ContourScore. Сводный балл контура за период.

  • contour_score_id (PK)
  • contour_id (FK)
  • period_start, period_end
  • score_0_100
  • computed_at
  • method_version (чтобы менять методику)

7.2 SIUScore. Индекс SIU.

Правило расчёта (MVP)

  • Считаем каждый ContourScore как взвешенное среднее KPI по KPI Definition.weight_in_contour за период (например, last/avg).
  • SIU = геометрическое среднее пяти контуров:
    SIU = (W × T × E × C × I)^{1/5}
  • Если по контуру много missing, вводим штраф (например, -5…-15), чтобы стимулировать данные.

8) Связи (коротко)

  • Contour 1—N Resilience Passport
  • CriticalSystem 1—N ResiliencePassport, 1—N Subsystem, 1—N KPIDefinition, 1—N Incident, 1—N DependencyItem
  • KPI 1—N KPIDefinition
  • KPIDefinition 1—N Measurement
  • Incident 1—N DecisionLog, 1—N IncidentImpact
  • Scenario 1—N StressTestRun 1—N StressTestResult
  • ContourScore + SIUScore — периодические агрегаты

9) Минимальный набор данных для запуска MVP

Чтобы платформа “жила” сразу:

  • 10 CriticalSystem
  • 5 Contour
  • по 5 KPI на контур (25 KPI минимум)
  • 1 паспорт на систему (10 паспортов) + версии
  • еженедельный импорт Measurement (даже ручной)
  • 1 базовый сценарий стресс-теста


DDL-скелет под PostgreSQL (таблицы/ключи/индексы) и wireframe навигации/экранов строго под наш Data Model.

1) PostgreSQL DDL (скелет)


-- =========================================

-- PLATFORM "SOYUZ" - MVP DDL (PostgreSQL)

-- =========================================


-- 0) Enums (можно заменить на справочники)

DO $$ BEGIN

  CREATE TYPE risk_status AS ENUM ('open','mitigating','closed');

EXCEPTION WHEN duplicate_object THEN NULL; END $$;


DO $$ BEGIN

  CREATE TYPE incident_status AS ENUM ('open','contained','recovered','closed');

EXCEPTION WHEN duplicate_object THEN NULL; END $$;


DO $$ BEGIN

  CREATE TYPE quality_flag AS ENUM ('ok','suspect','missing');

EXCEPTION WHEN duplicate_object THEN NULL; END $$;


DO $$ BEGIN

  CREATE TYPE kpi_direction AS ENUM ('higher_is_better','lower_is_better');

EXCEPTION WHEN duplicate_object THEN NULL; END $$;


DO $$ BEGIN

  CREATE TYPE kpi_aggregation AS ENUM ('avg','min','max','last','weighted');

EXCEPTION WHEN duplicate_object THEN NULL; END $$;


DO $$ BEGIN

  CREATE TYPE system_status AS ENUM ('active','archived');

EXCEPTION WHEN duplicate_object THEN NULL; END $$;


DO $$ BEGIN

  CREATE TYPE reserve_type AS ENUM ('physical','data','people','finance');

EXCEPTION WHEN duplicate_object THEN NULL; END $$;


DO $$ BEGIN

  CREATE TYPE dependency_type AS ENUM ('component','material','software','service');

EXCEPTION WHEN duplicate_object THEN NULL; END $$;


DO $$ BEGIN

  CREATE TYPE source_type AS ENUM ('manual','api','import');

EXCEPTION WHEN duplicate_object THEN NULL; END $$;


-- 1) Core reference tables


CREATE TABLE IF NOT EXISTS contour (

  contour_id        BIGSERIAL PRIMARY KEY,

  code              TEXT NOT NULL UNIQUE CHECK (code IN ('W','T','E','C','I')),

  name              TEXT NOT NULL,

  weight            NUMERIC(6,4) NOT NULL DEFAULT 0.2000,

  description       TEXT

);


CREATE TABLE IF NOT EXISTS org_unit (

  org_id            BIGSERIAL PRIMARY KEY,

  name              TEXT NOT NULL UNIQUE,

  type              TEXT,

  contact_role      TEXT, -- только роль, без персональных данных

  status            system_status NOT NULL DEFAULT 'active'

);


CREATE TABLE IF NOT EXISTS user_role (

  role_id           BIGSERIAL PRIMARY KEY,

  name              TEXT NOT NULL UNIQUE, -- strategic/operational/technical/auditor/admin

  permissions       JSONB NOT NULL DEFAULT '{}'::jsonb

);


CREATE TABLE IF NOT EXISTS critical_system (

  system_id         BIGSERIAL PRIMARY KEY,

  name              TEXT NOT NULL UNIQUE,

  category          TEXT NOT NULL, -- energy/comm/finance/logistics/...

  criticality_level SMALLINT NOT NULL CHECK (criticality_level BETWEEN 1 AND 3),

  owner_org         BIGINT REFERENCES org_unit(org_id),

  region_scope      TEXT NOT NULL DEFAULT 'national',

  status            system_status NOT NULL DEFAULT 'active'

);


CREATE TABLE IF NOT EXISTS subsystem (

  subsystem_id      BIGSERIAL PRIMARY KEY,

  system_id         BIGINT NOT NULL REFERENCES critical_system(system_id) ON DELETE CASCADE,

  name              TEXT NOT NULL,

  description       TEXT,

  status            system_status NOT NULL DEFAULT 'active',

  UNIQUE(system_id, name)

);


-- 2) Passports (versioned)


CREATE TABLE IF NOT EXISTS resilience_passport (

  passport_id        BIGSERIAL PRIMARY KEY,

  system_id          BIGINT NOT NULL REFERENCES critical_system(system_id) ON DELETE CASCADE,

  contour_id         BIGINT NOT NULL REFERENCES contour(contour_id),

  current_version_id BIGINT, -- FK added after passport_version exists

  maturity_level     SMALLINT NOT NULL DEFAULT 2 CHECK (maturity_level BETWEEN 1 AND 5),

  created_at         TIMESTAMPTZ NOT NULL DEFAULT NOW(),

  updated_at         TIMESTAMPTZ NOT NULL DEFAULT NOW(),

  UNIQUE(system_id, contour_id)

);


CREATE TABLE IF NOT EXISTS passport_version (

  version_id            BIGSERIAL PRIMARY KEY,

  passport_id           BIGINT NOT NULL REFERENCES resilience_passport(passport_id) ON DELETE CASCADE,

  version_no            INT NOT NULL,

  target_function       TEXT NOT NULL,

  failure_threshold_txt TEXT, -- краткое описание порога отказа

  rto_target_hours      NUMERIC(10,2),

  rpo_target_hours      NUMERIC(10,2),

  autonomy_target_pct   NUMERIC(6,2),

  test_frequency_per_year INT,

  approved_by_org       BIGINT REFERENCES org_unit(org_id),

  effective_from        DATE NOT NULL DEFAULT CURRENT_DATE,

  effective_to          DATE,

  notes                 TEXT,

  created_at            TIMESTAMPTZ NOT NULL DEFAULT NOW(),

  UNIQUE(passport_id, version_no)

);


ALTER TABLE resilience_passport

  ADD CONSTRAINT fk_passport_current_version

  FOREIGN KEY (current_version_id) REFERENCES passport_version(version_id);


CREATE TABLE IF NOT EXISTS failure_threshold (

  threshold_id    BIGSERIAL PRIMARY KEY,

  version_id      BIGINT NOT NULL REFERENCES passport_version(version_id) ON DELETE CASCADE,

  metric          TEXT NOT NULL,

  operator        TEXT NOT NULL, -- >, >=, < ...

  value           NUMERIC(18,6) NOT NULL,

  unit            TEXT

);


CREATE TABLE IF NOT EXISTS reserve_profile (

  reserve_id        BIGSERIAL PRIMARY KEY,

  version_id        BIGINT NOT NULL REFERENCES passport_version(version_id) ON DELETE CASCADE,

  reserve_type      reserve_type NOT NULL,

  description       TEXT,

  coverage_days     NUMERIC(10,2),

  capacity_units    TEXT,

  last_verified_at  TIMESTAMPTZ

);


-- 3) KPI model


CREATE TABLE IF NOT EXISTS kpi (

  kpi_id        BIGSERIAL PRIMARY KEY,

  name          TEXT NOT NULL UNIQUE,

  unit          TEXT NOT NULL,

  aggregation   kpi_aggregation NOT NULL DEFAULT 'avg',

  direction     kpi_direction NOT NULL DEFAULT 'higher_is_better',

  description   TEXT

);


CREATE TABLE IF NOT EXISTS kpi_definition (

  kpi_def_id        BIGSERIAL PRIMARY KEY,

  kpi_id            BIGINT NOT NULL REFERENCES kpi(kpi_id),

  system_id         BIGINT NOT NULL REFERENCES critical_system(system_id) ON DELETE CASCADE,

  subsystem_id      BIGINT REFERENCES subsystem(subsystem_id) ON DELETE SET NULL,

  contour_id        BIGINT NOT NULL REFERENCES contour(contour_id),

  target_value      NUMERIC(18,6),

  warning_value     NUMERIC(18,6),

  critical_value    NUMERIC(18,6),

  weight_in_contour NUMERIC(8,6) NOT NULL DEFAULT 0.200000,

  effective_from    DATE NOT NULL DEFAULT CURRENT_DATE,

  effective_to      DATE,

  source_type       source_type NOT NULL DEFAULT 'manual',

  owner_org         BIGINT REFERENCES org_unit(org_id),

  CHECK (weight_in_contour >= 0 AND weight_in_contour <= 1)

);


CREATE INDEX IF NOT EXISTS idx_kpi_def_system ON kpi_definition(system_id);

CREATE INDEX IF NOT EXISTS idx_kpi_def_contour ON kpi_definition(contour_id);

CREATE INDEX IF NOT EXISTS idx_kpi_def_kpi ON kpi_definition(kpi_id);


CREATE TABLE IF NOT EXISTS measurement (

  measurement_id BIGSERIAL PRIMARY KEY,

  kpi_def_id     BIGINT NOT NULL REFERENCES kpi_definition(kpi_def_id) ON DELETE CASCADE,

  timestamp      TIMESTAMPTZ NOT NULL,

  value          NUMERIC(18,6) NOT NULL,

  quality_flag   quality_flag NOT NULL DEFAULT 'ok',

  ingested_at    TIMESTAMPTZ NOT NULL DEFAULT NOW(),

  source_ref     TEXT

);


CREATE INDEX IF NOT EXISTS idx_measurement_kpi_def_time ON measurement(kpi_def_id, timestamp DESC);

CREATE INDEX IF NOT EXISTS idx_measurement_time ON measurement(timestamp DESC);


-- 4) Risks & dependencies


CREATE TABLE IF NOT EXISTS risk_register (

  risk_id          BIGSERIAL PRIMARY KEY,

  name             TEXT NOT NULL,

  type             TEXT NOT NULL,

  description      TEXT,

  probability      SMALLINT NOT NULL CHECK (probability BETWEEN 1 AND 5),

  impact           SMALLINT NOT NULL CHECK (impact BETWEEN 1 AND 5),

  risk_score       SMALLINT GENERATED ALWAYS AS (probability * impact) STORED,

  owner_org        BIGINT REFERENCES org_unit(org_id),

  status           risk_status NOT NULL DEFAULT 'open',

  last_reviewed_at TIMESTAMPTZ

);


CREATE INDEX IF NOT EXISTS idx_risk_score ON risk_register(risk_score DESC);

CREATE INDEX IF NOT EXISTS idx_risk_status ON risk_register(status);


CREATE TABLE IF NOT EXISTS dependency_item (

  dep_id                  BIGSERIAL PRIMARY KEY,

  system_id               BIGINT NOT NULL REFERENCES critical_system(system_id) ON DELETE CASCADE,

  subsystem_id            BIGINT REFERENCES subsystem(subsystem_id) ON DELETE SET NULL,

  item_name               TEXT NOT NULL,

  item_type               dependency_type NOT NULL,

  current_source          TEXT NOT NULL, -- domestic/foreign/mixed

  import_share_pct        NUMERIC(6,2),

  substitution_plan       TEXT,

  substitution_due_months INT,

  reserve_coverage_months NUMERIC(10,2),

  risk_level              TEXT NOT NULL, -- low/med/high/critical

  owner_org               BIGINT REFERENCES org_unit(org_id),

  updated_at              TIMESTAMPTZ NOT NULL DEFAULT NOW()

);


CREATE INDEX IF NOT EXISTS idx_dep_system ON dependency_item(system_id);

CREATE INDEX IF NOT EXISTS idx_dep_risk ON dependency_item(risk_level);


-- 5) Incidents & War Room


CREATE TABLE IF NOT EXISTS incident (

  incident_id     BIGSERIAL PRIMARY KEY,

  system_id       BIGINT NOT NULL REFERENCES critical_system(system_id) ON DELETE CASCADE,

  incident_type   TEXT NOT NULL, -- cyber/outage/supply/finance/info/...

  severity        SMALLINT NOT NULL CHECK (severity BETWEEN 1 AND 5),

  started_at      TIMESTAMPTZ NOT NULL,

  ended_at        TIMESTAMPTZ,

  status          incident_status NOT NULL DEFAULT 'open',

  summary         TEXT,

  root_cause      TEXT,

  created_by_role BIGINT REFERENCES user_role(role_id)

);


CREATE INDEX IF NOT EXISTS idx_incident_system ON incident(system_id, started_at DESC);

CREATE INDEX IF NOT EXISTS idx_incident_status ON incident(status);


CREATE TABLE IF NOT EXISTS incident_impact (

  impact_id          BIGSERIAL PRIMARY KEY,

  incident_id        BIGINT NOT NULL REFERENCES incident(incident_id) ON DELETE CASCADE,

  kpi_def_id         BIGINT REFERENCES kpi_definition(kpi_def_id) ON DELETE SET NULL,

  affected_system_id BIGINT REFERENCES critical_system(system_id) ON DELETE SET NULL,

  delta_value        NUMERIC(18,6),

  notes              TEXT

);


CREATE TABLE IF NOT EXISTS decision_log (

  decision_id   BIGSERIAL PRIMARY KEY,

  incident_id   BIGINT NOT NULL REFERENCES incident(incident_id) ON DELETE CASCADE,

  time          TIMESTAMPTZ NOT NULL DEFAULT NOW(),

  decision_text TEXT NOT NULL,

  assigned_org  BIGINT REFERENCES org_unit(org_id),

  deadline      TIMESTAMPTZ,

  status        TEXT NOT NULL DEFAULT 'planned', -- planned/in_progress/done

  evidence_ref  TEXT

);


CREATE INDEX IF NOT EXISTS idx_decision_incident ON decision_log(incident_id, time DESC);


-- 6) Scenarios & stress tests


CREATE TABLE IF NOT EXISTS scenario (

  scenario_id  BIGSERIAL PRIMARY KEY,

  name         TEXT NOT NULL UNIQUE, -- optimistic/base/stress/custom

  description  TEXT,

  assumptions  JSONB NOT NULL DEFAULT '{}'::jsonb,

  created_at   TIMESTAMPTZ NOT NULL DEFAULT NOW()

);


CREATE TABLE IF NOT EXISTS stress_test_run (

  run_id            BIGSERIAL PRIMARY KEY,

  scenario_id       BIGINT NOT NULL REFERENCES scenario(scenario_id),

  initiated_at      TIMESTAMPTZ NOT NULL DEFAULT NOW(),

  initiated_by_role BIGINT REFERENCES user_role(role_id),

  scope             TEXT NOT NULL DEFAULT 'national', -- national/region/system

  status            TEXT NOT NULL DEFAULT 'running'

);


CREATE TABLE IF NOT EXISTS stress_test_result (

  result_id           BIGSERIAL PRIMARY KEY,

  run_id              BIGINT NOT NULL REFERENCES stress_test_run(run_id) ON DELETE CASCADE,

  system_id           BIGINT NOT NULL REFERENCES critical_system(system_id) ON DELETE CASCADE,

  contour_id          BIGINT NOT NULL REFERENCES contour(contour_id),

  expected_siu_drop   NUMERIC(10,2),

  expected_rto_hours  NUMERIC(10,2),

  critical_findings   TEXT,

  recommended_actions TEXT

);


CREATE INDEX IF NOT EXISTS idx_stress_result_run ON stress_test_result(run_id);

CREATE INDEX IF NOT EXISTS idx_stress_result_system ON stress_test_result(system_id);


-- 7) Scores (computed aggregates)


CREATE TABLE IF NOT EXISTS contour_score (

  contour_score_id BIGSERIAL PRIMARY KEY,

  contour_id       BIGINT NOT NULL REFERENCES contour(contour_id),

  period_start     DATE NOT NULL,

  period_end       DATE NOT NULL,

  score_0_100      NUMERIC(6,2) NOT NULL CHECK (score_0_100 BETWEEN 0 AND 100),

  computed_at      TIMESTAMPTZ NOT NULL DEFAULT NOW(),

  method_version   TEXT NOT NULL DEFAULT 'mvp_v1',

  UNIQUE(contour_id, period_start, period_end, method_version)

);


CREATE TABLE IF NOT EXISTS siu_score (

  siu_id       BIGSERIAL PRIMARY KEY,

  period_start DATE NOT NULL,

  period_end   DATE NOT NULL,

  siu_0_100    NUMERIC(6,2) NOT NULL CHECK (siu_0_100 BETWEEN 0 AND 100),

  w_score      NUMERIC(6,2) NOT NULL,

  t_score      NUMERIC(6,2) NOT NULL,

  e_score      NUMERIC(6,2) NOT NULL,

  c_score      NUMERIC(6,2) NOT NULL,

  i_score      NUMERIC(6,2) NOT NULL,

  computed_at  TIMESTAMPTZ NOT NULL DEFAULT NOW(),

  method_version TEXT NOT NULL DEFAULT 'mvp_v1',

  UNIQUE(period_start, period_end, method_version)

);


-- Helpful indexes for dashboard queries

CREATE INDEX IF NOT EXISTS idx_siu_latest ON siu_score(period_end DESC);

CREATE INDEX IF NOT EXISTS idx_contour_score_latest ON contour_score(period_end DESC, contour_id);


Нота по MVP

  • В DDL нет таблицы пользователей (логин/аутентификация). Для MVP достаточно RBAC ролей + внешней SSO/LDAP позже.
  • Весов много: contour.weight + kpi_definition.weight_in_contour. В MVP можно зафиксировать контуры по 0.2 и управлять только KPI-весами.

2) Wireframe интерфейса (меню + экраны)

Глобальная навигация (левое меню)

  • Главная
  • Контуры
    • W Военный
    • T Технологии
    • E Экономика
    • C Когнитивный
    • I Институциональный
  • Критические системы
    • Энергия
    • Связь
    • Финансы
    • Логистика
    • Продовольствие
    • Здравоохранение
    • Госуправление
    • ОПК
    • Кадры/НИОКР
    • Инфосреда
  • Паспорта устойчивости
  • KPI и Измерения
  • Риски и Зависимости
  • Стресс-тесты
  • War Room
  • Отчёты / Экспорт
  • Настройки
    • Справочники
    • Пороги/шкалы
    • Роли доступа

Экран 1: Главная (Strategic Dashboard)

Верхняя панель:

  • Период (неделя/месяц/квартал)
  • Фильтр (страна/регион/система)
  • Кнопка “Запустить стресс-тест”
  • Индикатор режима (Normal / Alert / War Room)

Тело:

  • Большой SIU gauge
  • 5 плиток контуров (W/T/E/C/I): score + тренд + статус
  • “Топ-5 рисков” (из risk_register по risk_score)
  • “Топ-5 зависимостей” (из dependency_item по risk_level=critical)
  • “Активные инциденты” (из incident status=open/contained)

Экран 2: Контур (пример: Экономика)

Вкладки:

  • KPI
  • Риски
  • Зависимости
  • События (инциденты)
  • Рекомендации (из результатов стресс-тестов)

KPI-вкладка:

  • Таблица KPI с порогами (target/warn/critical)
  • График тренда по каждому KPI (last 90 days)
  • “Провалы данных” (quality_flag=missing) — штраф в индексе

Экран 3: Критическая система (пример: Энергия)

Шапка системы:

  • Уровень критичности
  • Ответственный орган (org_unit)
  • Текущий паспорт (версия)

Блоки:

  • KPI системы (в т.ч. подсистемы)
  • Порог отказа (из passport_version + failure_threshold)
  • Резервы (из reserve_profile)
  • Инциденты по системе
  • Кнопка “Открыть War Room по системе”

Экран 4: Паспорта устойчивости

  • Список паспортов (system + contour + maturity)
  • Открытие паспорта → история версий
  • Редактор версии (если роль позволяет)
  • Кнопка “Назначить текущей” (обновляет current_version_id)

Экран 5: KPI и измерения

  • Каталог KPI
  • Привязки KPI к системам (kpi_definition)
  • Импорт измерений / ручной ввод
  • Контроль качества данных (ok/suspect/missing)
  • Аудит источников (source_ref)

Экран 6: Риски и зависимости

  • Матрица вероятн×ущерб (heatmap)
  • Реестр рисков (risk_register)
  • Реестр зависимостей (dependency_item) с фильтрами:
    • риск_level
    • import_share_pct
    • substitution_due_months

Экран 7: Стресс-тесты

  • Сценарии (scenario)
  • Запуски (stress_test_run)
  • Результаты (stress_test_result):
    • ожидаемое падение SIU
    • ожидаемый RTO
    • рекомендации

Экран 8: War Room

Лэйаут 4 панели:

  • Карта/таймлайн инцидента
  • KPI “красной зоны”
  • Лента решений (decision_log)
  • Задачи/сроки/ответственные (decision_log status)

Авто-вход в War Room, если:

  • siu_score < 60 или
  • инцидент severity ≥ 4 или
  • риск_score ≥ 20 (5×4, 5×5)

1) Расчёт ContourScore и SIU (SQL)

1.1 Нормализация KPI в шкалу 0–100

Идея: каждое измерение KPI переводим в балл 0–100 относительно порогов critical_value / warning_value / target_value.

-- =========================================

-- KPI scoring view (0..100)

-- Uses latest measurement per KPI definition within period

-- =========================================


CREATE OR REPLACE VIEW v_kpi_latest_in_period AS

SELECT

  kd.kpi_def_id,

  kd.kpi_id,

  kd.system_id,

  kd.subsystem_id,

  kd.contour_id,

  kd.target_value,

  kd.warning_value,

  kd.critical_value,

  kd.weight_in_contour,

  k.direction,

  k.aggregation,

  m.timestamp,

  m.value,

  m.quality_flag

FROM kpi_definition kd

JOIN kpi k ON k.kpi_id = kd.kpi_id

JOIN LATERAL (

  SELECT m1.*

  FROM measurement m1

  WHERE m1.kpi_def_id = kd.kpi_def_id

  ORDER BY m1.timestamp DESC

  LIMIT 1

) m ON TRUE

WHERE kd.effective_to IS NULL OR kd.effective_to >= CURRENT_DATE;


-- Score each KPI definition to 0..100

CREATE OR REPLACE VIEW v_kpi_score_latest AS

SELECT

  v.*,

  CASE

    WHEN v.quality_flag = 'missing' THEN 0


    WHEN v.direction = 'higher_is_better' THEN

      CASE

        WHEN v.target_value IS NULL OR v.critical_value IS NULL THEN NULL

        WHEN v.value >= v.target_value THEN 100

        WHEN v.value <= v.critical_value THEN 0

        ELSE ROUND( ( (v.value - v.critical_value) / NULLIF((v.target_value - v.critical_value),0) ) * 100, 2)

      END


    WHEN v.direction = 'lower_is_better' THEN

      CASE

        WHEN v.target_value IS NULL OR v.critical_value IS NULL THEN NULL

        WHEN v.value <= v.target_value THEN 100

        WHEN v.value >= v.critical_value THEN 0

        ELSE ROUND( ( (v.critical_value - v.value) / NULLIF((v.critical_value - v.target_value),0) ) * 100, 2)

      END


    ELSE NULL

  END AS score_0_100

FROM v_kpi_latest_in_period v;


Примечание: warning_value пока не используется в формуле. В v2 можно сделать “ломаную” функцию: critical→warning→target.


1.2 ContourScore = взвешенное среднее KPI по контуру

-- =========================================

-- Contour score = weighted average of KPI scores

-- =========================================


CREATE OR REPLACE VIEW v_contour_score_current AS

SELECT

  c.contour_id,

  c.code AS contour_code,

  CURRENT_DATE AS period_start,

  CURRENT_DATE AS period_end,

  ROUND(

    SUM(ks.score_0_100 * kd.weight_in_contour) / NULLIF(SUM(kd.weight_in_contour),0),

    2

  ) AS score_0_100,

  SUM(CASE WHEN ks.score_0_100 IS NULL THEN 1 ELSE 0 END) AS null_scores_cnt,

  SUM(CASE WHEN ks.quality_flag = 'missing' THEN 1 ELSE 0 END) AS missing_cnt

FROM contour c

JOIN kpi_definition kd ON kd.contour_id = c.contour_id

JOIN v_kpi_score_latest ks ON ks.kpi_def_id = kd.kpi_def_id

GROUP BY c.contour_id, c.code;


1.3 SIU = геометрическое среднее 5 контуров + штраф за missing

-- =========================================

-- SIU score = geometric mean of 5 contour scores

-- + optional penalty for missing data

-- =========================================


CREATE OR REPLACE VIEW v_siu_score_current AS

WITH cs AS (

  SELECT

    contour_code,

    score_0_100,

    missing_cnt

  FROM v_contour_score_current

),

pivot AS (

  SELECT

    MAX(CASE WHEN contour_code='W' THEN score_0_100 END) AS w_score,

    MAX(CASE WHEN contour_code='T' THEN score_0_100 END) AS t_score,

    MAX(CASE WHEN contour_code='E' THEN score_0_100 END) AS e_score,

    MAX(CASE WHEN contour_code='C' THEN score_0_100 END) AS c_score,

    MAX(CASE WHEN contour_code='I' THEN score_0_100 END) AS i_score,

    SUM(missing_cnt) AS total_missing

  FROM cs

)

SELECT

  CURRENT_DATE AS period_start,

  CURRENT_DATE AS period_end,

  w_score, t_score, e_score, c_score, i_score,

  -- Base geometric mean

  ROUND(

    POWER(

      NULLIF(w_score,0) * NULLIF(t_score,0) * NULLIF(e_score,0) * NULLIF(c_score,0) * NULLIF(i_score,0),

      1.0/5.0

    ),

    2

  ) AS siu_base,

  -- Penalty: -0.5 per missing KPI (cap -15)

  GREATEST(

    ROUND(

      POWER(

        NULLIF(w_score,0) * NULLIF(t_score,0) * NULLIF(e_score,0) * NULLIF(c_score,0) * NULLIF(i_score,0),

        1.0/5.0

      ) - LEAST(total_missing * 0.5, 15),

      2

    ),

    0

  ) AS siu_0_100

FROM pivot;

1.4 (Опционально) materialized views для скорости

-- Materialize contour and SIU daily/weekly via cron/job

CREATE MATERIALIZED VIEW IF NOT EXISTS mv_contour_score_current AS

SELECT * FROM v_contour_score_current;


CREATE MATERIALIZED VIEW IF NOT EXISTS mv_siu_score_current AS

SELECT * FROM v_siu_score_current;


-- Refresh commands:

-- REFRESH MATERIALIZED VIEW mv_contour_score_current;

-- REFRESH MATERIALIZED VIEW mv_siu_score_current;


2) Seed-данные (MVP)

2.1 Контуры, роли, организации, 10 критических систем

-- =========================================

-- SEED DATA - CORE

-- =========================================


-- Contours

INSERT INTO contour (code, name, weight, description) VALUES

('W','Военный',0.2,'Сдерживание, управляемость, киберустойчивость, учения'),

('T','Технологический',0.2,'Локализация, НИОКР, ПО, кадры, производственная глубина'),

('E','Экономический',0.2,'Промышленность, финансы, энергия, продовольствие, логистика'),

('C','Когнитивный',0.2,'Доверие, инфоустойчивость, образование, культура'),

('I','Институциональный',0.2,'Координация, скорость решений, аудит рисков, резервирование управления')

ON CONFLICT (code) DO NOTHING;


-- Roles

INSERT INTO user_role (name, permissions) VALUES

('strategic',  '{"read":"all","write":"none"}'),

('operational','{"read":"all","write":"kpi,incident,decision"}'),

('technical', '{"read":"all","write":"kpi,measurement,deps"}'),

('auditor',   '{"read":"all","write":"none"}'),

('admin',     '{"read":"all","write":"all"}')

ON CONFLICT (name) DO NOTHING;


-- Org units (примерно)

INSERT INTO org_unit (name, type, contact_role, status) VALUES

('Центр мониторинга СОЮЗ','analysis','координатор','active'),

('Оператор критинфры','operator','дежурный','active'),

('Киберцентр','operator','дежурный','active'),

('Финансовый контур','operator','координатор','active'),

('Логистический контур','operator','координатор','active'),

('Инфосреда/коммуникации','operator','координатор','active'),

('НИОКР и кадры','operator','координатор','active')

ON CONFLICT (name) DO NOTHING;


-- 10 Critical systems

INSERT INTO critical_system (name, category, criticality_level, owner_org, region_scope, status)

SELECT x.name, x.category, x.crit, ou.org_id, 'national', 'active'

FROM (VALUES

('Энергосистема','energy',1),

('Связь и управление','comm',1),

('Финансовая система','finance',1),

('Логистика и транспорт','logistics',1),

('Продовольственная система','food',1),

('Здравоохранение','health',2),

('Непрерывность госуправления','governance',1),

('ОПК и промышленная мобилизация','defense_industry',1),

('Кадры и НИОКР','hr_rnd',2),

('Инфосреда и когнитивная устойчивость','info',1)

) AS x(name, category, crit)

JOIN org_unit ou ON ou.name = 'Центр мониторинга СОЮЗ'

ON CONFLICT (name) DO NOTHING;


2.2 KPI (25 штук: по 5 на каждый контур)

-- =========================================

-- SEED DATA - KPI CATALOG (25)

-- =========================================


-- W (higher better unless stated)

INSERT INTO kpi (name, unit, aggregation, direction, description) VALUES

('W1: Автономность управления','%','last','higher_is_better','Доля автономных контуров управления'),

('W2: Доля защищённых каналов','%','last','higher_is_better','Доля защищённых каналов связи'),

('W3: Время переключения на резерв','min','last','lower_is_better','Минуты до перехода на резервные каналы'),

('W4: Киберустойчивость (порог отражения)','index','last','higher_is_better','Индекс устойчивости к атакам'),

('W5: Частота межконтурных учений','per_year','last','higher_is_better','Учения/год');


-- T

INSERT INTO kpi (name, unit, aggregation, direction, description) VALUES

('T1: Локализация криткомпонентов','%','last','higher_is_better','Доля локализованных критических компонентов'),

('T2: Доля отечественного ПО в критсистемах','%','last','higher_is_better','Применение отечественного ПО'),

('T3: НИОКР к ВВП','%GDP','last','higher_is_better','Интенсивность НИОКР'),

('T4: Выпуск инженеров по приоритетам','per_year','last','higher_is_better','Количество выпускников/год'),

('T5: Время замещения криткомпонента','months','last','lower_is_better','Срок замещения узкого места');


-- E

INSERT INTO kpi (name, unit, aggregation, direction, description) VALUES

('E1: Промышленная автономность','%','last','higher_is_better','Самодостаточность производства'),

('E2: Непрерывность массовых платежей','%','last','higher_is_better','Доля платежей без задержек'),

('E3: Энергетическая автономность','%','last','higher_is_better','Доля внутреннего обеспечения энергии'),

('E4: Дни продовольственного резерва','days','last','higher_is_better','Покрытие резервом'),

('E5: SLA доставки критгрузов','%','last','higher_is_better','Доставка критгрузов в SLA');


-- C

INSERT INTO kpi (name, unit, aggregation, direction, description) VALUES

('C1: Индекс доверия к институтам','index','last','higher_is_better','Общественное доверие'),

('C2: Скорость опровержения вбросов','hours','last','lower_is_better','Часы до нейтрализации'),

('C3: Доля медиаграмотности','%','last','higher_is_better','Население с базовой медиаграмотностью'),

('C4: Охват системного образования','%','last','higher_is_better','Доля охвата программами'),

('C5: Индекс социальной связанности','index','last','higher_is_better','Поляризация/связанность');


-- I

INSERT INTO kpi (name, unit, aggregation, direction, description) VALUES

('I1: Время цикла принятия решения','hours','last','lower_is_better','От события до решения'),

('I2: Покрытие паспортами устойчивости','%','last','higher_is_better','Доля систем с паспортами'),

('I3: Регулярность аудита рисков','per_year','last','higher_is_better','Аудитов/год'),

('I4: Дублирование центров управления','%','last','higher_is_better','Покрытие резервными центрами'),

('I5: Исполнение решений в срок','%','last','higher_is_better','Доля задач выполненных в срок')

ON CONFLICT (name) DO NOTHING;


2.3 Привязки KPI к контурам и 10 системам (KPIDefinition)

Чтобы MVP “завёлся”, делаем так: каждый из 25 KPI привязываем ко всем системам (это нормально для MVP, потом дробим по подсистемам). Вес внутри контура = 0.2 (5 KPI).

-- =========================================

-- SEED DATA - KPI DEFINITIONS (25 KPI x 10 systems)

-- =========================================

-- Helper: get contour_id by code

WITH contours AS (

  SELECT contour_id, code FROM contour

),

systems AS (

  SELECT system_id FROM critical_system WHERE status='active'

),

kpimap AS (

  SELECT kpi_id, name FROM kpi

),

defs AS (

  SELECT

    s.system_id,

    c.contour_id,

    k.kpi_id,

    -- targets/warn/critical per KPI name (MVP rough norms)

    CASE

      WHEN k.name LIKE 'W1:%' THEN 85

      WHEN k.name LIKE 'W2:%' THEN 80

      WHEN k.name LIKE 'W3:%' THEN 10

      WHEN k.name LIKE 'W4:%' THEN 80

      WHEN k.name LIKE 'W5:%' THEN 4


      WHEN k.name LIKE 'T1:%' THEN 70

      WHEN k.name LIKE 'T2:%' THEN 80

      WHEN k.name LIKE 'T3:%' THEN 3

      WHEN k.name LIKE 'T4:%' THEN 100000 -- условная шкала, позже нормируем

      WHEN k.name LIKE 'T5:%' THEN 12


      WHEN k.name LIKE 'E1:%' THEN 75

      WHEN k.name LIKE 'E2:%' THEN 99

      WHEN k.name LIKE 'E3:%' THEN 90

      WHEN k.name LIKE 'E4:%' THEN 180

      WHEN k.name LIKE 'E5:%' THEN 95


      WHEN k.name LIKE 'C1:%' THEN 75

      WHEN k.name LIKE 'C2:%' THEN 6

      WHEN k.name LIKE 'C3:%' THEN 60

      WHEN k.name LIKE 'C4:%' THEN 50

      WHEN k.name LIKE 'C5:%' THEN 70


      WHEN k.name LIKE 'I1:%' THEN 12

      WHEN k.name LIKE 'I2:%' THEN 100

      WHEN k.name LIKE 'I3:%' THEN 4

      WHEN k.name LIKE 'I4:%' THEN 80

      WHEN k.name LIKE 'I5:%' THEN 90

      ELSE NULL

    END AS target_value,

    CASE

      WHEN k.name LIKE 'W3:%' THEN 20

      WHEN k.name LIKE 'T5:%' THEN 18

      WHEN k.name LIKE 'C2:%' THEN 12

      WHEN k.name LIKE 'I1:%' THEN 24

      ELSE NULL

    END AS warning_value,

    CASE

      WHEN k.name LIKE 'W1:%' THEN 50

      WHEN k.name LIKE 'W2:%' THEN 40

      WHEN k.name LIKE 'W3:%' THEN 60

      WHEN k.name LIKE 'W4:%' THEN 40

      WHEN k.name LIKE 'W5:%' THEN 1


      WHEN k.name LIKE 'T1:%' THEN 40

      WHEN k.name LIKE 'T2:%' THEN 50

      WHEN k.name LIKE 'T3:%' THEN 1

      WHEN k.name LIKE 'T4:%' THEN 20000

      WHEN k.name LIKE 'T5:%' THEN 36


      WHEN k.name LIKE 'E1:%' THEN 50

      WHEN k.name LIKE 'E2:%' THEN 90

      WHEN k.name LIKE 'E3:%' THEN 70

      WHEN k.name LIKE 'E4:%' THEN 30

      WHEN k.name LIKE 'E5:%' THEN 80


      WHEN k.name LIKE 'C1:%' THEN 45

      WHEN k.name LIKE 'C2:%' THEN 48

      WHEN k.name LIKE 'C3:%' THEN 30

      WHEN k.name LIKE 'C4:%' THEN 20

      WHEN k.name LIKE 'C5:%' THEN 40


      WHEN k.name LIKE 'I1:%' THEN 72

      WHEN k.name LIKE 'I2:%' THEN 60

      WHEN k.name LIKE 'I3:%' THEN 1

      WHEN k.name LIKE 'I4:%' THEN 40

      WHEN k.name LIKE 'I5:%' THEN 60

      ELSE NULL

    END AS critical_value

  FROM systems s

  JOIN contours c ON TRUE

  JOIN kpimap k ON (

    (c.code='W' AND k.name LIKE 'W%:%') OR

    (c.code='T' AND k.name LIKE 'T%:%') OR

    (c.code='E' AND k.name LIKE 'E%:%') OR

    (c.code='C' AND k.name LIKE 'C%:%') OR

    (c.code='I' AND k.name LIKE 'I%:%')

  )

)

INSERT INTO kpi_definition (

  kpi_id, system_id, contour_id,

  target_value, warning_value, critical_value,

  weight_in_contour, source_type, owner_org

)

SELECT

  d.kpi_id, d.system_id, d.contour_id,

  d.target_value, d.warning_value, d.critical_value,

  0.2,

  'manual',

  (SELECT org_id FROM org_unit WHERE name='Центр мониторинга СОЮЗ' LIMIT 1)

FROM defs d

ON CONFLICT DO NOTHING;


Важно: KPI вроде “выпуск инженеров” требует нормализации по населению/плану. В MVP он просто демонстрационный. В боевой версии делаем “инженеры на 100k” или “% выполнения плана”.


2.4 Несколько измерений, чтобы дашборд сразу показал SIU

-- =========================================

-- SEED DATA - MEASUREMENTS (latest values)

-- =========================================


-- Проставим измерения "сегодня" для всех kpi_definition.

-- Для демонстрации: значения около target (с небольшими отклонениями).

INSERT INTO measurement (kpi_def_id, timestamp, value, quality_flag, source_ref)

SELECT

  kd.kpi_def_id,

  NOW(),

  CASE

    WHEN k.name LIKE 'W1:%' THEN 82

    WHEN k.name LIKE 'W2:%' THEN 77

    WHEN k.name LIKE 'W3:%' THEN 14

    WHEN k.name LIKE 'W4:%' THEN 75

    WHEN k.name LIKE 'W5:%' THEN 3


    WHEN k.name LIKE 'T1:%' THEN 60

    WHEN k.name LIKE 'T2:%' THEN 72

    WHEN k.name LIKE 'T3:%' THEN 2.2

    WHEN k.name LIKE 'T4:%' THEN 70000

    WHEN k.name LIKE 'T5:%' THEN 16


    WHEN k.name LIKE 'E1:%' THEN 70

    WHEN k.name LIKE 'E2:%' THEN 98.5

    WHEN k.name LIKE 'E3:%' THEN 88

    WHEN k.name LIKE 'E4:%' THEN 120

    WHEN k.name LIKE 'E5:%' THEN 93


    WHEN k.name LIKE 'C1:%' THEN 68

    WHEN k.name LIKE 'C2:%' THEN 10

    WHEN k.name LIKE 'C3:%' THEN 45

    WHEN k.name LIKE 'C4:%' THEN 38

    WHEN k.name LIKE 'C5:%' THEN 62


    WHEN k.name LIKE 'I1:%' THEN 18

    WHEN k.name LIKE 'I2:%' THEN 70

    WHEN k.name LIKE 'I3:%' THEN 2

    WHEN k.name LIKE 'I4:%' THEN 55

    WHEN k.name LIKE 'I5:%' THEN 84

    ELSE NULL

  END AS value,

  'ok'::quality_flag,

  'seed_mvp'

FROM kpi_definition kd

JOIN kpi k ON k.kpi_id = kd.kpi_id

WHERE (kd.effective_to IS NULL OR kd.effective_to >= CURRENT_DATE);


Как проверить, что расчёт работает (быстро)

-- 1) Посмотреть KPI scores

SELECT contour_id, COUNT(*) cnt, ROUND(AVG(score_0_100),2) avg_score

FROM v_kpi_score_latest

GROUP BY contour_id

ORDER BY contour_id;


-- 2) Контуры

SELECT * FROM v_contour_score_current ORDER BY contour_code;


-- 3) SIU

SELECT * FROM v_siu_score_current;




-- =========================================

-- DASHBOARD PACK (single query views)

-- SIU + contour tiles + top risks + top deps + active incidents

-- =========================================


-- 1) Latest SIU (from materialized if exists, else from view)

CREATE OR REPLACE VIEW v_dashboard_siu_latest AS

SELECT *

FROM v_siu_score_current;


-- 2) Contour tiles

CREATE OR REPLACE VIEW v_dashboard_contours AS

SELECT

  contour_id,

  contour_code,

  score_0_100,

  missing_cnt,

  null_scores_cnt

FROM v_contour_score_current

ORDER BY contour_code;


-- 3) Top risks (by risk_score)

CREATE OR REPLACE VIEW v_dashboard_top_risks AS

SELECT

  risk_id,

  name,

  type,

  probability,

  impact,

  risk_score,

  status,

  last_reviewed_at

FROM risk_register

WHERE status IN ('open','mitigating')

ORDER BY risk_score DESC, last_reviewed_at NULLS LAST

LIMIT 5;


-- 4) Top dependencies (critical first, then high; shortest due date first)

CREATE OR REPLACE VIEW v_dashboard_top_dependencies AS

SELECT

  dep_id,

  item_name,

  item_type,

  system_id,

  import_share_pct,

  substitution_due_months,

  reserve_coverage_months,

  risk_level,

  updated_at

FROM dependency_item

WHERE risk_level IN ('critical','high')

ORDER BY

  CASE risk_level WHEN 'critical' THEN 0 ELSE 1 END,

  substitution_due_months NULLS LAST,

  reserve_coverage_months NULLS FIRST,

  updated_at DESC

LIMIT 5;


-- 5) Active incidents (open/contained)

CREATE OR REPLACE VIEW v_dashboard_active_incidents AS

SELECT

  i.incident_id,

  i.system_id,

  cs.name AS system_name,

  i.incident_type,

  i.severity,

  i.started_at,

  i.status,

  i.summary

FROM incident i

JOIN critical_system cs ON cs.system_id = i.system_id

WHERE i.status IN ('open','contained')

ORDER BY i.severity DESC, i.started_at DESC

LIMIT 10;


-- 6) Single "dashboard pack" view as JSON (handy for API)

CREATE OR REPLACE VIEW v_dashboard_pack_json AS

SELECT jsonb_build_object(

  'siu', (SELECT to_jsonb(s) FROM v_dashboard_siu_latest s),

  'contours', (SELECT jsonb_agg(to_jsonb(c) ORDER BY c.contour_code) FROM v_dashboard_contours c),

  'top_risks', (SELECT jsonb_agg(to_jsonb(r)) FROM v_dashboard_top_risks r),

  'top_dependencies', (SELECT jsonb_agg(to_jsonb(d)) FROM v_dashboard_top_dependencies d),

  'active_incidents', (SELECT jsonb_agg(to_jsonb(a)) FROM v_dashboard_active_incidents a)

) AS dashboard;

-- =========================================

-- OPTIONAL: ROLLUPS (weekly/monthly) for fast charts

-- Uses measurements to compute contour scores by period.

-- =========================================


-- Helper: choose period bucket. For weekly: date_trunc('week', ts), monthly: date_trunc('month', ts)


-- 1) KPI score per period (latest measurement within period)

CREATE OR REPLACE VIEW v_kpi_latest_by_week AS

WITH m2 AS (

  SELECT

    m.kpi_def_id,

    date_trunc('week', m.timestamp)::date AS period_start,

    (date_trunc('week', m.timestamp) + INTERVAL '6 days')::date AS period_end,

    m.timestamp,

    m.value,

    m.quality_flag,

    ROW_NUMBER() OVER (

      PARTITION BY m.kpi_def_id, date_trunc('week', m.timestamp)

      ORDER BY m.timestamp DESC

    ) AS rn

  FROM measurement m

)

SELECT

  kd.kpi_def_id,

  kd.kpi_id,

  kd.system_id,

  kd.subsystem_id,

  kd.contour_id,

  kd.target_value,

  kd.warning_value,

  kd.critical_value,

  kd.weight_in_contour,

  k.direction,

  m2.period_start,

  m2.period_end,

  m2.timestamp,

  m2.value,

  m2.quality_flag

FROM m2

JOIN kpi_definition kd ON kd.kpi_def_id = m2.kpi_def_id

JOIN kpi k ON k.kpi_id = kd.kpi_id

WHERE m2.rn = 1;


-- Score weekly

CREATE OR REPLACE VIEW v_kpi_score_by_week AS

SELECT

  v.*,

  CASE

    WHEN v.quality_flag = 'missing' THEN 0

    WHEN v.direction = 'higher_is_better' THEN

      CASE

        WHEN v.target_value IS NULL OR v.critical_value IS NULL THEN NULL

        WHEN v.value >= v.target_value THEN 100

        WHEN v.value <= v.critical_value THEN 0

        ELSE ROUND( ( (v.value - v.critical_value) / NULLIF((v.target_value - v.critical_value),0) ) * 100, 2)

      END

    WHEN v.direction = 'lower_is_better' THEN

      CASE

        WHEN v.target_value IS NULL OR v.critical_value IS NULL THEN NULL

        WHEN v.value <= v.target_value THEN 100

        WHEN v.value >= v.critical_value THEN 0

        ELSE ROUND( ( (v.critical_value - v.value) / NULLIF((v.critical_value - v.target_value),0) ) * 100, 2)

      END

    ELSE NULL

  END AS score_0_100

FROM v_kpi_latest_by_week v;


-- 2) Contour score by week (across all systems, MVP global)

CREATE OR REPLACE VIEW v_contour_score_by_week AS

SELECT

  c.contour_id,

  c.code AS contour_code,

  ks.period_start,

  ks.period_end,

  ROUND(

    SUM(ks.score_0_100 * kd.weight_in_contour) / NULLIF(SUM(kd.weight_in_contour),0),

    2

  ) AS score_0_100,

  SUM(CASE WHEN ks.score_0_100 IS NULL THEN 1 ELSE 0 END) AS null_scores_cnt,

  SUM(CASE WHEN ks.quality_flag = 'missing' THEN 1 ELSE 0 END) AS missing_cnt

FROM contour c

JOIN kpi_definition kd ON kd.contour_id = c.contour_id

JOIN v_kpi_score_by_week ks ON ks.kpi_def_id = kd.kpi_def_id

GROUP BY c.contour_id, c.code, ks.period_start, ks.period_end;


-- 3) SIU by week

CREATE OR REPLACE VIEW v_siu_by_week AS

WITH cs AS (

  SELECT period_start, period_end, contour_code, score_0_100, missing_cnt

  FROM v_contour_score_by_week

),

pivot AS (

  SELECT

    period_start,

    period_end,

    MAX(CASE WHEN contour_code='W' THEN score_0_100 END) AS w_score,

    MAX(CASE WHEN contour_code='T' THEN score_0_100 END) AS t_score,

    MAX(CASE WHEN contour_code='E' THEN score_0_100 END) AS e_score,

    MAX(CASE WHEN contour_code='C' THEN score_0_100 END) AS c_score,

    MAX(CASE WHEN contour_code='I' THEN score_0_100 END) AS i_score,

    SUM(missing_cnt) AS total_missing

  FROM cs

  GROUP BY period_start, period_end

)

SELECT

  period_start,

  period_end,

  w_score, t_score, e_score, c_score, i_score,

  ROUND(

    POWER(

      NULLIF(w_score,0) * NULLIF(t_score,0) * NULLIF(e_score,0) * NULLIF(c_score,0) * NULLIF(i_score,0),

      1.0/5.0

    ),

    2

  ) AS siu_base,

  GREATEST(

    ROUND(

      POWER(

        NULLIF(w_score,0) * NULLIF(t_score,0) * NULLIF(e_score,0) * NULLIF(c_score,0) * NULLIF(i_score,0),

        1.0/5.0

      ) - LEAST(total_missing * 0.5, 15),

      2

    ),

    0

  ) AS siu_0_100

FROM pivot

ORDER BY period_end DESC;

If you want the MVP to feel “alive” immediately, run this quick seed for risks/dependencies/incidents too:

-- =========================================

-- Optional seed: risks, dependencies, incident

-- =========================================


INSERT INTO risk_register (name, type, description, probability, impact, owner_org, status, last_reviewed_at)

VALUES

('Технологическая блокировка криткомпонентов','tech','Ограничение поставок/оборудования','5','5',

 (SELECT org_id FROM org_unit WHERE name='Центр мониторинга СОЮЗ'), 'open', NOW()),

('Кибератака на критинфраструктуру','cyber','Атаки на энергетику/связь/логистику','5','4',

 (SELECT org_id FROM org_unit WHERE name='Киберцентр'), 'open', NOW()),

('Логистический разрыв по критгрузам','logistics','Срыв маршрутов/узлов','4','4',

 (SELECT org_id FROM org_unit WHERE name='Логистический контур'), 'mitigating', NOW())

ON CONFLICT DO NOTHING;


INSERT INTO dependency_item (system_id, item_name, item_type, current_source, import_share_pct,

                            substitution_plan, substitution_due_months, reserve_coverage_months,

                            risk_level, owner_org)

VALUES

((SELECT system_id FROM critical_system WHERE name='Связь и управление'),

 'Критический сетевой чипсет','component','foreign',85,

 'Разработка отечественного аналога + контрактное производство',24,6,'critical',

 (SELECT org_id FROM org_unit WHERE name='Центр мониторинга СОЮЗ')),

((SELECT system_id FROM critical_system WHERE name='Финансовая система'),

 'Компоненты HSM (криптомодули)','component','mixed',40,

 'Локализация производства и сертификация',18,9,'high',

 (SELECT org_id FROM org_unit WHERE name='Киберцентр'))

ON CONFLICT DO NOTHING;


INSERT INTO incident (system_id, incident_type, severity, started_at, status, summary, created_by_role)

VALUES

((SELECT system_id FROM critical_system WHERE name='Энергосистема'),

 'outage',4,NOW() - INTERVAL '3 hours','contained','Локальный сбой в узле диспетчеризации',

 (SELECT role_id FROM user_role WHERE name='operational'))

ON CONFLICT DO NOTHING;

Use this one-liner to fetch the whole dashboard payload:

SELECT dashboard FROM v_dashboard_pack_json;