What (One-liner)
An insurance ALM reading on one honest daily axis — liability PV and Fisher-Weil duration from a declared template, the duration gap against a parameterised asset side, NAV impact under the in-force Solvency II Art. 166/167 rate shocks (verbatim tables), and a cashflow coverage runway.
How to use
Pick the liability template (life decaying-annuity or P&C runoff) and scale, set the asset side (value, duration, liquid share, income rate), choose the sovereign curve and run. Read the rate-shock loss proxy headline with the binding-scenario badge, then the duration-gap series chart. The shock table is relative and front-loaded — the binding scenario can contradict the gap sign's naive suggestion; read the badge. Wire it upstream of risk_management or meta_strategy, or an xlang script for an independent recompute. ⬇ CSV exports the full daily axis with every convention in the header.
Core formula
Shocks: r_up(t) = max(r·(1+s_up(t)), r+1pp); r_down(t) = r·(1−s_down(t)), nil if r<0
s_up: 70..26% over 1..20y → 20% at 90y; s_down: 75..29% → 20% (linear interp)
Liab: PV = Σ L_t·e^{−r(t)·t}; FW duration = Σ t·PV_t / PV
Assets: ΔA = −D_A·Δr(D_A)·A (duration-point approximation, declared)
Proxy: scr_ir_proxy = larger of the two NAV losses, floored at zero (Art. 165 shape)
Runway: liquid assets + cumulative income vs cumulative outflows, whole yearsAssumptions & applicability
Assumptions: sovereign curve ≠ EIOPA RFR (declared); declared parametric liability templates; duration-point asset side; ln(1+r) normalisation before shocking; endpoint-flat outside curve knots.
Applicable: life and P&C balance-sheet shapes on any of the five official sovereign curves; scenario-shape and runway reading.
Not applicable: regulatory SCR levels, actuarial valuation, bond-level analytics, the pending 2025 redesign.
Input / Output contract
Inputs: liability_template (life_annuity | pnc_runoff), liability_annual, liability_years, liability_decay, asset_value, asset_duration, liquid_share, asset_income_rate, curve, lookback_years.
Output: metrics (liability_pv, liability_fw_duration, duration_gap_years, nav_base, nav_delta_up_pct, nav_delta_down_pct, scr_ir_proxy_pct, binding_scenario, coverage_runway_years, n_dates, curve, liability_template) + one axis namespace series (dates + six per-date series, all equal length on the curve-panel axis), plus a provenance block declaring the shock-table version, both article rules, the curve basis, the asset approximation, the template spec and the runway convention.
Known limitations
- The binding scenario under the in-force table can flip the naive duration-gap intuition (front-loaded relative shocks) — this is the reading's core lesson, stated everywhere the number appears.
scr_ir_proxy_pctis shape-only: never compare its level to a reported regulatory SCR.- Templates are declared shapes, not actuarial models; mortality trend and lapse stress are separate family-D operators.
- A missing curve degrades honestly — the card never fabricates a term structure.

