{
  "capability_id": "math.fractions",
  "tool_id": "fractions",
  "engine": "fractions",
  "calculation_version": "1.0.5",
  "generated_at": "2026-09-16T22:03:43.769Z",
  "engine_build": "2026-09-10",
  "test_count": 32,
  "passed": 32,
  "failed": 0,
  "tests_summary": {
    "golden": {
      "total": 20,
      "passed": 20
    },
    "boundary": {
      "total": 8,
      "passed": 8
    },
    "property": {
      "total": 4,
      "passed": 4
    }
  },
  "engine_tested": true,
  "expert_reviewed": false,
  "internally_reviewed": false,
  "review_kind": null,
  "source_checked": true,
  "reviewed_by": null,
  "reviewer_role": null,
  "last_reviewed": null,
  "expert_review": {
    "status": "optional_not_performed",
    "reviewer": null,
    "scope": [
      "formula",
      "input semantics",
      "assumptions",
      "limitations",
      "sources",
      "tests"
    ],
    "note": "Domain expert review is optional under CVP (CVP-EXP-01). Absence does not block CVP Verified. See Review policy for supplemental domain assurance."
  },
  "internal_review": {
    "status": "not_applicable",
    "reviewer": null
  },
  "page": "https://www.calculatorx.com/calc/math/fractions",
  "api": "https://www.calculatorx.com/api/v1/calc/fractions",
  "schema_input": "https://www.calculatorx.com/schemas/math.fractions.input.json",
  "schema_output": "https://www.calculatorx.com/schemas/math.fractions.output.json",
  "assumptions": [
    "Integer numerators/denominators (and whole parts) for fraction modes.",
    "Results reduced by GCF; signs normalized onto the numerator."
  ],
  "limitations": [
    "Integer numerators and denominators only (optional mixed-number whole)",
    "Denominator 0 → DENOMINATOR_MUST_BE_NONZERO",
    "Division by 0/n → DIVISION_BY_ZERO",
    "Add/subtract use LCD = LCM(b, d); (ad ± bc)/bd is an equivalent check only",
    "Negative sign is normalized onto the numerator after reduction",
    "Expert review pending — L1 engine-tested / source-checked"
  ],
  "boundary_conditions": [
    "Denominator 0 → undefined",
    "Division by 0/n → undefined"
  ],
  "sources": [
    {
      "title": "OpenStax — Prealgebra 2e",
      "section": "4.5 Add and Subtract Fractions with Different Denominators",
      "url": "https://openstax.org/books/prealgebra-2e/pages/4-5-add-and-subtract-fractions-with-different-denominators",
      "supports": "LCD / LCM method used by this calculator for addition and subtraction",
      "kind": "reference"
    },
    {
      "title": "OpenStax — Prealgebra 2e",
      "section": "4.2 Multiply and Divide Fractions",
      "url": "https://openstax.org/books/prealgebra-2e/pages/4-2-multiply-and-divide-fractions",
      "supports": "GCF simplification, fraction product, and reciprocal (keep–change–flip) division",
      "kind": "reference"
    },
    {
      "title": "OpenStax — Prealgebra 2e",
      "section": "4.3 Multiply and Divide Mixed Numbers and Complex Fractions",
      "url": "https://openstax.org/books/prealgebra-2e/pages/4-3-multiply-and-divide-mixed-numbers-and-complex-fractions",
      "supports": "Convert mixed numbers to improper fractions, then multiply or divide",
      "kind": "reference"
    }
  ],
  "methods": [
    "LCD / LCM addition and subtraction",
    "Cross-product identity (equivalent to LCD, used as a check)",
    "GCF reduction",
    "Reciprocal (keep–change–flip) division"
  ],
  "fingerprint": "sha256:43b5cf307fc4f3736c87857e2bb116ab79f3dd7e7e16b44a5aff2945b674380d",
  "tests": [
    {
      "id": "add-lcd",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "operate",
        "op": "+",
        "aNum": 3,
        "aDen": 4,
        "bNum": 1,
        "bDen": 6
      },
      "expect": {
        "improper": "11/12",
        "n": 11,
        "d": 12
      },
      "expectWarning": null,
      "actual": {
        "mode": "operate",
        "op": "+",
        "n": 11,
        "d": 12,
        "improper": "11/12",
        "mixed": "11/12",
        "display": "11/12",
        "decimal": "0.916666666667",
        "decimal_display": "0.916666666667",
        "formula": "L = LCM(b, d); a/b + c/d = [a(L/b) + c(L/d)] / L",
        "steps": [
          "3/4 + 1/6",
          "LCD = LCM(4, 6) = 12",
          "3/4 = 9/12",
          "1/6 = 2/12",
          "9/12 + 2/12 = 11/12",
          "GCF(11, 12) = 1",
          "11/12 is already in lowest terms.",
          "Decimal: 11 ÷ 12 ≈ 0.916666666667"
        ],
        "explainer": "3/4 + 1/6 = 11/12 ≈ 0.916666666667.",
        "inputs_label": "3/4 + 1/6",
        "heading": "Result",
        "mode_label": "Operate"
      },
      "tol": 0
    },
    {
      "id": "sub-lcd",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "operate",
        "op": "-",
        "aNum": 3,
        "aDen": 4,
        "bNum": 1,
        "bDen": 6
      },
      "expect": {
        "improper": "7/12"
      },
      "expectWarning": null,
      "actual": {
        "mode": "operate",
        "op": "-",
        "n": 7,
        "d": 12,
        "improper": "7/12",
        "mixed": "7/12",
        "display": "7/12",
        "decimal": "0.583333333333",
        "decimal_display": "0.583333333333",
        "formula": "L = LCM(b, d); a/b − c/d = [a(L/b) − c(L/d)] / L",
        "steps": [
          "3/4 − 1/6",
          "LCD = LCM(4, 6) = 12",
          "3/4 = 9/12",
          "1/6 = 2/12",
          "9/12 − 2/12 = 7/12",
          "GCF(7, 12) = 1",
          "7/12 is already in lowest terms.",
          "Decimal: 7 ÷ 12 ≈ 0.583333333333"
        ],
        "explainer": "3/4 − 1/6 = 7/12 ≈ 0.583333333333.",
        "inputs_label": "3/4 − 1/6",
        "heading": "Result",
        "mode_label": "Operate"
      },
      "tol": 0
    },
    {
      "id": "mul",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "operate",
        "op": "*",
        "aNum": 3,
        "aDen": 4,
        "bNum": 1,
        "bDen": 6
      },
      "expect": {
        "improper": "1/8"
      },
      "expectWarning": null,
      "actual": {
        "mode": "operate",
        "op": "*",
        "n": 1,
        "d": 8,
        "improper": "1/8",
        "mixed": "1/8",
        "display": "1/8",
        "decimal": "0.125",
        "decimal_display": "0.125",
        "formula": "a/b × c/d = ac / bd",
        "steps": [
          "3/4 × 1/6",
          "Multiply: (3×1) / (4×6) = 3/24",
          "GCF(3, 24) = 3",
          "Reduced result: 1/8",
          "Decimal: 1 ÷ 8 ≈ 0.125"
        ],
        "explainer": "3/4 × 1/6 = 1/8 ≈ 0.125.",
        "inputs_label": "3/4 × 1/6",
        "heading": "Result",
        "mode_label": "Operate"
      },
      "tol": 0
    },
    {
      "id": "div",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "operate",
        "op": "/",
        "aNum": 3,
        "aDen": 4,
        "bNum": 1,
        "bDen": 6
      },
      "expect": {
        "improper": "9/2",
        "mixed": "4 1/2"
      },
      "expectWarning": null,
      "actual": {
        "mode": "operate",
        "op": "/",
        "n": 9,
        "d": 2,
        "improper": "9/2",
        "mixed": "4 1/2",
        "display": "4 1/2",
        "decimal": "4.5",
        "decimal_display": "4.5",
        "formula": "a/b ÷ c/d = a/b × d/c",
        "steps": [
          "3/4 ÷ 1/6",
          "Keep–change–flip: 3/4 × 6",
          "= 18/4",
          "GCF(18, 4) = 2",
          "Reduced result: 9/2",
          "Mixed: 4 1/2",
          "Decimal: 9 ÷ 2 ≈ 4.5"
        ],
        "explainer": "3/4 ÷ 1/6 = 9/2 = 4 1/2 ≈ 4.5.",
        "inputs_label": "3/4 ÷ 1/6",
        "heading": "Result",
        "mode_label": "Operate"
      },
      "tol": 0
    },
    {
      "id": "simp-12-18",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "simplify",
        "aNum": 12,
        "aDen": 18
      },
      "expect": {
        "improper": "2/3"
      },
      "expectWarning": null,
      "actual": {
        "mode": "simplify",
        "n": 2,
        "d": 3,
        "improper": "2/3",
        "mixed": "2/3",
        "display": "2/3",
        "decimal": "0.666666666667",
        "decimal_display": "0.666666666667",
        "formula": "a/b = (a÷g)/(b÷g) where g = GCF(a, b)",
        "steps": [
          "Input: 12/18",
          "GCF(12, 18) = 6",
          "Reduced result: 2/3",
          "Decimal: 2 ÷ 3 ≈ 0.666666666667"
        ],
        "explainer": "12/18 → 2/3 ≈ 0.666666666667.",
        "inputs_label": "12/18",
        "heading": "Simplified",
        "mode_label": "Simplify"
      },
      "tol": 0
    },
    {
      "id": "simp-100-250",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "simplify",
        "aNum": 100,
        "aDen": 250
      },
      "expect": {
        "improper": "2/5"
      },
      "expectWarning": null,
      "actual": {
        "mode": "simplify",
        "n": 2,
        "d": 5,
        "improper": "2/5",
        "mixed": "2/5",
        "display": "2/5",
        "decimal": "0.4",
        "decimal_display": "0.4",
        "formula": "a/b = (a÷g)/(b÷g) where g = GCF(a, b)",
        "steps": [
          "Input: 100/250",
          "GCF(100, 250) = 50",
          "Reduced result: 2/5",
          "Decimal: 2 ÷ 5 ≈ 0.4"
        ],
        "explainer": "100/250 → 2/5 ≈ 0.4.",
        "inputs_label": "100/250",
        "heading": "Simplified",
        "mode_label": "Simplify"
      },
      "tol": 0
    },
    {
      "id": "simp-zero",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "simplify",
        "aNum": 0,
        "aDen": 5
      },
      "expect": {
        "improper": "0"
      },
      "expectWarning": null,
      "actual": {
        "mode": "simplify",
        "n": 0,
        "d": 1,
        "improper": "0",
        "mixed": "0",
        "display": "0",
        "decimal": "0",
        "decimal_display": "0",
        "formula": "a/b = (a÷g)/(b÷g) where g = GCF(a, b)",
        "steps": [
          "Input: 0/5",
          "GCF(0, 5) = 5",
          "Reduced result: 0",
          "Decimal: 0 ÷ 1 ≈ 0"
        ],
        "explainer": "0/5 → 0 ≈ 0.",
        "inputs_label": "0/5",
        "heading": "Simplified",
        "mode_label": "Simplify"
      },
      "tol": 0
    },
    {
      "id": "add-zero",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "operate",
        "op": "+",
        "aNum": 0,
        "aDen": 5,
        "bNum": 3,
        "bDen": 4
      },
      "expect": {
        "improper": "3/4"
      },
      "expectWarning": null,
      "actual": {
        "mode": "operate",
        "op": "+",
        "n": 3,
        "d": 4,
        "improper": "3/4",
        "mixed": "3/4",
        "display": "3/4",
        "decimal": "0.75",
        "decimal_display": "0.75",
        "formula": "L = LCM(b, d); a/b + c/d = [a(L/b) + c(L/d)] / L",
        "steps": [
          "0/5 + 3/4",
          "LCD = LCM(5, 4) = 20",
          "0/5 = 0/20",
          "3/4 = 15/20",
          "0/20 + 15/20 = 15/20",
          "GCF(15, 20) = 5",
          "Reduced result: 3/4",
          "Decimal: 3 ÷ 4 ≈ 0.75"
        ],
        "explainer": "0/5 + 3/4 = 3/4 ≈ 0.75.",
        "inputs_label": "0/5 + 3/4",
        "heading": "Result",
        "mode_label": "Operate"
      },
      "tol": 0
    },
    {
      "id": "simp-neg-num",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "simplify",
        "aNum": -3,
        "aDen": 4
      },
      "expect": {
        "improper": "-3/4"
      },
      "expectWarning": null,
      "actual": {
        "mode": "simplify",
        "n": -3,
        "d": 4,
        "improper": "-3/4",
        "mixed": "-3/4",
        "display": "-3/4",
        "decimal": "-0.75",
        "decimal_display": "-0.75",
        "formula": "a/b = (a÷g)/(b÷g) where g = GCF(a, b)",
        "steps": [
          "Input: -3/4",
          "GCF(3, 4) = 1",
          "-3/4 is already in lowest terms.",
          "Decimal: -3 ÷ 4 ≈ -0.75"
        ],
        "explainer": "-3/4 → -3/4 ≈ -0.75.",
        "inputs_label": "-3/4",
        "heading": "Simplified",
        "mode_label": "Simplify"
      },
      "tol": 0
    },
    {
      "id": "simp-neg-den",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "simplify",
        "aNum": 3,
        "aDen": -4
      },
      "expect": {
        "improper": "-3/4"
      },
      "expectWarning": null,
      "actual": {
        "mode": "simplify",
        "n": -3,
        "d": 4,
        "improper": "-3/4",
        "mixed": "-3/4",
        "display": "-3/4",
        "decimal": "-0.75",
        "decimal_display": "-0.75",
        "formula": "a/b = (a÷g)/(b÷g) where g = GCF(a, b)",
        "steps": [
          "Input: -3/4",
          "GCF(3, 4) = 1",
          "-3/4 is already in lowest terms.",
          "Decimal: -3 ÷ 4 ≈ -0.75"
        ],
        "explainer": "-3/4 → -3/4 ≈ -0.75.",
        "inputs_label": "-3/4",
        "heading": "Simplified",
        "mode_label": "Simplify"
      },
      "tol": 0
    },
    {
      "id": "simp-neg-neg",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "simplify",
        "aNum": -3,
        "aDen": -4
      },
      "expect": {
        "improper": "3/4"
      },
      "expectWarning": null,
      "actual": {
        "mode": "simplify",
        "n": 3,
        "d": 4,
        "improper": "3/4",
        "mixed": "3/4",
        "display": "3/4",
        "decimal": "0.75",
        "decimal_display": "0.75",
        "formula": "a/b = (a÷g)/(b÷g) where g = GCF(a, b)",
        "steps": [
          "Input: 3/4",
          "GCF(3, 4) = 1",
          "3/4 is already in lowest terms.",
          "Decimal: 3 ÷ 4 ≈ 0.75"
        ],
        "explainer": "3/4 → 3/4 ≈ 0.75.",
        "inputs_label": "3/4",
        "heading": "Simplified",
        "mode_label": "Simplify"
      },
      "tol": 0
    },
    {
      "id": "add-neg",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "operate",
        "op": "+",
        "aNum": -3,
        "aDen": 4,
        "bNum": -5,
        "bDen": 8
      },
      "expect": {
        "improper": "-11/8"
      },
      "expectWarning": null,
      "actual": {
        "mode": "operate",
        "op": "+",
        "n": -11,
        "d": 8,
        "improper": "-11/8",
        "mixed": "-1 3/8",
        "display": "-1 3/8",
        "decimal": "-1.375",
        "decimal_display": "-1.375",
        "formula": "L = LCM(b, d); a/b + c/d = [a(L/b) + c(L/d)] / L",
        "steps": [
          "-3/4 + -5/8",
          "LCD = LCM(4, 8) = 8",
          "-3/4 = -6/8",
          "-5/8 = -5/8",
          "-6/8 + -5/8 = -11/8",
          "GCF(11, 8) = 1",
          "-11/8 is already in lowest terms.",
          "Mixed: -1 3/8",
          "Decimal: -11 ÷ 8 ≈ -1.375"
        ],
        "explainer": "-3/4 + -5/8 = -11/8 = -1 3/8 ≈ -1.375.",
        "inputs_label": "-3/4 + -5/8",
        "heading": "Result",
        "mode_label": "Operate"
      },
      "tol": 0
    },
    {
      "id": "add-mixed",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "operate",
        "op": "+",
        "aWhole": 1,
        "aNum": 1,
        "aDen": 2,
        "bWhole": 2,
        "bNum": 1,
        "bDen": 3
      },
      "expect": {
        "improper": "23/6",
        "mixed": "3 5/6"
      },
      "expectWarning": null,
      "actual": {
        "mode": "operate",
        "op": "+",
        "n": 23,
        "d": 6,
        "improper": "23/6",
        "mixed": "3 5/6",
        "display": "3 5/6",
        "decimal": "3.83333333333",
        "decimal_display": "3.83333333333",
        "formula": "L = LCM(b, d); a/b + c/d = [a(L/b) + c(L/d)] / L",
        "steps": [
          "3/2 + 7/3",
          "LCD = LCM(2, 3) = 6",
          "3/2 = 9/6",
          "7/3 = 14/6",
          "9/6 + 14/6 = 23/6",
          "GCF(23, 6) = 1",
          "23/6 is already in lowest terms.",
          "Mixed: 3 5/6",
          "Decimal: 23 ÷ 6 ≈ 3.83333333333"
        ],
        "explainer": "3/2 + 7/3 = 23/6 = 3 5/6 ≈ 3.83333333333.",
        "inputs_label": "3/2 + 7/3",
        "heading": "Result",
        "mode_label": "Operate"
      },
      "tol": 0
    },
    {
      "id": "mul-mixed",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "operate",
        "op": "*",
        "aWhole": 2,
        "aNum": 3,
        "aDen": 4,
        "bWhole": 1,
        "bNum": 1,
        "bDen": 2
      },
      "expect": {
        "improper": "33/8"
      },
      "expectWarning": null,
      "actual": {
        "mode": "operate",
        "op": "*",
        "n": 33,
        "d": 8,
        "improper": "33/8",
        "mixed": "4 1/8",
        "display": "4 1/8",
        "decimal": "4.125",
        "decimal_display": "4.125",
        "formula": "a/b × c/d = ac / bd",
        "steps": [
          "11/4 × 3/2",
          "Multiply: (11×3) / (4×2) = 33/8",
          "GCF(33, 8) = 1",
          "33/8 is already in lowest terms.",
          "Mixed: 4 1/8",
          "Decimal: 33 ÷ 8 ≈ 4.125"
        ],
        "explainer": "11/4 × 3/2 = 33/8 = 4 1/8 ≈ 4.125.",
        "inputs_label": "11/4 × 3/2",
        "heading": "Result",
        "mode_label": "Operate"
      },
      "tol": 0
    },
    {
      "id": "simp-improper",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "simplify",
        "aNum": 7,
        "aDen": 3
      },
      "expect": {
        "improper": "7/3",
        "mixed": "2 1/3"
      },
      "expectWarning": null,
      "actual": {
        "mode": "simplify",
        "n": 7,
        "d": 3,
        "improper": "7/3",
        "mixed": "2 1/3",
        "display": "7/3",
        "decimal": "2.33333333333",
        "decimal_display": "2.33333333333",
        "formula": "a/b = (a÷g)/(b÷g) where g = GCF(a, b)",
        "steps": [
          "Input: 7/3",
          "GCF(7, 3) = 1",
          "7/3 is already in lowest terms.",
          "Mixed: 2 1/3",
          "Decimal: 7 ÷ 3 ≈ 2.33333333333"
        ],
        "explainer": "7/3 → 7/3 = 2 1/3 ≈ 2.33333333333.",
        "inputs_label": "7/3",
        "heading": "Simplified",
        "mode_label": "Simplify"
      },
      "tol": 0
    },
    {
      "id": "from-375",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "from-dec",
        "decimal": 0.375
      },
      "expect": {
        "improper": "3/8"
      },
      "expectWarning": null,
      "actual": {
        "mode": "from-dec",
        "n": 3,
        "d": 8,
        "improper": "3/8",
        "mixed": "3/8",
        "display": "3/8",
        "decimal": "0.375",
        "decimal_display": "0.375",
        "formula": "decimal → a/b",
        "steps": [
          "0.375 → 3/8",
          "Decimal check: 0.375"
        ],
        "explainer": "Reduced 3/8 ≈ 0.375.",
        "inputs_label": "0.375",
        "heading": "Fraction",
        "mode_label": "From decimal"
      },
      "tol": 0
    },
    {
      "id": "from-125",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "from-dec",
        "decimal": 1.25
      },
      "expect": {
        "improper": "5/4"
      },
      "expectWarning": null,
      "actual": {
        "mode": "from-dec",
        "n": 5,
        "d": 4,
        "improper": "5/4",
        "mixed": "1 1/4",
        "display": "5/4",
        "decimal": "1.25",
        "decimal_display": "1.25",
        "formula": "decimal → a/b",
        "steps": [
          "1.25 → 5/4",
          "Mixed: 1 1/4",
          "Decimal check: 1.25"
        ],
        "explainer": "Reduced 5/4 = 1 1/4 ≈ 1.25.",
        "inputs_label": "1.25",
        "heading": "Fraction",
        "mode_label": "From decimal"
      },
      "tol": 0
    },
    {
      "id": "to-dec",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "to-dec",
        "aNum": 3,
        "aDen": 8
      },
      "expect": {
        "decimal": "0.375",
        "improper": "3/8"
      },
      "expectWarning": null,
      "actual": {
        "mode": "to-dec",
        "n": 3,
        "d": 8,
        "improper": "3/8",
        "mixed": "3/8",
        "display": "0.375",
        "decimal": "0.375",
        "decimal_display": "0.375",
        "formula": "a ÷ b",
        "steps": [
          "3/8 = 3 ÷ 8",
          "= 0.375",
          "Reduced form: 3/8"
        ],
        "explainer": "3/8 = 0.375.",
        "inputs_label": "3/8",
        "heading": "Decimal",
        "mode_label": "To decimal"
      },
      "tol": 0
    },
    {
      "id": "add-halves",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "operate",
        "op": "+",
        "aNum": 1,
        "aDen": 2,
        "bNum": 1,
        "bDen": 2
      },
      "expect": {
        "improper": "1"
      },
      "expectWarning": null,
      "actual": {
        "mode": "operate",
        "op": "+",
        "n": 1,
        "d": 1,
        "improper": "1",
        "mixed": "1",
        "display": "1",
        "decimal": "1",
        "decimal_display": "1",
        "formula": "L = LCM(b, d); a/b + c/d = [a(L/b) + c(L/d)] / L",
        "steps": [
          "1/2 + 1/2",
          "LCD = LCM(2, 2) = 2",
          "1/2 = 1/2",
          "1/2 = 1/2",
          "1/2 + 1/2 = 2/2",
          "GCF(2, 2) = 2",
          "Reduced result: 1",
          "Decimal: 1 ÷ 1 ≈ 1"
        ],
        "explainer": "1/2 + 1/2 = 1 ≈ 1.",
        "inputs_label": "1/2 + 1/2",
        "heading": "Result",
        "mode_label": "Operate"
      },
      "tol": 0
    },
    {
      "id": "mul-cancel",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "mode": "operate",
        "op": "*",
        "aNum": 2,
        "aDen": 4,
        "bNum": 3,
        "bDen": 6
      },
      "expect": {
        "improper": "1/4"
      },
      "expectWarning": null,
      "actual": {
        "mode": "operate",
        "op": "*",
        "n": 1,
        "d": 4,
        "improper": "1/4",
        "mixed": "1/4",
        "display": "1/4",
        "decimal": "0.25",
        "decimal_display": "0.25",
        "formula": "a/b × c/d = ac / bd",
        "steps": [
          "2/4 × 3/6",
          "Multiply: (2×3) / (4×6) = 6/24",
          "GCF(6, 24) = 6",
          "Reduced result: 1/4",
          "Decimal: 1 ÷ 4 ≈ 0.25"
        ],
        "explainer": "2/4 × 3/6 = 1/4 ≈ 0.25.",
        "inputs_label": "2/4 × 3/6",
        "heading": "Result",
        "mode_label": "Operate"
      },
      "tol": 0
    },
    {
      "id": "boundary-den-zero-a",
      "ok": true,
      "kind": "boundary",
      "inputs": {
        "mode": "simplify",
        "aNum": 1,
        "aDen": 0
      },
      "expectError": "DENOMINATOR_MUST_BE_NONZERO",
      "code": "DENOMINATOR_MUST_BE_NONZERO",
      "error": "Denominator cannot be 0."
    },
    {
      "id": "boundary-den-zero-b",
      "ok": true,
      "kind": "boundary",
      "inputs": {
        "mode": "operate",
        "op": "+",
        "aNum": 3,
        "aDen": 4,
        "bNum": 1,
        "bDen": 0
      },
      "expectError": "DENOMINATOR_MUST_BE_NONZERO",
      "code": "DENOMINATOR_MUST_BE_NONZERO",
      "error": "Denominator cannot be 0."
    },
    {
      "id": "boundary-div-zero",
      "ok": true,
      "kind": "boundary",
      "inputs": {
        "mode": "operate",
        "op": "/",
        "aNum": 1,
        "aDen": 2,
        "bNum": 0,
        "bDen": 5
      },
      "expectError": "DIVISION_BY_ZERO",
      "code": "DIVISION_BY_ZERO",
      "error": "Cannot divide by zero."
    },
    {
      "id": "boundary-missing",
      "ok": true,
      "kind": "boundary",
      "inputs": {
        "mode": "operate"
      },
      "expectError": "MISSING_REQUIRED_INPUT",
      "code": "MISSING_REQUIRED_INPUT",
      "error": "Enter denominator."
    },
    {
      "id": "boundary-invalid-num",
      "ok": true,
      "kind": "boundary",
      "inputs": {
        "mode": "simplify",
        "aNum": "abc",
        "aDen": 4
      },
      "expectError": "INVALID_NUMBER",
      "code": "INVALID_NUMBER",
      "error": "numerator must be an integer."
    },
    {
      "id": "boundary-from-dec-empty",
      "ok": true,
      "kind": "boundary",
      "inputs": {
        "mode": "from-dec"
      },
      "expectError": "INVALID_NUMBER",
      "code": "INVALID_NUMBER",
      "error": "Enter a finite decimal."
    },
    {
      "id": "boundary-alias-add",
      "ok": true,
      "kind": "boundary",
      "inputs": {
        "mode": "operate",
        "operator": "add",
        "aNum": 3,
        "aDen": 4,
        "bNum": 1,
        "bDen": 6
      },
      "expect": {
        "improper": "11/12",
        "n": 11,
        "d": 12
      },
      "expectWarning": null,
      "actual": {
        "mode": "operate",
        "op": "+",
        "n": 11,
        "d": 12,
        "improper": "11/12",
        "mixed": "11/12",
        "display": "11/12",
        "decimal": "0.916666666667",
        "decimal_display": "0.916666666667",
        "formula": "L = LCM(b, d); a/b + c/d = [a(L/b) + c(L/d)] / L",
        "steps": [
          "3/4 + 1/6",
          "LCD = LCM(4, 6) = 12",
          "3/4 = 9/12",
          "1/6 = 2/12",
          "9/12 + 2/12 = 11/12",
          "GCF(11, 12) = 1",
          "11/12 is already in lowest terms.",
          "Decimal: 11 ÷ 12 ≈ 0.916666666667"
        ],
        "explainer": "3/4 + 1/6 = 11/12 ≈ 0.916666666667.",
        "inputs_label": "3/4 + 1/6",
        "heading": "Result",
        "mode_label": "Operate"
      },
      "tol": null
    },
    {
      "id": "boundary-from-neg-decimal",
      "ok": true,
      "kind": "boundary",
      "inputs": {
        "mode": "from-dec",
        "decimal": -0.125
      },
      "expect": {
        "improper": "-1/8"
      },
      "expectWarning": null,
      "actual": {
        "mode": "from-dec",
        "n": -1,
        "d": 8,
        "improper": "-1/8",
        "mixed": "-1/8",
        "display": "-1/8",
        "decimal": "-0.125",
        "decimal_display": "-0.125",
        "formula": "decimal → a/b",
        "steps": [
          "-0.125 → -1/8",
          "Decimal check: -0.125"
        ],
        "explainer": "Reduced -1/8 ≈ -0.125.",
        "inputs_label": "-0.125",
        "heading": "Fraction",
        "mode_label": "From decimal"
      },
      "tol": null
    },
    {
      "id": "property-lcd-equals-cross-product",
      "ok": true,
      "kind": "property",
      "detail": "LCD result matches (ad ± bc)/bd after reduction",
      "expect": "11/12 and 7/12",
      "actual": "11/12 and 7/12"
    },
    {
      "id": "property-deterministic",
      "ok": true,
      "kind": "property",
      "detail": "3/4 × 1/6 is deterministic",
      "expect": "1/8",
      "actual": "1/8"
    },
    {
      "id": "property-multiply-commutative",
      "ok": true,
      "kind": "property",
      "detail": "(2/5)×(3/7) = (3/7)×(2/5)",
      "expect": "6/35",
      "actual": "6/35"
    },
    {
      "id": "property-gcf-lowest-terms",
      "ok": true,
      "kind": "property",
      "detail": "12/18 reduces to 2/3",
      "expect": "2/3",
      "actual": "2/3"
    }
  ],
  "tier": "engine_tested",
  "verification": {
    "tests": {
      "passed": 32,
      "total": 32,
      "golden": 20,
      "boundary": 8,
      "property": 4
    },
    "contract_checks": {
      "passed": 3,
      "total": 3
    }
  },
  "evidence_core_generated_at": "2026-09-10T22:48:17.762Z",
  "rendered_at": "2026-09-16T22:03:43.769Z",
  "release_integrity": {
    "status": "verified",
    "scope": "workspace",
    "production_attestation_required": true,
    "calculation_version": "1.0.5",
    "artifacts": {
      "engine": "1.0.5",
      "page": "1.0.5",
      "capability": "1.0.5",
      "evidence": "1.0.5",
      "input_schema": "1.0.5",
      "output_schema": "1.0.5",
      "mcp_contract": "1.0.5"
    },
    "digests": {
      "input_schema_sha256": "8d66a4747d5ec6e98d1037d68aa5291a0bd91768cfbd7df916f4b96c72d679af",
      "output_schema_sha256": "757c639f564495aa26b322ec5656467d90847acbcf3528b263800e623234fe43",
      "evidence_sha256": "c5a68d1949bc19a348bece7b0c113e5cc8cc98015169b798af3574213541a177",
      "evidence_core_sha256": "c5a68d1949bc19a348bece7b0c113e5cc8cc98015169b798af3574213541a177",
      "capability_sha256": "ef13641219e80b3098ac41f5894e3f23e1aa48068bf27fa9e641125c41eeb9dc",
      "engine_sha256": "c8d4ccdbfeaf61d7b024d4e1babb0c2ba3b324c1b37bd0cb456a526d8d2b1bd1",
      "mcp_contract_sha256": "863098b311a7b17dc4b229a6302b90b3545b175f716e5d84772c7be8e9716b86"
    },
    "contract_checks": {
      "total": 3,
      "passed": 3,
      "failed": 0,
      "items": [
        {
          "id": "release-artifacts-aligned",
          "status": "pass",
          "detail": "1.0.5"
        },
        {
          "id": "schema-valid-input-executes",
          "status": "pass"
        },
        {
          "id": "engine-success-output-validates-schema",
          "status": "pass"
        }
      ]
    },
    "report": "https://www.calculatorx.com/.well-known/calculatorx-release-integrity.json"
  }
}
