Closed-Block / Policyholder-Dividend-Obligation Glidepath Project the closed-block (participating) policyholder dividend obligation glidepath from cumulative actual-vs-expected closed-block earnings.
Demutualization closed-block accounting: tracks cumulative actual vs expected closed-block earnings and reserves the excess as a policyholder dividend obligation (PDO), projecting the dividend glidepath to block run-off. IN SCOPE (principal decision 2026-06-05, issue #2004): a demutualized participating closed block is in scope (e.g. PRU's Closed Block Division / legacy par blocks) — a committed Tier-1 build, not conditional. Grounded in the cross-firm 10-K study gap #4.
Inputs, processing, outputs
- data sources
- DS-081
- engines
-
insmodel.L4.closed_block_pdo
- dimensions
- D7
Methodology
Demutualization closed-block accounting under ASC 944-805 / SFAS 120. Each period the excess of actual over expected closed-block earnings is absorbed into the Policyholder Dividend Obligation (PDO), which accretes the prior balance at the closed-block earned rate and floors at zero:
PDO_t = max(0, PDO_{t-1}·(1 + r_t) + (actual_t − expected_t))
Cumulative excess earnings are an obligation to closed-block policyholders (future dividends), not shareholder profit; a cumulative shortfall reduces but never inverts the obligation. The glidepath tracks the closed-block funding ratio (assets / liabilities) to run-off. The engine takes all parameters from config/input (no hardcoded calibrations); the per-period actual/expected earnings, earned rate, and closed-block assets/liabilities are firm data bound at build time via DS-081. See firmmodel/governance/legacy_metadata/ClosedBlockPDOEngine.yaml for the full SR 11-7 narrative.
Aggregate-risk view (MRM §10.5 documentation-pack item 8): upstream dependencies — none (no upstream models; firm closed-block feed DS-081 only). Downstream consumers — none registered. See Dependencies above.
Key Assumptions and Their Justification
M-008 carries no formal A-NNN bindings; the engine takes all parameters from config/input (no hardcoded calibrations), and the per-period actual/expected earnings are firm data bound at build time (DS-081). The structural assumptions of the closed-block / PDO accounting model are:
| # | Assumption | Justification |
|---|---|---|
| 1 | The closed block was funded on an expected (glidepath) basis — if actual experience equals expected, assets run off in step with the liabilities. | Definitional to the ASC 944-805 closed-block construct: the block is funded at demutualization to be self-supporting under the expected dividend scale. |
| 2 | Cumulative actual earnings in excess of expected = the PDO, an obligation to closed-block policyholders, not shareholder profit. | ASC 944-805 / ASC 944-40: excess earnings accrue to participating policyholders as future dividends, classified as a liability (PDO), never equity. |
| 3 | The PDO accretes at the closed-block earned (investment) rate between measurement dates. | The obligation grows with the investment return on the supporting assets; accretion at the earned rate keeps the PDO consistent with the funding basis. |
| 4 | A cumulative earnings shortfall reduces future dividends rather than creating a receivable — the PDO floors at zero. | A shortfall cannot become an asset against policyholders; the obligation is bounded below at zero (PDO_t = max(0, ...)). |
These four are lifted from the engine's legacy_metadata (firmmodel/governance/legacy_metadata/ClosedBlockPDOEngine.yaml). Sensitivity: the binding levers are the actual-vs-expected earnings decomposition and the earned rate r_t; in the current PRU calibration both the earned-rate path and the actual/expected split are not independently exercised (see Validation Packet) because PRU discloses only the cumulative-excess result, not the per-period flows.
Output Snapshot
Deterministic run of ClosedBlockPDOEngine on the disclosed PRU Closed Block feed (DS-081; firmmodel/data_feeds/closed_block_pru.py). No new figures are introduced here — every value is a PRU FY2025 10-K disclosure (Note 16) or a direct recomputation from disclosed figures.
Inputs (disclosed, $M):
| year-end | CB liabilities | CB assets | earnings-based PDO (disclosed) |
|---|---|---|---|
| 2024-12-31 | 50,857 | 48,478 | 2,096 |
| 2025-12-31 | 50,027 | 47,762 | 1,635 |
Outputs:
| output | value | meaning |
|---|---|---|
| pdo_balance (2024-12-31) | 2,096 | round-trips the disclosed PDO (identity — see Validation Packet) |
| pdo_balance (2025-12-31) | 1,635 | round-trips the disclosed PDO; year-over-year reduction $461M |
| funding_ratio (2025-12-31) | 0.9547 | recomputed assets / liabilities = 47,762 / 50,027 |
The PDO round-trip is an identity check (the feed supplies expected_earnings=0, earned_rate=0, and actual_earnings = the year-over-year change in the disclosed PDO), not independent validation. The funding ratio is a recomputation from disclosed assets and liabilities.
Panel B — constructed r_t accretion path (non-circular characterization). A synthetic 5-period fixture (clearly not firm-disclosed) that exercises the accretion mechanic the disclosed round-trip cannot. Inputs: actual = [120, 130, 90, 105, 115], expected = 100 each, r_t = [0.040, 0.050, 0.045, 0.050, 0.055] ($M):
| period | pdo_balance | note |
|---|---|---|
| P1 (r=0.040) | 20.00 | excess 20, opening PDO 0 → no accretion |
| P2 (r=0.050) | 51.00 | accretion = 20.00 × 0.05 = 1.00; + excess 30 |
| P3 (r=0.045) | 43.30 | accretion 2.295 − shortfall 10 |
| P4 (r=0.050) | 50.46 | |
| P5 (r=0.055) | 68.24 | ending PDO |
Reproduced by scripts/model_snapshots.py M-008; frozen in tests/test_closed_block_pdo_gold.py; cross-checked period-by-period against an independent closed-form challenger in tests/test_closed_block_pdo_validation.py.
Deterministic; panel A from disclosed PRU figures, panel B from a synthetic fixture; no live data.
Limitations and Known Gaps
- Source registered; single-firm fixture. The firm closed-block feed is registered and active (DS-081, Demutualization Closed Block Disclosures, 10-K) and bound in the M-008 registry inputs. It is currently a single-firm, hand-transcribed disclosed-data fixture (Prudential's Closed Block Division, FY2025 10-K Note 16). Multi-firm automated 10-K extraction is the remaining refinement.
- Effective-challenge / promotion pending.
insmodel.L4.closed_block_pdoexists and is unit-tested; the Tier-1 validation-evidence pack is now assembled (validation_evidence/M-008/v1.0.0/).status: under_development→activeis gated on 2L re-review / effective-challenge sign-off of that pack. - Per-period calibration to a real firm is not available (honest open item). The non-circular validation exercises the
r_taccretion path and the actual-vs-expected decomposition on constructed inputs against an independent closed-form oracle — confirming the engine implements the ASC 944-805 recursion correctly. It does not calibrate the per-period actual/expected closed-block earnings to a real firm: PRU discloses only the cumulative-excess PDO balance each year-end, not the separate per-period flows (narrated in MD&A, not tabulated). Closing this fully needs a firm that tabulates the decomposition, or an independently-constructed glidepath calibration. Scoped data gap, not a fabricated result. - Applicability is limited to demutualized participating closed blocks (not stock-form / non-participating business).
- Models the PDO accumulation + funding-ratio glidepath, not the full seriatim dividend-scale mechanics or asset run-off cash flows.
Validation Packet
Status: remediated (COND-001 / COND-002), 2L re-review pending. The Tier-1 validation
evidence pack is assembled at insightalm/modelling/validation_evidence/M-008/v1.0.0/README.md.
It supplies the non-circular mechanic-exercising evidence the round-trip identity could not,
plus a sensitivity suite, an independent closed-form challenger, and a frozen gold snapshot.
Non-circular validation (COND-001) — exercises the model's core mechanic. Distinct from the
round-trip identity, tests/test_closed_block_pdo_validation.py cross-checks the engine against an
independent closed-form re-implementation of the ASC 944-805 recursion (challenger_pdo(), which
never calls the engine) over a constructed non-zero-r_t path with a genuine actual-vs-expected
split:
- r_t accretion path —
TestAccretionPathAgainstClosedFormChallenger: the 5-periodpdo_balance(20.00 / 51.00 / 43.30 / 50.46 / 68.24 $M) matches the oracle; the reported accretion column equalsPDO_{t-1}·r_texactly (e.g. P2 = 20.00 × 0.05 = 1.00); a pure-accretion case (200 at 3/4/5% → 224.95) isolates the accretion from the decomposition. - actual-vs-expected decomposition —
period_excess = actual − expectedeach period (test_excess_decomposition_drives_period_change). - sensitivity suite (COND-001) —
TestSensitivitySuiteOnBindingLevers: monotone-increasing inr_t(+200bp and ±100bp two-sided) and in the excess (+$10M/period), and the zero floor binds under a sustained shortfall (unfloored branch goes negative) — each with sign + reproducible magnitude checked against the oracle. - challenger (COND-001) — the closed-form oracle agrees with the engine across a seeded 50-path
battery (
TestChallengerAgreementIsExact); residual is zero up to the engine's 2-dp display rounding (≤ $0.02M).
These inputs are constructed (synthetic) and labelled as such — no firm is claimed to have disclosed these per-period flows (no-fabrication, Decision 053 §4).
Disclosed-firm reasonableness anchor (round-trip identity — labelled). The engine on PRU's
disclosed Closed Block feed (DS-081, FY2025 10-K Note 16, SEC accession 0001137774-26-000048;
firmmodel/data_feeds/closed_block_pru.py) reproduces the disclosed earnings-based PDO —
$2,096M at 2024-12-31 → $1,635M at 2025-12-31 (a $461M reduction) — and the funding ratio
47,762/50,027 = 0.9547. Test: tests/test_closed_block_pru_reconciliation.py (4 cases). This is
a round-trip identity (the feed supplies expected_earnings=0, earned_rate=0, and
actual_earnings = the YoY ΔPDO), not independent validation; it is retained only as the disclosed
reasonableness anchor.
Gold snapshot + doc-currency baseline (COND-002). A deterministic gold/characterization snapshot
of the engine output (both panels) is frozen in tests/test_closed_block_pdo_gold.py and reproduced
by scripts/model_snapshots.py M-008; M-008 is baselined into
insightalm/modelling/model_doc_stamps.yaml (the D049 detector now classifies M-008 current, was
unstamped).
Honestly open (NOT cleared): a per-period calibration to a real firm's actual/expected decomposition — PRU narrates but does not tabulate the per-period flows. This is a scoped data gap, not a fabricated result (see Limitations). Effective-challenge / 2L sign-off on the remediation is the remaining gate.
References
Regulatory / accounting: - ASC 944-805 — Financial Services — Insurance: Demutualizations and Closed Blocks (formerly SFAS No. 120). Governing standard for closed-block / PDO accounting. - ASC 944-40 — Participating policyholder dividend liabilities (PDO liability classification). - AICPA SOP 95-1 — Accounting for Certain Insurance Activities of Mutual Life Insurance Enterprises (closed-block guidance underlying ASC 944-805).
Source data:
- Prudential Financial, Inc. Form 10-K, FY2025 (period 2025-12-31), Note 16 "Closed Block" + Closed Block Division segment discussion. SEC accession 0001137774-26-000048; CIK 0001137774; filed 2026-02-12. Registered as DS-081 (modelling/data_source_registry.yaml); feed firmmodel/data_feeds/closed_block_pru.py.
Internal:
- Decision 018 (MRM Framework) — Management/decisions/018-mrm-framework-multi-regime.md (Tier-1 model-risk discipline).
- Data source: DS-081 (Demutualization Closed Block Disclosures, 10-K) — modelling/data_source_registry.yaml.
- Component legacy_metadata: ecosystem/InsModel/Models/firmmodel/governance/legacy_metadata/ClosedBlockPDOEngine.yaml (the full SR 11-7 narrative for the engine).
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-05 — engine
insmodel.L4.closed_block_pdo(ClosedBlockPDOEngine) built and bound: registered inengine_registry.yaml+ binding manifest; DS-081 registered indata_source_registry.yamland bound in the M-008 registry inputs; PRU disclosed-data feed wired (firmmodel/data_feeds/closed_block_pru.py). - 2026-06-06 — second-line documentation review. Lifted Key Assumptions (4), References, and Standards Coverage from
ClosedBlockPDOEngine.yaml; added Standards Coverage, Dependencies (no upstream models), and Output Snapshot (disclosed PRU figures only) sections to match the gold M-001 card shape; updated Components to bind DS-081; corrected Limitations (DS-081 now registered/active, single-firm fixture is the open item) and the Validation Packet (round-trip identity, not independent validation). No new validation numbers introduced. Stub marker advanced to ``. Promotion-gated items (non-circular back-test, sensitivity suite, challenger, frozen D049 snapshot, 2L sign-off) left for ratification. - 2026-06-06 — 1L remediation of RAT-008-v1.0.0 COND-001 / COND-002 (Decision 053 charter §2.2). COND-001: added a non-circular validation suite (
tests/test_closed_block_pdo_validation.py) exercising ther_taccretion path + actual-vs-expected decomposition against an independent closed-form challenger (challenger_pdo()), a sensitivity suite on the binding levers (r_t, excess, floor), and a seeded 50-path challenger battery — all on constructed/synthetic inputs (no fabricated firm data). COND-002: froze a deterministic gold characterization snapshot (tests/test_closed_block_pdo_gold.py+scripts/model_snapshots.py M-008, newsnap_M_008) and baselined M-008 intomodel_doc_stamps.yaml(D049 detector now classifies M-008current). Assembled the validation-evidence pack atvalidation_evidence/M-008/v1.0.0/README.md; reconciled the registrydocumentation_pack(validation_evidence/change_log → present) andlifecycle.last_validated_on. Honest open item retained: per-period calibration to a real firm's actual/expected decomposition (PRU does not tabulate it). 2L re-review pending — model staysunder_development.
Open findings (1)
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.
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-008-v1.0.1
Latest ratification on file: RAT-008-v1.0.1. Authored by 2L (mrm-peer-reviewer) per Decision 028 charter §5 Pattern A.