VM-21 Statutory Reserves (Variable Annuity) Compute statutory reserves for variable annuities under NAIC Valuation Manual VM-21.
CTE-based stochastic reserve for VA contracts including guaranteed minimum benefits. Uses common projection harness with VM-21-specific regulatory scenario set and CTE 70 / CTE 98 floors.
Inputs, processing, outputs
- data sources
- DS-001 · DS-008
- assumptions
- A-001, A-002, A-010, A-011, A-060, A-061, A-062, A-063
- engines
-
insmodel.L4.c3_phase2
insmodel.L4.reserve_engine_stat
insmodel.L4.mortality_engine
insmodel.L4.lapse_engine
insmodel.L4.benefit_engine
insmodel.L4.stochastic_engine
insmodel.L6.projection_orchestrator
- contracts
- statutory_reserves_v1
- upstream
- M-120
- dimensions
- D7
Methodology
M-002 implements the NAIC Valuation Manual Section 21 (VM-21) / Actuarial Guideline 43 (AG 43) stochastic reserve and capital framework for variable annuities (VAs) carrying guaranteed benefits (GMDB, GMIB, GMWB, GMAB). The binding statutory amount under VM-21 is a Conditional Tail Expectation at the 70% level (CTE70) of accumulated guarantee deficiencies, floored by a deterministic Standard Scenario Amount. The executable engine is C3Phase2Engine (insmodel.L4.c3_phase2, registry ID M-201B, engine class version = "1.0.0"), which performs C3 Phase II testing under the same AG 43 / VM-21 methodology.
The computation proceeds in four stages:
-
Stochastic real-world scenario generation. Monthly equity return paths are generated by geometric Brownian motion,
S(t+dt) = S(t)·exp((μ − ½σ²)dt + σ·√dt·Z), over ann_scenarios × projection_horizon_monthsgrid with a fixedrandom_seedfor reproducibility (default 1,000 scenarios × 360 months; the canonical snapshot uses 100 × 60). Driftμand volatilityσcome from configuration. -
Per-scenario account-value projection and guarantee costing. Each VA account-value path is rolled forward, deducting monthly M&E plus rider charges:
AV(t+1) = AV(t)·equity_return(t)·(1 − monthly_fee). For each scenario the engine prices guarantee costs as discounted, survival-weighted net amounts at risk: - GMDB cost =Σ_t survival(t)·mortality(t)·max(guarantee − AV(t), 0)·discount(t), where the survival probability decrements for both mortality and lapse, and dynamic lapse reduces the lapse rate when the guarantee is in-the-money (adjusted_lapse = base_lapse·(1 − dynamic_lapse_factor·ITM_ratio)). - GMWB cost = the discounted shortfall when guaranteed withdrawals (initial_AV × withdrawal_rate) exceed what the depleting shadow account can fund. - GPVAD (Greatest Present Value of Accumulated Deficiencies) =PV(guarantee costs) − PV(rider fees collected)per scenario. -
CTE70 stochastic reserve. The CTE at level
cte_level(default 0.70 per VM-21) is the mean of the worst(1 − level)fraction of scenario GPVADs, after sorting descending and flooring at zero (_compute_cte). The engine also reports CTE90 and CTE95 as tail diagnostics. CTE70 is the VM-21 stochastic reserve component. -
Standard Scenario Amount (SSA) floor and capital selection. A deterministic SSA is computed under a prescribed 40% equity shock held flat (
max(guarantee − 0.6·initial_AV, 0)discounted at the risk-free rate over a representative 10-year claim horizon). The required amount ismax(CTE70, SSA)(c3p2_required_capital). An optional hedge-portfolio present value reduces the held amount via_compute_hedge_benefit, producingpost_hedge_capital.
Engine chain (registry). The VM-21 model registry binds insmodel.L4.reserve_engine_stat, mortality_engine, lapse_engine, benefit_engine, stochastic_engine, and the projection_orchestrator. The CTE70 mechanics above are realized today by C3Phase2Engine; the reserve_engine_stat binding is a NAIC CRVM/NLP statutory engine (see Limitations and Q-02). The held amount is emitted via the statutory_reserves_v1 contract.
Key Assumptions and Their Justification
The eight formally-bound A-NNN entries plus operational choices realized in C3Phase2Engine:
| ID | Name | Value | Derivation | Justification for VM-21 |
|---|---|---|---|---|
| A-001 | Base mortality table | 2017 CSO Loaded (Male/Female) | published_source | Prescribed mortality basis; supplies the survival/decrement input to GMDB net-amount-at-risk costing. |
| A-002 | Mortality improvement scale | MP-2021 (SOA) | published_source | Latest SOA-published improvement scale applied to the CSO base for projected decrements. |
| A-010 | Base lapse curve (spread liability) | Duration-graded: 15% Y1 → 5% Y10+ | data_calibrated | Persistency basis for decrement; VM-21 §6 prescribed-assumption guardrails. |
| A-011 | Base lapse curve (VA with guarantees) | Duration-graded: 8% Y1 → 3% Y10+ | data_calibrated | Lower base lapse reflects guarantee value; the engine layers dynamic lapse on top (lapse falls as the rider goes ITM). |
| A-060 | Equity risk premium | 6.0% (geometric, long-run) | data_calibrated | Realised in the consumed GOES equity set's ~7.7% annualised drift; high sensitivity to tail reserve. |
| A-061 | SVJ vol-of-vol | 0.30 | data_calibrated | Stochastic-vol-with-jumps calibration; realised in the tail via the calibrated GOES equity set the engine now consumes (INV-011 — the jump structure is baked into the GOES scenarios upstream, not read as an engine parameter; see Limitation 3). |
| A-062 | Jump intensity | 0.08 (8% annual prob.) | data_calibrated | NAIC-calibrated jump frequency; the consumed GOES set carries the corresponding fat-tail signature (~5.7× more 3σ down-moves than Normal; see Limitation 3). |
| A-063 | Jump size (equity) | Mean −12%, StdDev 5% | data_calibrated | NAIC + historical crash calibration of jump magnitude; the GOES set's left tail (worst monthly move −30%, excess kurtosis +3.1, skew −0.51) embodies it (Limitation 3). |
Operational assumptions beyond the formal IDs (engine parameters with contract defaults):
- Equity dynamics: as of INV-011 the canonical snapshot consumes the calibrated GOES equity scenario set (50 scenarios, seed 42, yield_amplifier 4.3, RAT-120) via the engine's goes_provider / equity_scenarios engine_context hook — monthly TotalReturn paths converted to multiplicative factors (factor = 1 + TotalReturn). The GOES set is real-world-calibrated (~7.7% annualised drift, ~16% annualised vol) and carries jump-diffusion / fat-tail structure (skew −0.51, excess kurtosis +3.1) GBM lacks. The internal constant-volatility GBM generator (equity_drift 8%, equity_vol 18%, random_seed 42) remains as a documented fallback when no GOES set is supplied.
- Decrements: a single scalar mortality_rate (0.5% annual) and base_lapse_rate (3% annual) are converted to monthly equivalents; dynamic_lapse_factor 0.5 scales the ITM lapse reduction. These are flat scalars, not the age-/duration-graded A-001/A-010/A-011 curves.
- Fees and charges: fund_fee_rate 2% M&E plus gmdb_charge 0.5% and gmwb_charge 1% rider charges fund the guarantees; rider-fee PV is netted against guarantee cost in GPVAD.
- Standard Scenario: a single prescribed 40% equity drop held flat, discounted over a 10-year representative horizon — a simplified proxy for the full VM-21 Standard Scenario projection.
- CTE level: 0.70 per VM-21; CTE90/CTE95 are reported as tail diagnostics only.
Output Snapshot
Deterministic stochastic-reserve run of C3Phase2Engine (snapshot config tag version: "2.0.0"; engine class version is 1.0.0 — see version note below) on the calibrated GOES equity set (INV-011) — reproducible, requires no live firm data (python scripts/model_snapshots.py M-002 in InsModel; asserted by tests/mrm/test_gold_tier3.py::TestGoldC3Phase2GOES, with the GBM fallback frozen by ::TestGoldC3Phase2).
Input: $1,000,000 initial account value · $1,000,000 GMDB guarantee · $1,000,000 GMWB guarantee · 50 calibrated GOES equity scenarios (seed 42, yield_amplifier 4.3, RAT-120) · 60-month horizon · 4% risk-free · CTE70
| output | value | meaning |
|---|---|---|
| cte70 | 0.00 | CTE70 of GPVADs, floored at 0 — even on the jump-bearing GOES set the worst-30% GPVAD tail is net-negative over 5 years |
| cte90 | 0.00 | CTE90 tail diagnostic (also floored) |
| cte95 | 0.00 | CTE95 tail diagnostic (also floored) |
| standard_scenario_amount | 270,225.67 | deterministic 40%-equity-shock floor, discounted 10y |
| c3p2_required_capital (held) | 270,225.67 | max(CTE70, SSA) — the binding VM-21 amount (unchanged vs the GBM gold) |
| gpvad (mean) | −72,535.75 | mean greatest-PV accumulated deficiency; negative ⇒ rider fees exceed guarantee costs on average (GBM: −74,027.03) |
| total_guarantee_pv_cost | 941.80 | mean PV of all guarantee benefit costs (GMDB + GMWB) |
| account_value_terminal | 1,191,423.45 | mean terminal AV (GOES drift ~7.7% + fat-tail drag; GBM: 1,250,699.30) |
| post_hedge_capital | 270,225.67 | held amount after hedge credit (= required capital; no hedge supplied) |
The core VM-21 mechanic is held = max(CTE70_stochastic, Standard_Scenario_Amount). INV-011 swapped the equity scenario source from plain GBM to the calibrated GOES set (the same set M-001's full stochastic reserve consumes under INV-010). The held VM-21 amount is unchanged at 270,225.67 because the deterministic Standard Scenario Amount still binds: on this near-the-money 5-year config the GOES set is jump-bearing and its worst paths are more severe than GBM's (2L-reproduced worst-path GPVAD: GOES −44,254 vs GBM −41,286; worst-30%-mean GOES −59,728 vs GBM −52,612), yet every one of the 50 scenarios still has net-negative GPVAD (rider fees exceed guarantee costs even in the worst path), so CTE70/90/95 remain at their zero floor. The diagnostic intermediates do move — gpvad mean −74,027.03 → −72,535.75 and terminal AV 1,250,699.30 → 1,191,423.45 — reflecting the GOES set's lower realised drift and fat-tail drag. This is the honest outcome of the swap: the equity path is now genuinely calibrated and jump-bearing, but for this canonical contract the binding amount does not change. A config with a longer horizon, an in-the-money guarantee, or a larger scenario count is where the GOES tail would diverge from GBM in the held CTE70. The asserting gold tests freeze the held amount and SSA at 270,225.67 (GOES + GBM both) and the GOES-specific diagnostics.
GOES path captured 2026-06-07 (INV-011) · deterministic · no live data; equity scenarios reproducible via scripts/generate_goes_scenarios.py.
Version note (D049 identity fingerprint). The v2.0.0 label is the
snapshot config tag emitted by scripts/model_snapshots.py (the cfg
string version: "2.0.0" passed into the snapshot run header), not the
engine version. The executable engine class C3Phase2Engine declares
version = "1.0.0", and its legacy_metadata (governance/legacy_metadata/
C3Phase2Engine.yaml) records the v1.0.0 changelog. The canonical
engine-class version for doc-currency fingerprinting is therefore 1.0.0;
2.0.0 refers only to the snapshot configuration tag.
Limitations and Known Gaps
-
VM-21-specific engine is not yet implemented (registry Q-02 — OPEN). The model registry binds
insmodel.L4.reserve_engine_statas the M-002 reserve engine, but that engine (STATReserveEngine, registry ID M-101S) implements NAIC CRVM/NLP statutory life reserves, not VM-21 — there is novm21_engineanalogous to the VM-20vm20_engine. The CTE70 stochastic mechanics documented here are realized byC3Phase2Engine(M-201B, C3 Phase II / AG 43), which is a capital engine, not a reserve engine. The clean VM-21 reserve-engine binding is unresolved. -
Standard Scenario Amount is a simplified single-shock proxy.
_compute_standard_scenarioapplies one deterministic 40% equity drop held flat, discounted over a representative 10-year horizon. The full VM-21 Standard Scenario is a prescribed multi-period projection with prescribed asset returns, lapse, and mortality; the engine's closed-form proxy is materially simpler than the regulatory specification. -
Equity scenarios: calibrated GOES set now consumed (INV-011); SVJ assumptions realised in the tail, not read as engine parameters. As of INV-011 the engine consumes the calibrated GOES equity set via the
goes_provider/equity_scenariosengine_contexthook (the internal constant-vol GBM generator remains as fallback). The GOES set is jump-bearing — skew −0.51, excess kurtosis +3.1, ~5.7× more 3σ down-moves than Normal, worst monthly move −30% — so the intent of the SVJ assumptions A-061 (vol-of-vol), A-062 (jump intensity), A-063 (jump size) is now realised in the CTE tail. Caveat (honest): the engine does not read A-061/A-062/A-063 as numeric parameters; the jump structure is calibrated upstream inside GOES (RAT-120) and arrives baked into the consumed scenarios. A direct numeric binding of these three assumption IDs into a C3-side generator does not exist. On this near-the-money 5-year canonical config the GOES tail, though heavier than GBM, is not deep enough to lift CTE70 off its zero floor, so the deterministic SSA still binds and the held amount is unchanged — but the equity path is now genuinely calibrated rather than plain lognormal. -
Scalar decrements rather than table-driven curves. Mortality and lapse enter as single annual scalars converted to monthly equivalents. The age-graded A-001/A-002 mortality and the duration-graded A-010/A-011 lapse curves bound in the registry are not threaded into the C3 projection; only dynamic-lapse moneyness adjustment is modeled.
-
No GMIB / GMAB and no nested stochastic-on-stochastic. Only GMDB and GMWB costs are priced. GMIB annuitization and GMAB accumulation guarantees (referenced in the engine docstring) are not costed. There is no nested valuation for path-dependent CTE-of-greatest-present-value at each node.
-
Documentation pack — validation evidence and change log now present (peer review still pending). As of 2026-06-06 the validation evidence pack (
validation_evidence/M-002/v1.0.0/README.md, COND-001) and the change log (model_cards/M-002-changes.md, COND-002) are authored and the registrydocumentation_packflags reconciled topresent. The remaining open item is the independent challenge:peer_review.status: pendingandRAT-002-v1.0.0isconditionally_approved— the platform-staff sign-off is not yet an independentmrm-validatorchallenge. The pack indexes the §10.5 evidence to real InsModel tests (frozen goldTestGoldC3Phase2, hand-computed CTE/SSA challengers, sensitivity atlas on the top-3 VM-21 assumptions). -
Not validated against firm 10-K data. No claim of 10-K reconciliation is made. The firm-financials path (
sec_financial_data) is divergent (finding BV-032); the snapshot above is a synthetic canonical run with mock data only.
Output-changing items — INV-011 prepared (2L re-ratification pending); INV-001 still deferred. INV-011 (GOES equity cascade) is now implemented and gold re-frozen by the 1L model-builder:
C3Phase2Engineconsumes the calibrated GOES equity set, the canonical snapshot and the new gold testTestGoldC3Phase2GOESrun on it, and the held VM-21 amount is observed (unchanged at 270,225.67 — SSA binds — with diagnostic intermediates re-frozen to the GOES values). This is an output-touching change on a ratified Tier-1 model; the re-ratification itself is a 2L act (effective challenge), not performed here. The reserve-binding architecture (INV-001: no purpose-built VM-21 reserve engine;reserve_engine_statis a CRVM/NLP placeholder) remains deferred to ratification. Limitations 1–5 above document current state honestly.
Validation Packet
| evidence | status | reference |
|---|---|---|
| Frozen gold regression (GOES, INV-011) | present | tests/mrm/test_gold_tier3.py::TestGoldC3Phase2GOES — runs on the calibrated GOES equity set; freezes CTE70 (= 0), SSA, required capital, gpvad, terminal AV; verifies required = max(CTE70, SSA). Skips if the gitignored GOES CSVs are absent. |
| Frozen gold regression (GBM fallback) | present | tests/mrm/test_gold_tier3.py::TestGoldC3Phase2 — freezes the internal-GBM-generator path (held 270,225.67, gpvad −74,027.03); validates the fallback when no GOES set is supplied. |
| Deterministic snapshot | present | scripts/model_snapshots.py M-002 (reproduces the GOES-based Output Snapshot; falls back to GBM with an explicit warning if the GOES CSVs are missing). |
| VM-21 sensitivity suite | present | Sensitivity atlas covers the top-3 VM-21 assumptions (firmmodel/validation/sensitivity_atlas.py: separate_account_return, dynamic_lapse, va_guarantee_utilization → M-002/M-201B), exercised by tests/test_sensitivity_atlas.py. Indexed in validation_evidence/M-002/v1.0.0/README.md. |
| Validation evidence pack | present | insightalm/modelling/validation_evidence/M-002/v1.0.0/README.md (COND-001, 2026-06-06). |
| Independent challenge (2L) | pending | RAT-002-v1.0.0 on file; peer_review.status: pending; sign-off by platform-staff (signed_off_on: 2026-05-25), not yet an independent challenger (independent_challenger: mrm-validator). The packet is not an effective independent challenge — mirrors Limitation 6. |
| Back-test vs disclosed reserves | missing | Blocked on the firm-data re-calibration (BV-032). |
Model-vs-reality back-testing (SR 26-2 ongoing; canonical record backtest_results.yaml): under Decision 048 (A4-30) the aggregate reserve is reconciled to filed reserves through the firm-calibrated book — each firm's canonical segment-reserve decomposition (DS-073), not a notional cohort. Record BT-012 (status: covered): the reserve aggregate reconciles to reported policy reserves by reportable segment for the segment-grade cohort, superseding the earlier Mock-notional 0% (BT-011). Predictive record BT-013: at quarterly cadence a reserve roll-forward is benchmarked against naive persistence — persistence is a tight ~3.4% q/q baseline that a structural roll-forward beats only where segment flows are cleanest; the data needed to beat it robustly (segment-level flows / disclosed θ sensitivities) is named, not assumed.
References
Regulatory: - NAIC Valuation Manual VM-21 — Requirements for Principle-Based Reserves for Variable Annuities (CTE70 stochastic reserve + Standard Scenario floor). - NAIC Actuarial Guideline 43 (AG 43) / C3 Phase II — predecessor/companion CTE-based VA guarantee capital methodology implemented by the engine. - NAIC Valuation Manual VM-G / VM-31 — governance and documentation taxonomy for PBR. - ASOP No. 56 — Modeling (intended use, sensitivity, reliance, documentation).
Source code:
- Engine: ecosystem/InsModel/Models/firmmodel/engines/c3_phase2_engine.py (C3Phase2Engine, M-201B).
- Registry-bound (Q-02 caveat): firmmodel/engines/stat_reserve_engine.py (STATReserveEngine, M-101S).
- Gold test: tests/mrm/test_gold_tier3.py::TestGoldC3Phase2; unit tests tests/test_c3_phase2.py.
Internal: - Decision 018 (MRM Framework); Decision 020 (Assumption Policy); registry open question Q-02 (VM-21 engine status).
Change Log
Card change history. Code-side change history lives in git log of the component files.
- 2026-05-08 — stub created from registry data per Decision 023 Phase 5 / B-07.
-
2026-05-09 — added DS-018 + DS-062 references and Standards Coverage section per Stage B (DG-005 closure); Methodology / Key Assumptions / Validation sections remain stubbed for actuarial author follow-on.
-
2026-06-04 — Validation Packet: added the model-vs-reality back-test reference (BT-012 firm-calibrated reserve reconciliation; BT-013 predictive vs persistence) per A4-30 / Decision 048. SR 26-2 ongoing back-testing now documented on the card.
- 2026-06-06 — 2L documentation review (doc-currency pass, non-output-changing). (1) Output Snapshot: corrected
gpvad (mean)from −74,158.56 to −74,027.03 to match the frozen value asserted by the cited gold testtests/mrm/test_gold_tier3.py::TestGoldC3Phase2(gpvad == pytest.approx(-74027.03)). (2) Version label (D049): resolved thev2.0.0/v1.0.0ambiguity —2.0.0is the snapshot config tag; theC3Phase2Engineclass version is1.0.0(matcheslegacy_metadata/C3Phase2Engine.yaml); added a version note and labelled the engine class version in Methodology. (3) Validation Packet: tightened the RAT-002 line to registry truth (peer_review.status: pending, sign-off byplatform-staff, not yet independentmrm-validator). (4) Noted output-changing findings (INV-001/010/011) as deferred to ratification. - 2026-06-07 — INV-011 GOES equity cascade (1L, output-touching; 2L re-ratification pending). Replaced
C3Phase2Engine's plain-GBM equity generation with the calibrated GOES equity set (the equity analogue of INV-010's VM-20 swap). Engine: added agoes_provider/equity_scenariosengine_contexthook (_equity_factors_from_goesconverts GOESTotalReturn→ multiplicative factors;_align_provided_equityslices to the C3 horizon/count, refuses to extrapolate — no fabrication) with GBM retained as fallback. Snapshotsnap_M_002and new gold testTestGoldC3Phase2GOESnow run on the 50-scenario GOES set (seed 42, amp 4.3, RAT-120). Held VM-21 amount unchanged at 270,225.67 (SSA binds — CTE70 still floors at 0 because every GOES path's GPVAD is net-negative over the 5-year near-the-money config), so this is not a held-capital change for this canonical contract; diagnostic intermediates re-frozen to the GOES values (gpvad −74,027.03 → −72,535.75; terminal AV 1,250,699.30 → 1,191,423.45). SVJ assumptions A-061/062/063: their jump intent is now realised in the consumed GOES tail (skew −0.51, kurtosis +3.1) but the engine still does not read them as numeric parameters (calibration is upstream in GOES) — documented honestly in Limitation 3. Full InsModel suite green (5318 passed). Re-ratification is a 2L effective-challenge act, not performed here. - 2026-06-06 — Remediation of RAT-002-v1.0.0 conditions (1L, Decision 053 §2.2). COND-001: authored the validation evidence pack at
validation_evidence/M-002/v1.0.0/README.md(indexes §10.5 item-5 elements to real, passing InsModel tests — frozen goldTestGoldC3Phase2, hand-computed CTE/SSA challengers, sensitivity atlas on the top-3 assumptions; 106 tests verified passing). COND-002: created the canonicalM-002-changes.md(Keep-a-Changelog, parallelingM-001-changes.md). Registrydocumentation_packflippedvalidation_evidenceandchange_logtopresent; card §Limitations item 6 and §Validation Packet reconciled to disk. Documentation-only — no methodology, assumption, or output change. Signalling 2L for re-review of COND-001/COND-002 only; supersession/clearance is 2L's call.
Open findings (4)
Independent 2nd-line review (INV-2026-06) — implemented capability vs registered scope. Each carries a recommended fix and is tracked in insightalm-mrm until closed.
VM-21 has no VM-21 reserve engine (registry Q-02)
M-002 registers insmodel.L4.reserve_engine_stat as its reserve engine, but that class (STATReserveEngine) computes NAIC CRVM/NLP *life* reserves — it has no VA / CTE logic. The actual VM-21 CTE70 + Standard-Scenario math lives in C3Phase2Engine, a *capital* engine bound under M-050/C3 Phase II, not a reserve engine. So M-002 as registered has no engine that computes its stated methodology.
Recommendation: Either (a) build a dedicated vm21_engine (parallels vm20_engine) that owns the held VM-21 reserve = max(CTE70, Standard Scenario), delegating the stochastic leg to the C3Phase2 machinery; or (b) re-register M-002 to explicitly compose C3Phase2Engine as its reserve source and rename reserve_engine_stat's binding. Resolve registry Q-02 either way. Update the model card + add a frozen VM-21 gold case for the held reserve.
Full stochastic reserves are gated on GOES (M-120) — today they run on the deterministic floor
VM-20 (M-001), VM-21 (M-002), and C-3 (M-050) all require the full prescribed ESG scenario set for their held *stochastic* reserve. Because GOES (M-120) is under_development, these engines compute the SET/SSA *exclusion diagnostics* but hold max(deterministic, NPR) — the stochastic CTE shown is a diagnostic, not the held amount. The platform's "stochastic" reserves are effectively deterministic today.
Recommendation: Sequence M-120 calibration (INV-009) as the unlock for the Tier-1 stochastic chain, then enable the full-scenario path in VM20ReserveEngine / C3Phase2Engine and re-validate the held reserves. Until then, state plainly (done in cards) that the held reserve is the deterministic floor.
Validation evidence + change logs missing across most of the inventory
Only M-001/M-020/M-050 carried full documentation packs before this pass. Most models record validation_evidence: missing and change_log: missing with peer_review: pending. Gold tests freeze behaviour but many assert only structural invariants (e.g. reserve>0), not correctness against external truth. The flagship T0-vs-10-K match is circular (BV-032).
Recommendation: For each Tier-1 model: produce a validation-evidence pack (back-test vs disclosed results once BV-032 re-calibration lands, sensitivity suite, challenger comparison), a change log, and a 2L ratification. Sequence behind BV-032 (firm-data) for anything needing 10-K reconciliation.
VM-21 SVJ/jump assumptions (A-061/062/063) bound but not consumed
The registry binds stochastic-vol vol-of-vol, jump intensity, and jump size to M-002, but C3Phase2Engine._generate_equity_scenarios is plain constant-volatility GBM — it consumes none of them. Tail CTE is understated vs a jump-diffusion / the NAIC ESG.
Recommendation: Replace the GBM generator with the GOES SVJ scenario set (ties to INV-009/010) so the bound A-061/062/063 actually drive the tail, or unbind them and document GBM as the basis.
Per-tier expectations
Per MRM Framework §10.2 + §10.3, this model's regulatory_frameworks tag list activates the following overlays:
| component | tier-1 expectation | status |
|---|---|---|
| Registry entry | required | present |
| Model card (§10.5 doc pack) | required | present |
| Validation evidence | required | present |
| Change log | required | present |
| Independent effective challenge (2L) | required | attested |
Ratified — RAT-002-v1.0.2
Latest ratification on file: RAT-002-v1.0.2. Authored by 2L (mrm-peer-reviewer) per Decision 028 charter §5 Pattern A.