Proprietary Framework · MNS Consulting × Lladner Business Solutions
IGRIS™
Integrated
Geo-Risk
Intelligence
Integrated Geo-Risk Intelligence System™ · Integrated Geopolitical Risk Intelligence System™
A five-phase closed-loop intelligence engine that fuses structured analytic tradecraft (SATCON-X), contextual vulnerability quantification (CARVER-ECO), and correlated probabilistic simulation (Monte Carlo / Gaussian copula) into a living decision architecture — purpose-built for corporate boards, GSOCs, and national security councils operating in volatile theaters.
Built as an
Operational Engine
IGRIS™ was conceived by Quanta Analytica MNS Consulting and developed in partnership with Lladner Business Solutions' Risk Management & GSOC Services Division. It emerged from over a decade of field intelligence analysis, strategic security consulting, and corporate risk governance — not as a theoretical framework, but as an operational engine built to solve real failure modes in global risk analysis.
Traditional risk matrices assume linearity and understate tail-risk events that define real crises. IGRIS was built to replace them with a system that treats uncertainty as measurable data, bias as a structural problem to be engineered out, and decision thresholds as pre-modeled before a crisis — not improvised during one.
The Four Problems IGRIS Solves
- Static thinking — analysts treating risk as fixed, not evolving with the intelligence environment
- Cognitive bias — over-reliance on expert intuition without structured challenge mechanisms
- False precision — deterministic single-point forecasts that ignore the distribution of possible futures
- Siloed data — economic, security, cyber, and reputational indicators not fused into a single model
Who IGRIS Serves
- Corporate boards and C-suite risk principals
- Global Security Operations Centers (GSOCs)
- National security councils and policy intelligence units
- Interagency task forces and joint intelligence centers
- Institutional investors and sovereign fund risk teams
- Humanitarian and development organizations in volatile theaters
What IGRIS Produces
- Probabilistic country & sector risk forecasts with confidence bands
- CARVER-weighted vulnerability scores for GSOC dashboards
- Tripwire-based decision triggers (Go / Stage-Gate / Pause)
- Scenario clusters with named likelihoods and narrative intelligence
- Monte Carlo probability distributions with correlated risk events
The Closed-Loop Intelligence Cycle
Five phases · continuous reassessmentThe IGRIS cycle does not terminate. Phase 5 feeds updated intelligence back into Phase 1, making the model a living risk intelligence engine — mirroring the continuous assessment cycle used in modern Joint Intelligence Centers and corporate war rooms.
The Five Operating Layers
From framing to action to reassessmentEach phase has a defined objective, inputs, process flow, and strategic result. The phases are sequential in their first execution and continuously iterative thereafter — with Phase 5 feeding back into Phase 1 as new intelligence arrives.
- Key Assumptions Check — surface hidden biases in indicators
- Analysis of Competing Hypotheses (ACH) — compare plausible outcomes
- What-If / HI-LO shock analysis — map low-probability, high-impact events
- Red-team challenge sessions — independent hypothesis stress-testing
- Assign CARVER-ECO scores for each threat vector (1–5 per dimension)
- Generate CARVER heatmap — ranked assets and threats by composite score
- Dynamic weight adjustment based on geopolitical context
- Translate subjective analyst judgement into semi-quantitative parameters
- Define variable ranges and monthly event probabilities from CARVER-ECO
- Model risk correlations via Gaussian copula (Cholesky decomposition)
- Run 10,000–20,000 Monte Carlo iterations across correlated Bernoulli events
- Cluster output into scenario likelihoods with named narrative descriptions
- Generate CARVER-weighted severity score distribution per trial
- Probability distribution visualization for each priority risk
- Geo-mapped CARVER threat overlays (red = high effect + accessibility)
- Decision threshold mapping — Go / Stage-Gate / Pause with measurable indicators
- Pre-approved communications templates for CFO, board, or national council
- Ingest new OSINT / HUMINT / SIGINT and operational telemetry
- Re-score CARVER-ECO where threat or mission profile has changed
- Re-run Monte Carlo simulations with updated parameters
- Capture forecast deviation and update probability curves
- Back-test model calibration using Brier / proper scoring rules
- Archive decisions and parameter logs for audit trail
The Two Founding Methods
Intelligence tradecraft + vulnerability scienceIGRIS draws from three foundational QA-MNS methodologies that were field-tested across multiple regions and sectors before being fused into the closed-loop system. Two parent methods are the primary contributors — SATCON-X and CARVER-ECO — each addressing a distinct analytical failure mode.
A proprietary adaptation of Intelligence Community Structured Analytic Techniques (SATs) — including Key Assumptions Check, Analysis of Competing Hypotheses, and What-If analysis — merged with corporate red-team protocols. SATCON-X forces analysts to articulate why a risk matters and how it interacts with other risks before any quantification begins. It provides IGRIS with the hypothesis space and bias-checked variable set that feed the model. Without SATCON-X, the simulation engine operates on assumptions that have never been challenged — and garbage in produces garbage out at 10,000 iterations per run.
An evolved version of the classic CARVER matrix — originally a military targeting tool — re-engineered to assess interdependencies across economic, political, cyber, and reputational dimensions alongside the traditional six. CARVER-ECO converts subjective analyst judgement into semi-quantitative weights, creating a structured bridge between human intelligence insight and the simulation engine. It supplies IGRIS with the weighted parameters that define what is "critical" or "vulnerable" in the Monte Carlo model. The ECO suffix reflects the expanded contextual weighting — a CARVER score in a hybrid warfare zone weights cyber and reputational exposure differently than the same score in a conventional conflict environment.
| Capability | Mechanism | Strategic Benefit |
|---|---|---|
| SATs Integration | Key Assumptions Check, ACH, red-team | Removes bias and expands hypothesis space before quantification |
| CARVER-ECO Quantification | Semi-quantitative 1–5 scoring + context weights | Objectively ranks priorities across national, corporate, and sectoral lines |
| Monte Carlo Forecasting | Gaussian copula · 10,000+ iterations | Adds probabilistic depth and correlation modeling to qualitative intelligence |
| Dynamic Feedback Loop | Re-score · re-run · back-test calibration | Enables adaptive, real-time situational awareness that compounds in value |
| Cross-Domain Fusion | Geopolitical + cyber + financial risk in one model | Bridges traditionally siloed intelligence domains into a single decision engine |
| Pre-agreed Thresholds | Go / Stage-Gate / Pause mapped to indicators | Decisions are made by the model architecture, not improvised under pressure |
Six-Country Geo-Risk Dashboard
6–12 month horizon · CARVER + Monte CarloThe following represents IGRIS applied across six African theaters actively monitored by MNS Consulting. Each country cut runs the full five-phase IGRIS cycle — SATCON-X framing, CARVER-ECO scoring, Monte Carlo probabilistic simulation, decision thresholds, and collection priorities. These are illustrative planning probabilities derived from current intelligence baselines; they are not a substitute for a full coded model run against your organization's specific exposure profile.
Portfolio Bottom Line — Cross-Cutting Risk Summary
The heaviest systemic risk across the six theaters is DRC's cobalt quota regime — a global supply chain impact that extends far beyond the country's borders. The most acute humanitarian and security emergencies are Sudan (Darfur) and northern Benin and Togo. Mozambique's offshore gas trajectory is positive but onshore remains security-conditioned. Mauritania maintains comparative stability with risk concentrated in border spillover and ESG optics around migration controls.
The Simulation Engine
Python · Gaussian copula · correlated Bernoulli eventsThe IGRIS Monte Carlo engine models correlated risk events using a Gaussian copula — ensuring that related risks move together realistically rather than as independent coin flips. The Benin example below demonstrates the engine with illustrative monthly probabilities. Replace the risk configuration and correlation matrix with your country-specific parameters to run a live IGRIS assessment.
Step 1 — Define Probabilities
Set a monthly event probability for each risk (e.g., 0.20 = 20% chance per month) derived from your CARVER-ECO scoring and intelligence baseline.
Step 2 — Set Correlations
Build a correlation matrix capturing how risks co-move (e.g., militant raids and corridor shocks share causal drivers — a correlation of 0.35 models that relationship).
Step 3 — Run & Interpret
Run run_igris_monte_carlo() for scenario probabilities. Add CARVER weights via carver_weighted_scores() for annual severity distribution.
# IGRIS Monte Carlo Engine (Gaussian Copula for Correlated Bernoulli Events)
# M. Nuri Shakoor, SRMP — Quanta Analytica MNS Consulting
# In partnership with Lladner Business Solutions, Risk Management & GSOC Services Division
import numpy as np
import pandas as pd
def gaussian_copula_bernoulli(P, corr, trials=10000, months=12, seed=42):
"""Generate correlated Bernoulli outcomes over months for multiple risk factors.
P : (k,) array of monthly event probabilities
corr : (k,k) PSD correlation matrix between factors
Returns: (trials, months, k) boolean array"""
rng = np.random.default_rng(seed)
P = np.asarray(P, dtype=float)
k = P.shape[0]
corr = np.asarray(corr, dtype=float)
eps = 1e-10
try:
L = np.linalg.cholesky(corr)
except np.linalg.LinAlgError:
L = np.linalg.cholesky(corr + np.eye(k) * eps)
def norm_ppf(u): # Acklam inverse normal CDF (no scipy dependency)
u = np.asarray(u)
a = [-3.969683028665376e+01, 2.209460984245205e+02, -2.759285104469687e+02,
1.383577518672690e+02, -3.066479806614716e+01, 2.506628277459239e+00]
b = [-5.447609879822406e+01, 1.615858368580409e+02, -1.556989798598866e+02,
6.680131188771972e+01, -1.328068155288572e+01]
c = [-7.784894002430293e-03, -3.223964580411365e-01, -2.400758277161838e+00,
-2.549732539343734e+00, 4.374664141464968e+00, 2.938163982698783e+00]
d = [7.784695709041462e-03, 3.224671290700398e-01, 2.445134137142996e+00,
3.754408661907416e+00]
plow, phigh = 0.02425, 1 - 0.02425
x = np.empty_like(u, dtype=float)
mask = u < plow
q = np.sqrt(-2*np.log(u[mask]))
x[mask] = (((((c[0]*q+c[1])*q+c[2])*q+c[3])*q+c[4])*q+c[5]) / \
((((d[0]*q+d[1])*q+d[2])*q+d[3])*q+1)
mask = u > phigh
q = np.sqrt(-2*np.log(1-u[mask]))
x[mask] = -(((((c[0]*q+c[1])*q+c[2])*q+c[3])*q+c[4])*q+c[5]) / \
((((d[0]*q+d[1])*q+d[2])*q+d[3])*q+1)
mask = (u >= plow) & (u <= phigh)
q = u[mask] - 0.5
r = q*q
x[mask] = (((((a[0]*r+a[1])*r+a[2])*r+a[3])*r+a[4])*r+a[5]) * q / \
(((((b[0]*r+b[1])*r+b[2])*r+b[3])*r+b[4])*r+1)
return x
thresholds = norm_ppf(P)
outcomes = np.zeros((trials, months, k), dtype=bool)
for t in range(trials):
Z = rng.standard_normal(size=(months, k))
Y = Z @ L.T
outcomes[t] = (Y < thresholds)
return outcomes
def run_igris_monte_carlo(risk_config, corr, months=12, trials=10000, seed=42):
"""risk_config: {risk_name: monthly_probability}
Returns: (summary_dict, details_df, outcomes)"""
risk_names = list(risk_config.keys())
probs = np.array([risk_config[r] for r in risk_names], dtype=float)
outcomes = gaussian_copula_bernoulli(probs, corr, trials=trials, months=months, seed=seed)
tags = []
for rn in risk_names:
l = rn.lower()
if any(x in l for x in ["raid","ied","attack","insurg","militant"]): tags.append("SECURITY")
elif any(x in l for x in ["maritime","anchorage","piracy","offshore"]): tags.append("MARITIME")
elif any(x in l for x in ["policy","quota","rights","corridor","pipeline"]): tags.append("POLICY")
else: tags.append("OTHER")
tags = np.array(tags)
trial_flags = {"SECURITY_SHOCK":[], "POLICY_SHOCK":[], "MARITIME_SHOCK":[]}
for t in range(outcomes.shape[0]):
tr = outcomes[t]
sec_m = tr[:,tags=="SECURITY"].any(axis=1).sum() if np.any(tags=="SECURITY") else 0
pol_m = tr[:,tags=="POLICY"].any(axis=1).sum() if np.any(tags=="POLICY") else 0
mar_m = tr[:,tags=="MARITIME"].any(axis=1).sum() if np.any(tags=="MARITIME") else 0
trial_flags["SECURITY_SHOCK"].append(sec_m >= 2)
trial_flags["POLICY_SHOCK"].append(pol_m >= 1)
trial_flags["MARITIME_SHOCK"].append(mar_m >= 1)
trial_flags = {k: np.array(v) for k,v in trial_flags.items()}
dual = trial_flags["SECURITY_SHOCK"] & trial_flags["POLICY_SHOCK"]
sec_only = trial_flags["SECURITY_SHOCK"] & ~trial_flags["POLICY_SHOCK"]
pol_only = ~trial_flags["SECURITY_SHOCK"] & trial_flags["POLICY_SHOCK"]
quiet = ~trial_flags["SECURITY_SHOCK"] & ~trial_flags["POLICY_SHOCK"]
summary = {"p_dual_shock": dual.mean(), "p_security_only": sec_only.mean(),
"p_policy_only": pol_only.mean(), "p_quiet": quiet.mean(),
"p_any_maritime": trial_flags["MARITIME_SHOCK"].mean()}
details = pd.DataFrame({"risk": risk_names,
"monthly_prob": [risk_config[r] for r in risk_names],
"tag": tags})
return summary, details, outcomes
def carver_weighted_scores(outcomes, carver_weights, risk_names):
"""Compute CARVER-weighted annual severity score per trial.
carver_weights: {risk_name: {C,A,R,V,E,Rz}} — returns 1D array per trial"""
occurred = outcomes.any(axis=1)
weights = np.array([sum(carver_weights[rn].values()) for rn in risk_names], dtype=float)
return (occurred * weights).sum(axis=1)
# ---- Example: Benin (replace with your country parameters) ----
benin_config = {
"northern_complex_attack": 0.20,
"IED_or_kidnap_event": 0.15,
"corridor_pipeline_shock": 0.10,
"maritime_anchor_incident":0.03,
"rights_or_local_unrest": 0.08
}
risk_names = list(benin_config.keys())
k = len(risk_names)
corr = np.eye(k)
def idx(name): return risk_names.index(name)
corr[idx("northern_complex_attack"), idx("IED_or_kidnap_event")] = 0.35
corr[idx("IED_or_kidnap_event"), idx("northern_complex_attack")] = 0.35
corr[idx("northern_complex_attack"), idx("corridor_pipeline_shock")] = 0.20
corr[idx("rights_or_local_unrest"), idx("corridor_pipeline_shock")] = 0.20
corr[idx("corridor_pipeline_shock"), idx("rights_or_local_unrest")] = 0.20
summary, details, outcomes = run_igris_monte_carlo(benin_config, corr, months=12, trials=20000, seed=7)
benin_carver = {
"northern_complex_attack": {"C":5,"A":3,"R":2,"V":4,"E":5,"Rz":5},
"IED_or_kidnap_event": {"C":4,"A":3,"R":3,"V":3,"E":4,"Rz":5},
"corridor_pipeline_shock": {"C":4,"A":3,"R":3,"V":3,"E":4,"Rz":4},
"maritime_anchor_incident":{"C":3,"A":2,"R":4,"V":2,"E":3,"Rz":3},
"rights_or_local_unrest": {"C":3,"A":3,"R":3,"V":3,"E":3,"Rz":4}
}
scores = carver_weighted_scores(outcomes, benin_carver, risk_names=list(benin_config.keys()))
score_summary = {
"mean_score": float(np.mean(scores)),
"p90_score": float(np.quantile(scores, 0.90)),
"p95_score": float(np.quantile(scores, 0.95)),
"p99_score": float(np.quantile(scores, 0.99))
}
print("=== IGRIS Monte Carlo (Benin demo) ===")
print("Scenario probabilities:", summary)
print("CARVER-weighted severity (annual):", score_summary)
print("\nRisk config & tags:\n", details)
The engine uses a Gaussian copula via Cholesky decomposition — no scipy dependency. Drop into any Python 3 environment with NumPy and Pandas. Replace benin_config and the correlation matrix with your country's parameters to run a live IGRIS assessment.
"IGRIS doesn't eliminate uncertainty — it quantifies it."M. Nuri Shakoor, SRMP — Quanta Analytica MNS Consulting
Deploy IGRIS™
Boards · GSOCs · Policy councilsIGRIS™ is deployed through MNS Consulting engagements — scoped to your organization's specific theaters, risk profile, and decision tempo. Whether you need a single-country CARVER + Monte Carlo cut or a full multi-theater living risk intelligence system, the starting point is an advisory intake.
IGRIS™, SATCON-X, CARVER-ECO, and the IGRIS Monte Carlo Engine are proprietary methodologies of MNS Consulting. Developed in partnership with Lladner Business Solutions, Risk Management & GSOC Services Division. M. Nuri Shakoor, SRMP. All rights reserved.