{
  "tool_id": "art-688-education-funding-gap-calculator",
  "note": "Golden vectors authored by EDUCATION-FUNDING-BUILD-1 per EDUCATION-FUNDING-BUILD-SPEC.md. Vector 1 is the spec canonical preimage; its execution_hash pins d0ed28680e17ad9a20bd29e5881bd054f4888ff40b7cee9d22e8efb9dda28ab6 (byte-exact parity target). Vector 2 is the opposite-verdict vector (GOAL_MET, overfunded, with a declared rollover cap echoed in the trace note). Vector 3 is the fail-closed vector. All inputs are caller-declared and synthetic; the rollover cap is a caller declaration echoed in the trace, never a kernel-owned constant; no runtime clock anywhere. human_sign_off: PENDING.",
  "vectors": [
    {
      "name": "spec-canonical-preimage (parity pin d0ed2868)",
      "policy_parameters": {
        "goal": 120000,
        "years": 10,
        "annual_return_pct": 5,
        "current_balance": 20000
      },
      "output_payload": {
        "fv_current_balance": 32577.89,
        "funding_gap": 87422.11,
        "trace": "20000 * 1.05^10 = 32577.89 (2dp half-up); gap = 120000 - 32577.89 = 87422.11",
        "overall": "GAP_COMPUTED"
      },
      "golden_hash": "d0ed28680e17ad9a20bd29e5881bd054f4888ff40b7cee9d22e8efb9dda28ab6"
    },
    {
      "name": "opposite-verdict goal met (overfunded, declared rollover cap)",
      "policy_parameters": {
        "goal": 120000,
        "years": 10,
        "annual_return_pct": 8,
        "current_balance": 60000,
        "rollover_cap": 35000
      },
      "output_payload": {
        "fv_current_balance": 129535.5,
        "funding_gap": -9535.5,
        "trace": "60000 * 1.08^10 = 129535.5 (2dp half-up); gap = 120000 - 129535.5 = -9535.5 (goal met by 9535.5); overfunded-to-Roth rollover note: the DECLARED lifetime rollover cap is 35000 -- a caller declaration echoed here, never a determination that any rollover is available or advisable",
        "overall": "GOAL_MET"
      },
      "golden_hash": "9657b4c5c779145b3f4711c75857fb50a06c336cea0d23c3e9eeb03917b49f8e"
    },
    {
      "name": "fail-closed absent inputs",
      "policy_parameters": {},
      "output_payload": {
        "fv_current_balance": null,
        "funding_gap": null,
        "trace": "fail-closed: goal must be a number in (0, 1000000000]; years must be an integer in [1, 100]; annual_return_pct must be a finite number in [-10, 30]; current_balance must be a finite number in [0, 1000000000]; no funding-gap computation performed -- correct the named inputs and resubmit. Education funding arithmetic over caller-declared synthetic inputs only: not financial advice, not a savings recommendation, and not a tax determination.",
        "overall": null,
        "domain_errors": [
          "INVALID_GOAL",
          "INVALID_YEARS",
          "INVALID_RETURN",
          "INVALID_BALANCE"
        ]
      },
      "golden_hash": "ac98ce183964986e75d007906e3f0d4d29754ea7a5df23694368ac0cea21566a"
    }
  ]
}
