{
  "tool_id": "art-705-bond-ladder-builder",
  "tool_version": "1.0.0",
  "display_name": "Bond Ladder Builder",
  "mcp_name": "build_bond_ladder",
  "mandate_type": "analytics_mandate",
  "wave": 124,
  "gpu": false,
  "url": "https://ainumbers.co/chaingraph/art-705-bond-ladder-builder.html",
  "description": "Builds a target-weight bond ladder from a total notional split across maturity rungs and reports rung-by-rung and portfolio risk analytics: each rung's price, Macaulay and modified duration, DV01 and convexity (the same formulas as compute_bond_duration, compute_dv01 and compute_convexity applied at each rung's notional), plus the target_weight-weighted portfolio aggregates. Every reinvestment assumption is named in plain sentences in the output: hold_to_maturity (cash held at 0%) or roll_to_longest_rung (coupons and maturing principal reinvested at the longest rung's yield), and rung target weights must sum to 1 within 1e-9 or the tool refuses, naming the sum. Exclusions: no credit spread, no call features, flat yield per rung, no live data.",
  "input_schema_ref": "chaingraph/art-705-bond-ladder-builder.html#manifest",
  "consumes": [],
  "feeds": [],
  "status": "live",
  "conformance_fixtures": true,
  "compute_capability": "server",
  "compute_images": [{"system":"sha256-source","image_id":"sha256:970caa8ad9d2832a8a9eb606726654fa1529c9669bee6a67cd0042ed88929bdb","valid_from":"2026-10-11"},{"system":"risc0","image_id":"sha256:a1a0bc89b5b1febaeda3519f6dbade0fa5ac16beeb143c4e1b01689573567bc6","valid_from":"2026-10-16"}],
  "export_capability": ["json"],
  "standards_basis": "not_applicable",
  "compute_proof_ready": "ready",
  "compute_proof": {
    "type": "ZkVmReceipt",
    "system": "risc0",
    "receiptFormat": "groth16-bn254",
    "imageId": "sha256:a1a0bc89b5b1febaeda3519f6dbade0fa5ac16beeb143c4e1b01689573567bc6",
    "seal": "AYUJ3UOSXO8BeqJDn8aaxIBJCNtHFRIhzC+95wwwSSkfDO/FFld8WCyAvg1FchewOsIkXakyBUzPbs7ex3TQAS9p5hlOhgbsLA0RFIdte2z9NgJWaDlHwBM5l3wNL8tTIkqhiJ6bbK2dRB//vAwGWYl61dU+zoHi3DQrpwfq9ZIcIEODhQ++zzN1XzD1v6DxQLvRvsfUh3Zmm4pYQI9i/Q9oViMlGyJrjZBb9pOa/4m8kgc7/HKIguor4tYnY+MRE8lCSsz0uZ9atG6iny20S3IoF1xL7FEEsho0/ir2zikpN2FmEAMoVovVv9g8w8yRYh2wZh4z+yQLeWGmIO18jQ==",
    "journal": {
      "chaingraph_version": "0.4.0",
      "kernel_digest": "sha256:970caa8ad9d2832a8a9eb606726654fa1529c9669bee6a67cd0042ed88929bdb",
      "output": {
        "assumptions": [
          "Schedule assumption: each rung is priced as an even-period bullet bond with 2 coupon period(s) per year — a fixed coupon of coupon_rate_pct/100 of face paid every period and face repaid with the final coupon; no odd first coupon, no stub periods, and no day-count accrual nuances are modeled.",
          "Yield assumption: each rung's yield_pct is a flat yield to maturity applied to all of that rung's cash flows; there is no credit spread, no forward curve, and no term-structure interpolation across rungs.",
          "Instrument assumption: all rungs are non-callable bullet bonds held to maturity — no call or put features, no default, no early sale, and no live market data are used.",
          "Reinvestment assumption (hold_to_maturity): every coupon payment and every maturing rung's principal are held as cash earning 0% after receipt — nothing is reinvested and nothing is rolled into other rungs. The duration, DV01 and convexity reported per rung and for the portfolio are computed on each rung's contractual bond cash flows only and do not depend on this assumption.",
          "Portfolio aggregation assumption: portfolio weighted_duration, weighted_modified_duration, weighted_dv01 and weighted_convexity are target_weight-weighted averages of the per-rung figures; no diversification or cross-rung offset effects are modeled."
        ],
        "ladder": [
          {
            "convexity": 23.142858,
            "duration": 4.536614,
            "dv01": 45.028616,
            "maturity_years": 5,
            "modified_duration": 4.443305,
            "notional": 100000,
            "price": 101340.37,
            "rung": 1,
            "weight": 1
          }
        ],
        "note": "Per-rung maths are the same formulas as compute_bond_duration (art-329), compute_dv01 (art-330) and compute_convexity (art-331) applied at each rung’s notional = notional * target_weight; parity is asserted by the art-705 parity gate. Exclusions: no credit spread, no call features, flat yield per rung, no live data.",
        "notional": 100000,
        "num_rungs": 1,
        "periods_per_year": 2,
        "portfolio": {
          "weighted_convexity": 23.142858,
          "weighted_duration": 4.536614,
          "weighted_dv01": 45.028616,
          "weighted_modified_duration": 4.443305
        },
        "regulatory_basis": "Standard fixed-income risk analytics (Macaulay/modified duration, DV01 by central-difference reprice, closed-form convexity) applied rung-by-rung over a target-weight bond ladder (Fabozzi, Bond Markets)",
        "reinvestment_assumption": "hold_to_maturity"
      }
    }
  }
}
