FAILURE MAP
← Case archive

FA-58379 / Loan amortization schedules / Member archive

Schedule rows from a fixed payment: interest-only guard · case 04

A payment that exactly equals interest produces rows that never reduce principal.

Member previewVariant 4 · 3 implementations · 7 checks per implementation

Case contract

x = {'principal', 'rate_bp', 'payment', 'max_months'}. For months 1..max_months while the balance is positive: interest = round_half_up(balance*bp/120000); if payment <= interest return {'error': 'negative_amortization', 'month': k}; principal paid = min(payment - interest, balance); append [k, interest, principal, balance after]. Return {'rows', 'balloon': remaining principal}.

Why this case matters

Amortization engines drive borrower statements, payoff quotes and investor remittances; a misplaced rounding step, boundary or ordering rule compounds across hundreds of periods.

One recorded failure

Sample boundary fixture

This sample comes from the broken implementation of a controlled reproducer.

Boundary fixtureActualExpectedOutcome
regression: interest-only guard{"balloon": 50000, "rows": [[1, 500, 0, 50000], [2, 500, 0, 50000], [3, 500, 0, 50000], [4, 500, 0, 50000], [5, 500, 0, 50000], [6, 500, 0, 50000], [7, 500, 0, 50000], [8, 500, 0, 50000], [9, 500, 0, 50000], [10, 500, 0, 50000], [11, 500, 0, 50000], [12, 500, 0, 50000], [13, 500, 0, 50000], [14, 500, 0, 50000], [15, 500, 0, 50000], [16, 500, 0, 50000], [17, 500, 0, 50000], [18, 500, 0, 50000], [19, 500, 0, 50000], [20, 500, 0, 50000], [21, 500, 0, 50000], [22, 500, 0, 50000], [23, 500, 0, 50000], [24, 500, 0, 50000]]}{"error": "negative_amortization", "month": 1}Failed

MEMBER ARCHIVE

The complete case is available to members.

This record includes three runnable implementations, regression fixtures, execution results, and source hashes.

Member access is invitation-based. Sign in with your invited account to inspect the sources.

Sign in to the archive ↗