{
  "tool_id": "art-664-loan-servicing-waterfall-recompute",
  "vectors": [
    {
      "name": "matches-basic-full-cascade",
      "policy_parameters": {
        "application_order": [
          "late_fee",
          "escrow_shortage",
          "escrow",
          "interest",
          "principal"
        ],
        "bucket_balances": {
          "late_fee": 500,
          "escrow_shortage": 1000,
          "escrow": 2000,
          "interest": 1500,
          "principal": 5000
        },
        "payment_amount": 10000,
        "core_applied": {
          "late_fee": 500,
          "escrow_shortage": 1000,
          "escrow": 2000,
          "interest": 1500,
          "principal": 5000
        }
      },
      "output_payload": {
        "application_order": [
          "late_fee",
          "escrow_shortage",
          "escrow",
          "interest",
          "principal"
        ],
        "payment_amount": 10000,
        "computed_applied_by_bucket": {
          "late_fee": 500,
          "escrow_shortage": 1000,
          "escrow": 2000,
          "interest": 1500,
          "principal": 5000
        },
        "unapplied_remainder": 0,
        "core_applied": {
          "late_fee": 500,
          "escrow_shortage": 1000,
          "escrow": 2000,
          "interest": 1500,
          "principal": 5000
        },
        "per_bucket_deltas": [
          {
            "bucket": "late_fee",
            "in_declared_order": true,
            "computed_applied": 500,
            "core_applied": 500,
            "delta": 0
          },
          {
            "bucket": "escrow_shortage",
            "in_declared_order": true,
            "computed_applied": 1000,
            "core_applied": 1000,
            "delta": 0
          },
          {
            "bucket": "escrow",
            "in_declared_order": true,
            "computed_applied": 2000,
            "core_applied": 2000,
            "delta": 0
          },
          {
            "bucket": "interest",
            "in_declared_order": true,
            "computed_applied": 1500,
            "core_applied": 1500,
            "delta": 0
          },
          {
            "bucket": "principal",
            "in_declared_order": true,
            "computed_applied": 5000,
            "core_applied": 5000,
            "delta": 0
          }
        ],
        "verdict": "MATCHES",
        "missing_inputs": []
      },
      "compliance_flags": [],
      "golden_hash": "e0204930bfa6003978fd45f3971c737e34eea6aae145b076e2176317fe789963"
    },
    {
      "name": "diverges-interest-principal-shifted",
      "policy_parameters": {
        "application_order": [
          "late_fee",
          "escrow_shortage",
          "escrow",
          "interest",
          "principal"
        ],
        "bucket_balances": {
          "late_fee": 500,
          "escrow_shortage": 1000,
          "escrow": 2000,
          "interest": 1500,
          "principal": 5000
        },
        "payment_amount": 10000,
        "core_applied": {
          "late_fee": 500,
          "escrow_shortage": 1000,
          "escrow": 2000,
          "interest": 1600,
          "principal": 4900
        }
      },
      "output_payload": {
        "application_order": [
          "late_fee",
          "escrow_shortage",
          "escrow",
          "interest",
          "principal"
        ],
        "payment_amount": 10000,
        "computed_applied_by_bucket": {
          "late_fee": 500,
          "escrow_shortage": 1000,
          "escrow": 2000,
          "interest": 1500,
          "principal": 5000
        },
        "unapplied_remainder": 0,
        "core_applied": {
          "late_fee": 500,
          "escrow_shortage": 1000,
          "escrow": 2000,
          "interest": 1600,
          "principal": 4900
        },
        "per_bucket_deltas": [
          {
            "bucket": "late_fee",
            "in_declared_order": true,
            "computed_applied": 500,
            "core_applied": 500,
            "delta": 0
          },
          {
            "bucket": "escrow_shortage",
            "in_declared_order": true,
            "computed_applied": 1000,
            "core_applied": 1000,
            "delta": 0
          },
          {
            "bucket": "escrow",
            "in_declared_order": true,
            "computed_applied": 2000,
            "core_applied": 2000,
            "delta": 0
          },
          {
            "bucket": "interest",
            "in_declared_order": true,
            "computed_applied": 1500,
            "core_applied": 1600,
            "delta": 100
          },
          {
            "bucket": "principal",
            "in_declared_order": true,
            "computed_applied": 5000,
            "core_applied": 4900,
            "delta": -100
          }
        ],
        "verdict": "DIVERGES",
        "missing_inputs": []
      },
      "compliance_flags": [
        "waterfall_application_diverges_from_core"
      ],
      "golden_hash": "e245a0e2eedfdb07ef403b09add04f4cfa78ab2eb3c63d583f05787eb2dc9463"
    },
    {
      "name": "indeterminate-missing-core-applied",
      "policy_parameters": {
        "application_order": [
          "late_fee",
          "interest",
          "principal"
        ],
        "bucket_balances": {
          "late_fee": 100,
          "interest": 400,
          "principal": 1000
        },
        "payment_amount": 1500
      },
      "output_payload": {
        "application_order": [
          "late_fee",
          "interest",
          "principal"
        ],
        "payment_amount": 1500,
        "computed_applied_by_bucket": {
          "late_fee": 100,
          "interest": 400,
          "principal": 1000
        },
        "unapplied_remainder": 0,
        "core_applied": null,
        "per_bucket_deltas": [],
        "verdict": "INDETERMINATE",
        "missing_inputs": [
          "core_applied"
        ]
      },
      "compliance_flags": [
        "waterfall_recompute_indeterminate_missing_input"
      ],
      "golden_hash": "c2218df3584322124e4e2a570ad3b135292d3799248aa1bfd59c90346a7f4b56"
    },
    {
      "name": "indeterminate-missing-bucket-balance",
      "policy_parameters": {
        "application_order": [
          "late_fee",
          "principal"
        ],
        "bucket_balances": {
          "late_fee": 100
        },
        "payment_amount": 1000,
        "core_applied": {
          "late_fee": 100,
          "principal": 900
        }
      },
      "output_payload": {
        "application_order": [
          "late_fee",
          "principal"
        ],
        "payment_amount": 1000,
        "computed_applied_by_bucket": null,
        "unapplied_remainder": null,
        "core_applied": {
          "late_fee": 100,
          "principal": 900
        },
        "per_bucket_deltas": [],
        "verdict": "INDETERMINATE",
        "missing_inputs": [
          "bucket_balances.principal"
        ]
      },
      "compliance_flags": [
        "waterfall_recompute_indeterminate_missing_input"
      ],
      "golden_hash": "8f2e5b4ac36e9c314e07de7fa999a9856ac8f06a532792802a3fe7150c4f6ead"
    },
    {
      "name": "matches-with-overpayment-remainder",
      "policy_parameters": {
        "application_order": [
          "late_fee",
          "principal"
        ],
        "bucket_balances": {
          "late_fee": 100,
          "principal": 400
        },
        "payment_amount": 1000,
        "core_applied": {
          "late_fee": 100,
          "principal": 400
        }
      },
      "output_payload": {
        "application_order": [
          "late_fee",
          "principal"
        ],
        "payment_amount": 1000,
        "computed_applied_by_bucket": {
          "late_fee": 100,
          "principal": 400
        },
        "unapplied_remainder": 500,
        "core_applied": {
          "late_fee": 100,
          "principal": 400
        },
        "per_bucket_deltas": [
          {
            "bucket": "late_fee",
            "in_declared_order": true,
            "computed_applied": 100,
            "core_applied": 100,
            "delta": 0
          },
          {
            "bucket": "principal",
            "in_declared_order": true,
            "computed_applied": 400,
            "core_applied": 400,
            "delta": 0
          }
        ],
        "verdict": "MATCHES",
        "missing_inputs": []
      },
      "compliance_flags": [],
      "golden_hash": "b389c02b2cd8105f358243254d0c10757b3a09260c167f508486849d3dbd2c86"
    },
    {
      "name": "diverges-core-applied-undeclared-bucket",
      "policy_parameters": {
        "application_order": [
          "late_fee",
          "principal"
        ],
        "bucket_balances": {
          "late_fee": 100,
          "principal": 900
        },
        "payment_amount": 1000,
        "core_applied": {
          "late_fee": 100,
          "principal": 800,
          "misc_fee": 100
        }
      },
      "output_payload": {
        "application_order": [
          "late_fee",
          "principal"
        ],
        "payment_amount": 1000,
        "computed_applied_by_bucket": {
          "late_fee": 100,
          "principal": 900
        },
        "unapplied_remainder": 0,
        "core_applied": {
          "late_fee": 100,
          "principal": 800,
          "misc_fee": 100
        },
        "per_bucket_deltas": [
          {
            "bucket": "late_fee",
            "in_declared_order": true,
            "computed_applied": 100,
            "core_applied": 100,
            "delta": 0
          },
          {
            "bucket": "principal",
            "in_declared_order": true,
            "computed_applied": 900,
            "core_applied": 800,
            "delta": -100
          },
          {
            "bucket": "misc_fee",
            "in_declared_order": false,
            "computed_applied": 0,
            "core_applied": 100,
            "delta": 100
          }
        ],
        "verdict": "DIVERGES",
        "missing_inputs": []
      },
      "compliance_flags": [
        "waterfall_application_diverges_from_core"
      ],
      "golden_hash": "df5cf31003cda4404edeca46a062c461a803b03e99dc7ae7af96bc6ee5811b12"
    },
    {
      "name": "indeterminate-empty-application-order",
      "policy_parameters": {
        "application_order": [],
        "bucket_balances": {},
        "payment_amount": 500,
        "core_applied": {}
      },
      "output_payload": {
        "application_order": null,
        "payment_amount": 500,
        "computed_applied_by_bucket": null,
        "unapplied_remainder": null,
        "core_applied": {},
        "per_bucket_deltas": [],
        "verdict": "INDETERMINATE",
        "missing_inputs": [
          "application_order"
        ]
      },
      "compliance_flags": [
        "waterfall_recompute_indeterminate_missing_input"
      ],
      "golden_hash": "f0b15fccf6b577d04955114c66a5d867b559bc22b3936aac7eeab44c86622203"
    },
    {
      "name": "indeterminate-negative-payment-amount",
      "policy_parameters": {
        "application_order": [
          "late_fee"
        ],
        "bucket_balances": {
          "late_fee": 100
        },
        "payment_amount": -50,
        "core_applied": {
          "late_fee": 0
        }
      },
      "output_payload": {
        "application_order": [
          "late_fee"
        ],
        "payment_amount": null,
        "computed_applied_by_bucket": null,
        "unapplied_remainder": null,
        "core_applied": {
          "late_fee": 0
        },
        "per_bucket_deltas": [],
        "verdict": "INDETERMINATE",
        "missing_inputs": [
          "payment_amount"
        ]
      },
      "compliance_flags": [
        "waterfall_recompute_indeterminate_missing_input"
      ],
      "golden_hash": "22afa2b97eca796be5dc00e6a34155f1f618b90c0573073fe3e146d3d3d81091"
    }
  ]
}
