{
  "tool_id": "art-663-apy-earned-recompute",
  "note": "Reachability vectors ONLY (AUTHORING-STANDARD 1.5): every vector here is kernel_generated by construction — its expectation is the kernel's own output, and each one exists to prove a declared refusal path actually fires. Never cited as conformance evidence. Each policy_parameters object is byte-identical to the reachability_vector declared for the corresponding refused branch in the branch inventory.",
  "vectors": [
    {
      "name": "empty-input-refuses-everything",
      "provenance": "kernel_generated",
      "policy_parameters": {},
      "expect": {
        "verdict": "INDETERMINATE",
        "manual_review_required": true,
        "flags_present": [
          "MISSING_INTEREST_EARNED",
          "MISSING_DAYS_IN_PERIOD",
          "MISSING_BALANCE_INPUT",
          "DISCLOSED_APY_ABSENT"
        ]
      }
    },
    {
      "name": "zero-average-daily-balance-refused",
      "provenance": "kernel_generated",
      "policy_parameters": {
        "interest_earned": 5.25,
        "days_in_period": 30,
        "average_daily_balance": 0,
        "disclosed_apy_earned": 6.58
      },
      "expect": {
        "verdict": "INDETERMINATE",
        "manual_review_required": true,
        "flags_present": [
          "AVERAGE_DAILY_BALANCE_NONPOSITIVE"
        ]
      }
    },
    {
      "name": "days-out-of-range-refused",
      "provenance": "kernel_generated",
      "policy_parameters": {
        "interest_earned": 5.25,
        "days_in_period": 400,
        "average_daily_balance": 1000,
        "disclosed_apy_earned": 6.58
      },
      "expect": {
        "verdict": "INDETERMINATE",
        "manual_review_required": true,
        "flags_present": [
          "DAYS_IN_PERIOD_OUT_OF_RANGE"
        ]
      }
    },
    {
      "name": "negative-interest-refused",
      "provenance": "kernel_generated",
      "policy_parameters": {
        "interest_earned": -1,
        "days_in_period": 30,
        "average_daily_balance": 1000,
        "disclosed_apy_earned": 6.58
      },
      "expect": {
        "verdict": "INDETERMINATE",
        "manual_review_required": true,
        "flags_present": [
          "NEGATIVE_INTEREST_EARNED"
        ]
      }
    },
    {
      "name": "special-formula-case-refused",
      "provenance": "kernel_generated",
      "policy_parameters": {
        "interest_earned": 4.11,
        "days_in_period": 30,
        "average_daily_balance": 1000,
        "disclosed_apy_earned": 5,
        "special_formula_declared": true
      },
      "expect": {
        "verdict": "INDETERMINATE",
        "manual_review_required": true,
        "flags_present": [
          "SPECIAL_FORMULA_NOT_IMPLEMENTED"
        ]
      }
    },
    {
      "name": "segment-days-mismatch-held",
      "provenance": "kernel_generated",
      "policy_parameters": {
        "interest_earned": 5.25,
        "days_in_period": 30,
        "balance_segments": [
          {
            "balance": 1500,
            "days": 15
          },
          {
            "balance": 500,
            "days": 14
          }
        ],
        "disclosed_apy_earned": 6.58
      },
      "expect": {
        "verdict": "INDETERMINATE",
        "manual_review_required": true,
        "flags_present": [
          "SEGMENT_DAYS_MISMATCH"
        ]
      }
    }
  ]
}
