Source: https://guthlabs.ai/docs/instruments/amortization-schedule/mechanism/

instrument mechanism / verified-with-binding-errata

# Amortization Schedule mechanism

The inspectable method record for Amortization Schedule, kept separate from implementation and qualification.

Status: **VERIFIED_WITH_ERRATA**Lifecycle: **verified-with-binding-errata**

## Model scope

The core balance iteration is standard under clearly defined periodic-rate and payment conventions, but the specification omits the PMT formula, rate and term frequencies, extra-payment behavior, final-payment handling, rounding policy, and the data needed for a payoff date. One test vector exposed an arithmetic inconsistency in the initial extra-payment working; the corrected period balances are 659.98, 316.56, and 0.00.

- The iterative formulas are standard only when r is the interest rate per payment period and PMT is the total payment applied in that period.

- PMT is referenced but no formula or input definition is provided. For a fully amortizing fixed-rate loan, the standard formula is PMT=P*r/(1-(1+r)^(-n)) when r is nonzero, and PMT=P/n when r=0.

- The treatment of the optional extra payment is undefined: it must specify whether extra-payment is added to PMT every period, applied only to principal, and whether the scheduled term is shortened.

- The final payment must be capped at the remaining balance plus that period's interest; otherwise the iterative formula can produce a negative balance or overpayment.

- The payoff date cannot be computed from principal, rate, term, and extra-payment alone; an origination date and payment-calendar convention are required.

## Units and conventions

- The test vectors use monthly payments and a monthly periodic rate unless explicitly noted.

- For annual nominal rates, the monthly rate is annual_rate/12; this assumes a nominal rate compounded monthly, not an effective annual rate.

- Term is measured in payment periods.

- Amounts are currency units rounded to the nearest cent after each period.

- PMT is computed using the fixed-payment annuity formula, and the final payment is adjusted downward to exactly clear the balance.

- No payoff date is expected in these vectors because no origination date or calendar convention is supplied.

## Inspectable vector

One of 4 source-bound review vectors:

````
{
  "inputs": {
    "principal": 1200,
    "annual_rate": 0,
    "payment_frequency": "monthly",
    "term_periods": 3,
    "extra_payment": 0,
    "rounding": "nearest cent"
  },
  "expected_outputs": {
    "table": [
      {
        "period": 1,
        "interest": 0,
        "principal": 400,
        "balance": 800
      },
      {
        "period": 2,
        "interest": 0,
        "principal": 400,
        "balance": 400
      },
      {
        "period": 3,
        "interest": 0,
        "principal": 400,
        "balance": 0
      }
    ],
    "payoff_period": 3,
    "payoff_date": null
  },
  "working": "Monthly rate r=0.00/12=0.00. PMT=P/n=1200.00/3=400.00. Period 1: interest=1200.00*0.00=0.00; principal=400.00-0.00=400.00; balance=1200.00-400.00=800.00. Period 2: interest=800.00*0.00=0.00; principal=400.00; balance=800.00-400.00=400.00. Period 3: interest=400.00*0.00=0.00; principal=400.00; balance=400.00-400.00=0.00."
}
````

## Failure boundary

**BREAK_CLAIMED** · SELF_FLAGGED

A term of zero makes the payment calculation divide by zero and must be rejected. The specification also omits payment frequency and rate convention, so identical-looking rate and term inputs can produce materially different schedules.

## Other records

[01**Overview**](<https://guthlabs.ai/docs/instruments/amortization-schedule/>)[03**Implementation**](<https://guthlabs.ai/docs/instruments/amortization-schedule/implementation/>)[04**Qualification**](<https://guthlabs.ai/docs/instruments/amortization-schedule/qualification/>)

## Sources and evidence

These pointers bind the page to evidence. They do not grant authority or collapse verification into deployment.

- `VERIFIED_LEDGER.json`

- `evidence-tranche3/tranche3-results.json`

- `BOUNDARY_HAZARD_CATALOG.json`
