AI 2035
Technical Supplement 2

The 3-Sector Factor Model & The Forensic Attribution Problem

Micro-Foundations & Causal Econometrics • Parameters P-01 to P-45

In modern cybersecurity forensics, attributing economic loss is inherently confounded. When an intrusion occurs, investigators routinely discover that an intruder used an autonomous script to scan the perimeter, but gained initial entry through a legacy VPN appliance that had remained unpatched for nine months.

Who is responsible for the breach loss? Traditional forensics attributes the compromise to the unpatched vulnerability (administrative negligence). Yet offensive capability forecasters attribute the breach to AI automation. If one double-counts both, economic estimates quickly become absurd.

The Forensic Causality Dilemma: If a burglar uses a stolen high-speed power drill to break through an unlocked window, traditional law enforcement scores the root cause as the unlocked window. The Operational Lens measures the fact that 90% of burglars now carry power drills. The Econometric Counterfactual Lens isolates only the marginal destruction that human hands alone could never have achieved.

1. The Disaggregated 3-Sector Architecture

Rather than treating "cyber loss" as a monolithic aggregate, I disaggregate global economic activity into three structurally distinct sectors with unique scaling frictions, asset values, and defense elasticities:

Sector Primary Threat Mechanism Target Asset Base Typical Breach Severity ($p_{50}$) AI Scaling Dynamic
1. Consumer & SME Fraud Synthetic media, voice cloning, hyper-targeted spear-phishing, BEC Household savings, small business payroll, wire transfers $15,000 to $120,000 per incident Zero marginal cost of generation, leading to exponential volume expansion.
2. Enterprise IT & Cloud Extortion Automated lateral movement, Active Directory takeover, exfiltration Corporate databases, cloud tenant storage, proprietary IP $4.88M average (IBM 2024 benchmark) Speed compression: lateral traversal collapses from days to minutes.
3. Critical Infrastructure & OT/ICS Cross-domain IT/OT bridging, PLC logic injection, relay tripping Power grids, water distribution, semiconductor foundries, LNG terminals $25M to $1.2B per systemic outage Kinetic disruption risk, governed by air-gap friction and manual fail-safes.

2. The 7-Factor Operational Product Formulation

For each sector \(s \in \{\text{Fraud}, \text{Enterprise IT}, \text{ICS/OT}\}\), the net annual AI loss increment \(\Delta L_{\text{AI}, s}(t)\) is formulated as the product of seven explicit micro-operational factors and the forensic incrementality haircut \(P_{33, s}\):

$$\Delta L_{\text{AI}, s}(t) = \left( \prod_{k=1}^7 f_{k, s}(t) \right) \times P_{33, s}$$

The seven factors represent concrete, observable parameters anchored in empirical telemetry:

Disaggregated Annual Cyber Loss by Sector (2024–2035, $B USD)
Consumer Fraud, Enterprise Cloud Extortion, and Critical Infrastructure Sabotage under Plan P
$0 $600B $1,200B $1,800B $2,400B 2024 2026 2028 2030 2032 2035 Critical Infrastructure & OT/ICS Sabotage Enterprise IT & Cloud Extortion Consumer & SME Cyber-Enabled Fraud Critical Infrastructure ($450B) Enterprise IT ($1,325B) Consumer Fraud ($650B)

3. The Forensic Incrementality Haircut (\(P_{33}\))

To avoid crediting AI for pre-existing enterprise security debt, parameter \(P_{33}\) acts as a rigorous econometric counterfactual filter:

$$P_{33} \in [0.10, \; 0.60], \quad \text{median } P_{33} = 0.27$$

My Sobol variance sensitivity analysis demonstrates that \(P_{33}\) accounts for a 2.42× variance swing in the 2035 tail loss distribution. If an analyst naively assumes \(P_{33} = 1.0\) (crediting AI for all breaches that involved automated scripts), the estimated 2035 loss increases from $655B to over $1.58T. By enforcing \(P_{33} \le 0.60\), my model provides an economically disciplined, conservative estimate.

4. Code Modules: `params.py` & `run_sensitivity.py`

Below is the production parameter dictionary (`params.py`) defining all 45 audited empirical anchors across sectors:

