{
  "tool_id": "art-426-cecl-ecl-calculator",
  "note": "golden_hash computed at fixture generation time.",
  "vectors": [
    {
      "name": "warm-method-two-segments",
      "policy_parameters": {
        "method": "warm",
        "constants_version": "2026-07-23.cecl-warm-v1",
        "prior_allowance_balance_usd": 500000,
        "charge_offs_usd": 20000,
        "recoveries_usd": 5000,
        "forecast_weights": [
          {
            "scenario": "baseline",
            "weight": 0.6
          },
          {
            "scenario": "downside",
            "weight": 0.4
          }
        ],
        "segments": [
          {
            "segment_id": "retail-auto",
            "exposure_balance_usd": 10000000,
            "remaining_life_years": 3,
            "scenarios": [
              {
                "scenario": "baseline",
                "annual_loss_rate_pct": 0.012
              },
              {
                "scenario": "downside",
                "annual_loss_rate_pct": 0.025
              }
            ]
          },
          {
            "segment_id": "retail-card",
            "exposure_balance_usd": 5000000,
            "remaining_life_years": 2,
            "scenarios": [
              {
                "scenario": "baseline",
                "annual_loss_rate_pct": 0.03
              },
              {
                "scenario": "downside",
                "annual_loss_rate_pct": 0.06
              }
            ]
          }
        ]
      },
      "output_payload": {
        "method": "warm",
        "constants_version": "2026-07-23.cecl-warm-v1",
        "segment_count": 2,
        "segments": [
          {
            "segment_id": "retail-auto",
            "exposure_balance_usd": 10000000,
            "ead_usd": 10000000,
            "remaining_life_years": 3,
            "lgd_pct": 0,
            "scenario_count": 2,
            "scenarios": [
              {
                "scenario": "baseline",
                "weight": 0.6,
                "scenario_ecl_usd": 360000
              },
              {
                "scenario": "downside",
                "weight": 0.4,
                "scenario_ecl_usd": 750000
              }
            ],
            "segment_ecl_usd": 516000
          },
          {
            "segment_id": "retail-card",
            "exposure_balance_usd": 5000000,
            "ead_usd": 5000000,
            "remaining_life_years": 2,
            "lgd_pct": 0,
            "scenario_count": 2,
            "scenarios": [
              {
                "scenario": "baseline",
                "weight": 0.6,
                "scenario_ecl_usd": 300000
              },
              {
                "scenario": "downside",
                "weight": 0.4,
                "scenario_ecl_usd": 600000
              }
            ],
            "segment_ecl_usd": 420000
          }
        ],
        "forecast_weights": [
          {
            "scenario": "baseline",
            "weight": 0.6
          },
          {
            "scenario": "downside",
            "weight": 0.4
          }
        ],
        "total_required_allowance_usd": 936000,
        "prior_allowance_balance_usd": 500000,
        "charge_offs_usd": 20000,
        "recoveries_usd": 5000,
        "provision_expense_usd": 451000,
        "reconciled_ending_allowance_usd": 936000,
        "delta_vs_required_usd": 0,
        "reconciliation_balanced": true,
        "boundary_note": "PD/LGD/EAD curves and forecast scenario weights are policy inputs supplied by the caller (human/model judgment); this kernel performs only the arithmetic combination into ECL and allowance reconciliation. It does not estimate, calibrate, or validate any PD/LGD/EAD model.",
        "disambiguation": "CECL (ASC 326) recognizes lifetime expected credit losses from origination -- there is no 3-stage staging transfer regime here, unlike IFRS9 (see tools 196/198/204, a distinct standard). WARM applies an annualized historical loss rate x remaining life; loss-rate applies a lifetime historical loss rate directly (no discounting); DCF discounts period expected shortfalls (contractual cash flow x PD x LGD) at the effective interest rate."
      },
      "golden_hash": "42c8f2ef679e71ff98f6b1e3e63bbfbdb560cf57de69029645dfc34ceda275df"
    },
    {
      "name": "dcf-method-single-segment",
      "policy_parameters": {
        "method": "dcf",
        "constants_version": "2026-07-23.cecl-dcf-v1",
        "prior_allowance_balance_usd": 200000,
        "charge_offs_usd": 10000,
        "recoveries_usd": 2000,
        "forecast_weights": [
          {
            "scenario": "baseline",
            "weight": 1
          }
        ],
        "segments": [
          {
            "segment_id": "cre-loans",
            "exposure_balance_usd": 3000000,
            "lgd_pct": 0.4,
            "effective_interest_rate_pct": 5,
            "scenarios": [
              {
                "scenario": "baseline",
                "pd_curve": [
                  0.01,
                  0.012,
                  0.015
                ],
                "cash_flows": [
                  {
                    "period": 1,
                    "contractual_payment_usd": 1050000
                  },
                  {
                    "period": 2,
                    "contractual_payment_usd": 1050000
                  },
                  {
                    "period": 3,
                    "contractual_payment_usd": 1050000
                  }
                ]
              }
            ]
          }
        ]
      },
      "output_payload": {
        "method": "dcf",
        "constants_version": "2026-07-23.cecl-dcf-v1",
        "segment_count": 1,
        "segments": [
          {
            "segment_id": "cre-loans",
            "exposure_balance_usd": 3000000,
            "ead_usd": 3000000,
            "remaining_life_years": 0,
            "lgd_pct": 0.4,
            "scenario_count": 1,
            "scenarios": [
              {
                "scenario": "baseline",
                "weight": 1,
                "scenario_ecl_usd": 14013.61
              }
            ],
            "segment_ecl_usd": 14013.61
          }
        ],
        "forecast_weights": [
          {
            "scenario": "baseline",
            "weight": 1
          }
        ],
        "total_required_allowance_usd": 14013.61,
        "prior_allowance_balance_usd": 200000,
        "charge_offs_usd": 10000,
        "recoveries_usd": 2000,
        "provision_expense_usd": -177986.39,
        "reconciled_ending_allowance_usd": 14013.61,
        "delta_vs_required_usd": 0,
        "reconciliation_balanced": true,
        "boundary_note": "PD/LGD/EAD curves and forecast scenario weights are policy inputs supplied by the caller (human/model judgment); this kernel performs only the arithmetic combination into ECL and allowance reconciliation. It does not estimate, calibrate, or validate any PD/LGD/EAD model.",
        "disambiguation": "CECL (ASC 326) recognizes lifetime expected credit losses from origination -- there is no 3-stage staging transfer regime here, unlike IFRS9 (see tools 196/198/204, a distinct standard). WARM applies an annualized historical loss rate x remaining life; loss-rate applies a lifetime historical loss rate directly (no discounting); DCF discounts period expected shortfalls (contractual cash flow x PD x LGD) at the effective interest rate."
      },
      "golden_hash": "45f7f1ba01ce49dcb573cf39be18259ba05393a7becee178d03f7e61321463db"
    },
    {
      "name": "loss-rate-method-single-segment",
      "policy_parameters": {
        "method": "loss_rate",
        "constants_version": "2026-07-23.cecl-lr-v1",
        "prior_allowance_balance_usd": 100000,
        "forecast_weights": [
          {
            "scenario": "baseline",
            "weight": 0.7
          },
          {
            "scenario": "downside",
            "weight": 0.3
          }
        ],
        "segments": [
          {
            "segment_id": "unsecured-personal",
            "exposure_balance_usd": 2000000,
            "scenarios": [
              {
                "scenario": "baseline",
                "lifetime_loss_rate_pct": 0.04
              },
              {
                "scenario": "downside",
                "lifetime_loss_rate_pct": 0.09
              }
            ]
          }
        ]
      },
      "output_payload": {
        "method": "loss_rate",
        "constants_version": "2026-07-23.cecl-lr-v1",
        "segment_count": 1,
        "segments": [
          {
            "segment_id": "unsecured-personal",
            "exposure_balance_usd": 2000000,
            "ead_usd": 2000000,
            "remaining_life_years": 0,
            "lgd_pct": 0,
            "scenario_count": 2,
            "scenarios": [
              {
                "scenario": "baseline",
                "weight": 0.7,
                "scenario_ecl_usd": 80000
              },
              {
                "scenario": "downside",
                "weight": 0.3,
                "scenario_ecl_usd": 180000
              }
            ],
            "segment_ecl_usd": 110000
          }
        ],
        "forecast_weights": [
          {
            "scenario": "baseline",
            "weight": 0.7
          },
          {
            "scenario": "downside",
            "weight": 0.3
          }
        ],
        "total_required_allowance_usd": 110000,
        "prior_allowance_balance_usd": 100000,
        "charge_offs_usd": 0,
        "recoveries_usd": 0,
        "provision_expense_usd": 10000,
        "reconciled_ending_allowance_usd": 110000,
        "delta_vs_required_usd": 0,
        "reconciliation_balanced": true,
        "boundary_note": "PD/LGD/EAD curves and forecast scenario weights are policy inputs supplied by the caller (human/model judgment); this kernel performs only the arithmetic combination into ECL and allowance reconciliation. It does not estimate, calibrate, or validate any PD/LGD/EAD model.",
        "disambiguation": "CECL (ASC 326) recognizes lifetime expected credit losses from origination -- there is no 3-stage staging transfer regime here, unlike IFRS9 (see tools 196/198/204, a distinct standard). WARM applies an annualized historical loss rate x remaining life; loss-rate applies a lifetime historical loss rate directly (no discounting); DCF discounts period expected shortfalls (contractual cash flow x PD x LGD) at the effective interest rate."
      },
      "golden_hash": "be54568cfb863610ec274e4ffc56fb0b56fb593123f5618f0131fb11585f606e"
    },
    {
      "name": "empty-input-finite",
      "policy_parameters": {},
      "output_payload": {
        "method": "warm",
        "constants_version": "",
        "segment_count": 0,
        "segments": [],
        "forecast_weights": [],
        "total_required_allowance_usd": 0,
        "prior_allowance_balance_usd": 0,
        "charge_offs_usd": 0,
        "recoveries_usd": 0,
        "provision_expense_usd": 0,
        "reconciled_ending_allowance_usd": 0,
        "delta_vs_required_usd": 0,
        "reconciliation_balanced": true,
        "boundary_note": "PD/LGD/EAD curves and forecast scenario weights are policy inputs supplied by the caller (human/model judgment); this kernel performs only the arithmetic combination into ECL and allowance reconciliation. It does not estimate, calibrate, or validate any PD/LGD/EAD model.",
        "disambiguation": "CECL (ASC 326) recognizes lifetime expected credit losses from origination -- there is no 3-stage staging transfer regime here, unlike IFRS9 (see tools 196/198/204, a distinct standard). WARM applies an annualized historical loss rate x remaining life; loss-rate applies a lifetime historical loss rate directly (no discounting); DCF discounts period expected shortfalls (contractual cash flow x PD x LGD) at the effective interest rate."
      },
      "golden_hash": "42e05f03857f253ce84b3b6a0cd997c57c5aeb58d5896a9129ed520755edac07"
    }
  ]
}
