Source: https://guthlabs.ai/docs/instruments/ordinary-annuity-fv-pv/

instrument / verified-with-binding-errata

# Ordinary Annuity FV/PV

The current ledger marks this instrument verified with errata that must be applied at binding time.

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

## Inspectable records

[01**Overview**Purpose and lifecycle](<https://guthlabs.ai/docs/instruments/ordinary-annuity-fv-pv/>)[02**Mechanism**Method and assumptions](<https://guthlabs.ai/docs/instruments/ordinary-annuity-fv-pv/mechanism/>)[03**Implementation**Binding and validation](<https://guthlabs.ai/docs/instruments/ordinary-annuity-fv-pv/implementation/>)[04**Qualification**Evidence and errata](<https://guthlabs.ai/docs/instruments/ordinary-annuity-fv-pv/qualification/>)

## Ledger state

The current ledger marks this instrument verified with errata that must be applied at binding time.

**Area**: Finance, Economics & Business

**Tranche**: tranche-2

**Evidence ID**: t2-020

**Ledger rows**: 1

No ledger note is attached.

## Review findings

The ordinary-annuity formulas are standard under the stated unit and timing assumptions, but the instrument specification is ambiguous because it advertises an annuity-due toggle without supplying or explicitly requiring the due formulas. It also lacks a defined zero-rate branch. Resolve those behaviors before claiming the instrument is fully formula-verified.

### Formula and scope findings

- The FV and PV formulas are correct for an ordinary annuity with equal payments made at the end of each period, provided r is nonzero.

- The specification includes an annuity-due timing toggle, but neither formula includes the required due adjustment: FV_due=FV_ordinary*(1+r) and PV_due=PV_ordinary*(1+r).

- The formulas divide by r and therefore do not directly handle a zero rate; the correct zero-rate limit is FV=PMT*n and PV=PMT*n.

- The formulas do not state constraints such as n being a nonnegative integer and r being greater than -1 for standard real-valued discounting.

### Unit assumptions

- r is a decimal rate per payment period, not an annual rate unless payments are annual; for a nominal annual rate with m payments per year, use r=annual_rate/m.

- n is the total number of payment periods and must be a nonnegative integer.

- PMT is the equal payment amount per period; signs must be defined consistently for cash-flow convention.

- Ordinary annuity payments occur at the end of each period.

- The test-vector growth value is defined as FV minus total contributions, where total contributions=PMT*n.

## Boundary hardening

**BREAK_CLAIMED** · SELF_FLAGGED

The formulas require domain and convention handling that is not explicit: zero-rate handling needs a limiting implementation, r=-1 makes PV undefined, and an unlabelled rate value such as 5 produces radically different results depending on whether it means 5% or decimal 5.

## Errata and corrections

No applied erratum is attached to this unique-name record.

## Inspectable example

4 review vectors are recorded. One source-bound sample is shown below.

````
{
  "inputs": {
    "PMT": 1000,
    "rate_per_period": 0.05,
    "n": 3,
    "timing": "ordinary"
  },
  "expected_outputs": {
    "FV": 3152.5,
    "PV": 2723.248029,
    "total_contributions": 3000,
    "FV_growth": 152.5
  },
  "working": "FV=1000*((1.05)^3-1)/0.05=1000*(1.157625-1)/0.05=1000*0.157625/0.05=3152.50. PV=1000*(1-(1.05)^(-3))/0.05=1000*(1-0.8638375985)/0.05=1000*0.1361624015/0.05=2723.248029. Total contributions=1000*3=3000. FV growth=3152.50-3000=152.50."
}
````

## Related workflows

No source-defined multi-instrument workflow membership is recorded.

## Sources and evidence

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

- `VERIFIED_LEDGER.json · VERIFIED_WITH_ERRATA`

- `evidence-tranche2/tranche2-results.json`

- `BOUNDARY_HAZARD_CATALOG.json`