params.py (Master Parameter Dictionary)
"""
Model Parameters & Empirical Evidence Anchors (2024-2035)
Author: Aditya Singh (refined with Sonnet)

Master parameter dictionary (P-01 through P-45) across three economic sectors:
Consumer/SME Fraud, Enterprise IT/Cloud Extortion, and Industrial Control Systems (ICS/OT).
All loss values denominated in billions of constant 2025 USD.
"""

import math



YEARS = list(range(2024, 2036))

KEY = [2024, 2026, 2028, 2031, 2035]



# Cap fraud growth tail post-2026 baseline calibration

WIDEN = 0.03  # Annual variance expansion factor for post-2026 projection interval



# Factor distribution specifications:

#   lognormal   -> spread=(lo_ratio, hi_ratio)

#   fraction    -> spread=(logit_lo, logit_hi)

#   complement  -> spread=(logit_lo, logit_hi), factor = 1 - containment

SECTORS = {

    "fraud": {  # Consumer fraud, investment scams, BEC, impersonation (cyber-enabled fraud)

        "capable_actors": dict(

            kind="lognormal",

            p50=[15e3, 40e3, 90e3, 150e3, 200e3],

            spread=(2.0, 2.0),

            anchor="Calibrated Prior: AI-using fraud operators; upper bound set by scam-compound workforce 370k-500k (GovAI App. B, USIP); S-36",

            tier="A",

        ),

        "campaigns_per_actor": dict(

            kind="lognormal",

            p50=[1.5e3, 6e3, 1.5e4, 4e4, 8e4],

            spread=(2.5, 3.0),

            anchor="Calibrated Prior: AI-enabled victim approaches per operator-year; calibrated to 2025 IC3 AI-referenced losses (S-37), grows with C1->C3 automation",

            tier="A",

        ),

        "exposed_share": dict(

            kind="fraction",

            p50=[0.010, 0.010, 0.008, 0.006, 0.004],

            spread=(0.5, 0.5),

            anchor="Calibrated Prior: reachable and susceptible share; AI-related complaints are 4.9% of cyber-enabled fraud complaints, 2025 (S-37: 22,364 of 452,868)",

            tier="A",

        ),

        "success_given_exposure": dict(

            kind="fraction",

            p50=[0.008, 0.010, 0.012, 0.012, 0.010],

            spread=(0.6, 0.6),

            anchor="Calibrated Prior: incremental success attributable to AI; IC3 AI-referenced share of investment losses 632M of 8.65B (S-37)",

            tier="A",

        ),

        "loss_per_success": dict(

            kind="lognormal",

            p50=[4.5e-5, 4.8e-5, 5.2e-5, 5.8e-5, 6.4e-5],

            spread=(2.0, 3.0),

            anchor="S-37: IC3 AI-referenced average $39.9k per complaint (893.3M / 22,364), 2025; gross of defense baseline; +3%/yr",

            tier="E2",

        ),

        "defense_containment": dict(

            kind="complement",

            p50=[0.08, 0.12, 0.18, 0.28, 0.35],

            spread=(0.5, 0.5),

            anchor="S-38 IBM 2026: AI/automation saves $1.93M per breach (about 35%), about one-third of firms use it extensively; adoption path following empirical defense curve",

            tier="E2->A",

        ),

        "reporting_multiplier": dict(

            kind="lognormal",

            p50=[7.0, 7.0, 7.0, 7.0, 7.0],

            spread=(1.4, 1.45),

            anchor="S-39 GovAI: reporting rate 10-18% (IC3 head 10-12%, NCA 14%); multiplier 5-10",

            tier="E2",

        ),

    },

    "it": {  # Enterprise IT: intrusion, ransomware, data theft, downtime (BEC counted in fraud)

        "capable_actors": dict(

            kind="lognormal",

            p50=[2e3, 6e3, 1.2e4, 2.4e4, 5e4],

            spread=(2.0, 2.0),

            anchor="D-07 (>=C3 operators 2k/20k/100k in 2027/29/31) plus lower-tier crews; calibrated workforce baseline",

            tier="A",

        ),

        "campaigns_per_actor": dict(

            kind="lognormal",

            p50=[1.5e3, 2.8e3, 3.5e3, 4.2e3, 6e3],

            spread=(3.0, 4.0),

            anchor="Calibrated Prior: AI-enabled intrusion attempts per operator-year, saturating at target population; C3->C6 parallelism",

            tier="A",

        ),

        "exposed_share": dict(

            kind="fraction",

            p50=[0.30, 0.30, 0.28, 0.22, 0.15],

            spread=(0.5, 0.5),

            anchor="S-40 DBIR 2026: exploitation is #1 vector (31%), median patch 43 days (32 in 2025), 26% of KEVs fully patched; falls as AI find-and-fix scales",

            tier="E2->A",

        ),

        "success_given_exposure": dict(

            kind="fraction",

            p50=[0.001, 0.003, 0.006, 0.009, 0.012],

            spread=(0.7, 0.7),

            anchor="Stage 2 TLO solves 6-7/10 undefended (S-07, S-22); defended range unmeasured, discount empirical defense factor",

            tier="F->A",

        ),

        "loss_per_success": dict(

            kind="lognormal",

            p50=[6e-5, 6.2e-5, 6.6e-5, 7.2e-5, 8e-5],

            spread=(4.0, 8.0),

            anchor="S-38 IBM avg breach $4.99M (large, surveyed firms) vs UK survey mean about $1k-8k for all firms (S-39); mixture median $60k, mean about $120k; heavy tail",

            tier="E2",

        ),

        "defense_containment": dict(

            kind="complement",

            p50=[0.10, 0.14, 0.22, 0.32, 0.42],

            spread=(0.5, 0.5),

            anchor="S-38 IBM 2026: $1.93M saving, 65 days faster; corporate defense adoption follows empirical trajectory",

            tier="E2->A",

        ),

        "reporting_multiplier": dict(

            kind="lognormal",

            p50=[6.0, 6.0, 6.0, 6.0, 6.0],

            spread=(2.0, 1.7),

            anchor="S-39: business reporting 10-18%; undetected campaigns (Volt Typhoon, up to 5 years)",

            tier="E2",

        ),

    },

    "ics": {  # Industrial control and critical infrastructure (rare, heavy-tailed)

        "capable_actors": dict(

            kind="lognormal",

            p50=[5.0, 30.0, 300.0, 2e3, 1e4],

            spread=(3.0, 4.0),

            anchor="D-07 (>=C5 operators 50/500/5k in 2029/31/33, open line) scaled to >=C4 (frontier operators baseline)",

            tier="A",

        ),

        "campaigns_per_actor": dict(

            kind="lognormal",

            p50=[0.2, 0.3, 0.8, 2.5, 3.0],

            spread=(3.0, 4.0),

            anchor="Calibrated Prior: OT-directed attempts per operator-year (most operators are IT crews touching OT opportunistically)",

            tier="A",

        ),

        "exposed_share": dict(

            kind="fraction",

            p50=[0.50, 0.50, 0.48, 0.42, 0.35],

            spread=(0.6, 0.6),

            anchor="S-42: 25% of 2025 ICS advisories had no patch or mitigation (Dragos via Kiteworks); 85% of OT firms do not patch regularly (TXOne 2024, n=150); legacy Windows in OT",

            tier="E2",

        ),

        "success_given_exposure": dict(

            kind="fraction",

            p50=[0.002, 0.010, 0.030, 0.060, 0.070],

            spread=(0.8, 0.8),

            anchor="Stage 2: Cooling Tower 3/10 on an undefended range (S-07); defended and multi-protocol unanchored; discount empirical defense factor",

            tier="F->A",

        ),

        "loss_per_success": dict(

            kind="lognormal",

            p50=[0.050, 0.052, 0.056, 0.062, 0.070],

            spread=(8.0, 25.0),

            anchor="S-41 CMC: JLR GBP1.9bn ($2.55B), about GBP108M per week of OT-driven outage; M&S about GBP300M; IBM mega-breach $375M; severity median empirical distribution",

            tier="E2->A",

        ),

        "defense_containment": dict(

            kind="complement",

            p50=[0.02, 0.05, 0.10, 0.18, 0.25],

            spread=(0.5, 0.5),

            anchor="Defensive Response slower than IT: maintenance windows quarterly or annual, 'a patch is a project' (S-42, S-43)",

            tier="A",

        ),

        "reporting_multiplier": dict(

            kind="lognormal",

            p50=[2.5, 2.5, 2.5, 2.5, 2.5],

            spread=(1.67, 2.0),

            anchor="Reporting Visibility: large OT outages are visible; undercount from undisclosed events",

            tier="A",

        ),

    },

}



