# /// script # requires-python = ">=3.12" # dependencies = [] # exclude-newer = "2026-08-08T00:00:00Z" # /// """Readable pension-cost, OCI, AOCI, and entry reconciliation for Linden Peak.""" from __future__ import annotations def money(amount: float) -> str: return f"({abs(amount):,.2f})" if amount < 0 else f"{amount:,.2f}" def show(title: str, rows: list[tuple[str, float]]) -> None: print(f"\n{title}\n{'-' * len(title)}") width = max(len(label) for label, _ in rows) for label, value in rows: print(f"{label:<{width}} {money(value):>18}") # Periodic-cost rail: expected return belongs here; actual return does not. service_cost = 1_500_000.00 interest_cost = 1_250_000.00 expected_return = 1_400_000.00 prior_service_amortization = 180_000.00 loss_amortization = 100_000.00 benefit_cost = ( service_cost + interest_cost - expected_return + prior_service_amortization + loss_amortization ) other_cost = benefit_cost - service_cost show( "Net periodic pension cost", [ ("Service cost", service_cost), ("Interest cost", interest_cost), ("Expected return", -expected_return), ("Prior-service amortization", prior_service_amortization), ("Net-loss amortization", loss_amortization), ("Total pension cost", benefit_cost), ("Other cost components", other_cost), ], ) # Current OCI records new layers and removes amounts reclassified into cost. prior_service_cost = 900_000.00 obligation_loss = 300_000.00 actual_return = 1_600_000.00 asset_gain = actual_return - expected_return current_oci_loss = ( prior_service_cost + obligation_loss - asset_gain - prior_service_amortization - loss_amortization ) opening_aoci_loss = 3_000_000.00 ending_aoci_loss = opening_aoci_loss + current_oci_loss show( "OCI and AOCI", [ ("Prior-service cost", prior_service_cost), ("Obligation actuarial loss", obligation_loss), ("Asset gain", -asset_gain), ("Prior-service reclassification", -prior_service_amortization), ("Net-loss reclassification", -loss_amortization), ("Current OCI loss", current_oci_loss), ("Opening AOCI loss", opening_aoci_loss), ("Ending AOCI loss", ending_aoci_loss), ], ) # Supplied corridor policy: the program reperforms it but does not choose it. opening_net_loss = 3_500_000.00 greater_opening_base = 25_000_000.00 corridor_threshold = 0.10 * greater_opening_base corridor_excess = max(opening_net_loss - corridor_threshold, 0.00) corridor_amortization = corridor_excess / 10.00 show( "Corridor reperformance", [ ("Opening net loss", opening_net_loss), ("Corridor threshold", corridor_threshold), ("Corridor excess", corridor_excess), ("Ten-year amortization", corridor_amortization), ], ) opening_funded_status = 22_000_000.00 - 25_000_000.00 ending_funded_status = 23_500_000.00 - 27_550_000.00 liability_increase = -(ending_funded_status - opening_funded_status) contribution = 1_300_000.00 entry_difference = benefit_cost + current_oci_loss - contribution - liability_increase show( "Employer-entry control", [ ("Pension cost", benefit_cost), ("Current OCI loss", current_oci_loss), ("Cash contribution", -contribution), ("Liability increase", -liability_increase), ("Difference", entry_difference), ], ) assert abs(benefit_cost - 1_630_000.00) < 0.01 assert abs(current_oci_loss - 720_000.00) < 0.01 assert abs(ending_aoci_loss - 3_720_000.00) < 0.01 assert abs(entry_difference) < 0.01 print("\nPresentation: service cost = 1,500,000.00; other components = 130,000.00.") print("Boundary: this script does not select assumptions or classify a special event.")