{
  "capability_id": "education.gpa_letter",
  "tool_id": "gpa-to-letter",
  "engine": "gpa-letter",
  "calculation_version": "1.1.2",
  "generated_at": "2026-09-16T22:03:43.767Z",
  "engine_build": "2026-09-15",
  "test_count": 16,
  "passed": 16,
  "failed": 0,
  "tests_summary": {
    "golden": {
      "total": 16,
      "passed": 16
    },
    "boundary": {
      "total": 0,
      "passed": 0
    },
    "property": {
      "total": 0,
      "passed": 0
    }
  },
  "engine_tested": true,
  "expert_reviewed": false,
  "internally_reviewed": false,
  "review_kind": null,
  "source_checked": true,
  "reviewed_by": null,
  "reviewer_role": null,
  "last_reviewed": null,
  "expert_review": {
    "status": "optional_not_performed",
    "reviewer": null,
    "scope": [
      "formula",
      "input semantics",
      "assumptions",
      "limitations",
      "sources",
      "tests"
    ],
    "note": "Domain expert review is optional under CVP (CVP-EXP-01). Absence does not block CVP Verified. See Review policy for supplemental domain assurance."
  },
  "internal_review": {
    "status": "not_applicable",
    "reviewer": null
  },
  "page": "https://www.calculatorx.com/calc/grade/gpa-to-letter",
  "api": "https://www.calculatorx.com/api/v1/calc/gpa-to-letter",
  "schema_input": "https://www.calculatorx.com/schemas/education.gpa_letter.input.json",
  "schema_output": "https://www.calculatorx.com/schemas/education.gpa_letter.output.json",
  "assumptions": [
    "Default plus/minus map uses A+=4.33 … F=0.",
    "Percentage ranges are one common U.S. syllabus convention for the matched letter, not a function of the input GPA.",
    "Linear 5.0 assumes a 5.0 numeric ceiling linearly mapped to 4.0. It is not a generic weighted→unweighted GPA conversion.",
    "Nearest matching is an approximation algorithm, not a registrar rule for converting cumulative GPA back into a letter."
  ],
  "limitations": [
    "Interpretation of a numeric GPA or a single letter — not a registrar conversion",
    "Not a term or cumulative GPA from a course list (use the GPA calculator)",
    "Example percentage bands are syllabus conventions, not derived from GPA"
  ],
  "boundary_conditions": [
    "Plus/minus 4.33 requires 0 ≤ GPA ≤ 4.33; values outside that range are a validation error (not clamped).",
    "Flat 4.0 requires 0 ≤ GPA ≤ 4.00.",
    "Linear 5.0 requires 0 ≤ GPA ≤ 5.00, then scales by 4/5 before letter match.",
    "Nearest ties (equal distance to two grade points) prefer the higher letter, including 3.50 → A-, 3.835 → A, and 4.165 → A+ on plus/minus 4.33."
  ],
  "sources": [
    {
      "title": "University of Alabama — Grades and Grade Points",
      "section": "A+ = 4.33; A = 4.00; A− = 3.67; B+ = 3.33; … F = 0.00",
      "url": "https://catalog.ua.edu/undergraduate/about/academic-regulations/records/grades-grade-points-gpa/",
      "supports": "Published plus/minus 4.33 grade-point map used as this calculator’s default reference model",
      "kind": "reference",
      "accessed": "2026-08-18"
    },
    {
      "title": "Arizona State University Registrar — Grades and grading policies",
      "section": "A+ = 4.33 on the grading scale, but cumulative GPA is capped at 4.00",
      "url": "https://registrar.asu.edu/grades",
      "supports": "Same 4.33 letter points can still differ in how cumulative GPA is reported",
      "kind": "reference",
      "accessed": "2026-08-18"
    },
    {
      "title": "Simon Fraser University SIAT — Recommended grading scale",
      "section": "A− = 85–89.5% with A− = 3.67 grade points (not 90–92%)",
      "url": "https://www.sfu.ca/siat/programs/undergraduate/current-students/student-resources/grading-scale.html",
      "supports": "Percentage bands are school-specific even when grade points match 4.33 / 4.00 / 3.67",
      "kind": "reference",
      "accessed": "2026-08-18"
    },
    {
      "title": "University of California Admissions — GPA requirement",
      "section": "A/B/C/D map to 4/3/2/1, then extra honors/AP/IB points are added with a honors-point cap",
      "url": "https://admission.universityofcalifornia.edu/admission-requirements/first-year-requirements/gpa-requirement.html",
      "supports": "Why Linear 5.0 must not be described as a generic weighted→unweighted GPA conversion",
      "kind": "reference",
      "accessed": "2026-08-18"
    },
    {
      "title": "Randolph College Physics — Grade Scale",
      "section": "A+ = 97–100; A = 93–96; A− = 90–92; B+ = 87–89; … D− = 60–62; F = 0–59",
      "url": "https://physics.randolphcollege.edu/psheldon/classes/gradescale.html",
      "supports": "The example percentage-band table shown by this calculator (a published syllabus convention, not universal)",
      "kind": "reference",
      "accessed": "2026-08-18"
    },
    {
      "title": "St. Olaf College — Typical Grading Scale (Jill Dietz)",
      "section": "97–100% A/A+; 93–96% A; 90–92% A−; 87–89% B+; … 60–62% D−; <60% F",
      "url": "https://pages.stolaf.edu/dietz/typical-grading-scale/",
      "supports": "Independent published example of the same 97–100 / 93–96 / 90–92 syllabus convention",
      "kind": "reference",
      "accessed": "2026-08-18"
    }
  ],
  "methods": [],
  "fingerprint": "sha256:78ffd7e2acbb2873491fbe410ff218b311b72d30c299cd1fba18642b74e1bb18",
  "tests": [
    {
      "id": "nearest-3.67-a-minus",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "to-letter",
        "scale": "plus-minus",
        "match": "nearest",
        "gpa": 3.67
      },
      "expect": {
        "letter": "A-",
        "matchedGpa": 3.67,
        "tie": false
      },
      "expectWarning": null,
      "actual": {
        "status": "ok",
        "code": null,
        "message": null,
        "mode": "to-letter",
        "scale": "plus-minus",
        "scaleLabel": "Plus/minus 4.33",
        "match": "nearest",
        "inputGpa": 3.67,
        "gpa": 3.67,
        "normalized": false,
        "letter": "A-",
        "matchedGpa": 3.67,
        "pct": "90–92%",
        "tie": false,
        "credits": null,
        "qualityPoints": null,
        "value": "A-"
      },
      "tol": 1e-9
    },
    {
      "id": "nearest-3.50-tie-up-a-minus",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "to-letter",
        "scale": "plus-minus",
        "match": "nearest",
        "gpa": 3.5
      },
      "expect": {
        "letter": "A-",
        "tie": true
      },
      "expectWarning": null,
      "actual": {
        "status": "ok",
        "code": null,
        "message": null,
        "mode": "to-letter",
        "scale": "plus-minus",
        "scaleLabel": "Plus/minus 4.33",
        "match": "nearest",
        "inputGpa": 3.5,
        "gpa": 3.5,
        "normalized": false,
        "letter": "A-",
        "matchedGpa": 3.67,
        "pct": "90–92%",
        "tie": true,
        "credits": null,
        "qualityPoints": null,
        "value": "A-"
      },
      "tol": 1e-9
    },
    {
      "id": "nearest-3.4999-b-plus",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "to-letter",
        "scale": "plus-minus",
        "match": "nearest",
        "gpa": 3.4999
      },
      "expect": {
        "letter": "B+",
        "tie": false
      },
      "expectWarning": null,
      "actual": {
        "status": "ok",
        "code": null,
        "message": null,
        "mode": "to-letter",
        "scale": "plus-minus",
        "scaleLabel": "Plus/minus 4.33",
        "match": "nearest",
        "inputGpa": 3.4999,
        "gpa": 3.4999,
        "normalized": false,
        "letter": "B+",
        "matchedGpa": 3.33,
        "pct": "87–89%",
        "tie": false,
        "credits": null,
        "qualityPoints": null,
        "value": "B+"
      },
      "tol": null
    },
    {
      "id": "nearest-3.5001-a-minus",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "to-letter",
        "scale": "plus-minus",
        "match": "nearest",
        "gpa": 3.5001
      },
      "expect": {
        "letter": "A-",
        "tie": false
      },
      "expectWarning": null,
      "actual": {
        "status": "ok",
        "code": null,
        "message": null,
        "mode": "to-letter",
        "scale": "plus-minus",
        "scaleLabel": "Plus/minus 4.33",
        "match": "nearest",
        "inputGpa": 3.5001,
        "gpa": 3.5001,
        "normalized": false,
        "letter": "A-",
        "matchedGpa": 3.67,
        "pct": "90–92%",
        "tie": false,
        "credits": null,
        "qualityPoints": null,
        "value": "A-"
      },
      "tol": null
    },
    {
      "id": "floor-3.50-b-plus",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "to-letter",
        "scale": "plus-minus",
        "match": "floor",
        "gpa": 3.5
      },
      "expect": {
        "letter": "B+",
        "tie": false
      },
      "expectWarning": null,
      "actual": {
        "status": "ok",
        "code": null,
        "message": null,
        "mode": "to-letter",
        "scale": "plus-minus",
        "scaleLabel": "Plus/minus 4.33",
        "match": "floor",
        "inputGpa": 3.5,
        "gpa": 3.5,
        "normalized": false,
        "letter": "B+",
        "matchedGpa": 3.33,
        "pct": "87–89%",
        "tie": false,
        "credits": null,
        "qualityPoints": null,
        "value": "B+"
      },
      "tol": null
    },
    {
      "id": "nearest-3.835-tie-up-a",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "to-letter",
        "scale": "plus-minus",
        "match": "nearest",
        "gpa": 3.835
      },
      "expect": {
        "letter": "A",
        "tie": true
      },
      "expectWarning": null,
      "actual": {
        "status": "ok",
        "code": null,
        "message": null,
        "mode": "to-letter",
        "scale": "plus-minus",
        "scaleLabel": "Plus/minus 4.33",
        "match": "nearest",
        "inputGpa": 3.835,
        "gpa": 3.835,
        "normalized": false,
        "letter": "A",
        "matchedGpa": 4,
        "pct": "93–96%",
        "tie": true,
        "credits": null,
        "qualityPoints": null,
        "value": "A"
      },
      "tol": null
    },
    {
      "id": "nearest-4.165-tie-up-a-plus",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "to-letter",
        "scale": "plus-minus",
        "match": "nearest",
        "gpa": 4.165
      },
      "expect": {
        "letter": "A+",
        "tie": true
      },
      "expectWarning": null,
      "actual": {
        "status": "ok",
        "code": null,
        "message": null,
        "mode": "to-letter",
        "scale": "plus-minus",
        "scaleLabel": "Plus/minus 4.33",
        "match": "nearest",
        "inputGpa": 4.165,
        "gpa": 4.165,
        "normalized": false,
        "letter": "A+",
        "matchedGpa": 4.33,
        "pct": "97–100%",
        "tie": true,
        "credits": null,
        "qualityPoints": null,
        "value": "A+"
      },
      "tol": null
    },
    {
      "id": "nearest-3.33-b-plus",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "to-letter",
        "scale": "plus-minus",
        "match": "nearest",
        "gpa": 3.33
      },
      "expect": {
        "letter": "B+",
        "matchedGpa": 3.33,
        "tie": false
      },
      "expectWarning": null,
      "actual": {
        "status": "ok",
        "code": null,
        "message": null,
        "mode": "to-letter",
        "scale": "plus-minus",
        "scaleLabel": "Plus/minus 4.33",
        "match": "nearest",
        "inputGpa": 3.33,
        "gpa": 3.33,
        "normalized": false,
        "letter": "B+",
        "matchedGpa": 3.33,
        "pct": "87–89%",
        "tie": false,
        "credits": null,
        "qualityPoints": null,
        "value": "B+"
      },
      "tol": 1e-9
    },
    {
      "id": "letter-b-plus-points",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "to-gpa",
        "scale": "plus-minus",
        "letter": "B+"
      },
      "expect": {
        "value": 3.33,
        "letter": "B+"
      },
      "expectWarning": null,
      "actual": {
        "status": "ok",
        "code": null,
        "message": null,
        "mode": "to-gpa",
        "scale": "plus-minus",
        "scaleLabel": "Plus/minus 4.33",
        "match": null,
        "inputGpa": null,
        "gpa": 3.33,
        "normalized": false,
        "letter": "B+",
        "matchedGpa": 3.33,
        "pct": "87–89%",
        "tie": false,
        "credits": null,
        "qualityPoints": null,
        "value": 3.33,
        "legacyScale": null
      },
      "tol": 1e-9
    },
    {
      "id": "flat-3.50-tie-up-a",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "to-letter",
        "scale": "flat",
        "match": "nearest",
        "gpa": 3.5
      },
      "expect": {
        "letter": "A",
        "tie": true
      },
      "expectWarning": null,
      "actual": {
        "status": "ok",
        "code": null,
        "message": null,
        "mode": "to-letter",
        "scale": "flat",
        "scaleLabel": "Flat 4.0",
        "match": "nearest",
        "inputGpa": 3.5,
        "gpa": 3.5,
        "normalized": false,
        "letter": "A",
        "matchedGpa": 4,
        "pct": "90–100%",
        "tie": true,
        "credits": null,
        "qualityPoints": null,
        "value": "A"
      },
      "tol": null
    },
    {
      "id": "linear5-4.6-normalized-a-minus",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "to-letter",
        "scale": "linear5",
        "match": "nearest",
        "gpa": 4.6
      },
      "expect": {
        "letter": "A-",
        "gpa": 3.68,
        "normalized": true
      },
      "expectWarning": null,
      "actual": {
        "status": "ok",
        "code": null,
        "message": null,
        "mode": "to-letter",
        "scale": "linear5",
        "scaleLabel": "Linear 5.0",
        "match": "nearest",
        "inputGpa": 4.6,
        "gpa": 3.6799999999999997,
        "normalized": true,
        "letter": "A-",
        "matchedGpa": 3.67,
        "pct": "90–92%",
        "tie": false,
        "credits": null,
        "qualityPoints": null,
        "value": "A-"
      },
      "tol": 1e-9
    },
    {
      "id": "linear5-alias-weighted",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "to-letter",
        "scale": "weighted",
        "match": "nearest",
        "gpa": 4.6
      },
      "expect": {
        "scale": "linear5",
        "letter": "A-"
      },
      "expectWarning": null,
      "actual": {
        "status": "ok",
        "code": null,
        "message": null,
        "mode": "to-letter",
        "scale": "linear5",
        "scaleLabel": "Linear 5.0",
        "match": "nearest",
        "inputGpa": 4.6,
        "gpa": 3.6799999999999997,
        "normalized": true,
        "letter": "A-",
        "matchedGpa": 3.67,
        "pct": "90–92%",
        "tie": false,
        "credits": null,
        "qualityPoints": null,
        "value": "A-"
      },
      "tol": null
    },
    {
      "id": "negative-gpa-rejected",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "to-letter",
        "scale": "plus-minus",
        "match": "nearest",
        "gpa": -2
      },
      "expect": {
        "status": "invalid",
        "code": "GPA_OUT_OF_RANGE"
      },
      "expectWarning": null,
      "actual": {
        "status": "invalid",
        "code": "GPA_OUT_OF_RANGE",
        "message": "GPA must be between 0 and 4.33 for this scale.",
        "mode": "to-letter",
        "scale": "plus-minus",
        "scaleLabel": "Plus/minus 4.33",
        "match": "nearest",
        "inputGpa": -2,
        "gpa": null,
        "normalized": false,
        "letter": null,
        "matchedGpa": null,
        "pct": null,
        "tie": false,
        "credits": null,
        "qualityPoints": null,
        "value": null,
        "legacyScale": null
      },
      "tol": null
    },
    {
      "id": "over-max-plus-minus-rejected",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "to-letter",
        "scale": "plus-minus",
        "match": "nearest",
        "gpa": 4.5
      },
      "expect": {
        "status": "invalid",
        "code": "GPA_OUT_OF_RANGE"
      },
      "expectWarning": null,
      "actual": {
        "status": "invalid",
        "code": "GPA_OUT_OF_RANGE",
        "message": "GPA must be between 0 and 4.33 for this scale.",
        "mode": "to-letter",
        "scale": "plus-minus",
        "scaleLabel": "Plus/minus 4.33",
        "match": "nearest",
        "inputGpa": 4.5,
        "gpa": null,
        "normalized": false,
        "letter": null,
        "matchedGpa": null,
        "pct": null,
        "tie": false,
        "credits": null,
        "qualityPoints": null,
        "value": null,
        "legacyScale": null
      },
      "tol": null
    },
    {
      "id": "over-max-flat-rejected",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "to-letter",
        "scale": "flat",
        "match": "nearest",
        "gpa": 4.01
      },
      "expect": {
        "status": "invalid",
        "code": "GPA_OUT_OF_RANGE"
      },
      "expectWarning": null,
      "actual": {
        "status": "invalid",
        "code": "GPA_OUT_OF_RANGE",
        "message": "GPA must be between 0 and 4.00 for this scale.",
        "mode": "to-letter",
        "scale": "flat",
        "scaleLabel": "Flat 4.0",
        "match": "nearest",
        "inputGpa": 4.01,
        "gpa": null,
        "normalized": false,
        "letter": null,
        "matchedGpa": null,
        "pct": null,
        "tie": false,
        "credits": null,
        "qualityPoints": null,
        "value": null,
        "legacyScale": null
      },
      "tol": null
    },
    {
      "id": "over-max-linear5-rejected",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "to-letter",
        "scale": "linear5",
        "match": "nearest",
        "gpa": 5.1
      },
      "expect": {
        "status": "invalid",
        "code": "GPA_OUT_OF_RANGE"
      },
      "expectWarning": null,
      "actual": {
        "status": "invalid",
        "code": "GPA_OUT_OF_RANGE",
        "message": "GPA must be between 0 and 5.00 for this scale.",
        "mode": "to-letter",
        "scale": "linear5",
        "scaleLabel": "Linear 5.0",
        "match": "nearest",
        "inputGpa": 5.1,
        "gpa": null,
        "normalized": false,
        "letter": null,
        "matchedGpa": null,
        "pct": null,
        "tie": false,
        "credits": null,
        "qualityPoints": null,
        "value": null,
        "legacyScale": null
      },
      "tol": null
    }
  ],
  "tier": "engine_tested",
  "verification": {
    "tests": {
      "passed": 16,
      "total": 16,
      "golden": 16,
      "boundary": 0,
      "property": 0
    },
    "contract_checks": {
      "passed": 3,
      "total": 3
    }
  },
  "evidence_core_generated_at": "2026-09-15T06:31:46.555Z",
  "rendered_at": "2026-09-16T22:03:43.767Z",
  "release_integrity": {
    "status": "verified",
    "scope": "workspace",
    "production_attestation_required": true,
    "calculation_version": "1.1.2",
    "artifacts": {
      "engine": "1.1.2",
      "page": "1.1.2",
      "capability": "1.1.2",
      "evidence": "1.1.2",
      "input_schema": "1.1.2",
      "output_schema": "1.1.2",
      "mcp_contract": "1.1.2"
    },
    "digests": {
      "input_schema_sha256": "258a7b51431481323beae21596f2f06febf8da6cc157ffbfc895d2116fd58ec8",
      "output_schema_sha256": "5f6be44af76efeb83e06df0ae6e102fd28eb6104a3efeecb9cf92a4bb2b54748",
      "evidence_sha256": "70920e3179d559c32b0614e280b5c6086104c8125a1537a0def643121deacae4",
      "evidence_core_sha256": "70920e3179d559c32b0614e280b5c6086104c8125a1537a0def643121deacae4",
      "capability_sha256": "bd68d6c0ec3a43678ba3e77a8c5ddba678cd1f45cebeb68075e711f594058a0c",
      "engine_sha256": "c8d4ccdbfeaf61d7b024d4e1babb0c2ba3b324c1b37bd0cb456a526d8d2b1bd1",
      "mcp_contract_sha256": "863098b311a7b17dc4b229a6302b90b3545b175f716e5d84772c7be8e9716b86"
    },
    "contract_checks": {
      "total": 3,
      "passed": 3,
      "failed": 0,
      "items": [
        {
          "id": "release-artifacts-aligned",
          "status": "pass",
          "detail": "1.1.2"
        },
        {
          "id": "schema-valid-input-executes",
          "status": "pass"
        },
        {
          "id": "schema-rejects-incomplete-input",
          "status": "pass"
        }
      ]
    },
    "report": "https://www.calculatorx.com/.well-known/calculatorx-release-integrity.json"
  }
}