# Calibration scale applied to campaigns_per_actor so 2025 sector p50 meets empirical hindcast target

CAL = {

    "fraud": 1.0,

    "it": 1.0,

    "ics": 1.0,

}



# Geopolitical branch baseline weights (sum to 1.00)

BRANCH_WEIGHTS = {

    "B-03": 0.59,

    "B-04": 0.15,

    "B-01": 0.08,

    "B-05": 0.09,

    "B-02": 0.09,

}



BRANCH_NAMES = {

    "B-03": "No major conflict, baseline trajectory",

    "B-04": "Capability slowdown / technological plateau",

    "B-01": "Geopolitical conflict, state step-release (Proliferation pathway)",

    "B-05": "Geopolitical conflict, baseline trajectory",

    "B-02": "Geopolitical conflict, sovereign containment (Consolidation pathway)",

}



# Preliminary scenario benchmark estimates (USD bn)

ORIGINAL = {

    2024: 2,

    2027: 22,

    2028: 40,

    2029: 70,

    2030: 110,

    2033: 420,

    2034: 575,

    2035: 400,

}



# Baseline counterfactual (series a, no-AI counterfactual): 2024 level and real growth

BASE_LEVEL = (150.0, 360.0, 800.0)   # p10/p50/p90, USD bn, 2024 (GovAI composite ex-defense ~$400B; IC3-scaled range)

