{
 "schema": "ug-calc-trace-set/1",
 "title": "GCSE grade calculation, every line checked",
 "page": "https://gcsegenius.co.uk/gcse-tools/labs/gcse-grade-calculation-proof?utm_source=labs&utm_medium=page&utm_campaign=gcse-grade-calculation-proof&utm_content=download",
 "start": {
  "url": "https://gcsegenius.co.uk/gcse-maths/learn?utm_source=labs&utm_medium=page&utm_campaign=gcse-grade-calculation-proof&utm_content=download",
  "label": "Start GCSE Maths free"
 },
 "generated": "2026-10-06",
 "howToCheck": "Re-run each step in order. A const step's value equals its literal. Any other step's value equals its op applied to the values of the step ids in args, in exact fractions (values are stored as p/q). Ops: add, sub, mul, div (element by element on lists), sum, dot, min, max, ge (1 or 0), if (cond, then, else), floor, roundHalfUp, roundHalfEven, lookup (table, key, column), pick (cond, label, ..., fallback).",
 "licence": "Free to reuse with a link to the page above.",
 "traces": [
  {
   "schema": "ug-calc-trace/1",
   "id": "gcse-edexcel-higher-2026",
   "title": "Edexcel GCSE Mathematics Higher, June 2026: 52 + 48 + 47",
   "tool": {
    "name": "GCSE grade calculator",
    "url": "https://gcsegenius.co.uk/gcse-tools/gcse-grade-calculator?utm_source=labs&utm_medium=page&utm_campaign=gcse-grade-calculation-proof&utm_content=download"
   },
   "inputs": [
    {
     "label": "Qualification",
     "value": "Edexcel GCSE Mathematics Higher, June 2026"
    },
    {
     "label": "Paper 1",
     "value": "52 of 80"
    },
    {
     "label": "Paper 2",
     "value": "48 of 80"
    },
    {
     "label": "Paper 3",
     "value": "47 of 80"
    }
   ],
   "sources": [
    {
     "id": "board",
     "publisher": "Pearson Edexcel",
     "title": "GCSE grade boundaries, June 2026",
     "url": "https://qualifications.pearson.com/content/dam/pdf/Support/Grade-boundaries/GCSE/grade-boundaries-june-2026-gcse.pdf"
    }
   ],
   "steps": [
    {
     "id": "s1",
     "say": "Paper 1 mark, out of 80",
     "op": "const",
     "literal": "52",
     "key": true,
     "value": "52"
    },
    {
     "id": "s2",
     "say": "Paper 2 mark, out of 80",
     "op": "const",
     "literal": "48",
     "key": true,
     "value": "48"
    },
    {
     "id": "s3",
     "say": "Paper 3 mark, out of 80",
     "op": "const",
     "literal": "47",
     "key": true,
     "value": "47"
    },
    {
     "id": "s4",
     "say": "Total mark: the papers added together",
     "op": "sum",
     "args": [
      "s1",
      "s2",
      "s3"
     ],
     "key": true,
     "value": "147"
    },
    {
     "id": "s5",
     "say": "Maximum total",
     "op": "const",
     "literal": "240",
     "src": "board",
     "value": "240"
    },
    {
     "id": "s6",
     "say": "Grade 9 boundary (lowest total for grade 9)",
     "op": "const",
     "literal": "208",
     "src": "board",
     "value": "208"
    },
    {
     "id": "s7",
     "say": "Does the total reach grade 9? (1 yes, 0 no)",
     "op": "ge",
     "args": [
      "s4",
      "s6"
     ],
     "value": "0"
    },
    {
     "id": "s8",
     "say": "Grade 9",
     "op": "const",
     "literal": {
      "text": "9"
     },
     "value": {
      "text": "9"
     }
    },
    {
     "id": "s9",
     "say": "Grade 8 boundary (lowest total for grade 8)",
     "op": "const",
     "literal": "177",
     "src": "board",
     "value": "177"
    },
    {
     "id": "s10",
     "say": "Does the total reach grade 8? (1 yes, 0 no)",
     "op": "ge",
     "args": [
      "s4",
      "s9"
     ],
     "value": "0"
    },
    {
     "id": "s11",
     "say": "Grade 8",
     "op": "const",
     "literal": {
      "text": "8"
     },
     "value": {
      "text": "8"
     }
    },
    {
     "id": "s12",
     "say": "Grade 7 boundary (lowest total for grade 7)",
     "op": "const",
     "literal": "146",
     "src": "board",
     "value": "146"
    },
    {
     "id": "s13",
     "say": "Does the total reach grade 7? (1 yes, 0 no)",
     "op": "ge",
     "args": [
      "s4",
      "s12"
     ],
     "value": "1"
    },
    {
     "id": "s14",
     "say": "Grade 7",
     "op": "const",
     "literal": {
      "text": "7"
     },
     "value": {
      "text": "7"
     }
    },
    {
     "id": "s15",
     "say": "Grade 6 boundary (lowest total for grade 6)",
     "op": "const",
     "literal": "114",
     "src": "board",
     "value": "114"
    },
    {
     "id": "s16",
     "say": "Does the total reach grade 6? (1 yes, 0 no)",
     "op": "ge",
     "args": [
      "s4",
      "s15"
     ],
     "value": "1"
    },
    {
     "id": "s17",
     "say": "Grade 6",
     "op": "const",
     "literal": {
      "text": "6"
     },
     "value": {
      "text": "6"
     }
    },
    {
     "id": "s18",
     "say": "Grade 5 boundary (lowest total for grade 5)",
     "op": "const",
     "literal": "82",
     "src": "board",
     "value": "82"
    },
    {
     "id": "s19",
     "say": "Does the total reach grade 5? (1 yes, 0 no)",
     "op": "ge",
     "args": [
      "s4",
      "s18"
     ],
     "value": "1"
    },
    {
     "id": "s20",
     "say": "Grade 5",
     "op": "const",
     "literal": {
      "text": "5"
     },
     "value": {
      "text": "5"
     }
    },
    {
     "id": "s21",
     "say": "Grade 4 boundary (lowest total for grade 4)",
     "op": "const",
     "literal": "50",
     "src": "board",
     "value": "50"
    },
    {
     "id": "s22",
     "say": "Does the total reach grade 4? (1 yes, 0 no)",
     "op": "ge",
     "args": [
      "s4",
      "s21"
     ],
     "value": "1"
    },
    {
     "id": "s23",
     "say": "Grade 4",
     "op": "const",
     "literal": {
      "text": "4"
     },
     "value": {
      "text": "4"
     }
    },
    {
     "id": "s24",
     "say": "Grade 3 boundary (lowest total for grade 3)",
     "op": "const",
     "literal": "34",
     "src": "board",
     "value": "34"
    },
    {
     "id": "s25",
     "say": "Does the total reach grade 3? (1 yes, 0 no)",
     "op": "ge",
     "args": [
      "s4",
      "s24"
     ],
     "value": "1"
    },
    {
     "id": "s26",
     "say": "Grade 3",
     "op": "const",
     "literal": {
      "text": "3"
     },
     "value": {
      "text": "3"
     }
    },
    {
     "id": "s27",
     "say": "Below every boundary",
     "op": "const",
     "literal": {
      "text": "U"
     },
     "value": {
      "text": "U"
     }
    },
    {
     "id": "s28",
     "say": "The highest grade whose boundary the total reaches",
     "op": "pick",
     "args": [
      "s7",
      "s8",
      "s10",
      "s11",
      "s13",
      "s14",
      "s16",
      "s17",
      "s19",
      "s20",
      "s22",
      "s23",
      "s25",
      "s26",
      "s27"
     ],
     "key": true,
     "value": {
      "text": "7"
     }
    },
    {
     "id": "s29",
     "say": "Per cent",
     "op": "const",
     "literal": "100",
     "value": "100"
    },
    {
     "id": "s30",
     "say": "Total divided by maximum",
     "op": "div",
     "args": [
      "s4",
      "s5"
     ],
     "value": "49/80"
    },
    {
     "id": "s31",
     "say": "Total as a percentage of the maximum (for reference only)",
     "op": "mul",
     "args": [
      "s30",
      "s29"
     ],
     "value": "245/4"
    }
   ],
   "result": "s28",
   "answer": "Grade 7",
   "generated": "2026-10-06"
  },
  {
   "schema": "ug-calc-trace/1",
   "id": "gcse-aqa-foundation-2026",
   "title": "AQA GCSE Mathematics Foundation, June 2026: 55 + 50 + 50",
   "tool": {
    "name": "GCSE grade calculator",
    "url": "https://gcsegenius.co.uk/gcse-tools/gcse-grade-calculator?utm_source=labs&utm_medium=page&utm_campaign=gcse-grade-calculation-proof&utm_content=download"
   },
   "inputs": [
    {
     "label": "Qualification",
     "value": "AQA GCSE Mathematics Foundation, June 2026"
    },
    {
     "label": "Paper 1",
     "value": "55 of 80"
    },
    {
     "label": "Paper 2",
     "value": "50 of 80"
    },
    {
     "label": "Paper 3",
     "value": "50 of 80"
    }
   ],
   "sources": [
    {
     "id": "board",
     "publisher": "AQA",
     "title": "GCSE grade boundaries, June 2026",
     "url": "https://cdn.sanity.io/files/p28bar15/green/a8c1634eeced8e0ef79b2d179398dfd2414ee291.pdf"
    }
   ],
   "steps": [
    {
     "id": "s1",
     "say": "Paper 1 mark, out of 80",
     "op": "const",
     "literal": "55",
     "key": true,
     "value": "55"
    },
    {
     "id": "s2",
     "say": "Paper 2 mark, out of 80",
     "op": "const",
     "literal": "50",
     "key": true,
     "value": "50"
    },
    {
     "id": "s3",
     "say": "Paper 3 mark, out of 80",
     "op": "const",
     "literal": "50",
     "key": true,
     "value": "50"
    },
    {
     "id": "s4",
     "say": "Total mark: the papers added together",
     "op": "sum",
     "args": [
      "s1",
      "s2",
      "s3"
     ],
     "key": true,
     "value": "155"
    },
    {
     "id": "s5",
     "say": "Maximum total",
     "op": "const",
     "literal": "240",
     "src": "board",
     "value": "240"
    },
    {
     "id": "s6",
     "say": "Grade 5 boundary (lowest total for grade 5)",
     "op": "const",
     "literal": "187",
     "src": "board",
     "value": "187"
    },
    {
     "id": "s7",
     "say": "Does the total reach grade 5? (1 yes, 0 no)",
     "op": "ge",
     "args": [
      "s4",
      "s6"
     ],
     "value": "0"
    },
    {
     "id": "s8",
     "say": "Grade 5",
     "op": "const",
     "literal": {
      "text": "5"
     },
     "value": {
      "text": "5"
     }
    },
    {
     "id": "s9",
     "say": "Grade 4 boundary (lowest total for grade 4)",
     "op": "const",
     "literal": "154",
     "src": "board",
     "value": "154"
    },
    {
     "id": "s10",
     "say": "Does the total reach grade 4? (1 yes, 0 no)",
     "op": "ge",
     "args": [
      "s4",
      "s9"
     ],
     "value": "1"
    },
    {
     "id": "s11",
     "say": "Grade 4",
     "op": "const",
     "literal": {
      "text": "4"
     },
     "value": {
      "text": "4"
     }
    },
    {
     "id": "s12",
     "say": "Grade 3 boundary (lowest total for grade 3)",
     "op": "const",
     "literal": "115",
     "src": "board",
     "value": "115"
    },
    {
     "id": "s13",
     "say": "Does the total reach grade 3? (1 yes, 0 no)",
     "op": "ge",
     "args": [
      "s4",
      "s12"
     ],
     "value": "1"
    },
    {
     "id": "s14",
     "say": "Grade 3",
     "op": "const",
     "literal": {
      "text": "3"
     },
     "value": {
      "text": "3"
     }
    },
    {
     "id": "s15",
     "say": "Grade 2 boundary (lowest total for grade 2)",
     "op": "const",
     "literal": "76",
     "src": "board",
     "value": "76"
    },
    {
     "id": "s16",
     "say": "Does the total reach grade 2? (1 yes, 0 no)",
     "op": "ge",
     "args": [
      "s4",
      "s15"
     ],
     "value": "1"
    },
    {
     "id": "s17",
     "say": "Grade 2",
     "op": "const",
     "literal": {
      "text": "2"
     },
     "value": {
      "text": "2"
     }
    },
    {
     "id": "s18",
     "say": "Grade 1 boundary (lowest total for grade 1)",
     "op": "const",
     "literal": "38",
     "src": "board",
     "value": "38"
    },
    {
     "id": "s19",
     "say": "Does the total reach grade 1? (1 yes, 0 no)",
     "op": "ge",
     "args": [
      "s4",
      "s18"
     ],
     "value": "1"
    },
    {
     "id": "s20",
     "say": "Grade 1",
     "op": "const",
     "literal": {
      "text": "1"
     },
     "value": {
      "text": "1"
     }
    },
    {
     "id": "s21",
     "say": "Below every boundary",
     "op": "const",
     "literal": {
      "text": "U"
     },
     "value": {
      "text": "U"
     }
    },
    {
     "id": "s22",
     "say": "The highest grade whose boundary the total reaches",
     "op": "pick",
     "args": [
      "s7",
      "s8",
      "s10",
      "s11",
      "s13",
      "s14",
      "s16",
      "s17",
      "s19",
      "s20",
      "s21"
     ],
     "key": true,
     "value": {
      "text": "4"
     }
    },
    {
     "id": "s23",
     "say": "Per cent",
     "op": "const",
     "literal": "100",
     "value": "100"
    },
    {
     "id": "s24",
     "say": "Total divided by maximum",
     "op": "div",
     "args": [
      "s4",
      "s5"
     ],
     "value": "31/48"
    },
    {
     "id": "s25",
     "say": "Total as a percentage of the maximum (for reference only)",
     "op": "mul",
     "args": [
      "s24",
      "s23"
     ],
     "value": "775/12"
    }
   ],
   "result": "s22",
   "answer": "Grade 4",
   "generated": "2026-10-06"
  },
  {
   "schema": "ug-calc-trace/1",
   "id": "gcse-ocr-higher-2026",
   "title": "OCR GCSE Mathematics Higher, June 2026: 61 + 54 + 58",
   "tool": {
    "name": "GCSE grade calculator",
    "url": "https://gcsegenius.co.uk/gcse-tools/gcse-grade-calculator?utm_source=labs&utm_medium=page&utm_campaign=gcse-grade-calculation-proof&utm_content=download"
   },
   "inputs": [
    {
     "label": "Qualification",
     "value": "OCR GCSE Mathematics Higher, June 2026"
    },
    {
     "label": "Paper 1",
     "value": "61 of 100"
    },
    {
     "label": "Paper 2",
     "value": "54 of 100"
    },
    {
     "label": "Paper 3",
     "value": "58 of 100"
    }
   ],
   "sources": [
    {
     "id": "board",
     "publisher": "OCR",
     "title": "GCSE grade boundaries, June 2026",
     "url": "https://www.ocr.org.uk/Images/760866-gcse-grade-boundaries-june-2026.pdf"
    }
   ],
   "steps": [
    {
     "id": "s1",
     "say": "Paper 1 mark, out of 100",
     "op": "const",
     "literal": "61",
     "key": true,
     "value": "61"
    },
    {
     "id": "s2",
     "say": "Paper 2 mark, out of 100",
     "op": "const",
     "literal": "54",
     "key": true,
     "value": "54"
    },
    {
     "id": "s3",
     "say": "Paper 3 mark, out of 100",
     "op": "const",
     "literal": "58",
     "key": true,
     "value": "58"
    },
    {
     "id": "s4",
     "say": "Total mark: the papers added together",
     "op": "sum",
     "args": [
      "s1",
      "s2",
      "s3"
     ],
     "key": true,
     "value": "173"
    },
    {
     "id": "s5",
     "say": "Maximum total",
     "op": "const",
     "literal": "300",
     "src": "board",
     "value": "300"
    },
    {
     "id": "s6",
     "say": "Grade 9 boundary (lowest total for grade 9)",
     "op": "const",
     "literal": "264",
     "src": "board",
     "value": "264"
    },
    {
     "id": "s7",
     "say": "Does the total reach grade 9? (1 yes, 0 no)",
     "op": "ge",
     "args": [
      "s4",
      "s6"
     ],
     "value": "0"
    },
    {
     "id": "s8",
     "say": "Grade 9",
     "op": "const",
     "literal": {
      "text": "9"
     },
     "value": {
      "text": "9"
     }
    },
    {
     "id": "s9",
     "say": "Grade 8 boundary (lowest total for grade 8)",
     "op": "const",
     "literal": "217",
     "src": "board",
     "value": "217"
    },
    {
     "id": "s10",
     "say": "Does the total reach grade 8? (1 yes, 0 no)",
     "op": "ge",
     "args": [
      "s4",
      "s9"
     ],
     "value": "0"
    },
    {
     "id": "s11",
     "say": "Grade 8",
     "op": "const",
     "literal": {
      "text": "8"
     },
     "value": {
      "text": "8"
     }
    },
    {
     "id": "s12",
     "say": "Grade 7 boundary (lowest total for grade 7)",
     "op": "const",
     "literal": "170",
     "src": "board",
     "value": "170"
    },
    {
     "id": "s13",
     "say": "Does the total reach grade 7? (1 yes, 0 no)",
     "op": "ge",
     "args": [
      "s4",
      "s12"
     ],
     "value": "1"
    },
    {
     "id": "s14",
     "say": "Grade 7",
     "op": "const",
     "literal": {
      "text": "7"
     },
     "value": {
      "text": "7"
     }
    },
    {
     "id": "s15",
     "say": "Grade 6 boundary (lowest total for grade 6)",
     "op": "const",
     "literal": "132",
     "src": "board",
     "value": "132"
    },
    {
     "id": "s16",
     "say": "Does the total reach grade 6? (1 yes, 0 no)",
     "op": "ge",
     "args": [
      "s4",
      "s15"
     ],
     "value": "1"
    },
    {
     "id": "s17",
     "say": "Grade 6",
     "op": "const",
     "literal": {
      "text": "6"
     },
     "value": {
      "text": "6"
     }
    },
    {
     "id": "s18",
     "say": "Grade 5 boundary (lowest total for grade 5)",
     "op": "const",
     "literal": "94",
     "src": "board",
     "value": "94"
    },
    {
     "id": "s19",
     "say": "Does the total reach grade 5? (1 yes, 0 no)",
     "op": "ge",
     "args": [
      "s4",
      "s18"
     ],
     "value": "1"
    },
    {
     "id": "s20",
     "say": "Grade 5",
     "op": "const",
     "literal": {
      "text": "5"
     },
     "value": {
      "text": "5"
     }
    },
    {
     "id": "s21",
     "say": "Grade 4 boundary (lowest total for grade 4)",
     "op": "const",
     "literal": "57",
     "src": "board",
     "value": "57"
    },
    {
     "id": "s22",
     "say": "Does the total reach grade 4? (1 yes, 0 no)",
     "op": "ge",
     "args": [
      "s4",
      "s21"
     ],
     "value": "1"
    },
    {
     "id": "s23",
     "say": "Grade 4",
     "op": "const",
     "literal": {
      "text": "4"
     },
     "value": {
      "text": "4"
     }
    },
    {
     "id": "s24",
     "say": "Grade 3 boundary (lowest total for grade 3)",
     "op": "const",
     "literal": "38",
     "src": "board",
     "value": "38"
    },
    {
     "id": "s25",
     "say": "Does the total reach grade 3? (1 yes, 0 no)",
     "op": "ge",
     "args": [
      "s4",
      "s24"
     ],
     "value": "1"
    },
    {
     "id": "s26",
     "say": "Grade 3",
     "op": "const",
     "literal": {
      "text": "3"
     },
     "value": {
      "text": "3"
     }
    },
    {
     "id": "s27",
     "say": "Below every boundary",
     "op": "const",
     "literal": {
      "text": "U"
     },
     "value": {
      "text": "U"
     }
    },
    {
     "id": "s28",
     "say": "The highest grade whose boundary the total reaches",
     "op": "pick",
     "args": [
      "s7",
      "s8",
      "s10",
      "s11",
      "s13",
      "s14",
      "s16",
      "s17",
      "s19",
      "s20",
      "s22",
      "s23",
      "s25",
      "s26",
      "s27"
     ],
     "key": true,
     "value": {
      "text": "7"
     }
    },
    {
     "id": "s29",
     "say": "Per cent",
     "op": "const",
     "literal": "100",
     "value": "100"
    },
    {
     "id": "s30",
     "say": "Total divided by maximum",
     "op": "div",
     "args": [
      "s4",
      "s5"
     ],
     "value": "173/300"
    },
    {
     "id": "s31",
     "say": "Total as a percentage of the maximum (for reference only)",
     "op": "mul",
     "args": [
      "s30",
      "s29"
     ],
     "value": "173/3"
    }
   ],
   "result": "s28",
   "answer": "Grade 7",
   "generated": "2026-10-06"
  }
 ]
}