Funds-Withheld / Modco Reinsurance Embedded Derivative Bifurcate and fair-value the embedded derivative (total-return-of-withheld-portfolio feature) in funds-withheld and modified-coinsurance reinsurance treaties.
ASC 815 host-vs-embedded bifurcation on funds-withheld / modco treaties; fair-values the total-return feature on the withheld asset portfolio. A named net-income-volatility driver (PRU FY2025 10-K); sensitive to asset credit spreads. Distinct from the index-credit embedded derivatives already covered by insmodel.L4.va_guarantee, insmodel.L4.indexed_annuity, and insmodel.L4.rila_model — do not duplicate those. Gap #1 from the cross-firm 10-K footprint study (vertical/research/03_insurance_gap_analysis.md).
Inputs, processing, outputs
- data sources
- DS-001
- engines
-
insmodel.L4.funds_withheld_modco
- dimensions
- D2
Methodology
Engine BUILT and code-grounded. insmodel.L4.funds_withheld_modco (FundsWithheldModcoEngine, firmmodel/engines/funds_withheld_modco_engine.py) is implemented, @engine-decorated, bound in engine_registry.yaml (model_membership: [M-041]), SR 11-7 legacy_metadata archived, with 11 unit tests passing and a reproducible deterministic snapshot. The method below describes the running code (Decision 049 doc-currency: this narrative matches the engine source).
The method is ASC 815-15 host-vs-embedded-derivative bifurcation. A funds-withheld / modco treaty is separated into its host (financing) leg — the withheld / modco reserve balance earning the contractual host_funding_rate, carried at amortised cost and reported as the residual host_carrying_value = withheld_balance − embedded_derivative_fv — and the embedded derivative: the feature that passes the total return of the withheld / modco asset portfolio to the counterparty. The embedded derivative is fair-valued as the present value of the excess-return leg over the projection horizon:
ED_fv = Σ_t notional_t · (asset_total_return − host_funding_rate) · participation · DF(t)
where asset_total_return = risk_free_rate + asset_credit_spread (OAS decomposition), notional_t = withheld_balance · (1 − balance_runoff)^(t−1), DF(t) discounts at the flat per-treaty discount_rate, and an optional contractual floor on the passed return is supported. The credit-spread-sensitive, net-income-volatility-driving portion is isolated as ed_credit_spread_value (the leg repriced with OAS set to zero, differenced), and a +1bp OAS sensitivity is reported as ed_credit_spread_dv01 so downstream stress suites can shock the embedded derivative without a full re-projection. No firm calibration is invented — every economic input (withheld balance, host funding rate, OAS, discount rate, participation) is supplied via engine_context.
This engine does not replace insmodel.L4.reinsurance_engine (ReinsuranceEngine, firmmodel/engines/reinsurance_engine.py), which handles only modco cash-flow mechanics (_apply_modco: modco_adjustment = ceded_reserve_change + interest_on_ceded). That engine does not bifurcate the contract and does not fair-value the total-return feature — exactly the step this engine adds.
Key Assumptions and Their Justification
Engine ships UNCALIBRATED — no A-NNN assumptions are bound. The registry entry lists assumptions: [], and the engine carries no @uses_assumptions decorator: every economic input is a treaty input supplied at runtime via engine_context, not a registered calibrated assumption. This is a deliberate design choice (the same posture as ReinsuranceEngine) — the engine implements the deterministic ASC 815-15 bifurcation math and never invents firm calibrations.
The method exercises the following input families, each supplied per treaty (not a registered A-NNN value):
- Asset credit spread (OAS) — the option-adjusted spread of the withheld / modco portfolio; the credit-spread-sensitive driver of the total-return feature. Supplied as
asset_credit_spread. - Discount basis — the flat per-treaty
discount_ratefor the excess-return leg (defaults to the host funding rate). - Total-return participation —
participation_rate(default 1.0 = full pass-through; per-treaty override for partial-participation structures). - Projection horizon —
projection_years(default 10).
If firm-calibrated defaults are later registered as A-NNN assumptions (e.g. an OAS-decomposition basis sourced from a credit-spread feed), that binding plus the matching @uses_assumptions decorator is a ratification item — see Limitations. It is not claimed here today (no such assumptions exist on assumption_domains.yaml).
Output Snapshot
Deterministic snapshot — reproducible, no live data. Models/scripts/model_snapshots.py M-041 reproduces the table below on documented synthetic canonical treaties (BV-032-immune; no FRED / firm data touched). No firm withheld balance, OAS, funding rate, or disclosed embedded-derivative balance is asserted.
| Treaty | Inputs | embedded_derivative_fv |
ed_credit_spread_value |
ed_credit_spread_dv01 |
host_carrying_value |
|---|---|---|---|---|---|
| FWH001 | $1,000,000 withheld · host 4.00% · rf 3.00% · OAS 2.00% · disc 4.00% · 10y · participation 1.0 | 81,108.96 | 162,217.92 | 811.09 | 918,891.04 |
| MODCO001 | $500,000 withheld · host 5.00% · rf 3.00% · OAS 2.00% · disc 4.00% · 10y (zero-excess: total return == host) | 0.00 | — | — | 500,000.00 |
The FWH001 case is hand-verifiable: the excess-return leg is $1,000,000 × (5% − 4%) × 1.0 = $10,000/yr level for 10 years; the 10-year annuity factor at 4% is 8.110896, so ED fv = 10,000 × 8.110896 = 81,108.96. host_carrying_value + embedded_derivative_fv = withheld balance (the bifurcation reconciles). MODCO001 is the zero-excess control (asset total return equals host funding rate ⇒ embedded derivative = 0), a sign/identity check. Output schema (embedded_derivative_fv, ed_credit_spread_value, ed_credit_spread_dv01, host_carrying_value, …) is declared on the engine_registry.yaml entry outputs and consumed in-process — there is no cross-codebase boundary contract (so contracts: [] is correct, not a gap).
Limitations and Known Gaps
Engine is BUILT and tested; the model remains under_development pending 2L sign-off. The following are genuine, honestly-stated conditionals:
- No firm-calibrated reconciliation (PENDING — not fabricated). The deterministic snapshot runs on documented synthetic treaties. No reconciliation to a disclosed firm embedded-derivative balance (PRU et al.) is asserted — it requires real disclosed inputs (withheld balance, OAS, funding rate, disclosed ED balance) that are not sourced. This element is reported pending in the validation pack (§4), not papered over with synthetic numbers.
- Uncalibrated by design. The engine carries no
@uses_assumptionsand noA-NNNare registered; economic inputs are treaty inputs viaengine_context. Registering firm-calibrated defaults asA-NNN(with the matching decorator and a data-source binding) is a future ratification item —DS-001is a placeholder; no calibrated data source is bound. - Regulatory tag APPLIED + tier re-derived (COND-005, RAT-041-v1.0.3) — tier change FLAGGED for 2L. The §8.3 enum extension landed:
asc_815is now a registeredregulatory_frameworksvalue AND a §6.3(b) Tier-1 trigger. The registry is re-tagged toasc_944+asc_815+internal, and the materiality tier is re-derived 2 → 1 (Tier-1 trigger (b)asc_815+ trigger (c) audited-financial-statement numbers), reconciling the model-level tier with theengine_registrytier: tier-1already oninsmodel.L4.funds_withheld_modco. The tier re-derivation is a defensible 1L registry act flagged for 2L confirmation (RAT-041-v1.0.4) — it is not self-ratified, and it does not change model state (under_development). (Enum-leg precedent: issue #2002 / PR #2443 forbma_bscr+asc_815.) - No cross-codebase output contract (by design, not a gap). Engine outputs are declared on the engine entry and consumed in-process (like
ReinsuranceEngine);contracts: []is therefore correct. A contract would only be added if a downstream codebase consumed the output across a boundary. - Scope. Covers only the funds-withheld / modco total-return embedded derivative. The index-credit embedded derivatives (FIA/RILA/GMxB-on-VA) are out of scope — already covered by
insmodel.L4.va_guarantee,insmodel.L4.indexed_annuity,insmodel.L4.rila_model.
Remaining to flip under_development → active (2L work, not 1L):
- 2L effective-challenge sign-off (Validation & Audit) per MRM §10.2 / §10.6.
COND-005 status: the asc_815 §8.3 enum extension is landed (governance leg, above 1L); the consequent re-tag + tier 2 → 1 re-derivation are applied by this pass and flagged for 2L confirmation (RAT-041-v1.0.4).
Validation Packet
Partial — 1L evidence assembled; 2L sign-off pending. Registry lifecycle: validation_evidence: partial, peer_review.status: pending. The v1.0.0 pack at modelling/validation_evidence/M-041/v1.0.0/ (a thin index mapping MRM §10.5 elements to runnable tests + the snapshot) is on disk. A 2L reviewer running pytest tests/test_funds_withheld_modco_engine.py and model_snapshots.py M-041 in the InsModel checkout reproduces the evidence.
| §10.5 element | Status | Evidence |
|---|---|---|
| 1. Conceptual soundness | present | Card Methodology (ASC 815-15) + legacy_metadata/FundsWithheldModcoEngine.yaml (SR 11-7 narrative) |
| 2. Deterministic gold snapshot | present | model_snapshots.py M-041 — FWH001 81,108.96 hand-verifiable; MODCO001 zero-excess control |
| 3. Unit / internal-consistency tests | present | 11 tests in tests/test_funds_withheld_modco_engine.py (all passing) — host+ED reconciliation, OAS decomposition, DV01 sign, floor, zero-excess |
| 4. Firm-calibrated reconciliation | PENDING | requires real disclosed inputs (PRU et al.); reported honestly as pending — not fabricated |
| 5. 2L effective-challenge sign-off | PENDING | independent ratification (Validation & Audit), MRM §10.6 — flips under_development → active (§10.2) |
Items 1–3 are 1L deliverables (done). Items 4–5 are honestly conditional: item 4 is data-gated; item 5 is the 2L gate this hand-off requests.
References
Regulatory / accounting: - ASC 815 (Derivatives and Hedging) — host-vs-embedded-derivative bifurcation; the governing standard for the planned method. - ASC 944 (Financial Services — Insurance / LDTI) — surrounding US-GAAP insurance accounting context for the ceded treaty.
Source data / external: - Prudential Financial (PRU) FY2025 Form 10-K — names funds-withheld / modco embedded-derivative remeasurement as a net-income-volatility driver.
Internal:
- firmmodel/engines/funds_withheld_modco_engine.py (FundsWithheldModcoEngine) — the implemented engine.
- tests/test_funds_withheld_modco_engine.py — 11 unit tests; Models/scripts/model_snapshots.py M-041 — deterministic snapshot.
- modelling/validation_evidence/M-041/v1.0.0/ — the §10.5 evidence index.
- Cross-firm 10-K footprint study, "Gap #1" — vertical/research/03_insurance_gap_analysis.md.
- Decision 018 (MRM Framework) — Management/decisions/018-mrm-framework-multi-regime.md; the framework under which this card is governed.
- ASC 815 enum extension (RAT-041 COND-005) — landed in modelling/charters/mrm_framework.md (§8.3 enum line 608 + §6.3(b) Tier-1 trigger line 407; precedent: issue #2002 / PR #2443 for bma_bscr + asc_815). The consequent M-041 re-tag + tier 2 → 1 re-derivation are applied (this pass) and flagged for 2L confirmation (RAT-041-v1.0.4).
Change Log
Card change history. Code-side change history lives in git log of the component files.
- 2026-06-05 — stub created from registry data per Decision 023 Phase 5 / B-07.
- 2026-06-06 — 1L remediation pass (RAT-041 COND-005) — partially reverted, see below. The pass had claimed
asc_815was added to the §8.3 enum and M-041 re-tagged; that enum edit was an over-reach (amending the MRM standard is a governance act, not 1L) and was reverted. - 2026-06-07 — corrected the COND-005 claim (2L re-review caught a card-vs-artifact contradiction, COND-006).
asc_815is NOT in the §8.3 enum and the registry tag isasc_944+internal; the enum extension is a tracked governance follow-up (precedent: #2002). Standards Coverage, Limitations, References, and this Change Log reverted from "resolved" to honest "open/pending". No model code, output, or state change. COND-001/002/003/004 remain genuine engine-build / validation prerequisites (honest conditional). - 2026-06-06 — 2L documentation pass (card text only; no model-state change). Hand-authored Methodology (planned / pending engine build, grounded in the existing
ReinsuranceEnginemodco-mechanics boundary), Key Assumptions (noA-NNNbound; required families marked to-be-confirmed-at-build), Validation Packet (honest pending state mirroring registry lifecycle), and References. Added missing Standards Coverage, Dependencies, and Output Snapshot sections (matching the gold-standard M-001 structure). Cross-referenced Limitations to the new pending sections and to insightalm #2001. Advanced header marker fromto. Output-changing / modeling-code items (engine build, output contract, assumption registration, validation evidence, §8.3 enum) left for ratification — no model state changed. - 2026-06-28 — 1L build reconciliation (D053, #2308). The engine
insmodel.L4.funds_withheld_modco(FundsWithheldModcoEngine) is BUILT, bound, and merged on InsModel main (@engine, 11 tests passing, deterministic snapshot reproducible, SR 11-7legacy_metadataarchived) — but this card and the registry still described the pre-build "planned / pending engine build /validation_evidence: missing" state (a registry-and-card-vs-disk contradiction). Rewrote Methodology (now code-grounded: ASC 815-15 PV-of-excess-leg, OAS decomposition, DV01), Key Assumptions (uncalibrated by design — no@uses_assumptions, noA-NNN; treaty inputs viaengine_context— corrects the prior over-claim risk, COND-006), Output Snapshot (real reproducible table: FWH001 ED fv 81,108.96 hand-verifiable, MODCO001 zero-excess control), Components, Validation Packet (partial — §10.5 elements 1–3 done, 4 firm-reconciliation + 5 2L sign-off honestly PENDING), Limitations, References, Standards Coverage. Registry promoted viaregistry_deltas/M-041.yaml(PROMOTION channel:validation_evidence: partial,change_log: present, honest BUILT notes). Status STAYSunder_development— only 2L effective-challenge sign-off flips it to active.contracts: []andassumptions: []are correct (in-process outputs; uncalibrated engine), not gaps.asc_815§8.3 enum re-tag remains a GOVERNANCE follow-up above 1L (COND-005). No model code or output changed; this is the registry/card sync to the already-built engine. - 2026-06-29 — 1L COND-005 re-tag + tier re-derivation (RAT-041-v1.0.3). With the
asc_815§8.3 enum leg now landed (registered framework + §6.3(b) Tier-1 trigger — verified inmrm_framework.md), applied the consequent 1L registry acts viaregistry_deltas/M-041.yaml: re-taggedregulatory_frameworks→[asc_944, asc_815, internal]and re-derivedmateriality.tier2 → 1 (Tier-1 triggers (b)+(c)), with the §-reasoning recorded in the materiality justification. This reconciles the model-level tier with theengine_registrytier: tier-1already on the bound engine. The tier change is FLAGGED for 2L confirmation (RAT-041-v1.0.4) — not self-ratified. Updated Standards Coverage, Limitations, References, and the COND-005 status line from "open / governance-follow-up" to "applied / flagged-for-2L". Status STAYSunder_development(1L never self-promotes state). No engine code, output, or model state changed.
Open findings (3)
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.
The README's reproduction command hard-codes a stale checkout path (check_registry_integrity.py [redacted]); the canonical checkout is [redacted]
Recommendation: Correct the path. Non-blocking (the no-arg invocation passes).
STALE / OVER-CLAIMING validation README. validation_evidence/M-041/v1.0.0/ README.md (2026-06-08) asserts assumptions A-286..A-289 are bound (A-288 consumed) and a contract funds_withheld_embedded_derivative_v1 is bound — NEITHER exists on disk (highest registered assumption is A-285; no such contract in contract_registry.yaml), and the reconciled card itself now correctly disclaims both (by-design `[]`). The README contradicts the reconciled reality.
Recommendation: Correct the README to match the reconciled card (no bound A-NNN, no registered contract; document the by-design `[]` postures). Blocks COND-004 adequacy.
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 | partial |
| Change log | required | present |
| Independent effective challenge (2L) | required | pending |
Conditionally-approved scaffold — RAT-041-v1.0.3
2L issued RAT-041-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 | CLEARED. Engine built, bound, active; integrity gate passes; card current. | |
| COND-002 | 2026-09-04 | Resolve the output-contract posture. EITHER (a) explicitly ADOPT the by-design no-MRM-contract posture (outputs consumed in-process; the reproducing gold snapshot is the deterministic output anchor) and record that decision in the Validation Packet, OR (b) register a funds_withheld_embedded_derivative output contract in contract_registry.yaml and bind it to M-041. The card's in-process argument is defensible; it is not yet a recorded clearance. (The pack README's claim that a contract is ALREADY bound is false — LG-041-07.) |
| COND-003 | 2026-09-04 | Finalize the assumptions posture. EITHER register the A-NNN (credit-spread/OAS basis, discount basis, total-return measurement, participation) with calibrated values + sources and have the engine CONSUME them, OR document a deliberate, justified engine-contract-default policy reconciled to the registry (the M-005 leg-(b) precedent). inputs.assumptions: [] today; engine has no @uses_assumptions. (The pack README's claim that A-286..A-289 are bound is false — LG-041-07.) |
| COND-004 | 2026-09-04 | Bring the validation pack to adequacy: it already has 11/11 tests + a reproducing gold snapshot + the SR-11-7 archive (real). Add the disclosed-firm embedded-derivative reconciliation (honestly pending today — do NOT fabricate) OR record it as a deliberate data-gated deferral with the gate named, and a conceptual-soundness review beyond the legacy_metadata. CORRECT the stale README over-claims first (LG-041-07). Until adequate, held at under_development. |
| COND-005 | 2026-09-04 | §8.3 enum extension DONE — asc_815 is a registered framework (line 608) and a Tier-1 trigger (line 407). NOT cleared: re-tag M-041.regulatory_frameworks to add asc_815 (it is the true governing standard for the bifurcation method), and re-derive the materiality tier under §6.3 — asc_815 is a Tier-1 trigger, so the recorded tier: 2 should be re-derived and reconciled with the engine_registry tier: tier-1. The card flags this honestly. |
| COND-006 | CLEARED (v1.0.2). Re-confirmed: card true to the artifacts, no false 'resolved' prose. No regression. |