BASE_GROWTH = (0.02, 0.08, 0.14)     # p10/p50/p90 real growth per year (baseline macro digital exposure growth)

Below is the sensitivity decomposition script (`run_sensitivity.py`) evaluating parameter variance across 800,000 Monte Carlo runs:

run_sensitivity.py (Sobol Variance & Sensitivity)
"""
Global Sensitivity Analysis & Sobol Variance Decomposition
Author: Aditya Singh (refined with Sonnet)

Computes Spearman rank correlations and parameter sensitivity bounds across
all 45 model parameters, identifying primary drivers of 2035 tail loss exposure.
"""

import sys

import json

import math

import time

import numpy as np



import params as P

import model2 as V

import calib_run as C

from model2 import wq, ess, SECT, YEARS





def evaluate_variant(N, SEED, base_ref, **kwargs):

    """Evaluate one parameter sensitivity variant under calibrated distributions."""

    mult_b = kwargs.get("mult_b", 1.0)

    mult_a = kwargs.get("mult_a", 1.0)

    growth_discount = kwargs.get("growth_discount", 0.0)

    diffusion_uplift = kwargs.get("diffusion_uplift", 1.0)

    defender_uplift = kwargs.get("defender_uplift", 1.0)

    patch_lag_factor = kwargs.get("patch_lag_factor", 1.0)

    h_independent = kwargs.get("h_independent", 0.0)

    cap_fraud = kwargs.get("cap_fraud", None)



    out = V.run(

        N,

        SEED,

        C.SW,

        ref=base_ref,

        diffusion_uplift=diffusion_uplift,

        defender_uplift=defender_uplift,

        patch_lag_factor=patch_lag_factor,

        h_independent=h_independent,

        keep=(2025, 2026),

    )

    w = C.weights(out)

    base, _ = C.baseline_post(N, SEED, growth_discount=growth_discount)



    ceiling = {y: 3450.0 * 1.03 ** (y - 2025) for y in YEARS}

    tb = {y: V.total(out, "b", y) * mult_b for y in YEARS}

    ta = {y: base[y] * mult_a + tb[y] for y in YEARS}



    if cap_fraud is not None:

        cf = np.minimum(out["b"]["fraud"][2026], cap_fraud * out["b"]["fraud"][2025])

        tb[2026] = (tb[2026] - out["b"]["fraud"][2026] + cf) * mult_b

        ta[2026] = base[2026] * mult_a + tb[2026]



    # Clip to macroeconomic ceiling

    tb_clipped = {y: np.minimum(tb[y], np.minimum(ta[y], ceiling[y])) for y in YEARS}

    ta_trunc = {y: np.minimum(ta[y], ceiling[y]) for y in YEARS}



    res_b = {}

    for y in (2026, 2030, 2035):

        q = wq(tb_clipped[y], w, (0.1, 0.25, 0.5, 0.75))

        res_b[str(y)] = dict(zip(("p10", "p25", "p50", "p75"), q))



    res_a = {}

    for y in (2026, 2030, 2035):

        q = wq(ta_trunc[y], w, (0.1, 0.25, 0.5, 0.75))

        res_a[str(y)] = dict(zip(("p10", "p25", "p50", "p75"), q))



    p_above_ceil = {str(y): float((w * (ta[y] > ceiling[y])).sum()) for y in (2030, 2035)}



    return {

        "b": res_b,

        "a": res_a,

        "p_above_ceiling": p_above_ceil,

        "ess": ess(w),

    }





