Home Developers Evidence education.gpa_letter

Public evidence

education.gpa_letter

Machine-checked verification for calculation version 1.1.2 · tier engine_tested

Verification

16/16 calculation tests · Production surface contract 3/3

  • Golden tests 16 / 16
  • Boundary tests 0 / 0
  • Property tests 0 / 0
  • Production surface contract 3 / 3
  • }
  • Engine tested Yes
  • Source checked Yes
  • Artifact integrity PASS
  • Production attestation Embedded snapshot: STALE · Last attested schema matched 1.1.2 snapshot / local build · Semantic contract ✓ · Last attestation PASS · current evidence changed · re-attestation required · Public/cache ✓ · Origin ✓ · Live production status PASS (0 stale; 164 CURRENT) @ 2026-09-16T06:44:24.909Z
  • Semantic contract PASS
  • Evidence attested at 2026-09-16T06:44:24.203Z
  • Last production check 2026-09-16T06:44:24.203Z
  • Public / cache PASS
  • Origin PASS
  • Supplemental domain review Not performed
  • Named expert review Not performed
  • release artifacts aligned PASS
  • schema valid input executes PASS
  • schema rejects incomplete input PASS

Fingerprint sha256:78ffd7e2acbb2873491fbe410ff218b311b72d30c299cd1fba18642b74e1bb18

Input schema sha256:258a7b51431481323beae21596f2f06febf8da6cc157ffbfc895d2116fd58ec8 · Output schema sha256:5f6be44af76efeb83e06df0ae6e102fd28eb6104a3efeecb9cf92a4bb2b54748 · Build-time SHA-256 digests prove published artifacts agree with each other (release_integrity.scope=workspace). Production attestation GETs canonical URLs twice (public/cached view and origin), including Capability HTML, via npm run attest:production --write (published at /.well-known/calculatorx-production-attestation.json) and fails if the public Capability page advertises a different calculation_version. This is artifact consistency, not an independent immutable release log.

Build & scope

Engine identity and declared limitations.

Tool
gpa-to-letter
Engine
gpa-letter
Engine build
2026-09-15
Evidence core
2026-09-15T06:31:46.555Z
Rendered
2026-09-16T22:03:43.767Z
Last reviewed

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

Sources

Standards and references supporting this tool specification. Methods are listed separately — they are algorithms, not bibliographic sources.

Published checks

Golden, boundary, and property cases included in this evidence build.

IDKindStatusDetail
nearest-3.67-a-minusgoldenpassExpected letter=A- · matchedGpa=3.67 · tie=false · Actual value=A- · status=ok · mode=to-letter · scale=plus-minus · scaleLabel=Plus/minus 4.33 · match=nearest · inputGpa=3.67 · gpa=3.67
nearest-3.50-tie-up-a-minusgoldenpassExpected letter=A- · tie=true · Actual value=A- · status=ok · mode=to-letter · scale=plus-minus · scaleLabel=Plus/minus 4.33 · match=nearest · inputGpa=3.5 · gpa=3.5
nearest-3.4999-b-plusgoldenpassExpected letter=B+ · tie=false · Actual value=B+ · status=ok · mode=to-letter · scale=plus-minus · scaleLabel=Plus/minus 4.33 · match=nearest · inputGpa=3.4999 · gpa=3.4999
nearest-3.5001-a-minusgoldenpassExpected letter=A- · tie=false · Actual value=A- · status=ok · mode=to-letter · scale=plus-minus · scaleLabel=Plus/minus 4.33 · match=nearest · inputGpa=3.5001 · gpa=3.5001
floor-3.50-b-plusgoldenpassExpected letter=B+ · tie=false · Actual value=B+ · status=ok · mode=to-letter · scale=plus-minus · scaleLabel=Plus/minus 4.33 · match=floor · inputGpa=3.5 · gpa=3.5
nearest-3.835-tie-up-agoldenpassExpected letter=A · tie=true · Actual value=A · status=ok · mode=to-letter · scale=plus-minus · scaleLabel=Plus/minus 4.33 · match=nearest · inputGpa=3.835 · gpa=3.835
nearest-4.165-tie-up-a-plusgoldenpassExpected letter=A+ · tie=true · Actual value=A+ · status=ok · mode=to-letter · scale=plus-minus · scaleLabel=Plus/minus 4.33 · match=nearest · inputGpa=4.165 · gpa=4.165
nearest-3.33-b-plusgoldenpassExpected letter=B+ · matchedGpa=3.33 · tie=false · Actual value=B+ · status=ok · mode=to-letter · scale=plus-minus · scaleLabel=Plus/minus 4.33 · match=nearest · inputGpa=3.33 · gpa=3.33
letter-b-plus-pointsgoldenpassExpected value=3.33 · letter=B+ · Actual value=3.33 · status=ok · mode=to-gpa · scale=plus-minus · scaleLabel=Plus/minus 4.33 · gpa=3.33 · normalized=false · letter=B+
flat-3.50-tie-up-agoldenpassExpected letter=A · tie=true · Actual value=A · status=ok · mode=to-letter · scale=flat · scaleLabel=Flat 4.0 · match=nearest · inputGpa=3.5 · gpa=3.5
linear5-4.6-normalized-a-minusgoldenpassExpected letter=A- · gpa=3.68 · normalized=true · Actual value=A- · status=ok · mode=to-letter · scale=linear5 · scaleLabel=Linear 5.0 · match=nearest · inputGpa=4.6 · gpa=3.6799999999999997
linear5-alias-weightedgoldenpassExpected scale=linear5 · letter=A- · Actual value=A- · status=ok · mode=to-letter · scale=linear5 · scaleLabel=Linear 5.0 · match=nearest · inputGpa=4.6 · gpa=3.6799999999999997
negative-gpa-rejectedgoldenpassExpected status=invalid · code=GPA_OUT_OF_RANGE · 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
over-max-plus-minus-rejectedgoldenpassExpected status=invalid · code=GPA_OUT_OF_RANGE · 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
over-max-flat-rejectedgoldenpassExpected status=invalid · code=GPA_OUT_OF_RANGE · 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
over-max-linear5-rejectedgoldenpassExpected status=invalid · code=GPA_OUT_OF_RANGE · 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