{
  "id": "competency:matric-nqf4",
  "code": "CDU-GEN-NSC-400",
  "level": "NSC",
  "name": "Senior Certificate (Amended) — exam-readiness programme (NQF 4 matric)",
  "faculty": "Faculty of General Studies",
  "lineage": [
    {
      "institution": "Conquest Designer University",
      "year": 2026,
      "note": "authored from the offline coursework base (an unofficial working reconstruction of CAPS and the Umalusi qualification); a readiness mapping — the DBE administers the examination and Umalusi certifies it, never the house"
    }
  ],
  "researchProject": "Matriculate Again in 24 Hours — exam readiness across the complete Umalusi subject catalogue, proven against deterministic reference engines",
  "description": "The complete matric subject catalogue on one row: the eleven official languages at three levels, Mathematics and Physical Sciences at full CAPS Grade 12 depth with independently recomputed worked solutions, and every other Umalusi subject with its own deterministic worked-reference unit. The house proves exam readiness; it does not register candidates, mark scripts that count, or issue the Senior Certificate — those are the roles of the examining authorities.",
  "syllabus": [
    "Languages: the eleven official languages at Home / First Additional / Second Additional level",
    "Mathematics (flawless focus): algebra and equations; patterns, sequences and series; functions and graphs; calculus; probability; finance; analytical geometry; trigonometry; Euclidean geometry and measurement; statistics",
    "Physical Sciences (flawless focus): mechanics; waves, sound and light; electricity and magnetism; matter and materials; chemical change; chemical systems",
    "The full elective catalogue: Mathematical Literacy, Life Orientation, Life Sciences, Agricultural Sciences, Accounting, Business Studies, Economics, Geography, History, Religion Studies, Tourism, Consumer Studies, Hospitality Studies, the technology subjects, the arts subjects and the named additional electives",
    "The qualification rules: the 7-subject package and the adult second-chance route, the working assessment splits, the pass rules and the designated-subject list — all working reconstructions with verify-before-claim items"
  ],
  "reference": {
    "Quadratic formula": "x = (−b ± √(b² − 4ac)) / (2a), a ≠ 0; Δ = b² − 4ac",
    "Sequences": "Tₙ = a + (n − 1)d; Sₙ = n/2 [2a + (n − 1)d]; Tₙ = arⁿ⁻¹; S∞ = a/(1 − r), |r| < 1",
    "Calculus": "f′(x) = limₕ→₀ [f(x+h) − f(x)]/h; d/dx axⁿ = naxⁿ⁻¹",
    "Trigonometry": "sin(A ± B) = sinA cosB ± cosA sinB; sine, cosine and area rules",
    "Mechanics": "F_net = ma; f = μN; F_net Δt = Δp; W_net = ΔKE; g = 9,8 m·s⁻²",
    "Waves and light": "v = fλ; f_L = v/(v ∓ v_s)·f_s; n₁ sinθ₁ = n₂ sinθ₂; E = hf = hc/λ",
    "Chemistry": "pV = nRT; c = n/V; pH = −log[H⁺]; Kc from equilibrium concentrations; E°cell = E°cathode − E°anode",
    "Assessment split (working)": "25% school-based assessment, 75% examination; Life Orientation 100% school-based; the adult route has no school-based component — working reconstruction, each a verify item",
    "What this row never claims": "registration, accreditation, an examination centre, or the issuing of a Senior Certificate — readiness only"
  },
  "role": "You are a patient matric tutor working one unit at a time. State the formula, substitute every number, carry the units, and end with the check a learner can redo by hand. You never claim the house registers candidates or issues certificates; readiness is the product.",
  "feeUsd": 1,
  "version": "1.0.0",
  "qualification": {
    "award": "Senior Certificate (Amended) — exam readiness",
    "nqfLevel": 4,
    "qualificationType": "Senior Certificate (Amended) — school-sector qualification; the house offers an exam-readiness mapping only",
    "totalCredits": 120,
    "minCreditsAtExitLevel": 120,
    "iscedFields": [
      "001"
    ],
    "standards": [
      "CAPS (Curriculum and Assessment Policy Statements), Grades 10–12 — cited from the offline working reconstruction, not an official text",
      "The NSC and Senior Certificate (Amended) qualification structure — working reconstruction; SAQA identifiers deliberately not typed (verify-before-claim)",
      "Umalusi quality-assurance and certification cycle — working reconstruction; the house holds no accreditation from it"
    ],
    "registration": "not registered"
  },
  "modules": [
    {
      "code": "NSC4-LAN-AFRI-HL",
      "title": "Afrikaans Home Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend Afrikaans at Home Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-AFRI-FAL",
      "title": "Afrikaans First Additional Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend Afrikaans at First Additional Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-AFRI-SAL",
      "title": "Afrikaans Second Additional Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend Afrikaans at Second Additional Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-ENGL-HL",
      "title": "English Home Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend English at Home Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-ENGL-FAL",
      "title": "English First Additional Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend English at First Additional Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-ENGL-SAL",
      "title": "English Second Additional Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend English at Second Additional Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-ISIN-HL",
      "title": "isiNdebele Home Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend isiNdebele at Home Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-ISIN-FAL",
      "title": "isiNdebele First Additional Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend isiNdebele at First Additional Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-ISIN-SAL",
      "title": "isiNdebele Second Additional Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend isiNdebele at Second Additional Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-ISIX-HL",
      "title": "isiXhosa Home Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend isiXhosa at Home Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-ISIX-FAL",
      "title": "isiXhosa First Additional Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend isiXhosa at First Additional Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-ISIX-SAL",
      "title": "isiXhosa Second Additional Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend isiXhosa at Second Additional Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-ISIZ-HL",
      "title": "isiZulu Home Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend isiZulu at Home Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-ISIZ-FAL",
      "title": "isiZulu First Additional Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend isiZulu at First Additional Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-ISIZ-SAL",
      "title": "isiZulu Second Additional Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend isiZulu at Second Additional Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-SEPE-HL",
      "title": "Sepedi Home Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend Sepedi at Home Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-SEPE-FAL",
      "title": "Sepedi First Additional Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend Sepedi at First Additional Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-SEPE-SAL",
      "title": "Sepedi Second Additional Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend Sepedi at Second Additional Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-SESO-HL",
      "title": "Sesotho Home Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend Sesotho at Home Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-SESO-FAL",
      "title": "Sesotho First Additional Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend Sesotho at First Additional Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-SESO-SAL",
      "title": "Sesotho Second Additional Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend Sesotho at Second Additional Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-SETS-HL",
      "title": "Setswana Home Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend Setswana at Home Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-SETS-FAL",
      "title": "Setswana First Additional Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend Setswana at First Additional Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-SETS-SAL",
      "title": "Setswana Second Additional Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend Setswana at Second Additional Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-SISW-HL",
      "title": "siSwati Home Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend siSwati at Home Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-SISW-FAL",
      "title": "siSwati First Additional Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend siSwati at First Additional Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-SISW-SAL",
      "title": "siSwati Second Additional Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend siSwati at Second Additional Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-TSHI-HL",
      "title": "Tshivenda Home Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend Tshivenda at Home Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-TSHI-FAL",
      "title": "Tshivenda First Additional Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend Tshivenda at First Additional Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-TSHI-SAL",
      "title": "Tshivenda Second Additional Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend Tshivenda at Second Additional Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-XITS-HL",
      "title": "Xitsonga Home Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend Xitsonga at Home Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-XITS-FAL",
      "title": "Xitsonga First Additional Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend Xitsonga at First Additional Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LAN-XITS-SAL",
      "title": "Xitsonga Second Additional Language",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "read, write and comprehend Xitsonga at Second Additional Language level (CAPS working set)",
        "compute the weighted final mark from component marks; measure a fixed passage deterministically"
      ],
      "assessment": {
        "formative": [
          "component marks aggregated under the working 25/75 split (oral inside SBA)"
        ],
        "summative": "the deterministic worked-reference units — the weighted final mark and the fixed-text statistic; orals and essays are marked by people, never by a model",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lang_final_mark",
        "lang_reading_statistic"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-MATH",
      "title": "Mathematics",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "master the CAPS Grade 12 Mathematics working set (offline reconstruction)",
        "the flawless focus — full CAPS topic families; not taken together with Mathematical Literacy"
      ],
      "assessment": {
        "formative": [
          "seeded practice scenarios, deterministic per (pan, unit, attempt)"
        ],
        "summative": "the deterministic worked-reference unit(s), each its own marker; the external examination belongs to the DBE and Umalusi, never to the house",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "maths_quadratic_factorise",
        "maths_quadratic_formula",
        "maths_nature_of_roots",
        "maths_simultaneous",
        "maths_arithmetic_sequence",
        "maths_geometric_sequence",
        "maths_geometric_infinite",
        "maths_sigma_sum",
        "maths_parabola",
        "maths_inverse_linear",
        "maths_exponential_log",
        "maths_first_principles",
        "maths_cubic_stationary",
        "maths_optimisation",
        "maths_compound_angle",
        "maths_trig_general_solution",
        "maths_circle_tangent",
        "maths_probability_table",
        "maths_probability_draws",
        "maths_compound_interest",
        "maths_statistics",
        "maths_regression_line"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-MLIT",
      "title": "Mathematical Literacy",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "master the CAPS Grade 12 Mathematical Literacy working set (offline reconstruction)",
        "not taken together with Mathematics"
      ],
      "assessment": {
        "formative": [
          "seeded practice scenarios, deterministic per (pan, unit, attempt)"
        ],
        "summative": "the deterministic worked-reference unit(s), each its own marker; the external examination belongs to the DBE and Umalusi, never to the house",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "mathlit_tariff",
        "lang_final_mark"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LIFO",
      "title": "Life Orientation",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "master the CAPS Grade 12 Life Orientation working set (offline reconstruction)",
        "school-based assessment only, no external paper (working reconstruction)"
      ],
      "assessment": {
        "formative": [
          "seeded practice scenarios, deterministic per (pan, unit, attempt)"
        ],
        "summative": "school-based assessment only — no external paper (working reconstruction; a verify item of the coursework base)",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lo_sba_total"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-PSCI",
      "title": "Physical Sciences",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "master the CAPS Grade 12 Physical Sciences working set (offline reconstruction)",
        "the flawless focus — full CAPS topic families"
      ],
      "assessment": {
        "formative": [
          "seeded practice scenarios, deterministic per (pan, unit, attempt)"
        ],
        "summative": "the deterministic worked-reference unit(s), each its own marker; the external examination belongs to the DBE and Umalusi, never to the house",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "sci_newton_second_law",
        "sci_inclined_plane",
        "sci_impulse",
        "sci_work_energy",
        "sci_projectile",
        "sci_doppler",
        "sci_snell",
        "sci_coulomb",
        "sci_internal_resistance",
        "sci_faraday",
        "sci_ideal_gas",
        "sci_stoichiometry",
        "sci_concentration",
        "sci_ph",
        "sci_equilibrium_kc",
        "sci_cell_potential",
        "sci_photon_energy",
        "sci_practical_data"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-LSCI",
      "title": "Life Sciences",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "master the CAPS Grade 12 Life Sciences working set (offline reconstruction)"
      ],
      "assessment": {
        "formative": [
          "seeded practice scenarios, deterministic per (pan, unit, attempt)"
        ],
        "summative": "the deterministic worked-reference unit(s), each its own marker; the external examination belongs to the DBE and Umalusi, never to the house",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "lifesci_punnett",
        "lang_final_mark"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-AGRI",
      "title": "Agricultural Sciences",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "master the CAPS Grade 12 Agricultural Sciences working set (offline reconstruction)"
      ],
      "assessment": {
        "formative": [
          "seeded practice scenarios, deterministic per (pan, unit, attempt)"
        ],
        "summative": "the deterministic worked-reference unit(s), each its own marker; the external examination belongs to the DBE and Umalusi, never to the house",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "agrisci_npk",
        "lang_final_mark"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-ACCT",
      "title": "Accounting",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "master the CAPS Grade 12 Accounting working set (offline reconstruction)"
      ],
      "assessment": {
        "formative": [
          "seeded practice scenarios, deterministic per (pan, unit, attempt)"
        ],
        "summative": "the deterministic worked-reference unit(s), each its own marker; the external examination belongs to the DBE and Umalusi, never to the house",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "acc_depreciation",
        "lang_final_mark"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-BSTU",
      "title": "Business Studies",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "master the CAPS Grade 12 Business Studies working set (offline reconstruction)"
      ],
      "assessment": {
        "formative": [
          "seeded practice scenarios, deterministic per (pan, unit, attempt)"
        ],
        "summative": "the deterministic worked-reference unit(s), each its own marker; the external examination belongs to the DBE and Umalusi, never to the house",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "bus_breakeven",
        "lang_final_mark"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-ECON",
      "title": "Economics",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "master the CAPS Grade 12 Economics working set (offline reconstruction)"
      ],
      "assessment": {
        "formative": [
          "seeded practice scenarios, deterministic per (pan, unit, attempt)"
        ],
        "summative": "the deterministic worked-reference unit(s), each its own marker; the external examination belongs to the DBE and Umalusi, never to the house",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "econ_inflation",
        "lang_final_mark"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-GEOG",
      "title": "Geography",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "master the CAPS Grade 12 Geography working set (offline reconstruction)"
      ],
      "assessment": {
        "formative": [
          "seeded practice scenarios, deterministic per (pan, unit, attempt)"
        ],
        "summative": "the deterministic worked-reference unit(s), each its own marker; the external examination belongs to the DBE and Umalusi, never to the house",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "geo_map_scale",
        "lang_final_mark"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-HIST",
      "title": "History",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "master the CAPS Grade 12 History working set (offline reconstruction)"
      ],
      "assessment": {
        "formative": [
          "seeded practice scenarios, deterministic per (pan, unit, attempt)"
        ],
        "summative": "the deterministic worked-reference unit(s), each its own marker; the external examination belongs to the DBE and Umalusi, never to the house",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "hist_timeline",
        "lang_final_mark"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-RELS",
      "title": "Religion Studies",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "master the CAPS Grade 12 Religion Studies working set (offline reconstruction)"
      ],
      "assessment": {
        "formative": [
          "seeded practice scenarios, deterministic per (pan, unit, attempt)"
        ],
        "summative": "the deterministic worked-reference unit(s), each its own marker; the external examination belongs to the DBE and Umalusi, never to the house",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "rel_text_compare",
        "lang_final_mark"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-TOUR",
      "title": "Tourism",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "master the CAPS Grade 12 Tourism working set (offline reconstruction)"
      ],
      "assessment": {
        "formative": [
          "seeded practice scenarios, deterministic per (pan, unit, attempt)"
        ],
        "summative": "the deterministic worked-reference unit(s), each its own marker; the external examination belongs to the DBE and Umalusi, never to the house",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "tour_currency",
        "lang_final_mark"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-CONS",
      "title": "Consumer Studies",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "master the CAPS Grade 12 Consumer Studies working set (offline reconstruction)"
      ],
      "assessment": {
        "formative": [
          "seeded practice scenarios, deterministic per (pan, unit, attempt)"
        ],
        "summative": "the deterministic worked-reference unit(s), each its own marker; the external examination belongs to the DBE and Umalusi, never to the house",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "cons_unit_price",
        "lang_final_mark"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-HOSP",
      "title": "Hospitality Studies",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "master the CAPS Grade 12 Hospitality Studies working set (offline reconstruction)"
      ],
      "assessment": {
        "formative": [
          "seeded practice scenarios, deterministic per (pan, unit, attempt)"
        ],
        "summative": "the deterministic worked-reference unit(s), each its own marker; the external examination belongs to the DBE and Umalusi, never to the house",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "hosp_portion_cost",
        "lang_final_mark"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-CAT",
      "title": "Computer Applications Technology",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "master the CAPS Grade 12 Computer Applications Technology working set (offline reconstruction)"
      ],
      "assessment": {
        "formative": [
          "seeded practice scenarios, deterministic per (pan, unit, attempt)"
        ],
        "summative": "the deterministic worked-reference unit(s), each its own marker; the external examination belongs to the DBE and Umalusi, never to the house",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "cat_filesize",
        "lang_final_mark"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-IT",
      "title": "Information Technology",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "master the CAPS Grade 12 Information Technology working set (offline reconstruction)"
      ],
      "assessment": {
        "formative": [
          "seeded practice scenarios, deterministic per (pan, unit, attempt)"
        ],
        "summative": "the deterministic worked-reference unit(s), each its own marker; the external examination belongs to the DBE and Umalusi, never to the house",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "it_binary",
        "lang_final_mark"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-EGD",
      "title": "Engineering Graphics and Design",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "master the CAPS Grade 12 Engineering Graphics and Design working set (offline reconstruction)"
      ],
      "assessment": {
        "formative": [
          "seeded practice scenarios, deterministic per (pan, unit, attempt)"
        ],
        "summative": "the deterministic worked-reference unit(s), each its own marker; the external examination belongs to the DBE and Umalusi, never to the house",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "egd_scale",
        "lang_final_mark"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-CIVT",
      "title": "Civil Technology",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "master the CAPS Grade 12 Civil Technology working set (offline reconstruction)"
      ],
      "assessment": {
        "formative": [
          "seeded practice scenarios, deterministic per (pan, unit, attempt)"
        ],
        "summative": "the deterministic worked-reference unit(s), each its own marker; the external examination belongs to the DBE and Umalusi, never to the house",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "civtech_load",
        "lang_final_mark"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-MECT",
      "title": "Mechanical Technology",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "master the CAPS Grade 12 Mechanical Technology working set (offline reconstruction)"
      ],
      "assessment": {
        "formative": [
          "seeded practice scenarios, deterministic per (pan, unit, attempt)"
        ],
        "summative": "the deterministic worked-reference unit(s), each its own marker; the external examination belongs to the DBE and Umalusi, never to the house",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "mechtech_gear",
        "lang_final_mark"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-ELET",
      "title": "Electrical Technology",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "master the CAPS Grade 12 Electrical Technology working set (offline reconstruction)"
      ],
      "assessment": {
        "formative": [
          "seeded practice scenarios, deterministic per (pan, unit, attempt)"
        ],
        "summative": "the deterministic worked-reference unit(s), each its own marker; the external examination belongs to the DBE and Umalusi, never to the house",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "electech_resistance",
        "lang_final_mark"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-VART",
      "title": "Visual Arts",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "master the CAPS Grade 12 Visual Arts working set (offline reconstruction)"
      ],
      "assessment": {
        "formative": [
          "seeded practice scenarios, deterministic per (pan, unit, attempt)"
        ],
        "summative": "the deterministic worked-reference unit(s), each its own marker; the external examination belongs to the DBE and Umalusi, never to the house",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "art_colour_mix",
        "lang_final_mark"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-MUSC",
      "title": "Music",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "master the CAPS Grade 12 Music working set (offline reconstruction)"
      ],
      "assessment": {
        "formative": [
          "seeded practice scenarios, deterministic per (pan, unit, attempt)"
        ],
        "summative": "the deterministic worked-reference unit(s), each its own marker; the external examination belongs to the DBE and Umalusi, never to the house",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "music_interval",
        "lang_final_mark"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-DRAM",
      "title": "Drama",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "master the CAPS Grade 12 Drama working set (offline reconstruction)"
      ],
      "assessment": {
        "formative": [
          "seeded practice scenarios, deterministic per (pan, unit, attempt)"
        ],
        "summative": "the deterministic worked-reference unit(s), each its own marker; the external examination belongs to the DBE and Umalusi, never to the house",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "drama_cue",
        "lang_final_mark"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-DANC",
      "title": "Dance Studies",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "master the CAPS Grade 12 Dance Studies working set (offline reconstruction)"
      ],
      "assessment": {
        "formative": [
          "seeded practice scenarios, deterministic per (pan, unit, attempt)"
        ],
        "summative": "the deterministic worked-reference unit(s), each its own marker; the external examination belongs to the DBE and Umalusi, never to the house",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "dance_tempo",
        "lang_final_mark"
      ],
      "notionalHours": 200
    },
    {
      "code": "NSC4-BIBL",
      "title": "Biblical Studies",
      "nqfLevel": 4,
      "credits": 20,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "master the CAPS Grade 12 Biblical Studies working set (offline reconstruction)",
        "named in the Additional row of the coursework base §4"
      ],
      "assessment": {
        "formative": [
          "seeded practice scenarios, deterministic per (pan, unit, attempt)"
        ],
        "summative": "the deterministic worked-reference unit(s), each its own marker; the external examination belongs to the DBE and Umalusi, never to the house",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "rel_text_compare",
        "lang_final_mark"
      ],
      "notionalHours": 200
    }
  ],
  "units": [
    {
      "id": "maths_quadratic_factorise",
      "name": "Quadratic equation by factorising",
      "answers": "The roots of ax² + bx + c = 0 by factorisation, with the discriminant, the sum and the product of the roots checked.",
      "reference": "CAPS Grade 12 Mathematics, worked reference M1 (offline reconstruction); quadratic formula and nature of roots",
      "example": {
        "a": 1,
        "b": -5,
        "c": 6
      },
      "signature": {
        "input": {
          "a": {
            "type": "number",
            "describe": "coefficient of x² (a ≠ 0)",
            "min": -100,
            "max": 100
          },
          "b": {
            "type": "number",
            "describe": "coefficient of x",
            "min": -1000,
            "max": 1000
          },
          "c": {
            "type": "number",
            "describe": "constant term",
            "min": -10000,
            "max": 10000
          }
        },
        "output": {
          "rootA": {
            "type": "number",
            "describe": "the smaller root"
          },
          "rootB": {
            "type": "number",
            "describe": "the larger root"
          },
          "discriminant": {
            "type": "number",
            "describe": "Δ = b² − 4ac"
          },
          "sumOfRoots": {
            "type": "number",
            "describe": "−b/a"
          },
          "productOfRoots": {
            "type": "number",
            "describe": "c/a"
          }
        }
      }
    },
    {
      "id": "maths_quadratic_formula",
      "name": "Quadratic equation by the formula",
      "answers": "The roots of ax² + bx + c = 0 by x = (−b ± √Δ)/(2a), every substitution shown.",
      "reference": "CAPS Grade 12 Mathematics, worked reference M2 (offline reconstruction); x = (−b ± √(b² − 4ac)) / (2a), a ≠ 0",
      "example": {
        "a": 2,
        "b": 3,
        "c": -2
      },
      "signature": {
        "input": {
          "a": {
            "type": "number",
            "describe": "coefficient of x² (a ≠ 0)",
            "min": -100,
            "max": 100
          },
          "b": {
            "type": "number",
            "describe": "coefficient of x",
            "min": -1000,
            "max": 1000
          },
          "c": {
            "type": "number",
            "describe": "constant term",
            "min": -10000,
            "max": 10000
          }
        },
        "output": {
          "rootA": {
            "type": "number",
            "describe": "the smaller root"
          },
          "rootB": {
            "type": "number",
            "describe": "the larger root"
          },
          "discriminant": {
            "type": "number",
            "describe": "Δ = b² − 4ac"
          }
        }
      }
    },
    {
      "id": "maths_nature_of_roots",
      "name": "Nature of the roots",
      "answers": "Whether ax² + bx + c = 0 has two distinct real, equal real, or non-real roots, from the discriminant alone.",
      "reference": "CAPS Grade 12 Mathematics, worked reference M3 (offline reconstruction); Δ > 0 distinct real, Δ = 0 equal real, Δ < 0 non-real",
      "example": {
        "a": 1,
        "b": 2,
        "c": 5
      },
      "signature": {
        "input": {
          "a": {
            "type": "number",
            "describe": "coefficient of x² (a ≠ 0)",
            "min": -100,
            "max": 100
          },
          "b": {
            "type": "number",
            "describe": "coefficient of x",
            "min": -1000,
            "max": 1000
          },
          "c": {
            "type": "number",
            "describe": "constant term",
            "min": -10000,
            "max": 10000
          }
        },
        "output": {
          "discriminant": {
            "type": "number",
            "describe": "Δ = b² − 4ac"
          },
          "nature": {
            "type": "string",
            "describe": "two distinct real roots | equal real roots | non-real (complex) roots"
          }
        }
      }
    },
    {
      "id": "maths_simultaneous",
      "name": "Simultaneous linear/quadratic system",
      "answers": "Where the line y = mx + k meets the parabola y = x² + px + q — equate, solve, substitute back.",
      "reference": "CAPS Grade 12 Mathematics, worked reference M4 (offline reconstruction); equate the two expressions for y and solve the quadratic",
      "example": {
        "p": -3,
        "q": 2,
        "m": 2,
        "k": -4
      },
      "signature": {
        "input": {
          "p": {
            "type": "number",
            "describe": "parabola coefficient of x",
            "min": -100,
            "max": 100
          },
          "q": {
            "type": "number",
            "describe": "parabola constant",
            "min": -1000,
            "max": 1000
          },
          "m": {
            "type": "number",
            "describe": "line gradient",
            "min": -100,
            "max": 100
          },
          "k": {
            "type": "number",
            "describe": "line intercept",
            "min": -1000,
            "max": 1000
          }
        },
        "output": {
          "x1": {
            "type": "number",
            "describe": "smaller x of intersection"
          },
          "y1": {
            "type": "number",
            "describe": "its y"
          },
          "x2": {
            "type": "number",
            "describe": "larger x of intersection"
          },
          "y2": {
            "type": "number",
            "describe": "its y"
          }
        }
      }
    },
    {
      "id": "maths_arithmetic_sequence",
      "name": "Arithmetic sequence and series",
      "answers": "Tₙ = a + (n − 1)d and Sₙ = n/2 [2a + (n − 1)d], with the Sₙ = n/2 (a + l) cross-check.",
      "reference": "CAPS Grade 12 Mathematics, worked reference M5 (offline reconstruction); Tₙ = a + (n − 1)d; Sₙ = n/2 [2a + (n − 1)d]",
      "example": {
        "a": 4,
        "d": 3,
        "n": 20
      },
      "signature": {
        "input": {
          "a": {
            "type": "number",
            "describe": "first term",
            "min": -10000,
            "max": 10000
          },
          "d": {
            "type": "number",
            "describe": "common difference",
            "min": -1000,
            "max": 1000
          },
          "n": {
            "type": "number",
            "describe": "term number (positive integer)",
            "max": 100000
          }
        },
        "output": {
          "tn": {
            "type": "number",
            "describe": "the nth term"
          },
          "sn": {
            "type": "number",
            "describe": "the sum of the first n terms"
          }
        }
      }
    },
    {
      "id": "maths_geometric_sequence",
      "name": "Geometric sequence and series",
      "answers": "Tₙ = arⁿ⁻¹ and Sₙ = a(rⁿ − 1)/(r − 1), refusing r = 1 where the formula is undefined.",
      "reference": "CAPS Grade 12 Mathematics, worked reference M6 (offline reconstruction); Tₙ = arⁿ⁻¹; Sₙ = a(rⁿ − 1)/(r − 1), r ≠ 1",
      "example": {
        "a": 2,
        "r": 3,
        "n": 5
      },
      "signature": {
        "input": {
          "a": {
            "type": "number",
            "describe": "first term",
            "min": -10000,
            "max": 10000
          },
          "r": {
            "type": "number",
            "describe": "common ratio (r ≠ 1 for the Sₙ formula)",
            "min": -100,
            "max": 100
          },
          "n": {
            "type": "number",
            "describe": "term number (positive integer)",
            "max": 60
          }
        },
        "output": {
          "tn": {
            "type": "number",
            "describe": "the nth term"
          },
          "sn": {
            "type": "number",
            "describe": "the sum of the first n terms"
          }
        }
      }
    },
    {
      "id": "maths_geometric_infinite",
      "name": "Infinite geometric series",
      "answers": "S∞ = a/(1 − r) for |r| < 1; a ratio at or beyond 1 in magnitude is refused because the sum does not converge.",
      "reference": "CAPS Grade 12 Mathematics, worked reference M6 (offline reconstruction); S∞ = a/(1 − r), only for |r| < 1",
      "example": {
        "a": 8,
        "r": 0.5
      },
      "signature": {
        "input": {
          "a": {
            "type": "number",
            "describe": "first term",
            "min": -10000,
            "max": 10000
          },
          "r": {
            "type": "number",
            "describe": "common ratio, |r| < 1",
            "min": -100,
            "max": 100
          }
        },
        "output": {
          "sInfinity": {
            "type": "number",
            "describe": "the infinite sum"
          }
        }
      }
    },
    {
      "id": "maths_sigma_sum",
      "name": "Sigma notation",
      "answers": "Σₖ₌₁ⁿ (pk + q) evaluated with Σk = n(n + 1)/2 and Σ1 = n.",
      "reference": "CAPS Grade 12 Mathematics, worked reference M7 (offline reconstruction); Σₖ₌₁ⁿ k = n(n+1)/2",
      "example": {
        "p": 2,
        "q": 1,
        "n": 10
      },
      "signature": {
        "input": {
          "p": {
            "type": "number",
            "describe": "coefficient of k",
            "min": -1000,
            "max": 1000
          },
          "q": {
            "type": "number",
            "describe": "constant term",
            "min": -1000,
            "max": 1000
          },
          "n": {
            "type": "number",
            "describe": "upper limit (positive integer)",
            "max": 1000000
          }
        },
        "output": {
          "sum": {
            "type": "number",
            "describe": "the value of the sum"
          }
        }
      }
    },
    {
      "id": "maths_parabola",
      "name": "The parabola",
      "answers": "Turning point, axis of symmetry, intercepts and range of f(x) = ax² + bx + c.",
      "reference": "CAPS Grade 12 Mathematics, worked reference M8 (offline reconstruction); turning point at x = −b/(2a)",
      "example": {
        "a": 1,
        "b": -4,
        "c": 3
      },
      "signature": {
        "input": {
          "a": {
            "type": "number",
            "describe": "coefficient of x² (a ≠ 0)",
            "min": -100,
            "max": 100
          },
          "b": {
            "type": "number",
            "describe": "coefficient of x",
            "min": -1000,
            "max": 1000
          },
          "c": {
            "type": "number",
            "describe": "constant term",
            "min": -10000,
            "max": 10000
          }
        },
        "output": {
          "tpX": {
            "type": "number",
            "describe": "x of the turning point"
          },
          "tpY": {
            "type": "number",
            "describe": "y of the turning point"
          },
          "xIntercept1": {
            "type": "number",
            "describe": "smaller x-intercept"
          },
          "xIntercept2": {
            "type": "number",
            "describe": "larger x-intercept"
          },
          "yIntercept": {
            "type": "number",
            "describe": "f(0)"
          },
          "range": {
            "type": "string",
            "describe": "the range, e.g. y ≥ −1"
          }
        }
      }
    },
    {
      "id": "maths_inverse_linear",
      "name": "Inverse of a linear function",
      "answers": "g⁻¹ of g(x) = ax + b, the round trip g⁻¹(g(x)) = x, and the composition f(g(x)) with a given parabola.",
      "reference": "CAPS Grade 12 Mathematics, worked reference M8 (offline reconstruction); y = ax + b ⇒ g⁻¹(x) = (x − b)/a, a ≠ 0",
      "example": {
        "a": 2,
        "b": 1,
        "x": 2,
        "pa": 1,
        "pb": -4,
        "pc": 3
      },
      "signature": {
        "input": {
          "a": {
            "type": "number",
            "describe": "gradient of g (a ≠ 0)",
            "min": -100,
            "max": 100
          },
          "b": {
            "type": "number",
            "describe": "intercept of g",
            "min": -1000,
            "max": 1000
          },
          "x": {
            "type": "number",
            "describe": "where to evaluate",
            "min": -1000,
            "max": 1000
          },
          "pa": {
            "type": "number",
            "describe": "parabola a for the composition",
            "min": -100,
            "max": 100,
            "default": 1
          },
          "pb": {
            "type": "number",
            "describe": "parabola b",
            "min": -1000,
            "max": 1000,
            "default": -4
          },
          "pc": {
            "type": "number",
            "describe": "parabola c",
            "min": -10000,
            "max": 10000,
            "default": 3
          }
        },
        "output": {
          "gOfX": {
            "type": "number",
            "describe": "g(x)"
          },
          "inverseOfGOfX": {
            "type": "number",
            "describe": "g⁻¹(g(x)) — must be x"
          },
          "fOfGOfX": {
            "type": "number",
            "describe": "f(g(x)) with the given parabola"
          }
        }
      }
    },
    {
      "id": "maths_exponential_log",
      "name": "Exponential and logarithmic equations",
      "answers": "Solve baseˣ = value: x = log_base(value), refusing non-positive arguments and degenerate bases.",
      "reference": "CAPS Grade 12 Mathematics, worked reference M9 (offline reconstruction); logarithm defined only for argument > 0 and base > 0, base ≠ 1",
      "example": {
        "base": 2,
        "value": 16
      },
      "signature": {
        "input": {
          "base": {
            "type": "number",
            "describe": "the base (b > 0, b ≠ 1)",
            "min": -1000,
            "max": 1000
          },
          "value": {
            "type": "number",
            "describe": "the value (v > 0)",
            "min": -1000000,
            "max": 1000000
          }
        },
        "output": {
          "exponent": {
            "type": "number",
            "describe": "x with baseˣ = value"
          }
        }
      }
    },
    {
      "id": "maths_first_principles",
      "name": "Differentiation from first principles",
      "answers": "f′(x) of f(x) = ax² + bx from the limit definition, the derivative at a point, and the tangent's equation there.",
      "reference": "CAPS Grade 12 Mathematics, worked reference M10 (offline reconstruction); f′(x) = limₕ→₀ [f(x+h) − f(x)]/h",
      "example": {
        "a": 1,
        "b": 3,
        "x0": 2
      },
      "signature": {
        "input": {
          "a": {
            "type": "number",
            "describe": "coefficient of x²",
            "min": -100,
            "max": 100
          },
          "b": {
            "type": "number",
            "describe": "coefficient of x",
            "min": -1000,
            "max": 1000
          },
          "x0": {
            "type": "number",
            "describe": "the point of tangency",
            "min": -1000,
            "max": 1000
          }
        },
        "output": {
          "derivativeAt": {
            "type": "number",
            "describe": "f′(x0)"
          },
          "fAt": {
            "type": "number",
            "describe": "f(x0)"
          },
          "tangentSlope": {
            "type": "number",
            "describe": "gradient of the tangent"
          },
          "tangentIntercept": {
            "type": "number",
            "describe": "c of the tangent y = mx + c"
          }
        }
      }
    },
    {
      "id": "maths_cubic_stationary",
      "name": "Stationary points of a cubic",
      "answers": "The stationary points of f(x) = x³ + bx² + cx + d, classified by the second derivative, with the point of inflection.",
      "reference": "CAPS Grade 12 Mathematics, worked reference M11 (offline reconstruction); f′(x) = 0 at stationary points; f″ classifies them",
      "example": {
        "b": -6,
        "c": 9,
        "d": 1
      },
      "signature": {
        "input": {
          "b": {
            "type": "number",
            "describe": "coefficient of x²",
            "min": -1000,
            "max": 1000
          },
          "c": {
            "type": "number",
            "describe": "coefficient of x",
            "min": -10000,
            "max": 10000
          },
          "d": {
            "type": "number",
            "describe": "constant term",
            "min": -100000,
            "max": 100000
          }
        },
        "output": {
          "x1": {
            "type": "number",
            "describe": "first stationary x (smaller)"
          },
          "y1": {
            "type": "number",
            "describe": "f(x1)"
          },
          "type1": {
            "type": "string",
            "describe": "local maximum | local minimum"
          },
          "x2": {
            "type": "number",
            "describe": "second stationary x (larger)"
          },
          "y2": {
            "type": "number",
            "describe": "f(x2)"
          },
          "type2": {
            "type": "string",
            "describe": "local maximum | local minimum"
          },
          "inflectionX": {
            "type": "number",
            "describe": "x of the point of inflection"
          }
        }
      }
    },
    {
      "id": "maths_optimisation",
      "name": "Optimisation — the largest rectangle",
      "answers": "The rectangle of greatest area for a fixed perimeter, by differentiating A(x) = x(P/2 − x).",
      "reference": "CAPS Grade 12 Mathematics, worked reference M12 (offline reconstruction); A′(x) = 0 at the maximum, A″ < 0 confirms it",
      "example": {
        "perimeter": 40
      },
      "signature": {
        "input": {
          "perimeter": {
            "type": "number",
            "describe": "the fixed perimeter (metres)",
            "unit": "m",
            "min": 0.001,
            "max": 1000000
          }
        },
        "output": {
          "sideX": {
            "type": "number",
            "describe": "the optimal width (m)"
          },
          "sideY": {
            "type": "number",
            "describe": "the optimal height (m)"
          },
          "maxArea": {
            "type": "number",
            "describe": "the maximal area (m²)"
          }
        }
      }
    },
    {
      "id": "maths_compound_angle",
      "name": "Compound-angle identity",
      "answers": "sin(A + B) = sinA cosB + cosA sinB, every substitution shown — sin 75° exactly and numerically.",
      "reference": "CAPS Grade 12 Mathematics, worked reference M13 (offline reconstruction); sin(A ± B) = sinA cosB ± cosA sinB",
      "example": {
        "angleA": 45,
        "angleB": 30
      },
      "signature": {
        "input": {
          "angleA": {
            "type": "number",
            "describe": "A in degrees",
            "unit": "°",
            "min": 0,
            "max": 90
          },
          "angleB": {
            "type": "number",
            "describe": "B in degrees",
            "unit": "°",
            "min": 0,
            "max": 90
          }
        },
        "output": {
          "sinAB": {
            "type": "number",
            "describe": "sin(A + B)"
          }
        }
      }
    },
    {
      "id": "maths_trig_general_solution",
      "name": "General solution of a trig equation",
      "answers": "Solve p·sinθ = q on [0° ; 360°] with the general solution, refusing |q/p| > 1 because sine never leaves [−1 ; 1].",
      "reference": "CAPS Grade 12 Mathematics, worked reference M14 (offline reconstruction); sinθ = k ⇒ θ = α + 360°k or 180° − α + 360°k",
      "example": {
        "p": 2,
        "q": 1
      },
      "signature": {
        "input": {
          "p": {
            "type": "number",
            "describe": "coefficient of sinθ (p ≠ 0)",
            "min": -100,
            "max": 100
          },
          "q": {
            "type": "number",
            "describe": "right-hand side",
            "min": -100,
            "max": 100
          }
        },
        "output": {
          "alpha": {
            "type": "number",
            "describe": "the reference angle (°)"
          },
          "solution1": {
            "type": "number",
            "describe": "first solution in [0 ; 360] (°)"
          },
          "solution2": {
            "type": "number",
            "describe": "second solution in [0 ; 360] (°)"
          }
        }
      }
    },
    {
      "id": "maths_circle_tangent",
      "name": "Tangent to a circle",
      "answers": "The tangent to (x − a)² + (y − b)² = r² at a point on the circle: prove the point is on it, radius ⟂ tangent, the line in standard form.",
      "reference": "CAPS Grade 12 Mathematics, worked reference M15 (offline reconstruction); gradient of tangent = −1/(gradient of radius)",
      "example": {
        "a": 2,
        "b": -1,
        "r": 5,
        "px": 5,
        "py": 3
      },
      "signature": {
        "input": {
          "a": {
            "type": "number",
            "describe": "centre x",
            "min": -1000,
            "max": 1000
          },
          "b": {
            "type": "number",
            "describe": "centre y",
            "min": -1000,
            "max": 1000
          },
          "r": {
            "type": "number",
            "describe": "radius (r > 0)",
            "min": 0.001,
            "max": 100000
          },
          "px": {
            "type": "number",
            "describe": "point x",
            "min": -100000,
            "max": 100000
          },
          "py": {
            "type": "number",
            "describe": "point y",
            "min": -100000,
            "max": 100000
          }
        },
        "output": {
          "tangentGradient": {
            "type": "number",
            "describe": "gradient of the tangent"
          },
          "lineA": {
            "type": "number",
            "describe": "A of Ax + By + C = 0"
          },
          "lineB": {
            "type": "number",
            "describe": "B of Ax + By + C = 0"
          },
          "lineC": {
            "type": "number",
            "describe": "C of Ax + By + C = 0"
          }
        }
      }
    },
    {
      "id": "maths_probability_table",
      "name": "Probability from a contingency table",
      "answers": "P(A | B) and P(neither) for two subject choices over one class, refusing any probability outside [0 ; 1].",
      "reference": "CAPS Grade 12 Mathematics, worked reference M16 (offline reconstruction); P(A∪B) = P(A) + P(B) − P(A∩B)",
      "example": {
        "total": 100,
        "nA": 60,
        "nB": 40,
        "nBoth": 30
      },
      "signature": {
        "input": {
          "total": {
            "type": "number",
            "describe": "learners in the class",
            "min": 1,
            "max": 1000000
          },
          "nA": {
            "type": "number",
            "describe": "take subject A",
            "min": 0,
            "max": 1000000
          },
          "nB": {
            "type": "number",
            "describe": "take subject B",
            "min": 0,
            "max": 1000000
          },
          "nBoth": {
            "type": "number",
            "describe": "take both",
            "min": 0,
            "max": 1000000
          }
        },
        "output": {
          "pAGivenB": {
            "type": "number",
            "describe": "P(A | B)"
          },
          "pNeither": {
            "type": "number",
            "describe": "P(neither)"
          }
        }
      }
    },
    {
      "id": "maths_probability_draws",
      "name": "Probability without replacement",
      "answers": "P(both red) for two draws without replacement from a mixed set of counters.",
      "reference": "CAPS Grade 12 Mathematics, worked reference M16 (offline reconstruction); dependent events multiply along the branch",
      "example": {
        "red": 5,
        "blue": 3,
        "green": 2
      },
      "signature": {
        "input": {
          "red": {
            "type": "number",
            "describe": "red counters",
            "min": 0,
            "max": 100000
          },
          "blue": {
            "type": "number",
            "describe": "blue counters",
            "min": 0,
            "max": 100000
          },
          "green": {
            "type": "number",
            "describe": "green counters",
            "min": 0,
            "max": 100000
          }
        },
        "output": {
          "pBothRed": {
            "type": "number",
            "describe": "P(first red and second red)"
          }
        }
      }
    },
    {
      "id": "maths_compound_interest",
      "name": "Compound interest",
      "answers": "A = P(1 + i)ⁿ and the interest earned, each substitution shown.",
      "reference": "CAPS Grade 12 Mathematics, worked reference M17 (offline reconstruction); A = P(1 + i)ⁿ, i > −1",
      "example": {
        "principal": 10000,
        "ratePercent": 8,
        "years": 3
      },
      "signature": {
        "input": {
          "principal": {
            "type": "number",
            "describe": "P, the amount invested",
            "min": 0,
            "max": 1000000000
          },
          "ratePercent": {
            "type": "number",
            "describe": "annual rate (percent)",
            "min": -99,
            "max": 1000
          },
          "years": {
            "type": "number",
            "describe": "n, whole years",
            "min": 0,
            "max": 200
          }
        },
        "output": {
          "amount": {
            "type": "number",
            "describe": "A after n years"
          },
          "interestEarned": {
            "type": "number",
            "describe": "A − P"
          }
        }
      }
    },
    {
      "id": "maths_statistics",
      "name": "Descriptive statistics",
      "answers": "Mean, population variance and standard deviation, the five-number summary (inclusive quartiles), IQR and the outlier fences.",
      "reference": "CAPS Grade 12 Mathematics, worked reference M18 (offline reconstruction); σ = √(Σ(x − x̄)²/n); quartiles include the median in each half",
      "example": {
        "data": [
          2,
          4,
          6,
          8,
          10
        ]
      },
      "signature": {
        "input": {
          "data": {
            "type": "number[]",
            "describe": "the data values"
          }
        },
        "output": {
          "mean": {
            "type": "number",
            "describe": "x̄"
          },
          "variance": {
            "type": "number",
            "describe": "σ² (population)"
          },
          "standardDeviation": {
            "type": "number",
            "describe": "σ, 4 d.p."
          },
          "min": {
            "type": "number",
            "describe": "minimum"
          },
          "q1": {
            "type": "number",
            "describe": "lower quartile"
          },
          "median": {
            "type": "number",
            "describe": "median"
          },
          "q3": {
            "type": "number",
            "describe": "upper quartile"
          },
          "max": {
            "type": "number",
            "describe": "maximum"
          },
          "iqr": {
            "type": "number",
            "describe": "Q3 − Q1"
          },
          "outliers": {
            "type": "number",
            "describe": "how many values lie outside the 1.5·IQR fences"
          }
        }
      }
    },
    {
      "id": "maths_regression_line",
      "name": "Least-squares regression line",
      "answers": "ŷ = a + bx from r, the standard deviations and the means: b = r·σ_y/σ_x, a = ȳ − b·x̄. A zero σ_x is refused.",
      "reference": "CAPS Grade 12 Mathematics, worked reference M19 (offline reconstruction); r is interpreted, never used as proof of causation",
      "example": {
        "r": 0.8,
        "sigmaX": 2,
        "sigmaY": 3,
        "meanX": 10,
        "meanY": 20
      },
      "signature": {
        "input": {
          "r": {
            "type": "number",
            "describe": "correlation coefficient",
            "min": -1,
            "max": 1
          },
          "sigmaX": {
            "type": "number",
            "describe": "σ_x (must be > 0)",
            "min": 0,
            "max": 1000000
          },
          "sigmaY": {
            "type": "number",
            "describe": "σ_y",
            "min": 0,
            "max": 1000000
          },
          "meanX": {
            "type": "number",
            "describe": "x̄",
            "min": -1000000,
            "max": 1000000
          },
          "meanY": {
            "type": "number",
            "describe": "ȳ",
            "min": -1000000,
            "max": 1000000
          }
        },
        "output": {
          "slope": {
            "type": "number",
            "describe": "b"
          },
          "intercept": {
            "type": "number",
            "describe": "a"
          }
        }
      }
    },
    {
      "id": "sci_newton_second_law",
      "name": "Newton's second law — horizontal motion",
      "answers": "The acceleration of a block under an applied force and kinetic friction: a = F_net/m.",
      "reference": "CAPS Grade 12 Physical Sciences, worked reference P1 (offline reconstruction); F_net = ma",
      "example": {
        "mass": 5,
        "appliedForce": 20,
        "friction": 5
      },
      "signature": {
        "input": {
          "mass": {
            "type": "number",
            "describe": "mass (kg)",
            "unit": "kg",
            "min": 0.001,
            "max": 100000
          },
          "appliedForce": {
            "type": "number",
            "describe": "applied force (N), positive in the direction of motion",
            "unit": "N",
            "min": 0,
            "max": 1000000
          },
          "friction": {
            "type": "number",
            "describe": "kinetic friction magnitude (N)",
            "unit": "N",
            "min": 0,
            "max": 1000000
          }
        },
        "output": {
          "netForce": {
            "type": "number",
            "describe": "F_net (N)"
          },
          "acceleration": {
            "type": "number",
            "describe": "a (m·s⁻²)"
          }
        }
      }
    },
    {
      "id": "sci_inclined_plane",
      "name": "Inclined plane with friction",
      "answers": "The acceleration of a block sliding down a rough incline: components, the normal, μN, F_net, a — every substitution shown.",
      "reference": "CAPS Grade 12 Physical Sciences, worked reference P2 (offline reconstruction); f = μN; up the slope is positive for the friction on a sliding block",
      "example": {
        "mass": 10,
        "angleDeg": 30,
        "mu": 0.2
      },
      "signature": {
        "input": {
          "mass": {
            "type": "number",
            "describe": "mass (kg)",
            "unit": "kg",
            "min": 0.001,
            "max": 100000
          },
          "angleDeg": {
            "type": "number",
            "describe": "incline angle (° in [0 ; 90])",
            "unit": "°",
            "min": 0,
            "max": 90
          },
          "mu": {
            "type": "number",
            "describe": "coefficient of kinetic friction",
            "min": 0,
            "max": 5
          }
        },
        "output": {
          "downSlopeComponent": {
            "type": "number",
            "describe": "mg sinθ (N)"
          },
          "normalForce": {
            "type": "number",
            "describe": "N = mg cosθ (N)"
          },
          "frictionForce": {
            "type": "number",
            "describe": "f = μN (N)"
          },
          "netForce": {
            "type": "number",
            "describe": "F_net (N)"
          },
          "acceleration": {
            "type": "number",
            "describe": "a (m·s⁻², 2 d.p.)"
          }
        }
      }
    },
    {
      "id": "sci_impulse",
      "name": "Impulse and rebound",
      "answers": "Δp = m(v − u) for a rebound, the impulse magnitude, the average force, and the direction stated — never just the magnitude.",
      "reference": "CAPS Grade 12 Physical Sciences, worked reference P3 (offline reconstruction); F_net Δt = Δp; toward the wall is positive",
      "example": {
        "mass": 0.2,
        "uToward": 4,
        "vRebound": -3,
        "contactTime": 0.01
      },
      "signature": {
        "input": {
          "mass": {
            "type": "number",
            "describe": "mass (kg)",
            "unit": "kg",
            "min": 0.0001,
            "max": 100000
          },
          "uToward": {
            "type": "number",
            "describe": "approach velocity, toward the wall positive (m·s⁻¹)",
            "unit": "m·s⁻¹",
            "min": -1000,
            "max": 1000
          },
          "vRebound": {
            "type": "number",
            "describe": "rebound velocity, same sign convention (m·s⁻¹)",
            "unit": "m·s⁻¹",
            "min": -1000,
            "max": 1000
          },
          "contactTime": {
            "type": "number",
            "describe": "contact time (s, > 0)",
            "unit": "s",
            "min": 0.000001,
            "max": 60
          }
        },
        "output": {
          "momentumChange": {
            "type": "number",
            "describe": "Δp (kg·m·s⁻¹, signed)"
          },
          "impulseMagnitude": {
            "type": "number",
            "describe": "|J| (N·s)"
          },
          "averageForceMagnitude": {
            "type": "number",
            "describe": "|F| (N)"
          },
          "direction": {
            "type": "string",
            "describe": "away from the wall | toward the wall"
          }
        }
      }
    },
    {
      "id": "sci_work_energy",
      "name": "Work–energy theorem",
      "answers": "The net work on a vehicle from its change in kinetic energy: W_net = ΔKE = ½m(v² − u²).",
      "reference": "CAPS Grade 12 Physical Sciences, worked reference P4 (offline reconstruction); W_net = ΔKE",
      "example": {
        "mass": 1200,
        "uSpeed": 10,
        "vSpeed": 25
      },
      "signature": {
        "input": {
          "mass": {
            "type": "number",
            "describe": "mass (kg)",
            "unit": "kg",
            "min": 0.001,
            "max": 1000000
          },
          "uSpeed": {
            "type": "number",
            "describe": "initial speed (m·s⁻¹)",
            "unit": "m·s⁻¹",
            "min": 0,
            "max": 10000
          },
          "vSpeed": {
            "type": "number",
            "describe": "final speed (m·s⁻¹)",
            "unit": "m·s⁻¹",
            "min": 0,
            "max": 10000
          }
        },
        "output": {
          "workJoule": {
            "type": "number",
            "describe": "W_net (J)"
          },
          "workKilojoule": {
            "type": "number",
            "describe": "W_net (kJ)"
          }
        }
      }
    },
    {
      "id": "sci_projectile",
      "name": "Vertical projectile motion",
      "answers": "Time to the top, maximum height and total flight time for a projectile launched straight up at u, constant g, no air resistance.",
      "reference": "CAPS Grade 12 Physical Sciences, worked reference P5 (offline reconstruction); t_up = u/g; h_max = u²/(2g)",
      "example": {
        "uUp": 20
      },
      "signature": {
        "input": {
          "uUp": {
            "type": "number",
            "describe": "launch speed upward (m·s⁻¹, > 0)",
            "unit": "m·s⁻¹",
            "min": 0.001,
            "max": 10000
          }
        },
        "output": {
          "timeUp": {
            "type": "number",
            "describe": "t to the highest point (s, 3 d.p.)"
          },
          "maxHeight": {
            "type": "number",
            "describe": "h_max (m, 3 d.p.)"
          },
          "flightTime": {
            "type": "number",
            "describe": "total time back to launch height (s, 3 d.p.)"
          }
        }
      }
    },
    {
      "id": "sci_doppler",
      "name": "Doppler effect",
      "answers": "The observed frequency for a source approaching or receding from a stationary listener; a source at or beyond the speed of sound is refused.",
      "reference": "CAPS Grade 12 Physical Sciences, worked reference P6 (offline reconstruction); f_L = v/(v ∓ v_s) · f_s; v = 340 m·s⁻¹ working value",
      "example": {
        "sourceFrequency": 500,
        "sourceSpeed": 20,
        "motion": "approaching"
      },
      "signature": {
        "input": {
          "sourceFrequency": {
            "type": "number",
            "describe": "f_s (Hz)",
            "unit": "Hz",
            "min": 0.001,
            "max": 1000000
          },
          "sourceSpeed": {
            "type": "number",
            "describe": "source speed (m·s⁻¹, < 340)",
            "unit": "m·s⁻¹",
            "min": 0,
            "max": 10000
          },
          "motion": {
            "type": "string",
            "describe": "approaching or receding",
            "oneOf": [
              "approaching",
              "receding"
            ]
          }
        },
        "output": {
          "observedFrequency": {
            "type": "number",
            "describe": "f_L (Hz)"
          }
        }
      }
    },
    {
      "id": "sci_snell",
      "name": "Snell's law and the critical angle",
      "answers": "The refraction angle for n₁ sinθ₁ = n₂ sinθ₂ and the critical angle for the reverse passage; total internal reflection is refused by name.",
      "reference": "CAPS Grade 12 Physical Sciences, worked reference P7 (offline reconstruction); sinθ_c = n₁/n₂ for the denser-to-rarer passage",
      "example": {
        "n1": 1,
        "n2": 1.5,
        "theta1": 30
      },
      "signature": {
        "input": {
          "n1": {
            "type": "number",
            "describe": "refractive index of the first medium (> 0)",
            "min": 0.001,
            "max": 10
          },
          "n2": {
            "type": "number",
            "describe": "refractive index of the second medium (> 0)",
            "min": 0.001,
            "max": 10
          },
          "theta1": {
            "type": "number",
            "describe": "angle of incidence (°)",
            "unit": "°",
            "min": 0,
            "max": 90
          }
        },
        "output": {
          "theta2": {
            "type": "number",
            "describe": "angle of refraction (°, 2 d.p.)"
          },
          "criticalAngle": {
            "type": "number",
            "describe": "critical angle for the denser-to-rarer passage (°, 2 d.p.)"
          }
        }
      }
    },
    {
      "id": "sci_coulomb",
      "name": "Coulomb's law",
      "answers": "The electrostatic force between two point charges, its magnitude and its nature (attractive or repulsive).",
      "reference": "CAPS Grade 12 Physical Sciences, worked reference P8 (offline reconstruction); F = k|Q₁Q₂|/r², k = 9,0 × 10⁹ N·m²·C⁻²",
      "example": {
        "q1MicroC": 2,
        "q2MicroC": -3,
        "distance": 0.3
      },
      "signature": {
        "input": {
          "q1MicroC": {
            "type": "number",
            "describe": "Q₁ (μC)",
            "unit": "μC",
            "min": -1000000,
            "max": 1000000
          },
          "q2MicroC": {
            "type": "number",
            "describe": "Q₂ (μC)",
            "unit": "μC",
            "min": -1000000,
            "max": 1000000
          },
          "distance": {
            "type": "number",
            "describe": "separation r (m, > 0)",
            "unit": "m",
            "min": 0.000001,
            "max": 100000
          }
        },
        "output": {
          "forceNewton": {
            "type": "number",
            "describe": "|F| (N)"
          },
          "nature": {
            "type": "string",
            "describe": "attractive | repulsive"
          }
        }
      }
    },
    {
      "id": "sci_internal_resistance",
      "name": "EMF and internal resistance",
      "answers": "Current, terminal potential difference and the power split for ε = I(R + r), with the energy check εI = P_R + P_r.",
      "reference": "CAPS Grade 12 Physical Sciences, worked reference P9 (offline reconstruction); ε = I(R + r); P = I²R",
      "example": {
        "emf": 12,
        "internalResistance": 1,
        "loadResistance": 5
      },
      "signature": {
        "input": {
          "emf": {
            "type": "number",
            "describe": "ε (V)",
            "unit": "V",
            "min": 0.001,
            "max": 1000000
          },
          "internalResistance": {
            "type": "number",
            "describe": "r (Ω)",
            "unit": "Ω",
            "min": 0,
            "max": 1000000
          },
          "loadResistance": {
            "type": "number",
            "describe": "R (Ω, > 0)",
            "unit": "Ω",
            "min": 0.001,
            "max": 1000000
          }
        },
        "output": {
          "current": {
            "type": "number",
            "describe": "I (A)"
          },
          "terminalPd": {
            "type": "number",
            "describe": "V = IR (V)"
          },
          "powerLoad": {
            "type": "number",
            "describe": "P_R = I²R (W)"
          },
          "powerInternal": {
            "type": "number",
            "describe": "P_r = I²r (W)"
          }
        }
      }
    },
    {
      "id": "sci_faraday",
      "name": "Faraday's law",
      "answers": "The magnitude of the induced emf for a changing flux through N turns; the sign follows Lenz and is stated, not dropped.",
      "reference": "CAPS Grade 12 Physical Sciences, worked reference P10 (offline reconstruction); ε = −NΔΦ/Δt",
      "example": {
        "turns": 200,
        "fluxFrom": 0.02,
        "fluxTo": 0,
        "timeSeconds": 0.1
      },
      "signature": {
        "input": {
          "turns": {
            "type": "number",
            "describe": "N (whole turns, ≥ 1)",
            "min": 1,
            "max": 1000000
          },
          "fluxFrom": {
            "type": "number",
            "describe": "initial flux (Wb)",
            "unit": "Wb",
            "min": -1000,
            "max": 1000
          },
          "fluxTo": {
            "type": "number",
            "describe": "final flux (Wb)",
            "unit": "Wb",
            "min": -1000,
            "max": 1000
          },
          "timeSeconds": {
            "type": "number",
            "describe": "Δt (s, > 0)",
            "unit": "s",
            "min": 0.000001,
            "max": 86400
          }
        },
        "output": {
          "emfMagnitude": {
            "type": "number",
            "describe": "|ε| (V)"
          }
        }
      }
    },
    {
      "id": "sci_ideal_gas",
      "name": "The ideal gas law",
      "answers": "The pressure from pV = nRT, kelvin only — a Celsius temperature is refused with the conversion shown.",
      "reference": "CAPS Grade 12 Physical Sciences, worked reference P11 (offline reconstruction); pV = nRT, R = 8,314 J·K⁻¹·mol⁻¹",
      "example": {
        "moles": 2,
        "temperature": 300,
        "volume": 0.05,
        "temperatureUnit": "K"
      },
      "signature": {
        "input": {
          "moles": {
            "type": "number",
            "describe": "n (mol, ≥ 0)",
            "unit": "mol",
            "min": 0,
            "max": 1000000
          },
          "temperature": {
            "type": "number",
            "describe": "T (kelvin, > 0)",
            "unit": "K",
            "min": -273,
            "max": 100000
          },
          "volume": {
            "type": "number",
            "describe": "V (m³, > 0)",
            "unit": "m³",
            "min": 1e-7,
            "max": 1000000
          },
          "temperatureUnit": {
            "type": "string",
            "describe": "K only — a Celsius value must be converted first",
            "oneOf": [
              "K",
              "C"
            ],
            "default": "K"
          }
        },
        "output": {
          "pressurePa": {
            "type": "number",
            "describe": "p (Pa)"
          },
          "pressureKPa": {
            "type": "number",
            "describe": "p (kPa, 1 d.p.)"
          }
        }
      }
    },
    {
      "id": "sci_stoichiometry",
      "name": "Stoichiometry — 2H₂ + O₂ → 2H₂O",
      "answers": "The limiting reagent and the mass of water formed, with the mole ratios shown (working molar masses: H₂ 2, O₂ 32, H₂O 18 g·mol⁻¹).",
      "reference": "CAPS Grade 12 Physical Sciences, worked reference P12 (offline reconstruction); the limiting reagent fixes the product",
      "example": {
        "massH2": 4,
        "massO2": 32
      },
      "signature": {
        "input": {
          "massH2": {
            "type": "number",
            "describe": "mass of H₂ (g, ≥ 0)",
            "unit": "g",
            "min": 0,
            "max": 1000000
          },
          "massO2": {
            "type": "number",
            "describe": "mass of O₂ (g, ≥ 0)",
            "unit": "g",
            "min": 0,
            "max": 1000000
          }
        },
        "output": {
          "molH2": {
            "type": "number",
            "describe": "n(H₂) (mol)"
          },
          "molO2": {
            "type": "number",
            "describe": "n(O₂) (mol)"
          },
          "limiting": {
            "type": "string",
            "describe": "H2 | O2 | stoichiometric"
          },
          "massWater": {
            "type": "number",
            "describe": "mass of H₂O formed (g)"
          }
        }
      }
    },
    {
      "id": "sci_concentration",
      "name": "Concentration",
      "answers": "c = n/V with the volume converted from cm³ to dm³ first.",
      "reference": "CAPS Grade 12 Physical Sciences, worked reference P13 (offline reconstruction); c = n/V, V in dm³",
      "example": {
        "moles": 0.5,
        "volumeCm3": 250
      },
      "signature": {
        "input": {
          "moles": {
            "type": "number",
            "describe": "n (mol, ≥ 0)",
            "unit": "mol",
            "min": 0,
            "max": 1000000
          },
          "volumeCm3": {
            "type": "number",
            "describe": "V (cm³, > 0)",
            "unit": "cm³",
            "min": 0.001,
            "max": 100000000
          }
        },
        "output": {
          "concentration": {
            "type": "number",
            "describe": "c (mol·dm⁻³)"
          }
        }
      }
    },
    {
      "id": "sci_ph",
      "name": "pH of a strong acid",
      "answers": "pH = −log[H⁺] for a fully dissociated monoprotic acid; a weak acid without Ka is refused with that reason.",
      "reference": "CAPS Grade 12 Physical Sciences, worked reference P14 (offline reconstruction); pH = −log[H⁺]",
      "example": {
        "concentration": 0.01,
        "acidStrength": "strong"
      },
      "signature": {
        "input": {
          "concentration": {
            "type": "number",
            "describe": "[acid] (mol·dm⁻³, > 0)",
            "unit": "mol·dm⁻³",
            "min": 1e-10,
            "max": 20
          },
          "acidStrength": {
            "type": "string",
            "describe": "strong (full dissociation) or weak (needs Ka)",
            "oneOf": [
              "strong",
              "weak"
            ]
          }
        },
        "output": {
          "pH": {
            "type": "number",
            "describe": "pH (2 d.p.)"
          }
        }
      }
    },
    {
      "id": "sci_equilibrium_kc",
      "name": "Equilibrium constant — N₂ + 3H₂ ⇌ 2NH₃",
      "answers": "Kc = [NH₃]²/([N₂][H₂]³) from the equilibrium concentrations; a zero denominator is refused.",
      "reference": "CAPS Grade 12 Physical Sciences, worked reference P15 (offline reconstruction); Kc carries no unit in the house's convention",
      "example": {
        "concN2": 0.5,
        "concH2": 1.5,
        "concNH3": 1
      },
      "signature": {
        "input": {
          "concN2": {
            "type": "number",
            "describe": "[N₂] (mol·dm⁻³, ≥ 0)",
            "unit": "mol·dm⁻³",
            "min": 0,
            "max": 1000
          },
          "concH2": {
            "type": "number",
            "describe": "[H₂] (mol·dm⁻³, ≥ 0)",
            "unit": "mol·dm⁻³",
            "min": 0,
            "max": 1000
          },
          "concNH3": {
            "type": "number",
            "describe": "[NH₃] (mol·dm⁻³, ≥ 0)",
            "unit": "mol·dm⁻³",
            "min": 0,
            "max": 1000
          }
        },
        "output": {
          "kc": {
            "type": "number",
            "describe": "Kc (4 d.p.)"
          }
        }
      }
    },
    {
      "id": "sci_cell_potential",
      "name": "Standard cell potential",
      "answers": "E°cell = E°cathode − E°anode; a negative answer is reported as non-spontaneous as written, never called an error.",
      "reference": "CAPS Grade 12 Physical Sciences, worked reference P16 (offline reconstruction); working electrode potentials Zn²⁺/Zn −0,76 V, Cu²⁺/Cu +0,34 V",
      "example": {
        "eCathode": 0.34,
        "eAnode": -0.76
      },
      "signature": {
        "input": {
          "eCathode": {
            "type": "number",
            "describe": "E° of the cathode half-cell (V)",
            "unit": "V",
            "min": -10,
            "max": 10
          },
          "eAnode": {
            "type": "number",
            "describe": "E° of the anode half-cell (V)",
            "unit": "V",
            "min": -10,
            "max": 10
          }
        },
        "output": {
          "cellPotential": {
            "type": "number",
            "describe": "E°cell (V)"
          },
          "spontaneity": {
            "type": "string",
            "describe": "spontaneous as written | non-spontaneous as written"
          }
        }
      }
    },
    {
      "id": "sci_photon_energy",
      "name": "Photon energy",
      "answers": "E = hc/λ in joule and electron-volt for a given wavelength; λ ≤ 0 is refused.",
      "reference": "CAPS Grade 12 Physical Sciences, worked reference P17 (offline reconstruction); h = 6,63 × 10⁻³⁴ J·s, c = 3,0 × 10⁸ m·s⁻¹, e = 1,6 × 10⁻¹⁹ C",
      "example": {
        "wavelengthNm": 500
      },
      "signature": {
        "input": {
          "wavelengthNm": {
            "type": "number",
            "describe": "λ (nm, > 0)",
            "unit": "nm",
            "min": 0.001,
            "max": 100000000
          }
        },
        "output": {
          "energyJoule": {
            "type": "number",
            "describe": "E (J)"
          },
          "energyEv": {
            "type": "number",
            "describe": "E (eV, 2 d.p.)"
          }
        }
      }
    },
    {
      "id": "sci_practical_data",
      "name": "Practical data exercise (offline)",
      "answers": "The gradient of extension against load, the mean of repeated readings and their spread — over SUPPLIED readings; no experiment was performed.",
      "reference": "CAPS Grade 12 Physical Sciences, worked reference P18 (offline reconstruction); the practical is a data exercise, not a performed experiment",
      "example": {
        "loads": [
          0,
          2,
          4,
          6,
          8
        ],
        "extensions": [
          0,
          0.8,
          1.6,
          2.4,
          3.2
        ],
        "repeats": [
          3.1,
          3.2,
          3.3
        ]
      },
      "signature": {
        "input": {
          "loads": {
            "type": "number[]",
            "describe": "applied loads (N), in order"
          },
          "extensions": {
            "type": "number[]",
            "describe": "measured extensions (cm), one per load"
          },
          "repeats": {
            "type": "number[]",
            "describe": "repeated readings of the final extension (cm)"
          }
        },
        "output": {
          "gradient": {
            "type": "number",
            "describe": "Δ(extension)/Δ(load) (cm·N⁻¹)"
          },
          "meanRepeat": {
            "type": "number",
            "describe": "mean of the repeated readings (cm)"
          },
          "spread": {
            "type": "number",
            "describe": "range of the repeated readings (cm)"
          }
        }
      }
    },
    {
      "id": "lang_final_mark",
      "name": "Weighted final mark",
      "answers": "The final subject mark from the school-based assessment and the examination mark under the stated weighting — or the examination mark alone on the adult (no-SBA) route.",
      "reference": "Umalusi/NSC subject catalogue, worked reference (offline reconstruction); working split 25% SBA / 75% exam for exam subjects; the Senior Certificate (Amended) route has no SBA (verify item §12)",
      "example": {
        "sbaMark": 60,
        "examMark": 68,
        "route": "nsc"
      },
      "signature": {
        "input": {
          "sbaMark": {
            "type": "number",
            "describe": "school-based assessment mark (percent)",
            "min": 0,
            "max": 100
          },
          "examMark": {
            "type": "number",
            "describe": "examination mark (percent)",
            "min": 0,
            "max": 100
          },
          "route": {
            "type": "string",
            "describe": "nsc (25/75) or amended (exam only)",
            "oneOf": [
              "nsc",
              "amended"
            ]
          }
        },
        "output": {
          "finalMark": {
            "type": "number",
            "describe": "the final mark (percent)"
          }
        }
      }
    },
    {
      "id": "lang_reading_statistic",
      "name": "Reading statistic on a fixed text",
      "answers": "Word count, sentence count and average word length of a supplied passage — a deterministic text measure, never a model-marked essay.",
      "reference": "Umalusi/NSC subject catalogue, worked reference (offline reconstruction); a fixed-text statistic (languages row of §4)",
      "example": {
        "text": "The sun rose over the valley. Every learner opened a book. Reading builds the mind."
      },
      "signature": {
        "input": {
          "text": {
            "type": "string",
            "describe": "the passage (non-empty)"
          }
        },
        "output": {
          "words": {
            "type": "number",
            "describe": "word count"
          },
          "sentences": {
            "type": "number",
            "describe": "sentence count"
          },
          "averageWordLength": {
            "type": "number",
            "describe": "letters per word (2 d.p.)"
          }
        }
      }
    },
    {
      "id": "mathlit_tariff",
      "name": "Stepped tariff",
      "answers": "The cost of consumption under a two-block stepped tariff, block by block.",
      "reference": "Umalusi/NSC subject catalogue, worked reference (offline reconstruction); Mathematical Literacy row of §4 — a tariff computation",
      "example": {
        "unitsUsed": 150,
        "blockOneLimit": 100,
        "blockOneRate": 1.5,
        "blockTwoRate": 2.1
      },
      "signature": {
        "input": {
          "unitsUsed": {
            "type": "number",
            "describe": "units consumed (≥ 0)",
            "min": 0,
            "max": 1000000
          },
          "blockOneLimit": {
            "type": "number",
            "describe": "units in the first block",
            "min": 0.001,
            "max": 1000000
          },
          "blockOneRate": {
            "type": "number",
            "describe": "rate per unit in block one",
            "min": 0,
            "max": 100000
          },
          "blockTwoRate": {
            "type": "number",
            "describe": "rate per unit above the limit",
            "min": 0,
            "max": 100000
          }
        },
        "output": {
          "totalCost": {
            "type": "number",
            "describe": "the total cost (2 d.p.)"
          }
        }
      }
    },
    {
      "id": "lo_sba_total",
      "name": "School-based assessment total",
      "answers": "The Life Orientation SBA percentage from task marks and task totals — 100% school-based, no external paper (working reconstruction).",
      "reference": "Umalusi/NSC subject catalogue, worked reference (offline reconstruction); Life Orientation is 100% SBA with no external examination (verify item §12)",
      "example": {
        "taskMarks": [
          38,
          42,
          71,
          85
        ],
        "taskTotals": [
          50,
          50,
          80,
          100
        ]
      },
      "signature": {
        "input": {
          "taskMarks": {
            "type": "number[]",
            "describe": "mark achieved per task"
          },
          "taskTotals": {
            "type": "number[]",
            "describe": "maximum mark per task"
          }
        },
        "output": {
          "sbaPercent": {
            "type": "number",
            "describe": "the SBA percentage (2 d.p.)"
          }
        }
      }
    },
    {
      "id": "lifesci_punnett",
      "name": "Punnett square — monohybrid cross",
      "answers": "The genotype and phenotype ratios of a monohybrid cross, by enumerating the four gamete combinations.",
      "reference": "Umalusi/NSC subject catalogue, worked reference (offline reconstruction); Life Sciences row of §4 — a Punnett-square ratio",
      "example": {
        "parentOne": "Aa",
        "parentTwo": "Aa"
      },
      "signature": {
        "input": {
          "parentOne": {
            "type": "string",
            "describe": "first parent genotype",
            "oneOf": [
              "AA",
              "Aa",
              "aa"
            ]
          },
          "parentTwo": {
            "type": "string",
            "describe": "second parent genotype",
            "oneOf": [
              "AA",
              "Aa",
              "aa"
            ]
          }
        },
        "output": {
          "genotypeRatio": {
            "type": "string",
            "describe": "AA : Aa : aa"
          },
          "dominantFraction": {
            "type": "number",
            "describe": "fraction showing the dominant phenotype"
          }
        }
      }
    },
    {
      "id": "agrisci_npk",
      "name": "Fertiliser nutrient mass",
      "answers": "The mass of N, P and K in a bag from its stated percentages.",
      "reference": "Umalusi/NSC subject catalogue, worked reference (offline reconstruction); Agricultural Sciences row of §4 — nutrient mass from a fertiliser label",
      "example": {
        "bagMassKg": 50,
        "nPercent": 10,
        "pPercent": 6,
        "kPercent": 4
      },
      "signature": {
        "input": {
          "bagMassKg": {
            "type": "number",
            "describe": "bag mass (kg, > 0)",
            "unit": "kg",
            "min": 0.001,
            "max": 100000
          },
          "nPercent": {
            "type": "number",
            "describe": "N (%)",
            "min": 0,
            "max": 100
          },
          "pPercent": {
            "type": "number",
            "describe": "P (%)",
            "min": 0,
            "max": 100
          },
          "kPercent": {
            "type": "number",
            "describe": "K (%)",
            "min": 0,
            "max": 100
          }
        },
        "output": {
          "massN": {
            "type": "number",
            "describe": "kg of N"
          },
          "massP": {
            "type": "number",
            "describe": "kg of P"
          },
          "massK": {
            "type": "number",
            "describe": "kg of K"
          }
        }
      }
    },
    {
      "id": "acc_depreciation",
      "name": "Depreciation",
      "answers": "Depreciation for a chosen year and the carrying value, on the straight-line or the diminishing-balance method.",
      "reference": "Umalusi/NSC subject catalogue, worked reference (offline reconstruction); Accounting row of §4 — depreciation and carrying value",
      "example": {
        "cost": 100000,
        "ratePercent": 20,
        "year": 3,
        "method": "diminishing-balance"
      },
      "signature": {
        "input": {
          "cost": {
            "type": "number",
            "describe": "cost price (> 0)",
            "min": 0.01,
            "max": 1000000000
          },
          "ratePercent": {
            "type": "number",
            "describe": "annual rate (%, 0–100)",
            "min": 0,
            "max": 100
          },
          "year": {
            "type": "number",
            "describe": "which year (1-based whole number)",
            "min": 1,
            "max": 100
          },
          "method": {
            "type": "string",
            "describe": "straight-line or diminishing-balance",
            "oneOf": [
              "straight-line",
              "diminishing-balance"
            ]
          }
        },
        "output": {
          "depreciationForYear": {
            "type": "number",
            "describe": "depreciation in that year (2 d.p.)"
          },
          "carryingValue": {
            "type": "number",
            "describe": "carrying value at the end of that year (2 d.p.)"
          }
        }
      }
    },
    {
      "id": "bus_breakeven",
      "name": "Break-even quantity",
      "answers": "Fixed cost over the contribution per unit; a selling price at or below the variable cost is refused because no volume can break even.",
      "reference": "Umalusi/NSC subject catalogue, worked reference (offline reconstruction); Business Studies row of §4 — break-even from fixed cost, price and variable cost",
      "example": {
        "fixedCost": 60000,
        "sellingPrice": 50,
        "variableCost": 30
      },
      "signature": {
        "input": {
          "fixedCost": {
            "type": "number",
            "describe": "fixed cost per period (≥ 0)",
            "min": 0,
            "max": 1000000000
          },
          "sellingPrice": {
            "type": "number",
            "describe": "selling price per unit (> 0)",
            "min": 0.01,
            "max": 1000000
          },
          "variableCost": {
            "type": "number",
            "describe": "variable cost per unit (≥ 0)",
            "min": 0,
            "max": 1000000
          }
        },
        "output": {
          "breakEvenUnits": {
            "type": "number",
            "describe": "units to break even (rounded up)"
          }
        }
      }
    },
    {
      "id": "econ_inflation",
      "name": "Inflation rate from two index values",
      "answers": "The percentage change of a price index between two readings.",
      "reference": "Umalusi/NSC subject catalogue, worked reference (offline reconstruction); Economics row of §4 — an inflation rate from two index values",
      "example": {
        "indexOld": 120,
        "indexNew": 129
      },
      "signature": {
        "input": {
          "indexOld": {
            "type": "number",
            "describe": "earlier index value (> 0)",
            "min": 0.001,
            "max": 1000000
          },
          "indexNew": {
            "type": "number",
            "describe": "later index value (≥ 0)",
            "min": 0,
            "max": 1000000
          }
        },
        "output": {
          "inflationPercent": {
            "type": "number",
            "describe": "the rate (%, 2 d.p.)"
          }
        }
      }
    },
    {
      "id": "geo_map_scale",
      "name": "Map scale and gradient",
      "answers": "The ground distance from a map measurement and a 1 : n scale, and the gradient as 1 : (run/rise).",
      "reference": "Umalusi/NSC subject catalogue, worked reference (offline reconstruction); Geography row of §4 — a map scale distance and a gradient",
      "example": {
        "mapDistanceCm": 4.5,
        "scaleDenominator": 50000,
        "riseM": 120
      },
      "signature": {
        "input": {
          "mapDistanceCm": {
            "type": "number",
            "describe": "measured map distance (cm, > 0)",
            "unit": "cm",
            "min": 0.001,
            "max": 10000
          },
          "scaleDenominator": {
            "type": "number",
            "describe": "the n of 1 : n (> 0)",
            "min": 1,
            "max": 10000000
          },
          "riseM": {
            "type": "number",
            "describe": "height gained over the distance (m, > 0)",
            "unit": "m",
            "min": 0.001,
            "max": 100000
          }
        },
        "output": {
          "groundDistanceKm": {
            "type": "number",
            "describe": "ground distance (km, 3 d.p.)"
          },
          "gradientRun": {
            "type": "number",
            "describe": "the n of gradient 1 : n (1 d.p.)"
          }
        }
      }
    },
    {
      "id": "hist_timeline",
      "name": "Timeline span",
      "answers": "The span in years between two dated events; an end year before the start year is refused.",
      "reference": "Umalusi/NSC subject catalogue, worked reference (offline reconstruction); History row of §4 — a timeline span and a source-weighting total",
      "example": {
        "startYear": 1948,
        "endYear": 1994
      },
      "signature": {
        "input": {
          "startYear": {
            "type": "number",
            "describe": "the earlier year",
            "min": -3000,
            "max": 3000
          },
          "endYear": {
            "type": "number",
            "describe": "the later year",
            "min": -3000,
            "max": 3000
          }
        },
        "output": {
          "spanYears": {
            "type": "number",
            "describe": "years between the two"
          }
        }
      }
    },
    {
      "id": "rel_text_compare",
      "name": "Fixed-text comparison statistic",
      "answers": "The shared and unique word counts of two supplied passages — a deterministic comparison, never a model-marked essay.",
      "reference": "Umalusi/NSC subject catalogue, worked reference (offline reconstruction); Religion Studies row of §4 — a fixed-text comparison statistic",
      "example": {
        "textA": "Compassion and justice guide the community.",
        "textB": "Justice and mercy guide the household."
      },
      "signature": {
        "input": {
          "textA": {
            "type": "string",
            "describe": "first passage"
          },
          "textB": {
            "type": "string",
            "describe": "second passage"
          }
        },
        "output": {
          "sharedWords": {
            "type": "number",
            "describe": "distinct words in both"
          },
          "uniqueToA": {
            "type": "number",
            "describe": "distinct words only in A"
          },
          "uniqueToB": {
            "type": "number",
            "describe": "distinct words only in B"
          }
        }
      }
    },
    {
      "id": "tour_currency",
      "name": "Currency conversion and occupancy",
      "answers": "A currency conversion at a stated rate, and the occupancy percentage of a lodge.",
      "reference": "Umalusi/NSC subject catalogue, worked reference (offline reconstruction); Tourism row of §4 — a currency conversion and an occupancy percentage",
      "example": {
        "amount": 1000,
        "rate": 18.5,
        "roomsSold": 45,
        "roomsAvailable": 60
      },
      "signature": {
        "input": {
          "amount": {
            "type": "number",
            "describe": "amount in the source currency (≥ 0)",
            "min": 0,
            "max": 1000000000
          },
          "rate": {
            "type": "number",
            "describe": "units of the target currency per source unit (> 0)",
            "min": 0.000001,
            "max": 1000000
          },
          "roomsSold": {
            "type": "number",
            "describe": "rooms sold",
            "min": 0,
            "max": 1000000
          },
          "roomsAvailable": {
            "type": "number",
            "describe": "rooms available (> 0)",
            "min": 1,
            "max": 1000000
          }
        },
        "output": {
          "converted": {
            "type": "number",
            "describe": "converted amount (2 d.p.)"
          },
          "occupancyPercent": {
            "type": "number",
            "describe": "occupancy (%, 1 d.p.)"
          }
        }
      }
    },
    {
      "id": "cons_unit_price",
      "name": "Unit price and recipe scaling",
      "answers": "The price per unit of a pack and the factor to scale a recipe between serving counts.",
      "reference": "Umalusi/NSC subject catalogue, worked reference (offline reconstruction); Consumer Studies row of §4 — a unit price and a recipe scale factor",
      "example": {
        "packPrice": 36,
        "packSize": 6,
        "servingsHave": 4,
        "servingsNeed": 10
      },
      "signature": {
        "input": {
          "packPrice": {
            "type": "number",
            "describe": "price of the pack (≥ 0)",
            "min": 0,
            "max": 1000000
          },
          "packSize": {
            "type": "number",
            "describe": "units in the pack (> 0)",
            "min": 0.001,
            "max": 1000000
          },
          "servingsHave": {
            "type": "number",
            "describe": "servings the recipe makes (> 0)",
            "min": 0.001,
            "max": 100000
          },
          "servingsNeed": {
            "type": "number",
            "describe": "servings needed (> 0)",
            "min": 0.001,
            "max": 100000
          }
        },
        "output": {
          "unitPrice": {
            "type": "number",
            "describe": "price per unit (2 d.p.)"
          },
          "scaleFactor": {
            "type": "number",
            "describe": "multiply every ingredient by this (2 d.p.)"
          }
        }
      }
    },
    {
      "id": "hosp_portion_cost",
      "name": "Portion cost",
      "answers": "The cost per portion from a batch cost and a portion count.",
      "reference": "Umalusi/NSC subject catalogue, worked reference (offline reconstruction); Hospitality Studies row of §4 — a portion cost and a cover count",
      "example": {
        "batchCost": 480,
        "portions": 32
      },
      "signature": {
        "input": {
          "batchCost": {
            "type": "number",
            "describe": "cost of the batch (≥ 0)",
            "min": 0,
            "max": 1000000
          },
          "portions": {
            "type": "number",
            "describe": "portions from the batch (whole, ≥ 1)",
            "min": 1,
            "max": 100000
          }
        },
        "output": {
          "costPerPortion": {
            "type": "number",
            "describe": "cost per portion (2 d.p.)"
          }
        }
      }
    },
    {
      "id": "cat_filesize",
      "name": "File-size total",
      "answers": "The total of a list of file sizes in KB, converted to MB at 1024 KB per MB.",
      "reference": "Umalusi/NSC subject catalogue, worked reference (offline reconstruction); CAT row of §4 — a file-size total",
      "example": {
        "fileSizesKb": [
          512,
          256,
          1280
        ]
      },
      "signature": {
        "input": {
          "fileSizesKb": {
            "type": "number[]",
            "describe": "file sizes (KB, each ≥ 0)"
          }
        },
        "output": {
          "totalKb": {
            "type": "number",
            "describe": "total (KB)"
          },
          "totalMb": {
            "type": "number",
            "describe": "total (MB, 3 d.p.)"
          }
        }
      }
    },
    {
      "id": "it_binary",
      "name": "Binary and decimal conversion",
      "answers": "The binary representation of a whole number (0–65535) and the round-trip back to decimal.",
      "reference": "Umalusi/NSC subject catalogue, worked reference (offline reconstruction); IT row of §4 — a binary/decimal conversion",
      "example": {
        "value": 156
      },
      "signature": {
        "input": {
          "value": {
            "type": "number",
            "describe": "whole number 0–65535",
            "min": 0,
            "max": 65535
          }
        },
        "output": {
          "binary": {
            "type": "string",
            "describe": "binary digits"
          },
          "bits": {
            "type": "number",
            "describe": "how many bits"
          },
          "roundTrip": {
            "type": "number",
            "describe": "parsed back to decimal — must equal the input"
          }
        }
      }
    },
    {
      "id": "egd_scale",
      "name": "Scale drawing length",
      "answers": "The actual length from a drawing measurement and a 1 : n scale.",
      "reference": "Umalusi/NSC subject catalogue, worked reference (offline reconstruction); EGD row of §4 — a scale drawing length",
      "example": {
        "drawingMm": 45,
        "scaleDenominator": 20
      },
      "signature": {
        "input": {
          "drawingMm": {
            "type": "number",
            "describe": "measured length on the drawing (mm, > 0)",
            "unit": "mm",
            "min": 0.001,
            "max": 100000
          },
          "scaleDenominator": {
            "type": "number",
            "describe": "the n of 1 : n (> 0)",
            "min": 0.001,
            "max": 1000000
          }
        },
        "output": {
          "actualMm": {
            "type": "number",
            "describe": "actual length (mm)"
          },
          "actualM": {
            "type": "number",
            "describe": "actual length (m, 3 d.p.)"
          }
        }
      }
    },
    {
      "id": "civtech_load",
      "name": "Load per area",
      "answers": "The distributed load on a slab: force over area.",
      "reference": "Umalusi/NSC subject catalogue, worked reference (offline reconstruction); Civil Technology row of §4 — a load per area",
      "example": {
        "loadKn": 12,
        "areaM2": 2.5
      },
      "signature": {
        "input": {
          "loadKn": {
            "type": "number",
            "describe": "total load (kN, ≥ 0)",
            "unit": "kN",
            "min": 0,
            "max": 1000000
          },
          "areaM2": {
            "type": "number",
            "describe": "area (m², > 0)",
            "unit": "m²",
            "min": 0.0001,
            "max": 1000000
          }
        },
        "output": {
          "loadPerArea": {
            "type": "number",
            "describe": "kN/m² (3 d.p.)"
          }
        }
      }
    },
    {
      "id": "mechtech_gear",
      "name": "Gear ratio and torque",
      "answers": "The velocity ratio of a gear pair and the ideal output torque.",
      "reference": "Umalusi/NSC subject catalogue, worked reference (offline reconstruction); Mechanical Technology row of §4 — a gear ratio and a torque",
      "example": {
        "teethDriver": 20,
        "teethDriven": 60,
        "inputTorque": 50
      },
      "signature": {
        "input": {
          "teethDriver": {
            "type": "number",
            "describe": "teeth on the driver (whole, ≥ 1)",
            "min": 1,
            "max": 10000
          },
          "teethDriven": {
            "type": "number",
            "describe": "teeth on the driven gear (whole, ≥ 1)",
            "min": 1,
            "max": 10000
          },
          "inputTorque": {
            "type": "number",
            "describe": "input torque (N·m, ≥ 0)",
            "unit": "N·m",
            "min": 0,
            "max": 1000000
          }
        },
        "output": {
          "gearRatio": {
            "type": "number",
            "describe": "driven/driver (3 d.p.)"
          },
          "outputTorque": {
            "type": "number",
            "describe": "ideal output torque (N·m, 3 d.p.)"
          }
        }
      }
    },
    {
      "id": "electech_resistance",
      "name": "Series and parallel resistance",
      "answers": "The total resistance of a set of resistors in series or in parallel; a zero resistor in parallel is refused.",
      "reference": "Umalusi/NSC subject catalogue, worked reference (offline reconstruction); Electrical Technology row of §4 — a series/parallel resistance",
      "example": {
        "resistors": [
          10,
          20,
          30
        ],
        "arrangement": "series"
      },
      "signature": {
        "input": {
          "resistors": {
            "type": "number[]",
            "describe": "resistances (Ω, each > 0)"
          },
          "arrangement": {
            "type": "string",
            "describe": "series or parallel",
            "oneOf": [
              "series",
              "parallel"
            ]
          }
        },
        "output": {
          "totalResistance": {
            "type": "number",
            "describe": "total (Ω, 3 d.p.)"
          }
        }
      }
    },
    {
      "id": "art_colour_mix",
      "name": "Colour-mix ratio and frame area",
      "answers": "The fraction of each pigment in a stated mix, and the area of a picture frame border.",
      "reference": "Umalusi/NSC subject catalogue, worked reference (offline reconstruction); Visual Arts row of §4 — a colour-mix ratio and a frame area",
      "example": {
        "partsA": 2,
        "partsB": 3,
        "innerWidthCm": 40,
        "innerHeightCm": 30,
        "borderCm": 5
      },
      "signature": {
        "input": {
          "partsA": {
            "type": "number",
            "describe": "parts of the first pigment (> 0)",
            "min": 0.001,
            "max": 1000
          },
          "partsB": {
            "type": "number",
            "describe": "parts of the second pigment (> 0)",
            "min": 0.001,
            "max": 1000
          },
          "innerWidthCm": {
            "type": "number",
            "describe": "picture width (cm, > 0)",
            "unit": "cm",
            "min": 0.001,
            "max": 10000
          },
          "innerHeightCm": {
            "type": "number",
            "describe": "picture height (cm, > 0)",
            "unit": "cm",
            "min": 0.001,
            "max": 10000
          },
          "borderCm": {
            "type": "number",
            "describe": "frame border width (cm, ≥ 0)",
            "unit": "cm",
            "min": 0,
            "max": 1000
          }
        },
        "output": {
          "fractionA": {
            "type": "number",
            "describe": "fraction of pigment A (4 d.p.)"
          },
          "frameAreaCm2": {
            "type": "number",
            "describe": "area of the border (cm²)"
          }
        }
      }
    },
    {
      "id": "music_interval",
      "name": "Interval frequency ratio",
      "answers": "The just-intonation frequency ratio of a named interval and the upper note from a base frequency.",
      "reference": "Umalusi/NSC subject catalogue, worked reference (offline reconstruction); Music row of §4 — a frequency ratio for an interval",
      "example": {
        "interval": "perfect fifth",
        "baseFrequencyHz": 440
      },
      "signature": {
        "input": {
          "interval": {
            "type": "string",
            "describe": "the interval",
            "oneOf": [
              "octave",
              "perfect fifth",
              "perfect fourth",
              "major third"
            ]
          },
          "baseFrequencyHz": {
            "type": "number",
            "describe": "the lower note (Hz, > 0)",
            "unit": "Hz",
            "min": 0.001,
            "max": 100000
          }
        },
        "output": {
          "ratio": {
            "type": "number",
            "describe": "the frequency ratio (4 d.p.)"
          },
          "upperFrequencyHz": {
            "type": "number",
            "describe": "the upper note (Hz, 2 d.p.)"
          }
        }
      }
    },
    {
      "id": "drama_cue",
      "name": "Lighting-cue duration total",
      "answers": "The total running time of a cue list in seconds and minutes:seconds.",
      "reference": "Umalusi/NSC subject catalogue, worked reference (offline reconstruction); Drama row of §4 — a lighting-cue duration total",
      "example": {
        "cueSeconds": [
          12,
          45,
          8,
          95
        ]
      },
      "signature": {
        "input": {
          "cueSeconds": {
            "type": "number[]",
            "describe": "cue durations (s, each ≥ 0)"
          }
        },
        "output": {
          "totalSeconds": {
            "type": "number",
            "describe": "total (s)"
          },
          "clock": {
            "type": "string",
            "describe": "m:ss"
          }
        }
      }
    },
    {
      "id": "dance_tempo",
      "name": "Tempo and bar count",
      "answers": "How many beats and full bars fit a piece at a stated tempo and time signature.",
      "reference": "Umalusi/NSC subject catalogue, worked reference (offline reconstruction); Dance Studies row of §4 — a tempo/bar count",
      "example": {
        "tempoBpm": 120,
        "beatsPerBar": 4,
        "durationSeconds": 90
      },
      "signature": {
        "input": {
          "tempoBpm": {
            "type": "number",
            "describe": "tempo (beats per minute, > 0)",
            "min": 0.001,
            "max": 1000
          },
          "beatsPerBar": {
            "type": "number",
            "describe": "beats per bar (whole, ≥ 1)",
            "min": 1,
            "max": 32
          },
          "durationSeconds": {
            "type": "number",
            "describe": "duration (s, > 0)",
            "unit": "s",
            "min": 0.001,
            "max": 86400
          }
        },
        "output": {
          "beats": {
            "type": "number",
            "describe": "total beats"
          },
          "fullBars": {
            "type": "number",
            "describe": "complete bars"
          }
        }
      }
    }
  ]
}