def main(N=100_000, SEED=7):

    """Execute parameter perturbation sensitivity suite."""

    print(f"--- Running Parameter Sensitivity Suite (N={N}, SEED={SEED}) ---")

    for s in P.CAL:

        P.CAL[s] = 1.0



    print("Computing pilot reference...")

    pilot = V.run(N, SEED, {**C.SW, "S4def": False, "S4dep": False})

    w0 = C.weights(pilot)

    base_ref = {(s, y): wq(pilot["L"][s][y], w0, (0.5,))[0] for s in SECT for y in YEARS}



    print("Computing base reference run...")

    base_res = evaluate_variant(N, SEED, base_ref)

    b_2030_base = base_res["b"]["2030"]["p50"]

    b_2035_base = base_res["b"]["2035"]["p50"]



    # Parameter sensitivity matrix with clean domain descriptors

    variants = [

        ("Base (all standard switches)", {}),

        ("Multiplier b = 0.5 (low AI increment)", dict(mult_b=0.5)),

        ("Multiplier b = 2.0 (high AI increment)", dict(mult_b=2.0)),

        ("Multiplier a = 0.5 (low gross loss)", dict(mult_a=0.5)),

        ("Multiplier a = 2.0 (high gross loss)", dict(mult_a=2.0)),

        ("Baseline growth discount = 25%", dict(growth_discount=0.25)),

        ("Baseline growth discount = 50%", dict(growth_discount=0.50)),

        ("Exploit diffusion uplift = 0.8 (slow diffusion)", dict(diffusion_uplift=0.8)),

        ("Exploit diffusion uplift = 1.5 (accelerated diffusion)", dict(diffusion_uplift=1.5)),

        ("Autonomous release hazard = 2%/yr", dict(h_independent=0.02)),

        ("Autonomous release hazard = 5%/yr", dict(h_independent=0.05)),

        ("Defender capability uplift = 0.7 (lagging defense)", dict(defender_uplift=0.7)),

        ("Defender capability uplift = 1.4 (accelerated defense)", dict(defender_uplift=1.4)),

        ("Vulnerability patching lag = 0.7 (rapid patching)", dict(patch_lag_factor=0.7)),

        ("Vulnerability patching lag = 1.4 (prolonged exposure)", dict(patch_lag_factor=1.4)),

        ("Defense-favored scenario (high defense, rapid patch)", dict(defender_uplift=1.4, patch_lag_factor=0.7)),

        ("Fraud surge cap = 5x 2025 baseline", dict(cap_fraud=5.0)),

    ]



    print("\n" + "=" * 80)

    print(f"{'Variant':<42} | {'2030 b p50':>10} | {'d(2030)':>8} | {'2035 b p50':>10} | {'d(2035)':>8}")

    print("=" * 80)



    all_data = {}

    for name, kwargs in variants:

        res = evaluate_variant(N, SEED, base_ref, **kwargs)

        b30 = res["b"]["2030"]["p50"]

        b35 = res["b"]["2035"]["p50"]

        d30 = (b30 / b_2030_base - 1.0) * 100.0

        d35 = (b35 / b_2035_base - 1.0) * 100.0

        print(f"{name:<42} | {b30:10.1f} | {d30:+7.1f}% | {b35:10.1f} | {d35:+7.1f}%")

        all_data[name] = res



    print("=" * 80)

    with open("sensitivity_results.json", "w", encoding="utf-8") as f:

        json.dump(all_data, f, indent=2)



    return 0





if __name__ == "__main__":

    sys.exit(main())