{
  "tool_id": "art-619-ccd2-aprc-annex3-recompute",
  "kernel_id": "art-619-ccd2-aprc-annex3-recompute",
  "display_name": "CCD2 Annex III APRC Recompute",
  "tool_version": "1.0.0",
  "mandate_type": "compliance_mandate",
  "purpose": "Recomputes the EU Directive (EU) 2023/2225 (CCD2) annual percentage rate of charge (APRC) from a caller-supplied drawdown/repayment schedule against Annex III Part I's own present-value-equality equation, solved iteratively by bracketed bisection for the rate X. Unlike Reg Z Appendix J (art-215), Annex III's own text expresses each flow's interval directly in years and fractions of a year and raises (1+X) to that real-valued power with no integer/fraction split, so this kernel uses genuine fractional exponentiation. A rate is reported only when a sign-change bracket was established and narrowed to a declared tolerance; non-convergence and a non-bracketed schedule are both reported honestly (converged:false, bracketed:false, aprc_pct:null), never silently returned as a guess. The result is expressed to at least one decimal place per Annex III Part I remark (d), rounded half-up on the next digit. Architecturally class-C shaped (unbounded schedule arrays, iterative solver) and assigned class-B property-testing rigor by this row's own explicit ruling, not because the input domain is bounded. Verify-only recompute: does not determine which CCD2-covered agreements a caller's product falls under, does not submit anything to a regulator, and does not assert that a real agreement is or is not CCD2-compliant.",
  "control_description": "Recomputes the EU Directive (EU) 2023/2225 (CCD2) annual percentage rate of charge (APRC) from a caller-supplied drawdown/repayment schedule against Annex III Part I's own present-value-equality equation, solved iteratively by bracketed bisection for the rate X. Unlike Reg Z Appendix J (art-215), Annex III's own text expresses each flow's interval directly in years and fractions of a year and raises (1+X) to that real-valued power with no integer/fraction split, so this kernel uses genuine fractional exponentiation. A rate is reported only when a sign-change bracket was established and narrowed to a declared tolerance; non-convergence and a non-bracketed schedule are both reported honestly (converged:false, bracketed:false, aprc_pct:null), never silently returned as a guess. The result is expressed to at least one decimal place per Annex III Part I remark (d), rounded half-up on the next digit. Architecturally class-C shaped (unbounded schedule arrays, iterative solver) and assigned class-B property-testing rigor by this row's own explicit ruling, not because the input domain is bounded. Verify-only recompute: does not determine which CCD2-covered agreements a caller's product falls under, does not submit anything to a regulator, and does not assert that a real agreement is or is not CCD2-compliant.",
  "declared_inputs": [],
  "declared_outputs": [],
  "kernel_digest": "sha256:b6916f257c4bafb7ddf7dd00b907aae102f03c92267a3dd99876216548835032",
  "trust_label": "deferred: deterministic source published, zkVM proof not yet generated; New gpu:false node, art-619, staged 2026-08-14. GPU-CYCLE-PREFLIGHT-1's exec-cycle tool (runq-cpu) is not present in this session's environment, so no GPU proving was attempted -- ratchet-visible deferral per the §18 steady-state rule (RIDER-KERNEL.md), never a silent claim of proof. Note for whoever runs the preflight: this kernel calls Math.pow with a real-valued exponent (fractional-t present-value discounting, per Annex III's own equation shape) inside the bisection loop, which is one of GPU-CYCLE-PREFLIGHT-SPEC.md's named static pre-screen flags (non-sqrt transcendentals) -- measure user_cycles before booking, do not assume FAST.",
  "data_vintage": "2026-08-14",
  "last_validated": "2026-08-14",
  "conformance_fixtures_vendored": true,
  "compute_proof_ready": "deferred",
  "wave": 101,
  "source_url": "https://ainumbers.co/chaingraph/art-619-ccd2-aprc-annex3-recompute.html",
  "generated_at": "2026-08-15T13:38:12.876Z"
}
