{
  "controller": "daycount",
  "name": "Day-count & accrual \u2014 coupon periods compose exactly (finance)",
  "kind": "theorem",
  "label": "The headline (days30E360_additive) is EXACT: splitting a coupon period at any intermediate date preserves the total day-count, so accrued interest composes exactly (accrual_additive) \u2014 no interest is manufactured by moving an accrual boundary, the day-count analogue of amortization's telescoping reconciliation. Plus regularity (equal calendar spacing \u21d2 equal day-count \u21d2 equal coupons) and a full year = 360. Honest domain point: this uses 30E/360 (Eurobond) precisely BECAUSE it's additive \u2014 the US 30/360 'bond basis' is NOT (its end-of-month rule depends on the other endpoint; the sim exhibits a case where US gives 44\u226043 while 30E/360 gives 43=43). All pure INTEGER arithmetic \u2014 #print axioms is propext + Quot.sound only, not even Classical.choice \u2014 and registered in the claim auditor. Honest scope: certifies the day-count convention's algebra, NOT a full calendar/business-day library, and NOT an audit certification.",
  "source": {
    "lean": "MachLib.FinanceDayCount",
    "theorem": "MachLib.Finance.days30E360_additive"
  },
  "emitted": [],
  "proof": {
    "theorem": "MachLib.Finance.days30E360_additive",
    "claim": "the 30E/360 day-count is additive \u2014 splitting a coupon period at ANY intermediate date preserves the total day-count, so accrued interest composes exactly (no interest created or destroyed by moving an accrual boundary)",
    "trail_file": "proof/days30E360_additive.axioms.txt",
    "clean": true,
    "forbidden_axioms_found": [],
    "rederived": "2026-07-02T08:57:45Z",
    "source_artifact": "MachLib.FinanceDayCount   (machlib module; the theorem's own #print axioms)",
    "reverify": "make verify-proof",
    "tier": "REPLAY (re-derive: TOOLCHAIN \u2014 Lean)"
  },
  "sim": {
    "bond": "$1,000,000 notional, 5% coupon, 2\u00d7/yr, 10y (30E/360)",
    "coupons": 20,
    "per_period_days": 180,
    "total_days": 3600,
    "sum_period_days": 3600,
    "total_accrued_cents": 50000000,
    "coupon_accrued_usd": 25000.0,
    "samples": 20,
    "trace_csv": "trace.csv",
    "plot_png": "daycount.png",
    "contrast_us_vs_30e": {
      "case": "2020-01-15 \u2192 2020-02-28, split at 2020-01-31",
      "e30_360_split_vs_whole": [
        43,
        43
      ],
      "e30_360_additive": true,
      "us_30_360_split_vs_whole": [
        44,
        43
      ],
      "us_30_360_additive": false
    },
    "check": {
      "quantity": "\u03a3(coupon-period 30E/360 day-counts) \u2212 total day-count over the bond (exact integers)",
      "value": 0,
      "relation": "=",
      "bound": 0,
      "holds": true,
      "context": "the 20 semiannual periods each count exactly 180 days and sum to 3600 = the direct issue\u2192maturity count \u2014 30E/360 is additive, so accrued interest composes exactly (total accrued $500,000.00). Honest contrast on 2020-01-15\u219202-28 split at 01-31: 30E/360 adds (43=43) but US 30/360 does NOT (44\u226043) \u2014 why the additive convention is the right one"
    },
    "tier": "LOCAL"
  },
  "hardware": {
    "tier": "none",
    "note": "\u2014 (a money/calendar kernel; the receipt is the proof + a real bond coupon schedule in exact integers, not hardware)"
  }
}