AG 55 Affiliated Reinsurance AAT Apply asset adequacy testing under NAIC AG 55 to asset-intensive life reinsurance treaties (formal title — applies beyond just affiliated transactions).
Effective YE 2025 Annual Statement; first AAT reports due April 1, 2026. Specialized AAT extension for life reinsurance treaties where assets back ceded reserves. AG-55 AAT orchestrator BUILT (1L, #2421, 2026-06-07): insmodel.L4.ag55_engine composes the reinsurance + asset + CFT engines into a net-of-reinsurance run and emits ag55_results_v1 (one row per treaty). DS-047 firm-data binding deferred (engine runs on parameterized treaty inputs). Awaits 2L re-review / ratification.
Inputs, processing, outputs
Methodology
M-005 is the AG 55 reinsurance asset-adequacy model. Status: under_development. NAIC Actuarial Guideline 55 (effective for the 2025 valuation, with the first AAT reports due April 2026) sharpens asset-adequacy testing for blocks that are ceded to, or assumed under, asset-intensive reinsurance — most pointedly offshore and affiliated reinsurers using funds-withheld / modco structures where the economic risk and the supporting assets can diverge from the statutory credit taken. AG 55 asks the appointed actuary to test reserve adequacy on a basis that looks through the cession: it is asset adequacy testing (AAT) re-run with the reinsurance treaty and its supporting-asset posture made explicit.
The intended architecture is reuse, not reinvention: M-005 = the M-004 cash-flow
testing core (insmodel.L4.cft_engine, CFTEngine) plus a reinsurance engine
(insmodel.L4.reinsurance_engine, ReinsuranceEngine) plus the asset engine.
The CFT engine projects asset and liability cash flows under prescribed scenarios
(see M-004); the reinsurance engine transforms gross cash flows and reserves into
net-of-reinsurance positions and computes the statutory reinsurance credit; the
asset side supplies the supporting-asset projection that AG 55 wants tested.
What is built today (the reinsurance engine). firmmodel/engines/reinsurance_engine.py
implements treaty-level cession mechanics, grounded in the code:
- Treaty dispatch (
calculate). For each treaty and period it builds a gross cash-flow dict (premium,benefit,reserve,prev_reserve) and dispatches to a handler bytreaty_type:coinsurance,modco,yrt,quota_share,excess_of_loss. - Coinsurance / quota share (
_apply_coinsurance). Cedes a fixed fraction of premium, benefit, and reserve;expense_allowance = ceded_premium × expense_allowance_rate(default 25%). Quota share calls the same code path. - Modified coinsurance (
_apply_modco). Same proportional cession of premium/benefit/reserve, but the cedant retains the assets; amodco_adjustment = (ceded_reserve − ceded_prev_reserve) + ceded_reserve × rate / 12captures the reserve change plus interest on the withheld reserve — the exact funds-withheld pattern AG 55 targets. - YRT (
_apply_yrt). Mortality-risk-only cession:ceded_premium = sum_at_risk / 1000 × yrt_rate / 12; no ceded reserve. - Excess of loss (
_apply_excess_of_loss). Per claim,ceded = max(0, min(claim − retention, treaty_limit − retention)). - Reinsurance credit (
_compute_reinsurance_credit).credit = ceded_reserve × credit_quality, wherecredit_quality ∈ [0, 1](1.0 = authorized/full credit, 0.0 = unauthorized without collateral). This is the lever that makes the counterparty's authorization status bite on the statutory balance sheet — the central AG 55 / Model-791 concern. - Capital relief (
_compute_capital_relief, lines 459-461).net_rbc = max(0.0, gross_rbc − reinsurance_credit)(floored at 0);capital_relief_pct = min(1.0, reinsurance_credit / gross_rbc)(capped at full relief, returns 0.0 whengross_rbc == 0). Both bounds added per INV-027 (resolved 2026-06-04): cession cannot relieve more than 100% of the requirement, so the raw ratio is clamped to [0, 1]. - Net cost of reinsurance (
compute_net_cost_of_reinsurance).ceded_premium − expense_allowance − expected_ceded_claims.
What is built (the AG 55 AAT orchestrator, #2421, 2026-06-07). The piece that
makes this AG 55 rather than treaty accounting — running the
net-of-reinsurance cash flows through the CFT engine under prescribed
scenarios, looking through to the supporting-asset posture backing the ceded
block, and producing an adequacy verdict — is now wired as
firmmodel/engines/ag55_engine.py (AG55Engine, insmodel.L4.ag55_engine,
v1.0.0). It is an orchestrator: no new actuarial primitive, composing the
three tested component engines and reducing their outputs to one
ag55_results_v1 row per treaty.
Composition pipeline (per treaty):
-
ReinsuranceEngine → ceded/net reserve and the statutory reinsurance credit. The AG-55-defining quantity is the unsecured shortfall =
ceded_reserve − reinsurance_credit(NAIC Model-791 credit haircut: authorized → full credit, unauthorized/uncollateralized → 0). This is the reserve the supporting (collateral / modco) assets must adequately back. The credit is taken straight fromReinsuranceEngine._compute_reinsurance_credit— no reimplementation. -
AssetEngine → sizes/composes the supporting-asset value backing the ceded block. When a treaty declares an explicit supporting-asset portfolio (
asset_value / coupon_rate / maturity_yearsrows) the orchestrator uses it directly; otherwise it falls back togeneral_account_ratio × (net + credit-haircut reserve)as a proxy bond. -
CFTEngine (the AG-53 core reused by M-004) → runs the 7 prescribed NAIC interest-rate scenarios on the supporting-asset cash flows vs. the net-of-reinsurance liability cash flows (the unsecured shortfall plus net benefits less net premiums, amortised over the projection horizon). Returns
adequacy_ratioandworst_scenario_surplus.
Reduction to ag55_results_v1. AG55Engine.calculate(data, engine_context=…)
returns one row per treaty: treaty_id, treaty_type, gross_reserve, ceded_reserve,
net_reserve, reinsurance_credit, unsecured_shortfall, credit_quality,
supporting_asset_value, supporting_asset_adequacy_ratio,
supporting_asset_worst_surplus, net_adequacy_ratio, net_worst_surplus,
ag55_passed, ag55_adequacy_ratio. The pass test is the AG-55
net-of-reinsurance worst-case-surplus ≥ 0 rule across all 7 scenarios AND the
unsecured shortfall fully asset-backed — precisely the net-aware overlay that
M-004's inherited aat_results_v1 lacks.
Conceptual soundness. AG-55 is by definition a net-of-reinsurance asset-
adequacy overlay on the standard AAT/CFT framework — it does not invent a new
projection. M-005 reuses the AAT machinery (CFTEngine, already validated for
M-004) applied to the credit-haircut reserve and the supporting assets; the
unsecured_shortfall = ceded_reserve − reinsurance_credit identity is exactly
NAIC Model-791 credit-for-reinsurance, already implemented in
ReinsuranceEngine._compute_reinsurance_credit. Each of the three component
engines has a passing test suite and a stable ENGINE_CONTRACT, so the
orchestrator's correctness reduces to (a) wiring and (b) the net-vs-gross pass
overlay — both deterministic and tested (tests/test_ag55_engine.py, 9 tests).
Earlier roadmap note (superseded by #2421). Prior to this build there was no
orchestrator composing CFTEngine + ReinsuranceEngine + asset engine and no AG-55
output contract; the reinsurance engine ran standalone (snapshot below remains the
reinsurance-leg illustration). That gap is now closed by AG55Engine +
ag55_results_v1.
Key Assumptions and Their Justification
| ID | Name | Value (canonical run) | Derivation | Justification for AG 55 |
|---|---|---|---|---|
| — | Cession percentage | 90% (canonical); 50% engine default | config / treaty | Asset-intensive blocks are typically ceded at high quota; 90% exercises the look-through. Per-treaty override supported. |
| — | Reinsurer credit quality | 0.80 (canonical); 1.0 default | treaty input | Partially-collateralized offshore/affiliated cession → partial statutory credit. The AG 55 / Model-791 credit lever. |
| — | Expense allowance rate | 25% of ceded premium | config_default | Ceding-commission / expense-allowance contractual term; AAA Reinsurance Accounting practice note. |
| — | ModCo interest rate | 4% p.a. (÷12 monthly) | config_default | Interest accrual on funds-withheld/modco reserve; the modco-adjustment mechanic. |
| — | YRT rate | $1.50 per $1,000 sum-at-risk | config_default | Risk-only mortality cession rate; external rate-table assumption. |
| — | Retention / treaty limit | $500,000 / $5,000,000 | config_default | Excess-of-loss layer bounds; not used in the canonical coinsurance run. |
Registry-declared assumptions vs. card-bound parameters. The registry entry
does declare assumptions: [A-001, A-002, A-090, A-091, A-100] for M-005.
These are inherited from the shared engine substrate, not the treaty-level
parameters tabled above:
A-001Base mortality table (2017 CSO Loaded) andA-002Mortality improvement scale (MP-2021) — feed the CFT/cash-flow core (shared with M-001 / M-004) that AG-55 will run net-of-reinsurance; they do not parameterize the cession mechanics themselves.A-090Credit spread curve (AAA-CCC) (FRED ICE BofA OAS) andA-091Spread term structure (linear interpolation of observed OAS) — feed the supporting-asset / asset-engine leg (the funds-withheld / modco portfolio AG-55 asks to test); not yet exercised because the asset look-through is roadmap.A-100Netting benefit assumption (full netting within ISDA master) — relevant to net-of-reinsurance counterparty exposure.
So the registry bindings are real but sit on the CFT + asset legs that are not
yet wired (see Limitations #1, #4); the per-treaty cession parameters in the
table above (cession %, credit quality, expense allowance, modco rate, YRT rate,
retention/limit) are engine ENGINE_CONTRACT defaults and treaty inputs, which
do not map to ratified A-NNN registry entries. The divergence is therefore
expected: declared-but-not-yet-card-bound assumptions belong to the unbuilt
integration, and the live reinsurance leg uses contract parameters that are not
registry assumptions.
Engine-level modelling simplifications. Per the engine's own legacy metadata, additional modelling assumptions hold: treaty terms are static over the projection (no mid-period amendment or recapture), cession percentages apply uniformly across the block, the credit-quality factor is constant (no credit deterioration / migration), and all flows are end-of-period (no intra-period timing). Each of these is a simplification relative to a full AG 55 stress of an offshore affiliate — see Limitations.
Output Snapshot
Deterministic single-treaty run of ReinsuranceEngine v1.0.0 (the reinsurance
leg only of M-005) — reproducible, requires no live firm data
(python scripts/model_snapshots.py M-005 in InsModel once registered; the
underlying cession mechanics are asserted by tests/test_reinsurance_engine.py).
Input: asset-intensive coinsurance block ceded to an offshore / partially- authorized affiliate · gross premium $100,000 · benefit $60,000 · reserve $500,000 · gross_rbc $40,000 · cession 90% · credit_quality 0.80 · 1 period. The CFT/asset adequacy legs (M-004) are not run here.
| output | value | meaning |
|---|---|---|
| treaty_id | RE-OFFSHORE-AFFIL | canonical offshore/affiliated treaty |
| treaty_type | coinsurance | proportional cession of all flows |
| gross_premium | 100,000.00 | pre-cession premium (period) |
| ceded_premium | 90,000.00 | premium ceded = gross × 90% |
| net_premium | 10,000.00 | retained premium |
| gross_benefit | 60,000.00 | pre-cession benefit |
| ceded_benefit | 54,000.00 | benefit ceded = gross × 90% |
| net_benefit | 6,000.00 | retained benefit |
| gross_reserve | 500,000.00 | pre-cession statutory reserve |
| ceded_reserve | 450,000.00 | reserve ceded = gross × 90% |
| net_reserve | 50,000.00 | retained reserve |
| expense_allowance | 22,500.00 | ceding commission = ceded_premium × 25% |
| reinsurance_credit | 360,000.00 | statutory credit = ceded_reserve × credit_quality (450,000 × 0.80) |
| capital_relief_pct | 1.00 | min(1.0, reinsurance_credit / gross_rbc) — capped fraction of gross RBC relieved (raw 360,000 / 40,000 = 9.0 exceeds 1.0, so full relief; INV-027, resolved 2026-06-04) |
| net_rbc | 0.00 | max(0.0, gross_rbc − reinsurance_credit) — floored at 0 (40,000 − 360,000 < 0; INV-027) |
| net_cost_of_reinsurance | 13,500.00 | ceded_premium − expense_allowance − ceded_benefit |
The AG-55-relevant signal is the credit haircut: a 90% cession produces a $450,000 ceded reserve, but the partially-authorized (0.80) offshore affiliate yields only $360,000 of statutory reinsurance credit — a $90,000 unsecured shortfall that an authorized, fully-collateralized counterparty would not carry. This is precisely the exposure AG 55 asks the actuary to test for adequacy. What the snapshot does not show — because it is not built — is that shortfall and the net-of-reinsurance cash flows run through the CFT engine under prescribed scenarios to an adequacy opinion.
Captured 2026-06-04 (reflects INV-027 clamped capital_relief_pct / floored net_rbc) · deterministic, no live data.
Limitations and Known Gaps
- DS-047 firm-data binding is DEFERRED (the primary build limitation). The orchestrator is built and tested, but it runs on parameterized / declared treaty + supporting-asset inputs, identical to how every other InsModel engine test runs — not against real NAIC AG-55 Form B state-DOI disclosures (DS-047). A firm-calibrated AG-55 run against real disclosures is a follow-on data-binding task; it is not fabricated here, it is honestly absent. Until DS-047 is wired, the engine's outputs are illustrative of the mechanics, not a firm-specific AG-55 opinion.
- First AG 55 AAT reports are due April 2026. AG 55 is effective for the 2025 valuation. The orchestrator now exists ahead of that window; the remaining gating work for a real filing is the DS-047 firm-data binding (#1).
- Status remains
under_developmentpending 2L re-review. The 1L build clears RAT-005 COND-001/002 (the missing orchestrator + reinsurance-aware contract, INV-004), but per Decision 052 the final AG-55 pass thresholds and the net-of-reinsurance pass rule are subject to 2L effective challenge — 1L does not gate the state transition or issue the ratification verdict. - The 7 prescribed scenarios are the simplified deterministic NY-7 set inherited from CFTEngine, not a full stochastic ESG. Adequacy under tail scenarios beyond the seven NAIC Model-822 shifts (level, ±100/200/300 bps) is not tested.
- Supporting-asset-value fallback is a proxy. When a treaty declares no
explicit collateral portfolio, the supporting asset value is derived as
general_account_ratio × (net + credit-haircut reserve)expressed as a single proxy bond. This may over- or understate the real backing; the proxy path is a modelling simplification, not the funds-withheld / modco portfolio look-through a real treaty would supply. credit_qualityis treaty-declared, not independently re-derived. The authorized / collateralized factor in[0, 1]is an input, not recomputed from counterparty financials; counterparty downgrade / migration / default dynamics are out of scope (would route to M-055 / a counterparty-credit model).- Static treaties; no recapture or credit deterioration. Treaty terms are fixed over the projection, the credit-quality factor is constant (no migration / downgrade / default path), and recapture provisions are not modelled — all of which are central to stressing an offshore affiliate.
- Retrocession, experience refunds, sliding-scale commissions absent. Per the engine's own limitations list; these features of real asset-intensive treaties are not implemented.
capital_relief_pctclamping — RESOLVED (INV-027, 2026-06-04). Previouslycapital_relief_pctwas the raw ratioreinsurance_credit / gross_rbc, which in the canonical run was360,000 / 40,000 = 9.0(uncapped, becausegross_rbc$40K is far belowceded_reserve$450K) — not a usable fraction. The engine now computescapital_relief_pct = min(1.0, reinsurance_credit / gross_rbc)and floorsnet_rbcatmax(0.0, gross_rbc − reinsurance_credit)(reinsurance_engine.pylines 459-461). The field is now safely in [0, 1] and the canonical snapshot value is 1.00 (full relief). No live defect remains; this note is retained as change provenance.- Registry-declared assumptions bind the CFT + asset legs, not the cession
mechanics. The registry declares
[A-001, A-002, A-090, A-091, A-100]and[DS-047]. A-001/A-002 drive the net liability CFs and A-090/A-091 the supporting-asset spreads/discounting through the now-wired CFT leg; the live reinsurance-leg parameters (cession %, credit quality, expense allowance, modco/YRT rates, retention/limit) are engineENGINE_CONTRACTdefaults and treaty inputs, not ratifiedA-NNNentries. See Key Assumptions for the full reconciliation. - Firm-data path divergent (BV-032). The build and tests use a
MagicMockdata provider on parameterized inputs; no 10-K-derived figures are claimed and no live firm data is used (see #1, DS-047 deferred).
Tracked for ratification (2L, Decision 052): the AG-55 net-of-reinsurance pass
thresholds and pass rule (the effective challenge over ag55_passed and the
worst-case-surplus ≥ 0 + shortfall-backed test); the DS-047 firm-data binding for
a firm-specific AG-55 opinion; and static-treaty / recapture / credit-deterioration
modelling (Limitations #5, #6, #7). The orchestrator + reinsurance-aware contract
(INV-004 / RAT-005 COND-001/002) are built by this 1L pass (#2421).
Validation Packet
| evidence | status | reference |
|---|---|---|
| Reinsurance engine unit tests | present | tests/test_reinsurance_engine.py — coinsurance cession (50% → 250,000 ceded reserve), expense allowance (25%), modco adjustment ≠ 0, YRT premium + zero ceded reserve, XL retention/limit boundaries, reinsurance credit (authorized 1.0 → full, unauthorized 0.0 → zero), full calculate with multi-treaty context. |
| Deterministic reinsurance-leg snapshot | present | scripts/model_snapshots.py M-005 (reinsurance leg only; once registered). |
| Cession invariants | present (engine) | per legacy metadata: ceded ≤ gross for every component; net = gross − ceded; reinsurance credit ≤ ceded reserve; expense allowance ≤ ceded premium; XL ceded bounded by limit − retention. |
| AG-55 orchestrator acceptance tests | present | tests/test_ag55_engine.py — 9 acceptance tests, all passing: unsecured-shortfall (authorized → 0 / unauthorized → full ceded reserve), ag55_results_v1 contract shape (all columns, one row per treaty), pass when assets adequate, fail when assets thin/short, composition (per-treaty reinsurance_credit equals a direct ReinsuranceEngine call and supporting_asset_adequacy_ratio equals a direct CFTEngine run, rel-tol 1e-9), YRT no-ceded-reserve edge, governance metadata (M-005, ≥3 refs), multi-treaty independent rows. |
| Sensitivity + cross-check (COND-001(c)) | present | validation_evidence/M-005/v1.0.0/sensitivity_and_cross_check.md + 4 standing regression tests in tests/test_ag55_engine.py (tests #10–#13, so the file is now 13 passing = 9 acceptance + 4): (1) ceded_reserve/unsecured_shortfall monotone-↑ in cession %; (2) unsecured_shortfall monotone-↓ in reinsurer credit quality (q=1.0 → 0, NAIC Model-791); (3) supporting-asset adequacy non-decreasing in asset value/coupon (AG-55 pass flips on); (4) cross-check — orchestrator supporting_asset_adequacy_ratio == a direct CFTEngine.calculate on the same assets/net liabilities at relative 1e-9. The tables are regenerable: scripts/validate_ag55_sensitivity.py (drives the real AG55Engine). Worked-example carve-out: the EXTERNAL worked-example back-test against a disclosed AG-55 Form B outcome is deferred — genuinely DS-047-gated (firm-data binding); the orchestrator introduces no new primitive (it reuses the CFT/reinsurance cores already validated for M-004), so the in-process composition cross-check + the sensitivity invariants are the standing evidence until DS-047 lands. |
| Integrated AG 55 AAT (CFT + reinsurance + asset) | present | BUILT (#2421): firmmodel/engines/ag55_engine.py (AG55Engine, insmodel.L4.ag55_engine, v1.0.0) composes the three engines and emits ag55_results_v1. Evidence pack: validation_evidence/M-005/v1.0.0/. |
| Deterministic AG-55 snapshot | present | scripts/model_snapshots.py M-005 reproduces the wired treaties/gross_book AG-55 run (LG-005-10 fixed — the stale singular treaty/gross_liability schema crash is gone). |
| Supporting-asset look-through | present (proxy/declared) | The orchestrator derives the supporting-asset portfolio from a treaty's declared collateral, or a general_account_ratio × reserve proxy; runs the CFT 7-scenario adequacy on it. Real funds-withheld / modco firm portfolios await DS-047 (Limitations #1, #5). |
| Independent challenge (2L) | pending | 1L build complete; awaits 2L re-review / ratification of the AG-55 pass thresholds (Decision 052). No verdict issued by 1L. |
References
Regulatory: - NAIC Actuarial Guideline 55 (AG 55) — asset adequacy testing focused on reinsurance ceded/assumed, esp. asset-intensive, offshore, and affiliated reinsurance; effective 2025 valuation, first AAT reports due April 2026. - NAIC Actuarial Guideline 53 (AG 53) — asset adequacy / complex-asset testing reused as the CFT core (see M-004). - NAIC Model Regulation 791 (Credit for Reinsurance) — statutory reinsurance credit; authorized vs unauthorized / collateralized treatment. - NAIC Model Regulation 822 (Actuarial Opinion and Memorandum) — prescribed interest-rate scenarios used by the CFT core. - SSAP No. 61R — statutory accounting for life/A&H reinsurance. - ASOP No. 7 / No. 22 — cash-flow analysis and asset-adequacy opinions. - ASOP No. 56 — Modeling.
Source code:
- AG-55 orchestrator: ecosystem/InsModel/Models/firmmodel/engines/ag55_engine.py
(AG55Engine, insmodel.L4.ag55_engine, v1.0.0; governance model_id M-005) — composes the three engines below and emits ag55_results_v1. Tests: ecosystem/InsModel/Models/tests/test_ag55_engine.py (13 = 9 acceptance + 4 sensitivity/cross-check regressions, COND-001(c)). Sensitivity generator: ecosystem/InsModel/Models/scripts/validate_ag55_sensitivity.py. Legacy metadata: firmmodel/governance/legacy_metadata/AG55Engine.yaml.
- Reinsurance engine: ecosystem/InsModel/Models/firmmodel/engines/reinsurance_engine.py
(ReinsuranceEngine, insmodel.L4.reinsurance_engine, v1.0.0; governance model_id M-901).
- CFT core (reused): ecosystem/InsModel/Models/firmmodel/engines/cft_engine.py
(CFTEngine, insmodel.L4.cft_engine, v1.0.0) — see M-004.
- Tests: ecosystem/InsModel/Models/tests/test_reinsurance_engine.py.
- Legacy metadata: firmmodel/governance/legacy_metadata/ReinsuranceEngine.yaml.
Other: - Tiller & Tiller (2015) Life, Health, and Annuity Reinsurance, 4th ed. - AAA Practice Note: Reinsurance Accounting (2019).
Change Log
Canonical going-forward change log: M-005-changes.md
(Keep-a-Changelog format, versioned with the ReinsuranceEngine class version;
created 2026-06-06, closing RAT-005-v1.0.0 COND-003). Code-side change history
lives in git log of the component files; release notes in
ecosystem/InsModel/CHANGELOG.md.
Pre-baseline authorship history of this card:
- 2026-05-08 — stub created from registry data per Decision 023 Phase 5 / B-07.
- 2026-05-09 — Tier-1 hand-authoring of Methodology, Key Assumptions and
Their Justification, Output Snapshot, Limitations and Known Gaps, Validation
Packet, and References from
ReinsuranceEnginelegacy_metadata + engine source - registry entry. Stub marker advanced to ``.
- 2026-06-04 — documentation pass reflecting the INV-027 engine fix
(
reinsurance_engine.pylines 459-461):capital_relief_pctclamped to [0, 1] andnet_rbcfloored at 0. Output Snapshot updated (capital_relief_pct9.00 → 1.00 capped; addednet_rbc0.00 row); Limitation #7 recast from live defect to resolved provenance note; Methodology §7 updated to the clamped formulas. - 2026-06-06 — documentation-only consistency pass: added a dedicated
Standards Coverage section (13-section gold-standard shape, cross-referencing
registry
regulatory_frameworks+ cited AG-53 / Model-791); reconciled the Key Assumptions prose and Limitation #8 with the registry-declared[A-001, A-002, A-090, A-091, A-100]bindings (mapped to the unwired CFT + asset legs); added a tracked-for-ratification note for the unbuilt AG-55 orchestrator and supporting-asset / static-treaty items. - 2026-06-07 — AG-55 AAT orchestrator BUILT (1L, Decision 053, build
issue #2421). New engine
AG55Engine(insmodel.L4.ag55_engine) composesReinsuranceEngine+AssetEngine+CFTEngineand emits the registeredag55_results_v1contract (one row per treaty); 9 acceptance tests pass. Closes RAT-005 COND-001/002 (INV-004 — missing orchestrator + reinsurance-aware contract) and unblocks M-055. Card updated: Description, Output contracts (aat_results_v1→ag55_results_v1), Methodology (composition pipeline + conceptual soundness), Limitations (recast roadmap → build-honest: DS-047 binding deferred, NY-7 deterministic scenarios, supporting-asset proxy, treaty-declared credit quality), Validation Packet (orchestrator tests + pack). Status staysunder_developmentpending 2L re-review (1L does not gate the state transition or issue the ratification verdict, per Decision 052). - 2026-06-29 — 1L COND-001(c) doc-integrity reconciliation (LG-005-08,
RAT-005-v1.0.3). The COND-001(c) SUBSTANCE (top-3 sensitivity + a
composition cross-check within 1e-9) is already delivered and on InsModel main
(PR #92):
tests/test_ag55_engine.pynow has 13 tests (9 + 4 standing sensitivity/cross-check regressions, #10–#13) — re-run → 13 passed; the generatorscripts/validate_ag55_sensitivity.pyis present and regeneratessensitivity_and_cross_check.md; and the M-005 snapshot runs clean (LG-005-10 fixed). This pass reconciles the card Validation Packet to that reality (the gap LG-005-08 flagged): corrected the AG-55 test count 9 → 13, added a dedicated Sensitivity + cross-check (COND-001(c)) row surfacingsensitivity_and_cross_check.md+ the 4 regression tests + the 1e-9 cross-check tolerance, stated the EXTERNAL worked-example back-test deferral as an explicit DS-047-gated carve-out, added a clean-snapshot row, and fixed the stale "(9)" in the source-code reference. Documentation-only — no engine code, output, or model state changed; status staysunder_developmentpending 2L re-review.
Open findings (6)
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.
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.
AG-55 AAT-CFT composition unwired (under_development)
The reinsurance engine runs and is well-tested, but the defining AG-55 exercise — net-of- reinsurance cash flows run through the CFT core (M-004) with supporting-asset look-through for asset-intensive/offshore-affiliated reinsurance — is not wired. No orchestrator composes CFT + reinsurance + asset; no AG-55 output contract. AAT reports first due Apr 2026.
Recommendation: Build the AG-55 orchestrator: net the reinsurance leg, run the retained + recoverable cash flows through CFTEngine with the supporting-asset portfolio, and emit an AG-55 adequacy contract. Keep under_development until composed. (See also INV-024, the capital_relief bug, which sits in the same engine.)
The M-005 card Validation Packet was not updated for COND-001(c): no row surfaces sensitivity_and_cross_check.md, the three sensitivity tables, or the composition-cross-check tolerance; the external worked-example deferral is not stated as an explicit carve-out.
Recommendation: Add a Validation Packet row pointing at the COND-001(c) evidence and state the external-worked-example deferral as a data-gated carve-out.
The M-005 snapshot (scripts/model_snapshots.py M-005) CRASHES (IndexError) — its driver uses the stale singular treaty/gross_liability engine-context schema, while the wired engine reads treaties (list) + gross_book, returning an empty frame so out.iloc[0] fails. The card's snapshot-reproduces claim is unverifiable.
Recommendation: Update the snapshot driver to the wired treaties/gross_book schema so the card snapshot is reproducible.
The cession A-NNN (A-230/A-233/A-234/A-235) are bound at the reinsurance_structure consuming_engines level; model_registry M-005 inputs.assumptions lists only [A-001,A-002,A-090,A-091,A-100]. Minor consistency gap — COND-002 is cleared on the documented leg-(b) policy.
Recommendation: Add the cession A-NNN to the M-005 entry, or note in the card that they are bound at the domain level under the leg-(b) policy.
FALSE EVIDENCE in the M-005 v1.0.0 pack (a Tier-1 no-fabrication / adequacy failure): README §2/§3 claim "13 passed (9 acceptance + 4 sensitivity/ cross-check regressions)" but tests/test_ag55_engine.py has EXACTLY 9 test functions and pytest returns 9 passed — the 4 regression tests do not exist (the count was bumped in prose only; the InsModel test file was untouched by #3438). The referenced generator Models/scripts/validate_ag55_sensitivity.py (the sensitivity tables' claimed provenance) does NOT exist on disk. The analytical substance (sensitivity + composition cross-check) is real and was independently reproduced; the artifact CLAIMS around it are false.
Recommendation: Correct the README count to 9 (or actually add the 4 sensitivity/cross-check regression tests and re-run — preferred), and commit validate_ag55_sensitivity.py (or drop the "Generated by" provenance). Blocks COND-001(c) clearance.
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 | pending |
Conditionally-approved scaffold — RAT-005-v1.0.3
2L issued RAT-005-v1.0.3 as a conditionally-approved Tier 3 analytic scaffold. The model exists, runs, and matches its card — but its approval is intelligence-use-only: its outputs must never be read as a booked, regulatory, capital, or reserving figure. Booked use (and tier promotion) is gated on the PLANNED engines, which are not built. The conditions below are on record.
| id | deadline | condition |
|---|---|---|
| COND-001 | 2026-09-04 | NARROWED to (c), HELD on documentation-integrity. (a) orchestrator + (b) reinsurance-aware contract/rebind cleared earlier. The COND-001(c) SUBSTANCE (top-3 sensitivity + a composition cross-check within 1e-9) is present and independently reproduced, and deferring the external worked-example back-test is acceptable. BUT the pack must be made HONEST before (c) clears (route to 1L / model-builder): (1) Correct the README test count to 9 — OR actually add the 4 claimed sensitivity/cross-check regression tests to test_ag55_engine.py and re-run (preferred — makes the sensitivity a standing regression). (2) Commit the referenced generator validate_ag55_sensitivity.py — OR remove the "Generated by" provenance claim. (3) Fix or retire the M-005 snapshot driver (it crashes on the stale treaty/gross_liability schema) and reconcile the card reference. (4) Add a card Validation Packet row pointing at sensitivity_and_cross_check.md (sensitivity + the cross-check tolerance), and state the external worked-example deferral explicitly as a COND-001(c) carve-out. First AG-55 AAT reports were due April 2026 (past) — time-critical. |
| COND-002 | CLEARED 2026-06-28. Cession mechanics reconciled with both legs: A-230/A-233/ A-234/A-235 (reinsurance_structure) are the ratified bounds; ag55_engine is on the domain consuming_engines list; and cession_mechanics_binding.md documents the deliberate engine-contract-default policy reconciled to the registry. The wired engine genuinely consumes the treaty-declared cession parameters — not paper-bound. | |
| COND-003 | CLEARED (v1.0.1). M-005-changes.md exists and resolves; re-confirmed no regression. |