{
  "fraction-subtract": [
    {
      "calculatorId": "fraction-subtract",
      "methodVersion": "fraction-subtract@1.0.0",
      "runAt": "2026-10-29T06:04:06.908Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "numeratorA": "5",
            "denominatorA": "6",
            "numeratorB": "3",
            "denominatorB": "4"
          }
        ],
        "units": {
          "numeratorA": "integer",
          "denominatorA": "integer",
          "numeratorB": "integer",
          "denominatorB": "integer"
        },
        "display": "First numerator: 5 integer; First denominator: 6 integer; Second numerator: 3 integer; Second denominator: 4 integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "numerator": "1",
            "denominator": "12",
            "fraction": "1/12",
            "lcd": "12",
            "scaledNumeratorA": "10",
            "scaledNumeratorB": "9",
            "unreduced": "1/12",
            "gcd": "1",
            "mixed": "1/12",
            "negative": false,
            "zero": false,
            "sameDenominator": false,
            "decimal": "0.08(3)",
            "decimalType": "repeating",
            "decimalExact": true
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Least common denominator = lcm of the denominators",
              "expression": "lcm(6, 4) = (6 × 4) / gcd(6, 4) = 12"
            },
            {
              "label": "Rewrite both fractions over the least common denominator",
              "expression": "5/6 = 10/12; 3/4 = 9/12"
            },
            {
              "label": "Subtract the numerators and keep the denominator",
              "expression": "(10 − (9))/12 = 1/12"
            },
            {
              "label": "Reduce by the greatest common divisor of the numerator and denominator",
              "expression": "gcd(1, 12) = 1; 1/12 = 1/12"
            }
          ],
          "explanation": "Rewrite both fractions over their least common denominator 12, subtract the numerators (10 − 9 = 1), then divide the numerator and denominator by their greatest common divisor 1. A mixed-number minus sign applies to the entire value."
        },
        "display": "Fraction: 1/12 fraction"
      },
      "expected": {
        "value": {
          "fraction": "1/12"
        },
        "display": "Fraction: 1/12 fraction",
        "source": "packages/calculator-core/tests/fraction-subtract.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "fraction-subtract",
      "methodVersion": "fraction-subtract@1.0.0",
      "runAt": "2026-10-29T06:04:06.908Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "numeratorA": "1",
            "denominatorA": "2",
            "numeratorB": "1",
            "denominatorB": "2"
          }
        ],
        "units": {
          "numeratorA": "integer",
          "denominatorA": "integer",
          "numeratorB": "integer",
          "denominatorB": "integer"
        },
        "display": "First numerator: 1 integer; First denominator: 2 integer; Second numerator: 1 integer; Second denominator: 2 integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "numerator": "0",
            "denominator": "1",
            "fraction": "0/1",
            "lcd": "2",
            "scaledNumeratorA": "1",
            "scaledNumeratorB": "1",
            "unreduced": "0/2",
            "gcd": "2",
            "mixed": "0",
            "negative": false,
            "zero": true,
            "sameDenominator": true,
            "decimal": "0",
            "decimalType": "terminating",
            "decimalExact": true
          },
          "errors": [],
          "warnings": [
            {
              "code": "zero_result",
              "severity": "info",
              "message": "The two fractions are equal, so the difference is 0."
            }
          ],
          "steps": [
            {
              "label": "The denominators already match, so the least common denominator is that denominator",
              "expression": "lcm(2, 2) = (2 × 2) / gcd(2, 2) = 2"
            },
            {
              "label": "Rewrite both fractions over the least common denominator",
              "expression": "1/2 = 1/2; 1/2 = 1/2"
            },
            {
              "label": "Subtract the numerators and keep the denominator",
              "expression": "(1 − (1))/2 = 0/2"
            },
            {
              "label": "Reduce by the greatest common divisor of the numerator and denominator",
              "expression": "gcd(0, 2) = 2; 0/2 = 0/1"
            }
          ],
          "explanation": "Rewrite both fractions over their least common denominator 2, subtract the numerators (1 − 1 = 0), then divide the numerator and denominator by their greatest common divisor 2. A mixed-number minus sign applies to the entire value."
        },
        "display": "Fraction: 0/1 fraction"
      },
      "expected": {
        "value": {
          "fraction": "0/1"
        },
        "display": "Fraction: 0/1 fraction",
        "source": "packages/calculator-core/tests/fraction-subtract.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "fraction-subtract",
      "methodVersion": "fraction-subtract@1.0.0",
      "runAt": "2026-10-29T06:04:06.908Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "numeratorA": "1",
            "denominatorA": "3",
            "numeratorB": "1",
            "denominatorB": "2"
          }
        ],
        "units": {
          "numeratorA": "integer",
          "denominatorA": "integer",
          "numeratorB": "integer",
          "denominatorB": "integer"
        },
        "display": "First numerator: 1 integer; First denominator: 3 integer; Second numerator: 1 integer; Second denominator: 2 integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "numerator": "-1",
            "denominator": "6",
            "fraction": "-1/6",
            "lcd": "6",
            "scaledNumeratorA": "2",
            "scaledNumeratorB": "3",
            "unreduced": "-1/6",
            "gcd": "1",
            "mixed": "-1/6",
            "negative": true,
            "zero": false,
            "sameDenominator": false,
            "decimal": "-0.1(6)",
            "decimalType": "repeating",
            "decimalExact": true
          },
          "errors": [],
          "warnings": [
            {
              "code": "negative_result",
              "severity": "info",
              "message": "The second fraction is larger than the first, so the difference is negative. Swap the fractions to get the positive amount B − A."
            }
          ],
          "steps": [
            {
              "label": "Least common denominator = lcm of the denominators",
              "expression": "lcm(3, 2) = (3 × 2) / gcd(3, 2) = 6"
            },
            {
              "label": "Rewrite both fractions over the least common denominator",
              "expression": "1/3 = 2/6; 1/2 = 3/6"
            },
            {
              "label": "Subtract the numerators and keep the denominator",
              "expression": "(2 − (3))/6 = -1/6"
            },
            {
              "label": "Reduce by the greatest common divisor of the numerator and denominator",
              "expression": "gcd(1, 6) = 1; -1/6 = -1/6"
            }
          ],
          "explanation": "Rewrite both fractions over their least common denominator 6, subtract the numerators (2 − 3 = -1), then divide the numerator and denominator by their greatest common divisor 1. A mixed-number minus sign applies to the entire value."
        },
        "display": "Fraction: -1/6 fraction"
      },
      "expected": {
        "value": {
          "fraction": "-1/6"
        },
        "display": "Fraction: -1/6 fraction",
        "source": "packages/calculator-core/tests/fraction-subtract.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "fraction-simplify": [
    {
      "calculatorId": "fraction-simplify",
      "methodVersion": "fraction-simplify@1.0.0",
      "runAt": "2026-10-29T06:04:06.909Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "numerator": "42",
            "denominator": "56"
          }
        ],
        "units": {
          "numerator": "integer",
          "denominator": "integer"
        },
        "display": "Numerator: 42 integer; Denominator: 56 integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "numerator": "3",
            "denominator": "4",
            "fraction": "3/4",
            "gcd": "14",
            "improperNumerator": "42",
            "improperDenominator": "56",
            "mixed": "3/4",
            "alreadySimplest": false,
            "decimal": "0.75",
            "decimalType": "terminating",
            "decimalExact": true,
            "nonRepeatingDigits": "75",
            "repeatingDigits": null,
            "denominatorTwos": 2,
            "denominatorFives": 0,
            "denominatorRest": "1"
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Euclid step 1",
              "expression": "42 = 0 × 56 + 42"
            },
            {
              "label": "Euclid step 2",
              "expression": "56 = 1 × 42 + 14"
            },
            {
              "label": "Euclid step 3",
              "expression": "42 = 3 × 14 + 0"
            },
            {
              "label": "Factor and cancel the greatest common divisor",
              "expression": "(14 × 3) / (14 × 4) = 3/4"
            },
            {
              "label": "Classify the reduced denominator",
              "expression": "4 = 2^2 × 5^0 × 1; terminating decimal"
            }
          ],
          "explanation": "Divide numerator and denominator by their positive GCD 14. The reduced denominator has no prime factors other than 2 and 5 (or equals 1), so its decimal terminates. Parentheses mark a complete repeating block when found. A mixed-number minus sign applies to the entire value."
        },
        "display": "Fraction: 3/4 fraction"
      },
      "expected": {
        "value": {
          "fraction": "3/4"
        },
        "display": "Fraction: 3/4 fraction",
        "source": "packages/calculator-core/tests/fraction-simplify.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "fraction-simplify",
      "methodVersion": "fraction-simplify@1.0.0",
      "runAt": "2026-10-29T06:04:06.909Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "numerator": "0",
            "denominator": "-5"
          }
        ],
        "units": {
          "numerator": "integer",
          "denominator": "integer"
        },
        "display": "Numerator: 0 integer; Denominator: -5 integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "numerator": "0",
            "denominator": "1",
            "fraction": "0/1",
            "gcd": "5",
            "improperNumerator": "0",
            "improperDenominator": "5",
            "mixed": "0",
            "alreadySimplest": false,
            "decimal": "0",
            "decimalType": "terminating",
            "decimalExact": true,
            "nonRepeatingDigits": "",
            "repeatingDigits": null,
            "denominatorTwos": 0,
            "denominatorFives": 0,
            "denominatorRest": "1"
          },
          "errors": [],
          "warnings": [
            {
              "code": "zero_fraction",
              "severity": "info",
              "message": "Zero divided by any nonzero denominator simplifies to 0/1; gcd(0, d) is |d|."
            }
          ],
          "steps": [
            {
              "label": "Move the sign to the numerator",
              "expression": "0/-5 = 0/5"
            },
            {
              "label": "Euclid step 1",
              "expression": "0 = 0 × 5 + 0"
            },
            {
              "label": "Factor and cancel the greatest common divisor",
              "expression": "(5 × 0) / (5 × 1) = 0/1"
            },
            {
              "label": "Classify the reduced denominator",
              "expression": "1 = 2^0 × 5^0 × 1; terminating decimal"
            }
          ],
          "explanation": "Divide numerator and denominator by their positive GCD 5. The reduced denominator has no prime factors other than 2 and 5 (or equals 1), so its decimal terminates. Parentheses mark a complete repeating block when found. A mixed-number minus sign applies to the entire value."
        },
        "display": "Fraction: 0/1 fraction"
      },
      "expected": {
        "value": {
          "fraction": "0/1"
        },
        "display": "Fraction: 0/1 fraction",
        "source": "packages/calculator-core/tests/fraction-simplify.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "fraction-simplify",
      "methodVersion": "fraction-simplify@1.0.0",
      "runAt": "2026-10-29T06:04:06.909Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "numerator": "-42",
            "denominator": "56"
          }
        ],
        "units": {
          "numerator": "integer",
          "denominator": "integer"
        },
        "display": "Numerator: -42 integer; Denominator: 56 integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "numerator": "-3",
            "denominator": "4",
            "fraction": "-3/4",
            "gcd": "14",
            "improperNumerator": "-42",
            "improperDenominator": "56",
            "mixed": "-3/4",
            "alreadySimplest": false,
            "decimal": "-0.75",
            "decimalType": "terminating",
            "decimalExact": true,
            "nonRepeatingDigits": "75",
            "repeatingDigits": null,
            "denominatorTwos": 2,
            "denominatorFives": 0,
            "denominatorRest": "1"
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Euclid step 1",
              "expression": "42 = 0 × 56 + 42"
            },
            {
              "label": "Euclid step 2",
              "expression": "56 = 1 × 42 + 14"
            },
            {
              "label": "Euclid step 3",
              "expression": "42 = 3 × 14 + 0"
            },
            {
              "label": "Factor and cancel the greatest common divisor",
              "expression": "(14 × -3) / (14 × 4) = -3/4"
            },
            {
              "label": "Classify the reduced denominator",
              "expression": "4 = 2^2 × 5^0 × 1; terminating decimal"
            }
          ],
          "explanation": "Divide numerator and denominator by their positive GCD 14. The reduced denominator has no prime factors other than 2 and 5 (or equals 1), so its decimal terminates. Parentheses mark a complete repeating block when found. A mixed-number minus sign applies to the entire value."
        },
        "display": "Fraction: -3/4 fraction"
      },
      "expected": {
        "value": {
          "fraction": "-3/4"
        },
        "display": "Fraction: -3/4 fraction",
        "source": "packages/calculator-core/tests/fraction-simplify.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "significant-figures": [
    {
      "calculatorId": "significant-figures",
      "methodVersion": "significant-figures@1.0.0",
      "runAt": "2026-10-29T06:04:06.909Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "value": "0.00450"
          }
        ],
        "units": {
          "value": "dimensionless exact decimal",
          "significantFigures": "digits",
          "mode": "rounding convention"
        },
        "display": "Value: 0.00450 dimensionless exact decimal"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "count": 3,
            "ambiguous": false,
            "assumption": "Leading zeros do not count; nonzero digits, interior zeros and written trailing zeros in a decimal or E-notation coefficient count.",
            "decimal": "0.00450",
            "scientific": "4.50 × 10^-3",
            "eNotation": "4.50E-3",
            "requestedFigures": null,
            "rounded": false
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Count the original written digits",
              "expression": "0.00450: 3 significant figures"
            },
            {
              "label": "Preserve the value",
              "expression": "No change to the numeric value"
            },
            {
              "label": "Display the resulting precision explicitly",
              "expression": "4.50 × 10^-3 = 4.50E-3"
            }
          ],
          "explanation": "Leading zeros do not count; nonzero digits, interior zeros and written trailing zeros in a decimal or E-notation coefficient count. No rounding requested."
        },
        "display": "Count: 3; Scientific notation: 4.50 × 10^-3 scientific notation"
      },
      "expected": {
        "value": {
          "count": 3,
          "scientific": "4.50 × 10^-3"
        },
        "display": "Count: 3; Scientific notation: 4.50 × 10^-3 scientific notation",
        "source": "packages/calculator-core/tests/significant-figures.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "significant-figures",
      "methodVersion": "significant-figures@1.0.0",
      "runAt": "2026-10-29T06:04:06.909Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "value": "0"
          }
        ],
        "units": {
          "value": "dimensionless exact decimal",
          "significantFigures": "digits",
          "mode": "rounding convention"
        },
        "display": "Value: 0 dimensionless exact decimal"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "count": null,
            "ambiguous": false,
            "assumption": "All-zero input: a significant-figure count is not inferred. Zero is displayed as 0 × 10^0 regardless of requested precision.",
            "decimal": "0",
            "scientific": "0 × 10^0",
            "eNotation": "0E0",
            "requestedFigures": null,
            "rounded": false
          },
          "errors": [],
          "warnings": [
            {
              "code": "zero_convention",
              "severity": "info",
              "message": "All-zero input: a significant-figure count is not inferred. Zero is displayed as 0 × 10^0 regardless of requested precision."
            }
          ],
          "steps": [
            {
              "label": "Count the original written digits",
              "expression": "0: indeterminate significant figures"
            },
            {
              "label": "Preserve the value",
              "expression": "No change to the numeric value"
            },
            {
              "label": "Display the resulting precision explicitly",
              "expression": "0 × 10^0 = 0E0"
            }
          ],
          "explanation": "All-zero input: a significant-figure count is not inferred. Zero is displayed as 0 × 10^0 regardless of requested precision. No rounding requested."
        },
        "display": "Count: null; Scientific notation: 0 × 10^0 scientific notation"
      },
      "expected": {
        "value": {
          "count": null,
          "scientific": "0 × 10^0"
        },
        "display": "Count: null; Scientific notation: 0 × 10^0 scientific notation",
        "source": "packages/calculator-core/tests/significant-figures.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "significant-figures",
      "methodVersion": "significant-figures@1.0.0",
      "runAt": "2026-10-29T06:04:06.909Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "value": "-1.25",
            "significantFigures": 2,
            "mode": "half-even"
          }
        ],
        "units": {
          "value": "dimensionless exact decimal",
          "significantFigures": "digits",
          "mode": "rounding convention"
        },
        "display": "Value: -1.25 dimensionless exact decimal; Significant figures: 2 digits; Rounding rule: half-even rounding convention"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "count": 3,
            "ambiguous": false,
            "assumption": "Leading zeros do not count; nonzero digits, interior zeros and written trailing zeros in a decimal or E-notation coefficient count.",
            "decimal": "-1.2",
            "scientific": "-1.2 × 10^0",
            "eNotation": "-1.2E0",
            "requestedFigures": 2,
            "rounded": true
          },
          "errors": [],
          "warnings": [
            {
              "code": "rounded",
              "severity": "info",
              "message": "Rounded once to 2 significant figures using ties to an even retained digit."
            }
          ],
          "steps": [
            {
              "label": "Count the original written digits",
              "expression": "-1.25: 3 significant figures"
            },
            {
              "label": "Round using half-even",
              "expression": "Keep 2 significant figures; round at decimal place 1"
            },
            {
              "label": "Display the resulting precision explicitly",
              "expression": "-1.2 × 10^0 = -1.2E0"
            }
          ],
          "explanation": "Leading zeros do not count; nonzero digits, interior zeros and written trailing zeros in a decimal or E-notation coefficient count. Requested precision: 2; half-even."
        },
        "display": "Scientific notation: -1.2 × 10^0 scientific notation"
      },
      "expected": {
        "value": {
          "scientific": "-1.2 × 10^0"
        },
        "display": "Scientific notation: -1.2 × 10^0 scientific notation",
        "source": "packages/calculator-core/tests/significant-figures.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "rounding": [
    {
      "calculatorId": "rounding",
      "methodVersion": "rounding@1.0.0",
      "runAt": "2026-10-29T06:04:06.909Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "value": "0.125",
            "places": 2
          }
        ],
        "units": {
          "value": "dimensionless exact decimal",
          "places": "decimal places"
        },
        "display": "Value: 0.125 dimensionless exact decimal; Decimal places: 2 decimal places"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "result": "0.13",
            "results": {
              "half-up": "0.13",
              "half-down": "0.12",
              "half-even": "0.12",
              "floor": "0.12",
              "ceiling": "0.13",
              "truncate": "0.12"
            },
            "places": 2,
            "mode": "half-up",
            "discardedDigits": "5",
            "discardedExplanation": "Discarded digits: 5. The discarded magnitude is exactly half of one rounding unit. Half-up ties go away from zero; half-down ties go toward zero; half-even ties keep an even retained integer.",
            "tie": true,
            "rounded": true
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Choose the rounding unit",
              "expression": "10^-2"
            },
            {
              "label": "Split the magnitude into retained units and a remainder",
              "expression": "12 retained units; discarded digits: 5"
            },
            {
              "label": "Apply half-up",
              "expression": "0.125 ≈ 0.13"
            }
          ],
          "explanation": "Discarded digits: 5. The discarded magnitude is exactly half of one rounding unit. Half-up ties go away from zero; half-down ties go toward zero; half-even ties keep an even retained integer."
        },
        "display": "Result: 0.13 rounded decimal"
      },
      "expected": {
        "value": {
          "result": "0.13"
        },
        "display": "Result: 0.13 rounded decimal",
        "source": "packages/calculator-core/tests/rounding.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "rounding",
      "methodVersion": "rounding@1.0.0",
      "runAt": "2026-10-29T06:04:06.909Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "value": "-0.01",
            "places": 0
          }
        ],
        "units": {
          "value": "dimensionless exact decimal",
          "places": "decimal places"
        },
        "display": "Value: -0.01 dimensionless exact decimal; Decimal places: 0 decimal places"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "result": "0",
            "results": {
              "half-up": "0",
              "half-down": "0",
              "half-even": "0",
              "floor": "-1",
              "ceiling": "0",
              "truncate": "0"
            },
            "places": 0,
            "mode": "half-up",
            "discardedDigits": "01",
            "discardedExplanation": "Discarded digits: 01. The discarded magnitude is less than half of one rounding unit. Half-up ties go away from zero; half-down ties go toward zero; half-even ties keep an even retained integer.",
            "tie": false,
            "rounded": true
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Choose the rounding unit",
              "expression": "10^0"
            },
            {
              "label": "Split the magnitude into retained units and a remainder",
              "expression": "0 retained units; discarded digits: 01"
            },
            {
              "label": "Apply half-up",
              "expression": "-0.01 ≈ 0"
            }
          ],
          "explanation": "Discarded digits: 01. The discarded magnitude is less than half of one rounding unit. Half-up ties go away from zero; half-down ties go toward zero; half-even ties keep an even retained integer."
        },
        "display": "Result: 0 rounded decimal"
      },
      "expected": {
        "value": {
          "result": "0"
        },
        "display": "Result: 0 rounded decimal",
        "source": "packages/calculator-core/tests/rounding.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "rounding",
      "methodVersion": "rounding@1.0.0",
      "runAt": "2026-10-29T06:04:06.909Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "value": "-150",
            "places": -2
          }
        ],
        "units": {
          "value": "dimensionless exact decimal",
          "places": "decimal places"
        },
        "display": "Value: -150 dimensionless exact decimal; Decimal places: -2 decimal places"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "result": "-200",
            "results": {
              "half-up": "-200",
              "half-down": "-100",
              "half-even": "-200",
              "floor": "-200",
              "ceiling": "-100",
              "truncate": "-100"
            },
            "places": -2,
            "mode": "half-up",
            "discardedDigits": "50",
            "discardedExplanation": "Discarded digits: 50. The discarded magnitude is exactly half of one rounding unit. Half-up ties go away from zero; half-down ties go toward zero; half-even ties keep an even retained integer.",
            "tie": true,
            "rounded": true
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Choose the rounding unit",
              "expression": "10^2"
            },
            {
              "label": "Split the magnitude into retained units and a remainder",
              "expression": "1 retained units; discarded digits: 50"
            },
            {
              "label": "Apply half-up",
              "expression": "-150 ≈ -200"
            }
          ],
          "explanation": "Discarded digits: 50. The discarded magnitude is exactly half of one rounding unit. Half-up ties go away from zero; half-down ties go toward zero; half-even ties keep an even retained integer."
        },
        "display": "Result: -200 rounded decimal"
      },
      "expected": {
        "value": {
          "result": "-200"
        },
        "display": "Result: -200 rounded decimal",
        "source": "packages/calculator-core/tests/rounding.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "fraction": [
    {
      "calculatorId": "fraction",
      "methodVersion": "fraction-add@1.0.1",
      "runAt": "2026-10-29T06:04:06.909Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "numerator1": 1,
            "denominator1": 2,
            "numerator2": 1,
            "denominator2": 3
          }
        ],
        "units": {
          "numerator1": "integer",
          "denominator1": "integer",
          "numerator2": "integer",
          "denominator2": "integer"
        },
        "display": "First numerator: 1 integer; First denominator: 2 integer; Second numerator: 1 integer; Second denominator: 3 integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "simplifiedNum": 5,
            "simplifiedDen": 6
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Add fractions",
              "expression": "1/2 + 1/3 = 5/6",
              "value": 0.8333333333333334
            },
            {
              "label": "Simplify",
              "expression": "5/6 = 5/6",
              "value": 0.8333333333333334
            }
          ],
          "explanation": "The simplified sum is 5/6."
        },
        "display": "Sum numerator: 5 numerator; Sum denominator: 6 denominator"
      },
      "expected": {
        "value": {
          "simplifiedNum": 5,
          "simplifiedDen": 6
        },
        "display": "Sum numerator: 5 numerator; Sum denominator: 6 denominator",
        "source": "packages/calculator-core/tests/fraction.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "fraction",
      "methodVersion": "fraction-add@1.0.1",
      "runAt": "2026-10-29T06:04:06.918Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "numerator1": 1,
            "denominator1": 2,
            "numerator2": -1,
            "denominator2": 2
          }
        ],
        "units": {
          "numerator1": "integer",
          "denominator1": "integer",
          "numerator2": "integer",
          "denominator2": "integer"
        },
        "display": "First numerator: 1 integer; First denominator: 2 integer; Second numerator: -1 integer; Second denominator: 2 integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "simplifiedNum": 0,
            "simplifiedDen": 1
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Add fractions",
              "expression": "1/2 + -1/2 = 0/4",
              "value": 0
            },
            {
              "label": "Simplify",
              "expression": "0/4 = 0/1",
              "value": 0
            }
          ],
          "explanation": "The simplified sum is 0/1."
        },
        "display": "Sum numerator: 0 numerator; Sum denominator: 1 denominator"
      },
      "expected": {
        "value": {
          "simplifiedNum": 0,
          "simplifiedDen": 1
        },
        "display": "Sum numerator: 0 numerator; Sum denominator: 1 denominator",
        "source": "packages/calculator-core/tests/fraction.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "fraction",
      "methodVersion": "fraction-add@1.0.1",
      "runAt": "2026-10-29T06:04:06.918Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "numerator1": 1,
            "denominator1": 4,
            "numerator2": 1,
            "denominator2": 4
          }
        ],
        "units": {
          "numerator1": "integer",
          "denominator1": "integer",
          "numerator2": "integer",
          "denominator2": "integer"
        },
        "display": "First numerator: 1 integer; First denominator: 4 integer; Second numerator: 1 integer; Second denominator: 4 integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "simplifiedNum": 1,
            "simplifiedDen": 2
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Add fractions",
              "expression": "1/4 + 1/4 = 8/16",
              "value": 0.5
            },
            {
              "label": "Simplify",
              "expression": "8/16 = 1/2",
              "value": 0.5
            }
          ],
          "explanation": "The simplified sum is 1/2."
        },
        "display": "Sum numerator: 1 numerator; Sum denominator: 2 denominator"
      },
      "expected": {
        "value": {
          "simplifiedNum": 1,
          "simplifiedDen": 2
        },
        "display": "Sum numerator: 1 numerator; Sum denominator: 2 denominator",
        "source": "packages/calculator-core/tests/fraction.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "inductor-energy": [
    {
      "calculatorId": "inductor-energy",
      "methodVersion": "inductor-energy@1.0.0",
      "runAt": "2026-10-29T06:04:06.918Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "inductanceH": 0.1,
            "currentA": 2
          }
        ],
        "units": {
          "inductanceH": "H",
          "currentA": "A"
        },
        "display": "Inductance: 0.1 H; Current: 2 A"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "energyJ": 0.2
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Stored energy",
              "expression": "0.5 × 0.1 H × 2² A = 0.2 J",
              "value": 0.2,
              "unit": "J"
            }
          ],
          "explanation": "The energy stored in the inductor is 0.2 joules."
        },
        "display": "Stored energy: 0.2 J"
      },
      "expected": {
        "value": {
          "energyJ": 0.2
        },
        "display": "Stored energy: 0.2 J",
        "source": "packages/calculator-core/tests/inductor-energy.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "inductor-energy",
      "methodVersion": "inductor-energy@1.0.0",
      "runAt": "2026-10-29T06:04:06.919Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "inductanceH": 0.001,
            "currentA": 0.01
          }
        ],
        "units": {
          "inductanceH": "H",
          "currentA": "A"
        },
        "display": "Inductance: 0.001 H; Current: 0.01 A"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "energyJ": 5.0000000000000004e-8
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Stored energy",
              "expression": "0.5 × 0.001 H × 0.01² A = 5.000000e-8 J",
              "value": 5.0000000000000004e-8,
              "unit": "J"
            }
          ],
          "explanation": "The energy stored in the inductor is 5.000000e-8 joules."
        },
        "display": "Stored energy: 5.0000000000000004e-8 J"
      },
      "expected": {
        "value": {
          "energyJ": 5e-8
        },
        "display": "Stored energy: 5e-8 J",
        "source": "packages/calculator-core/tests/inductor-energy.test.ts"
      },
      "tolerance": 1e-12,
      "pass": true
    },
    {
      "calculatorId": "inductor-energy",
      "methodVersion": "inductor-energy@1.0.0",
      "runAt": "2026-10-29T06:04:06.919Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "inductanceH": 0.5,
            "currentA": 3
          }
        ],
        "units": {
          "inductanceH": "H",
          "currentA": "A"
        },
        "display": "Inductance: 0.5 H; Current: 3 A"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "energyJ": 2.25
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Stored energy",
              "expression": "0.5 × 0.5 H × 3² A = 2.25 J",
              "value": 2.25,
              "unit": "J"
            }
          ],
          "explanation": "The energy stored in the inductor is 2.25 joules."
        },
        "display": "Stored energy: 2.25 J"
      },
      "expected": {
        "value": {
          "energyJ": 2.25
        },
        "display": "Stored energy: 2.25 J",
        "source": "packages/calculator-core/tests/inductor-energy.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "electricity-cost": [
    {
      "calculatorId": "electricity-cost",
      "methodVersion": "electricity-cost@1.0.0",
      "runAt": "2026-10-29T06:04:06.919Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "powerW": 1000,
            "hoursPerDay": 10,
            "ratePerKwh": 0.15
          }
        ],
        "units": {
          "powerW": "W",
          "hoursPerDay": "h/day",
          "ratePerKwh": "currency/kWh"
        },
        "display": "Power: 1000 W; Daily use: 10 h/day; Energy price: 0.15 currency/kWh"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "kwhPerDay": 10,
            "costPerDay": 1.5,
            "costPerMonth": 45
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Daily energy",
              "expression": "(1,000 W ÷ 1000) × 10 h = 10 kWh",
              "value": 10,
              "unit": "kWh"
            },
            {
              "label": "Daily cost",
              "expression": "10 kWh × 0.15 per kWh = 1.5",
              "value": 1.5
            },
            {
              "label": "30-day cost",
              "expression": "1.5 × 30 days = 45",
              "value": 45
            }
          ],
          "explanation": "The device uses 10 kilowatt-hours per day, costing 1.5 per day and 45 over 30 days."
        },
        "display": "Daily energy: 10 kWh/day; Daily cost: 1.5 currency/day; 30-day cost: 45 currency/30 days"
      },
      "expected": {
        "value": {
          "kwhPerDay": 10,
          "costPerDay": 1.5,
          "costPerMonth": 45
        },
        "display": "Daily energy: 10 kWh/day; Daily cost: 1.5 currency/day; 30-day cost: 45 currency/30 days",
        "source": "packages/calculator-core/tests/electricity-cost.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "electricity-cost",
      "methodVersion": "electricity-cost@1.0.0",
      "runAt": "2026-10-29T06:04:06.919Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "powerW": 100,
            "hoursPerDay": 24,
            "ratePerKwh": 0
          }
        ],
        "units": {
          "powerW": "W",
          "hoursPerDay": "h/day",
          "ratePerKwh": "currency/kWh"
        },
        "display": "Power: 100 W; Daily use: 24 h/day; Energy price: 0 currency/kWh"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "kwhPerDay": 2.4000000000000004,
            "costPerDay": 0,
            "costPerMonth": 0
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Daily energy",
              "expression": "(100 W ÷ 1000) × 24 h = 2.4 kWh",
              "value": 2.4000000000000004,
              "unit": "kWh"
            },
            {
              "label": "Daily cost",
              "expression": "2.4 kWh × 0 per kWh = 0",
              "value": 0
            },
            {
              "label": "30-day cost",
              "expression": "0 × 30 days = 0",
              "value": 0
            }
          ],
          "explanation": "The device uses 2.4 kilowatt-hours per day, costing 0 per day and 0 over 30 days."
        },
        "display": "30-day cost: 0 currency/30 days"
      },
      "expected": {
        "value": {
          "costPerMonth": 0
        },
        "display": "30-day cost: 0 currency/30 days",
        "source": "packages/calculator-core/tests/electricity-cost.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "electricity-cost",
      "methodVersion": "electricity-cost@1.0.0",
      "runAt": "2026-10-29T06:04:06.919Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "powerW": 500,
            "hoursPerDay": 4,
            "ratePerKwh": 0.2
          }
        ],
        "units": {
          "powerW": "W",
          "hoursPerDay": "h/day",
          "ratePerKwh": "currency/kWh"
        },
        "display": "Power: 500 W; Daily use: 4 h/day; Energy price: 0.2 currency/kWh"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "kwhPerDay": 2,
            "costPerDay": 0.4,
            "costPerMonth": 12
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Daily energy",
              "expression": "(500 W ÷ 1000) × 4 h = 2 kWh",
              "value": 2,
              "unit": "kWh"
            },
            {
              "label": "Daily cost",
              "expression": "2 kWh × 0.2 per kWh = 0.4",
              "value": 0.4
            },
            {
              "label": "30-day cost",
              "expression": "0.4 × 30 days = 12",
              "value": 12
            }
          ],
          "explanation": "The device uses 2 kilowatt-hours per day, costing 0.4 per day and 12 over 30 days."
        },
        "display": "Daily energy: 2 kWh/day; 30-day cost: 12 currency/30 days"
      },
      "expected": {
        "value": {
          "kwhPerDay": 2,
          "costPerMonth": 12
        },
        "display": "Daily energy: 2 kWh/day; 30-day cost: 12 currency/30 days",
        "source": "packages/calculator-core/tests/electricity-cost.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "lcm": [
    {
      "calculatorId": "lcm",
      "methodVersion": "lcm@1.0.0",
      "runAt": "2026-10-29T06:04:06.919Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          [
            4,
            6,
            8
          ]
        ],
        "units": {
          "values": "integers"
        },
        "display": "Values: [4,6,8] integers"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "lcm": 24,
            "gcd": 2,
            "count": 3
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "LCM step 1",
              "expression": "lcm(4, 6) = 4 × 6 ÷ gcd(2) = 12",
              "value": 12
            },
            {
              "label": "LCM step 2",
              "expression": "lcm(12, 8) = 12 × 8 ÷ gcd(4) = 24",
              "value": 24
            }
          ],
          "explanation": "The least common multiple of the 3 numbers is 24; their greatest common divisor is 2."
        },
        "display": "Least common multiple: 24 integer"
      },
      "expected": {
        "value": {
          "lcm": 24
        },
        "display": "Least common multiple: 24 integer",
        "source": "packages/calculator-core/tests/lcm.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "lcm",
      "methodVersion": "lcm@1.0.0",
      "runAt": "2026-10-29T06:04:06.919Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          [
            7,
            7
          ]
        ],
        "units": {
          "values": "integers"
        },
        "display": "Values: [7,7] integers"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "lcm": 7,
            "gcd": 7,
            "count": 2
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "LCM step 1",
              "expression": "lcm(7, 7) = 7 × 7 ÷ gcd(7) = 7",
              "value": 7
            }
          ],
          "explanation": "The least common multiple of the 2 numbers is 7; their greatest common divisor is 7."
        },
        "display": "Least common multiple: 7 integer"
      },
      "expected": {
        "value": {
          "lcm": 7
        },
        "display": "Least common multiple: 7 integer",
        "source": "packages/calculator-core/tests/lcm.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "lcm",
      "methodVersion": "lcm@1.0.0",
      "runAt": "2026-10-29T06:04:06.919Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          [
            -4,
            6
          ]
        ],
        "units": {
          "values": "integers"
        },
        "display": "Values: [-4,6] integers"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "lcm": 12,
            "gcd": 2,
            "count": 2
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "LCM step 1",
              "expression": "lcm(4, 6) = 4 × 6 ÷ gcd(2) = 12",
              "value": 12
            }
          ],
          "explanation": "The least common multiple of the 2 numbers is 12; their greatest common divisor is 2."
        },
        "display": "Least common multiple: 12 integer"
      },
      "expected": {
        "value": {
          "lcm": 12
        },
        "display": "Least common multiple: 12 integer",
        "source": "packages/calculator-core/tests/lcm.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "gcf": [
    {
      "calculatorId": "gcf",
      "methodVersion": "gcf@1.0.0",
      "runAt": "2026-10-29T06:04:06.919Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          [
            12,
            18
          ]
        ],
        "units": {
          "values": "integers"
        },
        "display": "Values: [12,18] integers"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "gcf": 6,
            "count": 2,
            "coprime": false
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "GCF step 1",
              "expression": "gcd(12, 18) = 6",
              "value": 6
            }
          ],
          "explanation": "The greatest common factor of the 2 numbers is 6."
        },
        "display": "Greatest common factor: 6 integer"
      },
      "expected": {
        "value": {
          "gcf": 6
        },
        "display": "Greatest common factor: 6 integer",
        "source": "packages/calculator-core/tests/gcf.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "gcf",
      "methodVersion": "gcf@1.0.0",
      "runAt": "2026-10-29T06:04:06.919Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          [
            0,
            5
          ]
        ],
        "units": {
          "values": "integers"
        },
        "display": "Values: [0,5] integers"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "gcf": 5,
            "count": 2,
            "coprime": false
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "GCF step 1",
              "expression": "gcd(0, 5) = 5",
              "value": 5
            }
          ],
          "explanation": "The greatest common factor of the 2 numbers is 5."
        },
        "display": "Greatest common factor: 5 integer"
      },
      "expected": {
        "value": {
          "gcf": 5
        },
        "display": "Greatest common factor: 5 integer",
        "source": "packages/calculator-core/tests/gcf.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "gcf",
      "methodVersion": "gcf@1.0.0",
      "runAt": "2026-10-29T06:04:06.919Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          [
            8,
            12,
            16
          ]
        ],
        "units": {
          "values": "integers"
        },
        "display": "Values: [8,12,16] integers"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "gcf": 4,
            "count": 3,
            "coprime": false
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "GCF step 1",
              "expression": "gcd(8, 12) = 4",
              "value": 4
            },
            {
              "label": "GCF step 2",
              "expression": "gcd(4, 16) = 4",
              "value": 4
            }
          ],
          "explanation": "The greatest common factor of the 3 numbers is 4."
        },
        "display": "Greatest common factor: 4 integer"
      },
      "expected": {
        "value": {
          "gcf": 4
        },
        "display": "Greatest common factor: 4 integer",
        "source": "packages/calculator-core/tests/gcf.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "modulo": [
    {
      "calculatorId": "modulo",
      "methodVersion": "modulo@1.0.0",
      "runAt": "2026-10-29T06:04:06.919Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          17,
          5
        ],
        "units": {
          "dividend": "integer",
          "divisor": "integer"
        },
        "display": "Dividend: 17 integer; Divisor: 5 integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "result": 2,
            "remainder": 2,
            "quotient": 3,
            "dividend": 17,
            "divisor": 5,
            "conventionsDiffer": false
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Division algorithm",
              "expression": "17 = 3 × 5 + 2",
              "value": 2
            },
            {
              "label": "Euclidean modulo",
              "expression": "17 mod 5 = 2",
              "value": 2
            }
          ],
          "explanation": "17 mod 5 = 2 (Euclidean, 0 ≤ result < 5)."
        },
        "display": "Result: 2 Euclidean remainder; Remainder: 2 truncated remainder"
      },
      "expected": {
        "value": {
          "result": 2,
          "remainder": 2
        },
        "display": "Result: 2 Euclidean remainder; Remainder: 2 truncated remainder",
        "source": "packages/calculator-core/tests/modulo.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "modulo",
      "methodVersion": "modulo@1.0.0",
      "runAt": "2026-10-29T06:04:06.919Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          0,
          5
        ],
        "units": {
          "dividend": "integer",
          "divisor": "integer"
        },
        "display": "Dividend: 0 integer; Divisor: 5 integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "result": 0,
            "remainder": 0,
            "quotient": 0,
            "dividend": 0,
            "divisor": 5,
            "conventionsDiffer": false
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Division algorithm",
              "expression": "0 = 0 × 5 + 0",
              "value": 0
            },
            {
              "label": "Euclidean modulo",
              "expression": "0 mod 5 = 0",
              "value": 0
            }
          ],
          "explanation": "0 mod 5 = 0 (Euclidean, 0 ≤ result < 5)."
        },
        "display": "Result: 0 Euclidean remainder; Remainder: 0 truncated remainder"
      },
      "expected": {
        "value": {
          "result": 0,
          "remainder": 0
        },
        "display": "Result: 0 Euclidean remainder; Remainder: 0 truncated remainder",
        "source": "packages/calculator-core/tests/modulo.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "modulo",
      "methodVersion": "modulo@1.0.0",
      "runAt": "2026-10-29T06:04:06.920Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          7,
          -3
        ],
        "units": {
          "dividend": "integer",
          "divisor": "integer"
        },
        "display": "Dividend: 7 integer; Divisor: -3 integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "result": 1,
            "remainder": 1,
            "quotient": -2,
            "dividend": 7,
            "divisor": -3,
            "conventionsDiffer": false
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Division algorithm",
              "expression": "7 = -2 × -3 + 1",
              "value": 1
            },
            {
              "label": "Euclidean modulo",
              "expression": "7 mod -3 = 1",
              "value": 1
            }
          ],
          "explanation": "7 mod -3 = 1 (Euclidean, 0 ≤ result < 3)."
        },
        "display": "Result: 1 Euclidean remainder; Remainder: 1 truncated remainder"
      },
      "expected": {
        "value": {
          "result": 1,
          "remainder": 1
        },
        "display": "Result: 1 Euclidean remainder; Remainder: 1 truncated remainder",
        "source": "packages/calculator-core/tests/modulo.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "modulo",
      "methodVersion": "modulo@1.0.0",
      "runAt": "2026-10-29T06:04:06.920Z",
      "buildRevision": "24533ff",
      "kind": "signed",
      "inputs": {
        "arguments": [
          -7,
          3
        ],
        "units": {
          "dividend": "integer",
          "divisor": "integer"
        },
        "display": "Dividend: -7 integer; Divisor: 3 integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "result": 2,
            "remainder": -1,
            "quotient": -3,
            "dividend": -7,
            "divisor": 3,
            "conventionsDiffer": true
          },
          "errors": [],
          "warnings": [
            {
              "code": "modulo_sign_convention",
              "message": "With a negative dividend the two common conventions differ: the Euclidean modulo is 2 (kept in 0…2), while the truncated remainder used by the % operator in C, Java and JavaScript is -1. Both are shown so you can match whichever your context uses.",
              "severity": "info"
            }
          ],
          "steps": [
            {
              "label": "Division algorithm",
              "expression": "-7 = -3 × 3 + 2",
              "value": 2
            },
            {
              "label": "Euclidean modulo",
              "expression": "-7 mod 3 = 2",
              "value": 2
            }
          ],
          "explanation": "-7 mod 3 = 2 (Euclidean, 0 ≤ result < 3)."
        },
        "display": "Result: 2 Euclidean remainder; Remainder: -1 truncated remainder"
      },
      "expected": {
        "value": {
          "result": 2,
          "remainder": -1
        },
        "display": "Result: 2 Euclidean remainder; Remainder: -1 truncated remainder",
        "source": "packages/calculator-core/tests/modulo.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "prime-factorization": [
    {
      "calculatorId": "prime-factorization",
      "methodVersion": "prime-factorization@1.0.0",
      "runAt": "2026-10-29T06:04:06.920Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          360
        ],
        "units": {
          "n": "integer"
        },
        "display": "Integer: 360 integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "factors": [
              {
                "prime": 2,
                "exponent": 3
              },
              {
                "prime": 3,
                "exponent": 2
              },
              {
                "prime": 5,
                "exponent": 1
              }
            ],
            "factorization": "2^3 × 3^2 × 5",
            "primeCount": 3,
            "isPrime": false
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Factor out 2",
              "expression": "2^3 = 8",
              "value": 8
            },
            {
              "label": "Factor out 3",
              "expression": "3^2 = 9",
              "value": 9
            },
            {
              "label": "Remaining prime",
              "expression": "5",
              "value": 5
            }
          ],
          "explanation": "360 = 2^3 × 3^2 × 5."
        },
        "display": "Prime factorization: 2^3 × 3^2 × 5 prime powers"
      },
      "expected": {
        "value": {
          "factorization": "2^3 × 3^2 × 5"
        },
        "display": "Prime factorization: 2^3 × 3^2 × 5 prime powers",
        "source": "packages/calculator-core/tests/prime-factorization.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "prime-factorization",
      "methodVersion": "prime-factorization@1.0.0",
      "runAt": "2026-10-29T06:04:06.920Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          2
        ],
        "units": {
          "n": "integer"
        },
        "display": "Integer: 2 integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "factors": [
              {
                "prime": 2,
                "exponent": 1
              }
            ],
            "factorization": "2",
            "primeCount": 1,
            "isPrime": true
          },
          "errors": [],
          "warnings": [
            {
              "code": "prime_input",
              "message": "2 is a prime number — its only factorization is itself.",
              "severity": "info"
            }
          ],
          "steps": [
            {
              "label": "Remaining prime",
              "expression": "2",
              "value": 2
            }
          ],
          "explanation": "2 = 2."
        },
        "display": "Prime factorization: 2 prime powers"
      },
      "expected": {
        "value": {
          "factorization": "2"
        },
        "display": "Prime factorization: 2 prime powers",
        "source": "packages/calculator-core/tests/prime-factorization.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "prime-factorization",
      "methodVersion": "prime-factorization@1.0.0",
      "runAt": "2026-10-29T06:04:06.920Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          100
        ],
        "units": {
          "n": "integer"
        },
        "display": "Integer: 100 integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "factors": [
              {
                "prime": 2,
                "exponent": 2
              },
              {
                "prime": 5,
                "exponent": 2
              }
            ],
            "factorization": "2^2 × 5^2",
            "primeCount": 2,
            "isPrime": false
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Factor out 2",
              "expression": "2^2 = 4",
              "value": 4
            },
            {
              "label": "Factor out 5",
              "expression": "5^2 = 25",
              "value": 25
            }
          ],
          "explanation": "100 = 2^2 × 5^2."
        },
        "display": "Prime factorization: 2^2 × 5^2 prime powers"
      },
      "expected": {
        "value": {
          "factorization": "2^2 × 5^2"
        },
        "display": "Prime factorization: 2^2 × 5^2 prime powers",
        "source": "packages/calculator-core/tests/prime-factorization.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "binary": [
    {
      "calculatorId": "binary",
      "methodVersion": "binary@1.0.0",
      "runAt": "2026-10-29T06:04:06.920Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          "1010",
          "110"
        ],
        "units": {
          "operandA": "binary integer",
          "operandB": "binary integer"
        },
        "display": "First operand: 1010 binary integer; Second operand: 110 binary integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "decimalA": "10",
            "decimalB": "6",
            "sumBinary": "10000",
            "sumDecimal": "16",
            "differenceBinary": "100",
            "differenceDecimal": "4",
            "productBinary": "111100",
            "productDecimal": "60",
            "quotientBinary": "1",
            "quotientDecimal": "1",
            "remainderBinary": "100",
            "remainderDecimal": "4"
          },
          "errors": [],
          "warnings": [
            {
              "code": "integer_division",
              "message": "Binary division here is integer division: 1010 ÷ 110 = 1 remainder 100.",
              "severity": "info"
            }
          ],
          "steps": [
            {
              "label": "Operand A to decimal",
              "expression": "1010₂ = 10₁₀"
            },
            {
              "label": "Operand B to decimal",
              "expression": "110₂ = 6₁₀"
            },
            {
              "label": "Add",
              "expression": "10 + 6 = 16 = 10000₂"
            },
            {
              "label": "Subtract",
              "expression": "10 − 6 = 4 = 100₂"
            },
            {
              "label": "Multiply",
              "expression": "10 × 6 = 60 = 111100₂"
            },
            {
              "label": "Divide (integer)",
              "expression": "10 ÷ 6 = 1 remainder 4 = 1₂ r 100₂"
            }
          ],
          "explanation": "1010₂ = 10₁₀ and 110₂ = 6₁₀. Their sum is 10000₂ (16₁₀)."
        },
        "display": "Binary sum: 10000"
      },
      "expected": {
        "value": {
          "sumBinary": "10000"
        },
        "display": "Binary sum: 10000",
        "source": "packages/calculator-core/tests/binary.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "binary",
      "methodVersion": "binary@1.0.0",
      "runAt": "2026-10-29T06:04:06.920Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          "100",
          "0"
        ],
        "units": {
          "operandA": "binary integer",
          "operandB": "binary integer"
        },
        "display": "First operand: 100 binary integer; Second operand: 0 binary integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "decimalA": "4",
            "decimalB": "0",
            "sumBinary": "100",
            "sumDecimal": "4",
            "differenceBinary": "100",
            "differenceDecimal": "4",
            "productBinary": "0",
            "productDecimal": "0",
            "quotientBinary": "",
            "quotientDecimal": "",
            "remainderBinary": "",
            "remainderDecimal": ""
          },
          "errors": [],
          "warnings": [
            {
              "code": "divide_by_zero",
              "message": "Division by zero is undefined, so the quotient is not shown.",
              "severity": "warning"
            }
          ],
          "steps": [
            {
              "label": "Operand A to decimal",
              "expression": "100₂ = 4₁₀"
            },
            {
              "label": "Operand B to decimal",
              "expression": "0₂ = 0₁₀"
            },
            {
              "label": "Add",
              "expression": "4 + 0 = 4 = 100₂"
            },
            {
              "label": "Subtract",
              "expression": "4 − 0 = 4 = 100₂"
            },
            {
              "label": "Multiply",
              "expression": "4 × 0 = 0 = 0₂"
            }
          ],
          "explanation": "100₂ = 4₁₀ and 0₂ = 0₁₀. Their sum is 100₂ (4₁₀)."
        },
        "display": "Binary sum: 100; Binary quotient: "
      },
      "expected": {
        "value": {
          "sumBinary": "100",
          "quotientBinary": ""
        },
        "display": "Binary sum: 100; Binary quotient: ",
        "source": "packages/calculator-core/tests/binary.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "binary",
      "methodVersion": "binary@1.0.0",
      "runAt": "2026-10-29T06:04:06.920Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          "1111",
          "11"
        ],
        "units": {
          "operandA": "binary integer",
          "operandB": "binary integer"
        },
        "display": "First operand: 1111 binary integer; Second operand: 11 binary integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "decimalA": "15",
            "decimalB": "3",
            "sumBinary": "10010",
            "sumDecimal": "18",
            "differenceBinary": "1100",
            "differenceDecimal": "12",
            "productBinary": "101101",
            "productDecimal": "45",
            "quotientBinary": "101",
            "quotientDecimal": "5",
            "remainderBinary": "0",
            "remainderDecimal": "0"
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Operand A to decimal",
              "expression": "1111₂ = 15₁₀"
            },
            {
              "label": "Operand B to decimal",
              "expression": "11₂ = 3₁₀"
            },
            {
              "label": "Add",
              "expression": "15 + 3 = 18 = 10010₂"
            },
            {
              "label": "Subtract",
              "expression": "15 − 3 = 12 = 1100₂"
            },
            {
              "label": "Multiply",
              "expression": "15 × 3 = 45 = 101101₂"
            },
            {
              "label": "Divide (integer)",
              "expression": "15 ÷ 3 = 5 remainder 0 = 101₂ r 0₂"
            }
          ],
          "explanation": "1111₂ = 15₁₀ and 11₂ = 3₁₀. Their sum is 10010₂ (18₁₀)."
        },
        "display": "Binary sum: 10010"
      },
      "expected": {
        "value": {
          "sumBinary": "10010"
        },
        "display": "Binary sum: 10010",
        "source": "packages/calculator-core/tests/binary.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "hex": [
    {
      "calculatorId": "hex",
      "methodVersion": "hex@1.0.0",
      "runAt": "2026-10-29T06:04:06.920Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          "A5",
          "1F"
        ],
        "units": {
          "operandA": "hex integer",
          "operandB": "hex integer"
        },
        "display": "First operand: A5 hex integer; Second operand: 1F hex integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "decimalA": "165",
            "decimalB": "31",
            "sumHex": "C4",
            "sumDecimal": "196",
            "differenceHex": "86",
            "differenceDecimal": "134",
            "productHex": "13FB",
            "productDecimal": "5115",
            "quotientHex": "5",
            "quotientDecimal": "5",
            "remainderHex": "A",
            "remainderDecimal": "10"
          },
          "errors": [],
          "warnings": [
            {
              "code": "integer_division",
              "message": "Hex division here is integer division: A5 ÷ 1F = 5 remainder A.",
              "severity": "info"
            }
          ],
          "steps": [
            {
              "label": "Operand A to decimal",
              "expression": "A5₁₆ = 165₁₀"
            },
            {
              "label": "Operand B to decimal",
              "expression": "1F₁₆ = 31₁₀"
            },
            {
              "label": "Add",
              "expression": "165 + 31 = 196 = C4₁₆"
            },
            {
              "label": "Subtract",
              "expression": "165 − 31 = 134 = 86₁₆"
            },
            {
              "label": "Multiply",
              "expression": "165 × 31 = 5115 = 13FB₁₆"
            },
            {
              "label": "Divide (integer)",
              "expression": "165 ÷ 31 = 5 remainder 10 = 5₁₆ r A₁₆"
            }
          ],
          "explanation": "A5₁₆ = 165₁₀ and 1F₁₆ = 31₁₀. Their sum is C4₁₆ (196₁₀)."
        },
        "display": "Hexadecimal sum: C4"
      },
      "expected": {
        "value": {
          "sumHex": "C4"
        },
        "display": "Hexadecimal sum: C4",
        "source": "packages/calculator-core/tests/hex.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "hex",
      "methodVersion": "hex@1.0.0",
      "runAt": "2026-10-29T06:04:06.920Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          "FF",
          "1"
        ],
        "units": {
          "operandA": "hex integer",
          "operandB": "hex integer"
        },
        "display": "First operand: FF hex integer; Second operand: 1 hex integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "decimalA": "255",
            "decimalB": "1",
            "sumHex": "100",
            "sumDecimal": "256",
            "differenceHex": "FE",
            "differenceDecimal": "254",
            "productHex": "FF",
            "productDecimal": "255",
            "quotientHex": "FF",
            "quotientDecimal": "255",
            "remainderHex": "0",
            "remainderDecimal": "0"
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Operand A to decimal",
              "expression": "FF₁₆ = 255₁₀"
            },
            {
              "label": "Operand B to decimal",
              "expression": "1₁₆ = 1₁₀"
            },
            {
              "label": "Add",
              "expression": "255 + 1 = 256 = 100₁₆"
            },
            {
              "label": "Subtract",
              "expression": "255 − 1 = 254 = FE₁₆"
            },
            {
              "label": "Multiply",
              "expression": "255 × 1 = 255 = FF₁₆"
            },
            {
              "label": "Divide (integer)",
              "expression": "255 ÷ 1 = 255 remainder 0 = FF₁₆ r 0₁₆"
            }
          ],
          "explanation": "FF₁₆ = 255₁₀ and 1₁₆ = 1₁₀. Their sum is 100₁₆ (256₁₀)."
        },
        "display": "Hexadecimal sum: 100"
      },
      "expected": {
        "value": {
          "sumHex": "100"
        },
        "display": "Hexadecimal sum: 100",
        "source": "packages/calculator-core/tests/hex.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "hex",
      "methodVersion": "hex@1.0.0",
      "runAt": "2026-10-29T06:04:06.920Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          "0x0ff",
          "a"
        ],
        "units": {
          "operandA": "hex integer",
          "operandB": "hex integer"
        },
        "display": "First operand: 0x0ff hex integer; Second operand: a hex integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "decimalA": "255",
            "decimalB": "10",
            "sumHex": "109",
            "sumDecimal": "265",
            "differenceHex": "F5",
            "differenceDecimal": "245",
            "productHex": "9F6",
            "productDecimal": "2550",
            "quotientHex": "19",
            "quotientDecimal": "25",
            "remainderHex": "5",
            "remainderDecimal": "5"
          },
          "errors": [],
          "warnings": [
            {
              "code": "integer_division",
              "message": "Hex division here is integer division: 0FF ÷ A = 19 remainder 5.",
              "severity": "info"
            }
          ],
          "steps": [
            {
              "label": "Operand A to decimal",
              "expression": "0FF₁₆ = 255₁₀"
            },
            {
              "label": "Operand B to decimal",
              "expression": "A₁₆ = 10₁₀"
            },
            {
              "label": "Add",
              "expression": "255 + 10 = 265 = 109₁₆"
            },
            {
              "label": "Subtract",
              "expression": "255 − 10 = 245 = F5₁₆"
            },
            {
              "label": "Multiply",
              "expression": "255 × 10 = 2550 = 9F6₁₆"
            },
            {
              "label": "Divide (integer)",
              "expression": "255 ÷ 10 = 25 remainder 5 = 19₁₆ r 5₁₆"
            }
          ],
          "explanation": "0FF₁₆ = 255₁₀ and A₁₆ = 10₁₀. Their sum is 109₁₆ (265₁₀)."
        },
        "display": "Hexadecimal sum: 109"
      },
      "expected": {
        "value": {
          "sumHex": "109"
        },
        "display": "Hexadecimal sum: 109",
        "source": "packages/calculator-core/tests/hex.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "octal": [
    {
      "calculatorId": "octal",
      "methodVersion": "octal@1.0.0",
      "runAt": "2026-10-29T06:04:06.920Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          "245",
          "37"
        ],
        "units": {
          "operandA": "octal integer",
          "operandB": "octal integer"
        },
        "display": "First operand: 245 octal integer; Second operand: 37 octal integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "decimalA": "165",
            "decimalB": "31",
            "sumOctal": "304",
            "sumDecimal": "196",
            "differenceOctal": "206",
            "differenceDecimal": "134",
            "productOctal": "11773",
            "productDecimal": "5115",
            "quotientOctal": "5",
            "quotientDecimal": "5",
            "remainderOctal": "12",
            "remainderDecimal": "10"
          },
          "errors": [],
          "warnings": [
            {
              "code": "integer_division",
              "message": "Octal division here is integer division: 245 ÷ 37 = 5 remainder 12.",
              "severity": "info"
            }
          ],
          "steps": [
            {
              "label": "Operand A to decimal",
              "expression": "245₈ = 165₁₀"
            },
            {
              "label": "Operand B to decimal",
              "expression": "37₈ = 31₁₀"
            },
            {
              "label": "Add",
              "expression": "165 + 31 = 196 = 304₈"
            },
            {
              "label": "Subtract",
              "expression": "165 − 31 = 134 = 206₈"
            },
            {
              "label": "Multiply",
              "expression": "165 × 31 = 5115 = 11773₈"
            },
            {
              "label": "Divide (integer)",
              "expression": "165 ÷ 31 = 5 remainder 10 = 5₈ r 12₈"
            }
          ],
          "explanation": "245₈ = 165₁₀ and 37₈ = 31₁₀. Their sum is 304₈ (196₁₀)."
        },
        "display": "Octal sum: 304"
      },
      "expected": {
        "value": {
          "sumOctal": "304"
        },
        "display": "Octal sum: 304",
        "source": "packages/calculator-core/tests/octal.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "octal",
      "methodVersion": "octal@1.0.0",
      "runAt": "2026-10-29T06:04:06.920Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          "77",
          "1"
        ],
        "units": {
          "operandA": "octal integer",
          "operandB": "octal integer"
        },
        "display": "First operand: 77 octal integer; Second operand: 1 octal integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "decimalA": "63",
            "decimalB": "1",
            "sumOctal": "100",
            "sumDecimal": "64",
            "differenceOctal": "76",
            "differenceDecimal": "62",
            "productOctal": "77",
            "productDecimal": "63",
            "quotientOctal": "77",
            "quotientDecimal": "63",
            "remainderOctal": "0",
            "remainderDecimal": "0"
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Operand A to decimal",
              "expression": "77₈ = 63₁₀"
            },
            {
              "label": "Operand B to decimal",
              "expression": "1₈ = 1₁₀"
            },
            {
              "label": "Add",
              "expression": "63 + 1 = 64 = 100₈"
            },
            {
              "label": "Subtract",
              "expression": "63 − 1 = 62 = 76₈"
            },
            {
              "label": "Multiply",
              "expression": "63 × 1 = 63 = 77₈"
            },
            {
              "label": "Divide (integer)",
              "expression": "63 ÷ 1 = 63 remainder 0 = 77₈ r 0₈"
            }
          ],
          "explanation": "77₈ = 63₁₀ and 1₈ = 1₁₀. Their sum is 100₈ (64₁₀)."
        },
        "display": "Octal sum: 100"
      },
      "expected": {
        "value": {
          "sumOctal": "100"
        },
        "display": "Octal sum: 100",
        "source": "packages/calculator-core/tests/octal.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "octal",
      "methodVersion": "octal@1.0.0",
      "runAt": "2026-10-29T06:04:06.920Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          "0o017",
          "5"
        ],
        "units": {
          "operandA": "octal integer",
          "operandB": "octal integer"
        },
        "display": "First operand: 0o017 octal integer; Second operand: 5 octal integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "decimalA": "15",
            "decimalB": "5",
            "sumOctal": "24",
            "sumDecimal": "20",
            "differenceOctal": "12",
            "differenceDecimal": "10",
            "productOctal": "113",
            "productDecimal": "75",
            "quotientOctal": "3",
            "quotientDecimal": "3",
            "remainderOctal": "0",
            "remainderDecimal": "0"
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Operand A to decimal",
              "expression": "017₈ = 15₁₀"
            },
            {
              "label": "Operand B to decimal",
              "expression": "5₈ = 5₁₀"
            },
            {
              "label": "Add",
              "expression": "15 + 5 = 20 = 24₈"
            },
            {
              "label": "Subtract",
              "expression": "15 − 5 = 10 = 12₈"
            },
            {
              "label": "Multiply",
              "expression": "15 × 5 = 75 = 113₈"
            },
            {
              "label": "Divide (integer)",
              "expression": "15 ÷ 5 = 3 remainder 0 = 3₈ r 0₈"
            }
          ],
          "explanation": "017₈ = 15₁₀ and 5₈ = 5₁₀. Their sum is 24₈ (20₁₀)."
        },
        "display": "Octal sum: 24"
      },
      "expected": {
        "value": {
          "sumOctal": "24"
        },
        "display": "Octal sum: 24",
        "source": "packages/calculator-core/tests/octal.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "prime-checker": [
    {
      "calculatorId": "prime-checker",
      "methodVersion": "prime-checker@1.0.0",
      "runAt": "2026-10-29T06:04:06.920Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          97
        ],
        "units": {
          "n": "integer"
        },
        "display": "Integer: 97 integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "isPrime": true,
            "smallestFactor": null,
            "cofactor": null
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Result",
              "expression": "no divisor found from 2 to √97",
              "value": 97
            }
          ],
          "explanation": "97 is prime — its only divisors are 1 and 97."
        },
        "display": "Prime: true boolean"
      },
      "expected": {
        "value": {
          "isPrime": true
        },
        "display": "Prime: true boolean",
        "source": "packages/calculator-core/tests/prime-checker.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "prime-checker",
      "methodVersion": "prime-checker@1.0.0",
      "runAt": "2026-10-29T06:04:06.920Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          1
        ],
        "units": {
          "n": "integer"
        },
        "display": "Integer: 1 integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "isPrime": false,
            "smallestFactor": null,
            "cofactor": null
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Range",
              "expression": "1 < 2",
              "value": 1
            }
          ],
          "explanation": "1 is not prime — a prime must be an integer greater than 1."
        },
        "display": "Prime: false boolean"
      },
      "expected": {
        "value": {
          "isPrime": false
        },
        "display": "Prime: false boolean",
        "source": "packages/calculator-core/tests/prime-checker.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "prime-checker",
      "methodVersion": "prime-checker@1.0.0",
      "runAt": "2026-10-29T06:04:06.920Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          91
        ],
        "units": {
          "n": "integer"
        },
        "display": "Integer: 91 integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "isPrime": false,
            "smallestFactor": 7,
            "cofactor": 13
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Smallest factor",
              "expression": "91 = 7 × 13",
              "value": 7
            }
          ],
          "explanation": "91 is not prime — it is divisible by 7 (91 = 7 × 13)."
        },
        "display": "Prime: false boolean; Smallest factor: 7"
      },
      "expected": {
        "value": {
          "isPrime": false,
          "smallestFactor": 7
        },
        "display": "Prime: false boolean; Smallest factor: 7",
        "source": "packages/calculator-core/tests/prime-checker.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "factors-list": [
    {
      "calculatorId": "factors-list",
      "methodVersion": "factors-list@1.0.0",
      "runAt": "2026-10-29T06:04:06.920Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          12
        ],
        "units": {
          "n": "integer"
        },
        "display": "Integer: 12 integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "factors": [
              1,
              2,
              3,
              4,
              6,
              12
            ],
            "count": 6,
            "sum": 28,
            "properSum": 16,
            "pairs": [
              {
                "a": 1,
                "b": 12
              },
              {
                "a": 2,
                "b": 6
              },
              {
                "a": 3,
                "b": 4
              }
            ],
            "isPrime": false,
            "isPerfect": false
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Factor pair",
              "expression": "1 × 12 = 12",
              "value": 1
            },
            {
              "label": "Factor pair",
              "expression": "2 × 6 = 12",
              "value": 2
            },
            {
              "label": "Factor pair",
              "expression": "3 × 4 = 12",
              "value": 3
            }
          ],
          "explanation": "12 has 6 factors: 1, 2, 3, 4, 6, 12."
        },
        "display": "Factors: [1,2,3,4,6,12] positive integers; Count: 6 count"
      },
      "expected": {
        "value": {
          "factors": [
            1,
            2,
            3,
            4,
            6,
            12
          ],
          "count": 6
        },
        "display": "Factors: [1,2,3,4,6,12] positive integers; Count: 6 count",
        "source": "packages/calculator-core/tests/factors-list.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "factors-list",
      "methodVersion": "factors-list@1.0.0",
      "runAt": "2026-10-29T06:04:06.920Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          1
        ],
        "units": {
          "n": "integer"
        },
        "display": "Integer: 1 integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "factors": [
              1
            ],
            "count": 1,
            "sum": 1,
            "properSum": 0,
            "pairs": [
              {
                "a": 1,
                "b": 1
              }
            ],
            "isPrime": false,
            "isPerfect": false
          },
          "errors": [],
          "warnings": [
            {
              "code": "unit_input",
              "message": "1 has a single factor: itself. It is neither prime nor composite.",
              "severity": "info"
            }
          ],
          "steps": [
            {
              "label": "1 squared",
              "expression": "1 × 1 = 1",
              "value": 1
            }
          ],
          "explanation": "1 has 1 factor: 1."
        },
        "display": "Factors: [1] positive integers; Count: 1 count"
      },
      "expected": {
        "value": {
          "factors": [
            1
          ],
          "count": 1
        },
        "display": "Factors: [1] positive integers; Count: 1 count",
        "source": "packages/calculator-core/tests/factors-list.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "factors-list",
      "methodVersion": "factors-list@1.0.0",
      "runAt": "2026-10-29T06:04:06.920Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          36
        ],
        "units": {
          "n": "integer"
        },
        "display": "Integer: 36 integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "factors": [
              1,
              2,
              3,
              4,
              6,
              9,
              12,
              18,
              36
            ],
            "count": 9,
            "sum": 91,
            "properSum": 55,
            "pairs": [
              {
                "a": 1,
                "b": 36
              },
              {
                "a": 2,
                "b": 18
              },
              {
                "a": 3,
                "b": 12
              },
              {
                "a": 4,
                "b": 9
              },
              {
                "a": 6,
                "b": 6
              }
            ],
            "isPrime": false,
            "isPerfect": false
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Factor pair",
              "expression": "1 × 36 = 36",
              "value": 1
            },
            {
              "label": "Factor pair",
              "expression": "2 × 18 = 36",
              "value": 2
            },
            {
              "label": "Factor pair",
              "expression": "3 × 12 = 36",
              "value": 3
            },
            {
              "label": "Factor pair",
              "expression": "4 × 9 = 36",
              "value": 4
            },
            {
              "label": "6 squared",
              "expression": "6 × 6 = 36",
              "value": 6
            }
          ],
          "explanation": "36 has 9 factors: 1, 2, 3, 4, 6, 9, 12, 18, 36."
        },
        "display": "Factors: [1,2,3,4,6,9,12,18,36] positive integers; Count: 9 count"
      },
      "expected": {
        "value": {
          "factors": [
            1,
            2,
            3,
            4,
            6,
            9,
            12,
            18,
            36
          ],
          "count": 9
        },
        "display": "Factors: [1,2,3,4,6,9,12,18,36] positive integers; Count: 9 count",
        "source": "packages/calculator-core/tests/factors-list.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "divisors": [
    {
      "calculatorId": "divisors",
      "methodVersion": "divisors@1.0.0",
      "runAt": "2026-10-29T06:04:06.920Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          12
        ],
        "units": {
          "n": "integer"
        },
        "display": "Integer: 12 integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "divisors": [
              1,
              2,
              3,
              4,
              6,
              12
            ],
            "count": 6,
            "sum": 28,
            "aliquotSum": 16,
            "classification": "abundant",
            "isPrime": false
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Number of divisors d(n)",
              "expression": "6",
              "value": 6
            },
            {
              "label": "Sum of divisors σ(n)",
              "expression": "1 + 2 + 3 + 4 + 6 + 12 = 28",
              "value": 28
            },
            {
              "label": "Aliquot sum (σ(n) − n)",
              "expression": "28 − 12 = 16",
              "value": 16
            }
          ],
          "explanation": "12 has 6 divisors summing to 28; it is abundant."
        },
        "display": "Count: 6 count; Sum: 28 integer; Classification: abundant classification"
      },
      "expected": {
        "value": {
          "count": 6,
          "sum": 28,
          "classification": "abundant"
        },
        "display": "Count: 6 count; Sum: 28 integer; Classification: abundant classification",
        "source": "packages/calculator-core/tests/divisors.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "divisors",
      "methodVersion": "divisors@1.0.0",
      "runAt": "2026-10-29T06:04:06.920Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          1
        ],
        "units": {
          "n": "integer"
        },
        "display": "Integer: 1 integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "divisors": [
              1
            ],
            "count": 1,
            "sum": 1,
            "aliquotSum": 0,
            "classification": "deficient",
            "isPrime": false
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Number of divisors d(n)",
              "expression": "1",
              "value": 1
            },
            {
              "label": "Sum of divisors σ(n)",
              "expression": "1 = 1",
              "value": 1
            },
            {
              "label": "Aliquot sum (σ(n) − n)",
              "expression": "1 − 1 = 0",
              "value": 0
            }
          ],
          "explanation": "1 has 1 divisors summing to 1; it is deficient."
        },
        "display": "Count: 1 count; Sum: 1 integer; Classification: deficient classification"
      },
      "expected": {
        "value": {
          "count": 1,
          "sum": 1,
          "classification": "deficient"
        },
        "display": "Count: 1 count; Sum: 1 integer; Classification: deficient classification",
        "source": "packages/calculator-core/tests/divisors.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "divisors",
      "methodVersion": "divisors@1.0.0",
      "runAt": "2026-10-29T06:04:06.920Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          28
        ],
        "units": {
          "n": "integer"
        },
        "display": "Integer: 28 integer"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "divisors": [
              1,
              2,
              4,
              7,
              14,
              28
            ],
            "count": 6,
            "sum": 56,
            "aliquotSum": 28,
            "classification": "perfect",
            "isPrime": false
          },
          "errors": [],
          "warnings": [
            {
              "code": "perfect_number",
              "message": "28 is a perfect number — it equals the sum of its proper divisors (1 + 2 + 4 + 7 + 14).",
              "severity": "info"
            }
          ],
          "steps": [
            {
              "label": "Number of divisors d(n)",
              "expression": "6",
              "value": 6
            },
            {
              "label": "Sum of divisors σ(n)",
              "expression": "1 + 2 + 4 + 7 + 14 + 28 = 56",
              "value": 56
            },
            {
              "label": "Aliquot sum (σ(n) − n)",
              "expression": "56 − 28 = 28",
              "value": 28
            }
          ],
          "explanation": "28 has 6 divisors summing to 56; it is perfect."
        },
        "display": "Count: 6 count; Sum: 56 integer; Classification: perfect classification"
      },
      "expected": {
        "value": {
          "count": 6,
          "sum": 56,
          "classification": "perfect"
        },
        "display": "Count: 6 count; Sum: 56 integer; Classification: perfect classification",
        "source": "packages/calculator-core/tests/divisors.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "base-converter": [
    {
      "calculatorId": "base-converter",
      "methodVersion": "base-converter@1.0.0",
      "runAt": "2026-10-29T06:04:06.920Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          "255",
          10,
          16
        ],
        "units": {
          "value": "integer in fromBase",
          "fromBase": "radix",
          "toBase": "radix"
        },
        "display": "Value: 255 integer in fromBase; Source base: 10 radix; Target base: 16 radix"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "normalizedInput": "255",
            "fromBase": 10,
            "toBase": 16,
            "converted": "FF",
            "decimal": "255",
            "binary": "11111111",
            "octal": "377",
            "hex": "FF",
            "digitCount": 2
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Read 255 as base-10 positional notation",
              "expression": "(2×10^2 + 5×10^1 + 5×10^0) = 255₁₀"
            },
            {
              "label": "Write 255₁₀ in base 16",
              "expression": "255₁₀ = FF(base 16)"
            }
          ],
          "explanation": "255 in base 10 equals 255 in base 10, which is FF in base 16 (a 2nd-place value)."
        },
        "display": "Converted value: FF target-base integer"
      },
      "expected": {
        "value": {
          "converted": "FF"
        },
        "display": "Converted value: FF target-base integer",
        "source": "packages/calculator-core/src/calculators/base-converter.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "base-converter",
      "methodVersion": "base-converter@1.0.0",
      "runAt": "2026-10-29T06:04:06.921Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          "0",
          10,
          2
        ],
        "units": {
          "value": "integer in fromBase",
          "fromBase": "radix",
          "toBase": "radix"
        },
        "display": "Value: 0 integer in fromBase; Source base: 10 radix; Target base: 2 radix"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "normalizedInput": "0",
            "fromBase": 10,
            "toBase": 2,
            "converted": "0",
            "decimal": "0",
            "binary": "0",
            "octal": "0",
            "hex": "0",
            "digitCount": 1
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Read 0 as base-10 positional notation",
              "expression": "(0×10^0) = 0₁₀"
            },
            {
              "label": "Write 0₁₀ in base 2",
              "expression": "0₁₀ = 0(base 2)"
            }
          ],
          "explanation": "0 in base 10 equals 0 in base 10, which is 0 in base 2 (a 1st-place value)."
        },
        "display": "Converted value: 0 target-base integer"
      },
      "expected": {
        "value": {
          "converted": "0"
        },
        "display": "Converted value: 0 target-base integer",
        "source": "packages/calculator-core/src/calculators/base-converter.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "base-converter",
      "methodVersion": "base-converter@1.0.0",
      "runAt": "2026-10-29T06:04:06.921Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          "1010",
          2,
          10
        ],
        "units": {
          "value": "integer in fromBase",
          "fromBase": "radix",
          "toBase": "radix"
        },
        "display": "Value: 1010 integer in fromBase; Source base: 2 radix; Target base: 10 radix"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "normalizedInput": "1010",
            "fromBase": 2,
            "toBase": 10,
            "converted": "10",
            "decimal": "10",
            "binary": "1010",
            "octal": "12",
            "hex": "A",
            "digitCount": 2
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Read 1010 as base-2 positional notation",
              "expression": "(1×2^3 + 0×2^2 + 1×2^1 + 0×2^0) = 10₁₀"
            },
            {
              "label": "Write 10₁₀ in base 10",
              "expression": "10₁₀ = 10(base 10)"
            }
          ],
          "explanation": "1010 in base 2 equals 10 in base 10, which is 10 in base 10 (a 2nd-place value)."
        },
        "display": "Converted value: 10 target-base integer"
      },
      "expected": {
        "value": {
          "converted": "10"
        },
        "display": "Converted value: 10 target-base integer",
        "source": "packages/calculator-core/src/calculators/base-converter.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "roman-numeral": [
    {
      "calculatorId": "roman-numeral",
      "methodVersion": "roman-numeral@1.0.0",
      "runAt": "2026-10-29T06:04:06.921Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          "1994"
        ],
        "units": {
          "value": "decimal integer or Roman numeral"
        },
        "display": "Value: 1994 decimal integer or Roman numeral"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "mode": "to-roman",
            "normalizedInput": "1994",
            "roman": "MCMXCIV",
            "number": 1994,
            "parts": [
              {
                "symbol": "M",
                "value": 1000
              },
              {
                "symbol": "CM",
                "value": 900
              },
              {
                "symbol": "XC",
                "value": 90
              },
              {
                "symbol": "IV",
                "value": 4
              }
            ]
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Break 1994 into standard Roman pieces, largest first",
              "expression": "1994 = M=1000 + CM=900 + XC=90 + IV=4"
            },
            {
              "label": "Join the symbols in order",
              "expression": "1994 = MCMXCIV"
            }
          ],
          "explanation": "1994 is written MCMXCIV in standard Roman numerals (M=1000 + CM=900 + XC=90 + IV=4)."
        },
        "display": "Roman numeral: MCMXCIV Roman numeral"
      },
      "expected": {
        "value": {
          "roman": "MCMXCIV"
        },
        "display": "Roman numeral: MCMXCIV Roman numeral",
        "source": "packages/calculator-core/tests/roman-numeral.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "roman-numeral",
      "methodVersion": "roman-numeral@1.0.0",
      "runAt": "2026-10-29T06:04:06.921Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          "3999"
        ],
        "units": {
          "value": "decimal integer or Roman numeral"
        },
        "display": "Value: 3999 decimal integer or Roman numeral"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "mode": "to-roman",
            "normalizedInput": "3999",
            "roman": "MMMCMXCIX",
            "number": 3999,
            "parts": [
              {
                "symbol": "M",
                "value": 1000
              },
              {
                "symbol": "M",
                "value": 1000
              },
              {
                "symbol": "M",
                "value": 1000
              },
              {
                "symbol": "CM",
                "value": 900
              },
              {
                "symbol": "XC",
                "value": 90
              },
              {
                "symbol": "IX",
                "value": 9
              }
            ]
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Break 3999 into standard Roman pieces, largest first",
              "expression": "3999 = M=1000 + M=1000 + M=1000 + CM=900 + XC=90 + IX=9"
            },
            {
              "label": "Join the symbols in order",
              "expression": "3999 = MMMCMXCIX"
            }
          ],
          "explanation": "3999 is written MMMCMXCIX in standard Roman numerals (M=1000 + M=1000 + M=1000 + CM=900 + XC=90 + IX=9)."
        },
        "display": "Roman numeral: MMMCMXCIX Roman numeral"
      },
      "expected": {
        "value": {
          "roman": "MMMCMXCIX"
        },
        "display": "Roman numeral: MMMCMXCIX Roman numeral",
        "source": "packages/calculator-core/tests/roman-numeral.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "roman-numeral",
      "methodVersion": "roman-numeral@1.0.0",
      "runAt": "2026-10-29T06:04:06.921Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          "XIV"
        ],
        "units": {
          "value": "decimal integer or Roman numeral"
        },
        "display": "Value: XIV decimal integer or Roman numeral"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "mode": "to-number",
            "normalizedInput": "XIV",
            "roman": "XIV",
            "number": 14,
            "parts": [
              {
                "symbol": "X",
                "value": 10
              },
              {
                "symbol": "IV",
                "value": 4
              }
            ]
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Add each symbol in XIV, subtracting a smaller symbol before a larger one",
              "expression": "XIV = X=10 + IV=4"
            },
            {
              "label": "Sum the pieces",
              "expression": "XIV = 14"
            }
          ],
          "explanation": "XIV is 14 (X=10 + IV=4)."
        },
        "display": "Number: 14 integer"
      },
      "expected": {
        "value": {
          "number": 14
        },
        "display": "Number: 14 integer",
        "source": "packages/calculator-core/tests/roman-numeral.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "scientific-notation": [
    {
      "calculatorId": "scientific-notation",
      "methodVersion": "scientific-notation@1.0.0",
      "runAt": "2026-10-29T06:04:06.921Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "value": "123456"
          }
        ],
        "units": {
          "value": "dimensionless exact decimal",
          "significantFigures": "digits"
        },
        "display": "Value: 123456 dimensionless exact decimal"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "scientific": "1.23456 × 10^5",
            "eNotation": "1.23456E5",
            "engineering": "123.456 × 10^3",
            "decimal": "123456",
            "coefficient": "1.23456",
            "exponent": 5,
            "engineeringCoefficient": "123.456",
            "engineeringExponent": 3,
            "significantFigures": null,
            "rounded": false
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Normalize the coefficient and apply optional significant-figure rounding",
              "expression": "123456 = 1.23456 × 10^5",
              "value": 5
            },
            {
              "label": "Write the same power of ten with E",
              "expression": "1.23456 × 10^5 = 1.23456E5",
              "value": 5
            },
            {
              "label": "Choose an engineering exponent divisible by three",
              "expression": "1.23456 × 10^5 = 123.456 × 10^3",
              "value": 3
            },
            {
              "label": "Shift the decimal point without floating-point multiplication",
              "expression": "1.23456 × 10^5 = 123456"
            }
          ],
          "explanation": "The coefficient has magnitude at least 1 and less than 10. The conversion preserves the exact input value. The engineering exponent is a multiple of three."
        },
        "display": "Scientific notation: 1.23456 × 10^5 scientific notation"
      },
      "expected": {
        "value": {
          "scientific": "1.23456 × 10^5"
        },
        "display": "Scientific notation: 1.23456 × 10^5 scientific notation",
        "source": "packages/calculator-core/tests/scientific-notation.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "scientific-notation",
      "methodVersion": "scientific-notation@1.0.0",
      "runAt": "2026-10-29T06:04:06.921Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "value": "0"
          }
        ],
        "units": {
          "value": "dimensionless exact decimal",
          "significantFigures": "digits"
        },
        "display": "Value: 0 dimensionless exact decimal"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "scientific": "0 × 10^0",
            "eNotation": "0E0",
            "engineering": "0 × 10^0",
            "decimal": "0",
            "coefficient": "0",
            "exponent": 0,
            "engineeringCoefficient": "0",
            "engineeringExponent": 0,
            "significantFigures": null,
            "rounded": false
          },
          "errors": [],
          "warnings": [
            {
              "code": "zero_convention",
              "severity": "info",
              "message": "Zero has no normalized nonzero coefficient. It is shown as 0 × 10^0 (0E0); negative zero and requested significant figures do not change this convention."
            }
          ],
          "steps": [
            {
              "label": "Use the zero convention",
              "expression": "0 = 0 × 10^0",
              "value": 0
            },
            {
              "label": "Write the same power of ten with E",
              "expression": "0 × 10^0 = 0E0",
              "value": 0
            },
            {
              "label": "Choose an engineering exponent divisible by three",
              "expression": "0 × 10^0 = 0 × 10^0",
              "value": 0
            },
            {
              "label": "Shift the decimal point without floating-point multiplication",
              "expression": "0 × 10^0 = 0"
            }
          ],
          "explanation": "Zero is displayed as 0 × 10^0 by convention."
        },
        "display": "Scientific notation: 0 × 10^0 scientific notation"
      },
      "expected": {
        "value": {
          "scientific": "0 × 10^0"
        },
        "display": "Scientific notation: 0 × 10^0 scientific notation",
        "source": "packages/calculator-core/tests/scientific-notation.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "scientific-notation",
      "methodVersion": "scientific-notation@1.0.0",
      "runAt": "2026-10-29T06:04:06.921Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "value": "999.9",
            "significantFigures": 2
          }
        ],
        "units": {
          "value": "dimensionless exact decimal",
          "significantFigures": "digits"
        },
        "display": "Value: 999.9 dimensionless exact decimal; Significant figures: 2 digits"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "scientific": "1.0 × 10^3",
            "eNotation": "1.0E3",
            "engineering": "1.0 × 10^3",
            "decimal": "1000",
            "coefficient": "1.0",
            "exponent": 3,
            "engineeringCoefficient": "1.0",
            "engineeringExponent": 3,
            "significantFigures": 2,
            "rounded": true
          },
          "errors": [],
          "warnings": [
            {
              "code": "rounded",
              "severity": "info",
              "message": "All displayed forms use the value rounded to 2 significant figures, with ties away from zero."
            }
          ],
          "steps": [
            {
              "label": "Normalize the coefficient and apply optional significant-figure rounding",
              "expression": "999.9 ≈ 1.0 × 10^3",
              "value": 3
            },
            {
              "label": "Write the same power of ten with E",
              "expression": "1.0 × 10^3 = 1.0E3",
              "value": 3
            },
            {
              "label": "Choose an engineering exponent divisible by three",
              "expression": "1.0 × 10^3 = 1.0 × 10^3",
              "value": 3
            },
            {
              "label": "Shift the decimal point without floating-point multiplication",
              "expression": "1.0 × 10^3 = 1000"
            }
          ],
          "explanation": "The coefficient has magnitude at least 1 and less than 10. The value was rounded to 2 significant figures (ties away from zero). The engineering exponent is a multiple of three."
        },
        "display": "Scientific notation: 1.0 × 10^3 scientific notation"
      },
      "expected": {
        "value": {
          "scientific": "1.0 × 10^3"
        },
        "display": "Scientific notation: 1.0 × 10^3 scientific notation",
        "source": "packages/calculator-core/tests/scientific-notation.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "series-resistors": [
    {
      "calculatorId": "series-resistors",
      "methodVersion": "series-resistors@1.0.0",
      "runAt": "2026-10-29T06:04:06.921Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "r1Ohms": 100,
            "r2Ohms": 200
          }
        ],
        "units": {
          "r1Ohms": "Ω",
          "r2Ohms": "Ω"
        },
        "display": "Resistance 1: 100 Ω; Resistance 2: 200 Ω"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "resistanceOhms": 300
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Series resistance",
              "expression": "100 Ω + 200 Ω = 300 Ω",
              "value": 300,
              "unit": "Ω"
            }
          ],
          "explanation": "The total series resistance is 300 ohms."
        },
        "display": "Resistance: 300 Ω"
      },
      "expected": {
        "value": {
          "resistanceOhms": 300
        },
        "display": "Resistance: 300 Ω",
        "source": "packages/calculator-core/tests/series-resistors.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "series-resistors",
      "methodVersion": "series-resistors@1.0.0",
      "runAt": "2026-10-29T06:04:06.921Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "r1Ohms": 0.001,
            "r2Ohms": 0.002
          }
        ],
        "units": {
          "r1Ohms": "Ω",
          "r2Ohms": "Ω"
        },
        "display": "Resistance 1: 0.001 Ω; Resistance 2: 0.002 Ω"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "resistanceOhms": 0.003
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Series resistance",
              "expression": "0.001 Ω + 0.002 Ω = 0.003 Ω",
              "value": 0.003,
              "unit": "Ω"
            }
          ],
          "explanation": "The total series resistance is 0.003 ohms."
        },
        "display": "Resistance: 0.003 Ω"
      },
      "expected": {
        "value": {
          "resistanceOhms": 0.003
        },
        "display": "Resistance: 0.003 Ω",
        "source": "packages/calculator-core/tests/series-resistors.test.ts"
      },
      "tolerance": 1e-12,
      "pass": true
    },
    {
      "calculatorId": "series-resistors",
      "methodVersion": "series-resistors@1.0.0",
      "runAt": "2026-10-29T06:04:06.921Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "r1Ohms": 100,
            "r2Ohms": 400
          }
        ],
        "units": {
          "r1Ohms": "Ω",
          "r2Ohms": "Ω"
        },
        "display": "Resistance 1: 100 Ω; Resistance 2: 400 Ω"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "resistanceOhms": 500
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Series resistance",
              "expression": "100 Ω + 400 Ω = 500 Ω",
              "value": 500,
              "unit": "Ω"
            }
          ],
          "explanation": "The total series resistance is 500 ohms."
        },
        "display": "Resistance: 500 Ω"
      },
      "expected": {
        "value": {
          "resistanceOhms": 500
        },
        "display": "Resistance: 500 Ω",
        "source": "Hand arithmetic: Series resistances add: 100 + 400 = 500 Ω."
      },
      "tolerance": 0,
      "pass": true
    }
  ],
  "cutting-speed": [
    {
      "calculatorId": "cutting-speed",
      "methodVersion": "cutting-speed@1.0.0",
      "runAt": "2026-10-29T06:04:06.921Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "diameterMm": 10,
            "spindleRpm": 1000
          }
        ],
        "units": {
          "diameterMm": "mm",
          "spindleRpm": "rpm"
        },
        "display": "Diameter: 10 mm; Spindle speed: 1000 rpm"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "surfaceSpeedMPerMin": 31.41592653589793
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Surface speed",
              "expression": "π × 10 mm × 1,000 rpm ÷ 1000 = 31.415927 m/min",
              "value": 31.41592653589793,
              "unit": "m/min"
            }
          ],
          "explanation": "The surface speed is 31.415927 meters per minute."
        },
        "display": "Surface speed: 31.41592653589793 m/min"
      },
      "expected": {
        "value": {
          "surfaceSpeedMPerMin": 31.415926536
        },
        "display": "Surface speed: 31.415926536 m/min",
        "source": "packages/calculator-core/tests/cutting-speed.test.ts"
      },
      "tolerance": 5e-7,
      "pass": true
    },
    {
      "calculatorId": "cutting-speed",
      "methodVersion": "cutting-speed@1.0.0",
      "runAt": "2026-10-29T06:04:06.921Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "diameterMm": 0.001,
            "spindleRpm": 0.001
          }
        ],
        "units": {
          "diameterMm": "mm",
          "spindleRpm": "rpm"
        },
        "display": "Diameter: 0.001 mm; Spindle speed: 0.001 rpm"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "surfaceSpeedMPerMin": 3.141592653589793e-9
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Surface speed",
              "expression": "π × 0.001 mm × 0.001 rpm ÷ 1000 = 3.141593e-9 m/min",
              "value": 3.141592653589793e-9,
              "unit": "m/min"
            }
          ],
          "explanation": "The surface speed is 3.141593e-9 meters per minute."
        },
        "display": "Surface speed: 3.141592653589793e-9 m/min"
      },
      "expected": {
        "value": {
          "surfaceSpeedMPerMin": 3.141592653589793e-9
        },
        "display": "Surface speed: 3.141592653589793e-9 m/min",
        "source": "packages/calculator-core/tests/cutting-speed.test.ts"
      },
      "tolerance": 5e-16,
      "pass": true
    },
    {
      "calculatorId": "cutting-speed",
      "methodVersion": "cutting-speed@1.0.0",
      "runAt": "2026-10-29T06:04:06.921Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "diameterMm": 50,
            "spindleRpm": 2000
          }
        ],
        "units": {
          "diameterMm": "mm",
          "spindleRpm": "rpm"
        },
        "display": "Diameter: 50 mm; Spindle speed: 2000 rpm"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "surfaceSpeedMPerMin": 314.1592653589793
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Surface speed",
              "expression": "π × 50 mm × 2,000 rpm ÷ 1000 = 314.159265 m/min",
              "value": 314.1592653589793,
              "unit": "m/min"
            }
          ],
          "explanation": "The surface speed is 314.159265 meters per minute."
        },
        "display": "Surface speed: 314.1592653589793 m/min"
      },
      "expected": {
        "value": {
          "surfaceSpeedMPerMin": 314.159265
        },
        "display": "Surface speed: 314.159265 m/min",
        "source": "packages/calculator-core/tests/cutting-speed.test.ts"
      },
      "tolerance": 5e-7,
      "pass": true
    }
  ],
  "area-converter": [
    {
      "calculatorId": "area-converter",
      "methodVersion": "area-linear@1.0.1",
      "runAt": "2026-10-29T06:04:06.921Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "value": 1,
            "from": "acre",
            "to": "m2"
          }
        ],
        "units": {
          "value": "from unit",
          "from": "source unit",
          "to": "target unit"
        },
        "display": "Value: 1 acre; From unit: acre; To unit: m²"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "value": 4046.8564224,
            "squareMeters": 4046.8564224,
            "from": "acre",
            "to": "m2"
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Normalize to base unit",
              "expression": "1 acre → square meters",
              "value": 4046.8564224,
              "unit": "m²"
            },
            {
              "label": "Convert to target unit",
              "expression": "4,046.856422 m² → m2",
              "value": 4046.8564224,
              "unit": "m2"
            }
          ],
          "explanation": "1 acre equals 4,046.856422 m2."
        },
        "display": "Value: 4046.8564224 m²"
      },
      "expected": {
        "value": {
          "value": 4046.8564224
        },
        "display": "Value: 4046.8564224 m²",
        "source": "packages/calculator-core/tests/area-converter.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "area-converter",
      "methodVersion": "area-linear@1.0.1",
      "runAt": "2026-10-29T06:04:06.921Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "value": 0,
            "from": "acre",
            "to": "m2"
          }
        ],
        "units": {
          "value": "from unit",
          "from": "source unit",
          "to": "target unit"
        },
        "display": "Value: 0 acre; From unit: acre; To unit: m²"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "value": 0,
            "squareMeters": 0,
            "from": "acre",
            "to": "m2"
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Normalize to base unit",
              "expression": "0 acre → square meters",
              "value": 0,
              "unit": "m²"
            },
            {
              "label": "Convert to target unit",
              "expression": "0 m² → m2",
              "value": 0,
              "unit": "m2"
            }
          ],
          "explanation": "0 acre equals 0 m2."
        },
        "display": "Value: 0 m²"
      },
      "expected": {
        "value": {
          "value": 0
        },
        "display": "Value: 0 m²",
        "source": "Hand arithmetic: 0 acre × the finite conversion factor = 0 m2."
      },
      "tolerance": 0,
      "pass": true
    },
    {
      "calculatorId": "area-converter",
      "methodVersion": "area-linear@1.0.1",
      "runAt": "2026-10-29T06:04:06.922Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "value": 1,
            "from": "hectare",
            "to": "m2"
          }
        ],
        "units": {
          "value": "from unit",
          "from": "source unit",
          "to": "target unit"
        },
        "display": "Value: 1 hectare; From unit: hectare; To unit: m²"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "value": 10000,
            "squareMeters": 10000,
            "from": "hectare",
            "to": "m2"
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Normalize to base unit",
              "expression": "1 hectare → square meters",
              "value": 10000,
              "unit": "m²"
            },
            {
              "label": "Convert to target unit",
              "expression": "10,000 m² → m2",
              "value": 10000,
              "unit": "m2"
            }
          ],
          "explanation": "1 hectare equals 10,000 m2."
        },
        "display": "Value: 10000 m²"
      },
      "expected": {
        "value": {
          "value": 10000
        },
        "display": "Value: 10000 m²",
        "source": "packages/calculator-core/tests/area-converter.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "parallel-resistors": [
    {
      "calculatorId": "parallel-resistors",
      "methodVersion": "parallel-resistors@1.0.0",
      "runAt": "2026-10-29T06:04:06.922Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "r1Ohms": 1000,
            "r2Ohms": 1000
          }
        ],
        "units": {
          "r1Ohms": "Ω",
          "r2Ohms": "Ω"
        },
        "display": "Resistance 1: 1000 Ω; Resistance 2: 1000 Ω"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "resistanceOhms": 500
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Equivalent resistance",
              "expression": "1 ÷ (1 ÷ 1,000 Ω + 1 ÷ 1,000 Ω) = 500 Ω",
              "value": 500,
              "unit": "Ω"
            }
          ],
          "explanation": "The equivalent resistance is 500 ohms."
        },
        "display": "Resistance: 500 Ω"
      },
      "expected": {
        "value": {
          "resistanceOhms": 500
        },
        "display": "Resistance: 500 Ω",
        "source": "packages/calculator-core/tests/parallel-resistors.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "parallel-resistors",
      "methodVersion": "parallel-resistors@1.0.0",
      "runAt": "2026-10-29T06:04:06.922Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "r1Ohms": 0.001,
            "r2Ohms": 0.001
          }
        ],
        "units": {
          "r1Ohms": "Ω",
          "r2Ohms": "Ω"
        },
        "display": "Resistance 1: 0.001 Ω; Resistance 2: 0.001 Ω"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "resistanceOhms": 0.0005
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Equivalent resistance",
              "expression": "1 ÷ (1 ÷ 0.001 Ω + 1 ÷ 0.001 Ω) = 0.0005 Ω",
              "value": 0.0005,
              "unit": "Ω"
            }
          ],
          "explanation": "The equivalent resistance is 0.0005 ohms."
        },
        "display": "Resistance: 0.0005 Ω"
      },
      "expected": {
        "value": {
          "resistanceOhms": 0.0005
        },
        "display": "Resistance: 0.0005 Ω",
        "source": "packages/calculator-core/tests/parallel-resistors.test.ts"
      },
      "tolerance": 1e-12,
      "pass": true
    },
    {
      "calculatorId": "parallel-resistors",
      "methodVersion": "parallel-resistors@1.0.0",
      "runAt": "2026-10-29T06:04:06.922Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "r1Ohms": 100,
            "r2Ohms": 300
          }
        ],
        "units": {
          "r1Ohms": "Ω",
          "r2Ohms": "Ω"
        },
        "display": "Resistance 1: 100 Ω; Resistance 2: 300 Ω"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "resistanceOhms": 75
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Equivalent resistance",
              "expression": "1 ÷ (1 ÷ 100 Ω + 1 ÷ 300 Ω) = 75 Ω",
              "value": 75,
              "unit": "Ω"
            }
          ],
          "explanation": "The equivalent resistance is 75 ohms."
        },
        "display": "Resistance: 75 Ω"
      },
      "expected": {
        "value": {
          "resistanceOhms": 75
        },
        "display": "Resistance: 75 Ω",
        "source": "packages/calculator-core/tests/parallel-resistors.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "battery-runtime": [
    {
      "calculatorId": "battery-runtime",
      "methodVersion": "battery-runtime-energy@1.0.0",
      "runAt": "2026-10-29T06:04:06.922Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "capacityAh": 100,
            "voltageV": 12,
            "loadW": 100,
            "efficiencyPercent": 85
          }
        ],
        "units": {
          "capacityAh": "Ah",
          "voltageV": "V",
          "loadW": "W",
          "efficiencyPercent": "%",
          "dischargeDepthPercent": "%"
        },
        "display": "Capacity: 100 Ah; Voltage: 12 V; Load: 100 W; Efficiency: 85 %"
      },
      "output": {
        "returned": {
          "ok": true,
          "errors": [],
          "output": {
            "runtimeHours": 10.2,
            "nominalEnergyWh": 1200,
            "usableEnergyWh": 1020,
            "dischargeDepthPercent": 100,
            "efficiencyPercent": 85,
            "loadW": 100
          },
          "warnings": [
            {
              "code": "BASIC_MODEL_ONLY",
              "severity": "info",
              "message": "Basic energy model: holds voltage and load constant and does not model chemistry, discharge rate, temperature or age."
            },
            {
              "code": "FULL_DISCHARGE_ASSUMED",
              "severity": "warning",
              "message": "Assumes the full nominal capacity is usable (100% depth of discharge). Set the usable fraction for your calculation; this default is not a discharge recommendation."
            }
          ],
          "steps": [
            {
              "label": "Nominal energy",
              "expression": "100 Ah × 12 V",
              "value": 1200,
              "unit": "Wh"
            },
            {
              "label": "Usable energy",
              "expression": "1,200 Wh × 100% DoD × 85%",
              "value": 1020,
              "unit": "Wh"
            },
            {
              "label": "Runtime",
              "expression": "1,020 Wh ÷ 100 W",
              "value": 10.2,
              "unit": "h"
            }
          ],
          "explanation": "The basic model estimates 10.2 hours of runtime."
        },
        "display": "Runtime: 10.2 h"
      },
      "expected": {
        "value": {
          "runtimeHours": 10.2
        },
        "display": "Runtime: 10.2 h",
        "source": "packages/calculator-core/tests/battery-runtime.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "battery-runtime",
      "methodVersion": "battery-runtime-energy@1.0.0",
      "runAt": "2026-10-29T06:04:06.922Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "capacityAh": 120,
            "voltageV": 12,
            "loadW": 96,
            "dischargeDepthPercent": 100,
            "efficiencyPercent": 100
          }
        ],
        "units": {
          "capacityAh": "Ah",
          "voltageV": "V",
          "loadW": "W",
          "efficiencyPercent": "%",
          "dischargeDepthPercent": "%"
        },
        "display": "Capacity: 120 Ah; Voltage: 12 V; Load: 96 W; Usable capacity: 100 %; Efficiency: 100 %"
      },
      "output": {
        "returned": {
          "ok": true,
          "errors": [],
          "output": {
            "runtimeHours": 15,
            "nominalEnergyWh": 1440,
            "usableEnergyWh": 1440,
            "dischargeDepthPercent": 100,
            "efficiencyPercent": 100,
            "loadW": 96
          },
          "warnings": [
            {
              "code": "BASIC_MODEL_ONLY",
              "severity": "info",
              "message": "Basic energy model: holds voltage and load constant and does not model chemistry, discharge rate, temperature or age."
            }
          ],
          "steps": [
            {
              "label": "Nominal energy",
              "expression": "120 Ah × 12 V",
              "value": 1440,
              "unit": "Wh"
            },
            {
              "label": "Usable energy",
              "expression": "1,440 Wh × 100% DoD × 100%",
              "value": 1440,
              "unit": "Wh"
            },
            {
              "label": "Runtime",
              "expression": "1,440 Wh ÷ 96 W",
              "value": 15,
              "unit": "h"
            }
          ],
          "explanation": "The basic model estimates 15 hours of runtime."
        },
        "display": "Runtime: 15 h"
      },
      "expected": {
        "value": {
          "runtimeHours": 15
        },
        "display": "Runtime: 15 h",
        "source": "packages/calculator-core/tests/battery-runtime.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "battery-runtime",
      "methodVersion": "battery-runtime-energy@1.0.0",
      "runAt": "2026-10-29T06:04:06.922Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "capacityAh": 100,
            "voltageV": 12,
            "loadW": 100,
            "efficiencyPercent": 85,
            "dischargeDepthPercent": 50
          }
        ],
        "units": {
          "capacityAh": "Ah",
          "voltageV": "V",
          "loadW": "W",
          "efficiencyPercent": "%",
          "dischargeDepthPercent": "%"
        },
        "display": "Capacity: 100 Ah; Voltage: 12 V; Load: 100 W; Efficiency: 85 %; Usable capacity: 50 %"
      },
      "output": {
        "returned": {
          "ok": true,
          "errors": [],
          "output": {
            "runtimeHours": 5.1,
            "nominalEnergyWh": 1200,
            "usableEnergyWh": 510,
            "dischargeDepthPercent": 50,
            "efficiencyPercent": 85,
            "loadW": 100
          },
          "warnings": [
            {
              "code": "BASIC_MODEL_ONLY",
              "severity": "info",
              "message": "Basic energy model: holds voltage and load constant and does not model chemistry, discharge rate, temperature or age."
            }
          ],
          "steps": [
            {
              "label": "Nominal energy",
              "expression": "100 Ah × 12 V",
              "value": 1200,
              "unit": "Wh"
            },
            {
              "label": "Usable energy",
              "expression": "1,200 Wh × 50% DoD × 85%",
              "value": 510,
              "unit": "Wh"
            },
            {
              "label": "Runtime",
              "expression": "510 Wh ÷ 100 W",
              "value": 5.1,
              "unit": "h"
            }
          ],
          "explanation": "The basic model estimates 5.1 hours of runtime."
        },
        "display": "Runtime: 5.1 h"
      },
      "expected": {
        "value": {
          "runtimeHours": 5.1
        },
        "display": "Runtime: 5.1 h",
        "source": "packages/calculator-core/tests/battery-runtime.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "ohms-law": [
    {
      "calculatorId": "ohms-law",
      "methodVersion": "ohms-law@1.0.0",
      "runAt": "2026-10-29T06:04:06.922Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "voltageV": 12,
            "currentA": 2
          }
        ],
        "units": {
          "voltageV": "V",
          "currentA": "A"
        },
        "display": "Voltage: 12 V; Current: 2 A"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "resistanceOhms": 6,
            "powerW": 24
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Resistance",
              "expression": "12 V ÷ 2 A = 6 Ω",
              "value": 6,
              "unit": "Ω"
            },
            {
              "label": "Power",
              "expression": "12 V × 2 A = 24 W",
              "value": 24,
              "unit": "W"
            }
          ],
          "explanation": "The circuit resistance is 6 ohms and its power is 24 watts."
        },
        "display": "Resistance: 6 Ω; Power: 24 W"
      },
      "expected": {
        "value": {
          "resistanceOhms": 6,
          "powerW": 24
        },
        "display": "Resistance: 6 Ω; Power: 24 W",
        "source": "packages/calculator-core/tests/ohms-law.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "ohms-law",
      "methodVersion": "ohms-law@1.0.0",
      "runAt": "2026-10-29T06:04:06.922Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "voltageV": 0.001,
            "currentA": 0.0005
          }
        ],
        "units": {
          "voltageV": "V",
          "currentA": "A"
        },
        "display": "Voltage: 0.001 V; Current: 0.0005 A"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "resistanceOhms": 2,
            "powerW": 5e-7
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Resistance",
              "expression": "0.001 V ÷ 0.0005 A = 2 Ω",
              "value": 2,
              "unit": "Ω"
            },
            {
              "label": "Power",
              "expression": "0.001 V × 0.0005 A = 5.000000e-7 W",
              "value": 5e-7,
              "unit": "W"
            }
          ],
          "explanation": "The circuit resistance is 2 ohms and its power is 5.000000e-7 watts."
        },
        "display": "Resistance: 2 Ω"
      },
      "expected": {
        "value": {
          "resistanceOhms": 2
        },
        "display": "Resistance: 2 Ω",
        "source": "packages/calculator-core/tests/ohms-law.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "ohms-law",
      "methodVersion": "ohms-law@1.0.0",
      "runAt": "2026-10-29T06:04:06.922Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "voltageV": 5,
            "currentA": 1
          }
        ],
        "units": {
          "voltageV": "V",
          "currentA": "A"
        },
        "display": "Voltage: 5 V; Current: 1 A"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "resistanceOhms": 5,
            "powerW": 5
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Resistance",
              "expression": "5 V ÷ 1 A = 5 Ω",
              "value": 5,
              "unit": "Ω"
            },
            {
              "label": "Power",
              "expression": "5 V × 1 A = 5 W",
              "value": 5,
              "unit": "W"
            }
          ],
          "explanation": "The circuit resistance is 5 ohms and its power is 5 watts."
        },
        "display": "Resistance: 5 Ω; Power: 5 W"
      },
      "expected": {
        "value": {
          "resistanceOhms": 5,
          "powerW": 5
        },
        "display": "Resistance: 5 Ω; Power: 5 W",
        "source": "packages/calculator-core/tests/ohms-law.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "percentage-change": [
    {
      "calculatorId": "percentage-change",
      "methodVersion": "percentage-change@1.0.0",
      "runAt": "2026-10-29T06:04:06.923Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "oldValue": 100,
            "newValue": 125
          }
        ],
        "units": {
          "oldValue": "same units",
          "newValue": "same units"
        },
        "display": "Original value: 100 same units; New value: 125 same units"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "change": 25,
            "percentChange": 25
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Absolute change",
              "expression": "125 − 100 = 25",
              "value": 25
            },
            {
              "label": "Percentage change",
              "expression": "(25 ÷ |100|) × 100 = 25%",
              "value": 25,
              "unit": "%"
            }
          ],
          "explanation": "The value changed by 25, or 25 percent of the original magnitude."
        },
        "display": "Percentage change: 25 %"
      },
      "expected": {
        "value": {
          "percentChange": 25
        },
        "display": "Percentage change: 25 %",
        "source": "packages/calculator-core/tests/percentage-change.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "percentage-change",
      "methodVersion": "percentage-change@1.0.0",
      "runAt": "2026-10-29T06:04:06.923Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "oldValue": 20,
            "newValue": 0
          }
        ],
        "units": {
          "oldValue": "same units",
          "newValue": "same units"
        },
        "display": "Original value: 20 same units; New value: 0 same units"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "change": -20,
            "percentChange": -100
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Absolute change",
              "expression": "0 − 20 = -20",
              "value": -20
            },
            {
              "label": "Percentage change",
              "expression": "(-20 ÷ |20|) × 100 = -100%",
              "value": -100,
              "unit": "%"
            }
          ],
          "explanation": "The value changed by -20, or -100 percent of the original magnitude."
        },
        "display": "Percentage change: -100 %"
      },
      "expected": {
        "value": {
          "percentChange": -100
        },
        "display": "Percentage change: -100 %",
        "source": "packages/calculator-core/tests/percentage-change.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "percentage-change",
      "methodVersion": "percentage-change@1.0.0",
      "runAt": "2026-10-29T06:04:06.923Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "oldValue": 80,
            "newValue": 60
          }
        ],
        "units": {
          "oldValue": "same units",
          "newValue": "same units"
        },
        "display": "Original value: 80 same units; New value: 60 same units"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "change": -20,
            "percentChange": -25
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Absolute change",
              "expression": "60 − 80 = -20",
              "value": -20
            },
            {
              "label": "Percentage change",
              "expression": "(-20 ÷ |80|) × 100 = -25%",
              "value": -25,
              "unit": "%"
            }
          ],
          "explanation": "The value changed by -20, or -25 percent of the original magnitude."
        },
        "display": "Percentage change: -25 %"
      },
      "expected": {
        "value": {
          "percentChange": -25
        },
        "display": "Percentage change: -25 %",
        "source": "packages/calculator-core/tests/percentage-change.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "percentage-change",
      "methodVersion": "percentage-change@1.0.0",
      "runAt": "2026-10-29T06:04:06.923Z",
      "buildRevision": "24533ff",
      "kind": "signed",
      "inputs": {
        "arguments": [
          {
            "oldValue": -100,
            "newValue": -50
          }
        ],
        "units": {
          "oldValue": "same units",
          "newValue": "same units"
        },
        "display": "Original value: -100 same units; New value: -50 same units"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "change": 50,
            "percentChange": 50
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Absolute change",
              "expression": "-50 − -100 = 50",
              "value": 50
            },
            {
              "label": "Percentage change",
              "expression": "(50 ÷ |-100|) × 100 = 50%",
              "value": 50,
              "unit": "%"
            }
          ],
          "explanation": "The value changed by 50, or 50 percent of the original magnitude."
        },
        "display": "Percentage change: 50 %"
      },
      "expected": {
        "value": {
          "percentChange": 50
        },
        "display": "Percentage change: 50 %",
        "source": "Hand arithmetic: Sumivo convention: (−50 − (−100)) ÷ |−100| × 100 = 50%."
      },
      "tolerance": 0,
      "pass": true
    }
  ],
  "voltage-divider": [
    {
      "calculatorId": "voltage-divider",
      "methodVersion": "voltage-divider@1.0.0",
      "runAt": "2026-10-29T06:04:06.923Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "vinV": 12,
            "r1Ohms": 1000,
            "r2Ohms": 2000
          }
        ],
        "units": {
          "vinV": "V",
          "r1Ohms": "Ω",
          "r2Ohms": "Ω"
        },
        "display": "Input voltage: 12 V; Resistance 1: 1000 Ω; Resistance 2: 2000 Ω"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "voutV": 8,
            "currentA": 0.004
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Output voltage",
              "expression": "12 V × 2,000 Ω ÷ (1,000 Ω + 2,000 Ω) = 8 V",
              "value": 8,
              "unit": "V"
            },
            {
              "label": "Current",
              "expression": "12 V ÷ (1,000 Ω + 2,000 Ω) = 0.004 A",
              "value": 0.004,
              "unit": "A"
            }
          ],
          "explanation": "The divider output is 8 volts and the series current is 0.004 amperes."
        },
        "display": "Output voltage: 8 V; Current: 0.004 A"
      },
      "expected": {
        "value": {
          "voutV": 8,
          "currentA": 0.004
        },
        "display": "Output voltage: 8 V; Current: 0.004 A",
        "source": "packages/calculator-core/tests/voltage-divider.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "voltage-divider",
      "methodVersion": "voltage-divider@1.0.0",
      "runAt": "2026-10-29T06:04:06.923Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "vinV": 0,
            "r1Ohms": 1000,
            "r2Ohms": 2000
          }
        ],
        "units": {
          "vinV": "V",
          "r1Ohms": "Ω",
          "r2Ohms": "Ω"
        },
        "display": "Input voltage: 0 V; Resistance 1: 1000 Ω; Resistance 2: 2000 Ω"
      },
      "output": {
        "returned": {
          "ok": false,
          "errors": [
            "Input voltage must be a positive finite number."
          ],
          "warnings": [],
          "steps": [],
          "explanation": ""
        },
        "display": "Rejected: Input voltage must be a positive finite number."
      },
      "expected": {
        "value": {
          "ok": false
        },
        "display": "Rejected",
        "source": "packages/calculator-core/tests/voltage-divider.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "voltage-divider",
      "methodVersion": "voltage-divider@1.0.0",
      "runAt": "2026-10-29T06:04:06.923Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "vinV": 12,
            "r1Ohms": 1000,
            "r2Ohms": 1000
          }
        ],
        "units": {
          "vinV": "V",
          "r1Ohms": "Ω",
          "r2Ohms": "Ω"
        },
        "display": "Input voltage: 12 V; Resistance 1: 1000 Ω; Resistance 2: 1000 Ω"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "voutV": 6,
            "currentA": 0.006
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Output voltage",
              "expression": "12 V × 1,000 Ω ÷ (1,000 Ω + 1,000 Ω) = 6 V",
              "value": 6,
              "unit": "V"
            },
            {
              "label": "Current",
              "expression": "12 V ÷ (1,000 Ω + 1,000 Ω) = 0.006 A",
              "value": 0.006,
              "unit": "A"
            }
          ],
          "explanation": "The divider output is 6 volts and the series current is 0.006 amperes."
        },
        "display": "Output voltage: 6 V; Current: 0.006 A"
      },
      "expected": {
        "value": {
          "voutV": 6,
          "currentA": 0.006
        },
        "display": "Output voltage: 6 V; Current: 0.006 A",
        "source": "Hand arithmetic: 12/2000 = 0.006 A; 0.006 × 1000 = 6 V."
      },
      "tolerance": 1e-12,
      "pass": true
    }
  ],
  "led-resistor": [
    {
      "calculatorId": "led-resistor",
      "methodVersion": "led-resistor@1.0.0",
      "runAt": "2026-10-29T06:04:06.923Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "supplyVoltageV": 5,
            "ledForwardVoltageV": 2,
            "ledCurrentMa": 20
          }
        ],
        "units": {
          "supplyVoltageV": "V",
          "ledForwardVoltageV": "V",
          "ledCurrentMa": "mA"
        },
        "display": "Supply voltage: 5 V; LED forward voltage: 2 V; LED current: 20 mA"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "currentA": 0.02,
            "resistanceOhms": 150,
            "resistorPowerW": 0.06
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Convert LED current",
              "expression": "20 mA ÷ 1000 = 0.02 A",
              "value": 0.02,
              "unit": "A"
            },
            {
              "label": "Series resistance",
              "expression": "(5 V − 2 V) ÷ 0.02 A = 150 Ω",
              "value": 150,
              "unit": "Ω"
            },
            {
              "label": "Resistor power",
              "expression": "(5 V − 2 V) × 0.02 A = 0.06 W",
              "value": 0.06,
              "unit": "W"
            }
          ],
          "explanation": "The required series resistance is 150 ohms and the resistor dissipates 0.06 watts."
        },
        "display": "Resistance: 150 Ω"
      },
      "expected": {
        "value": {
          "resistanceOhms": 150
        },
        "display": "Resistance: 150 Ω",
        "source": "packages/calculator-core/tests/led-resistor.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "led-resistor",
      "methodVersion": "led-resistor@1.0.0",
      "runAt": "2026-10-29T06:04:06.924Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "supplyVoltageV": 2.0001,
            "ledForwardVoltageV": 2,
            "ledCurrentMa": 1
          }
        ],
        "units": {
          "supplyVoltageV": "V",
          "ledForwardVoltageV": "V",
          "ledCurrentMa": "mA"
        },
        "display": "Supply voltage: 2.0001 V; LED forward voltage: 2 V; LED current: 1 mA"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "currentA": 0.001,
            "resistanceOhms": 0.10000000000021103,
            "resistorPowerW": 1.0000000000021104e-7
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Convert LED current",
              "expression": "1 mA ÷ 1000 = 0.001 A",
              "value": 0.001,
              "unit": "A"
            },
            {
              "label": "Series resistance",
              "expression": "(2.0001 V − 2 V) ÷ 0.001 A = 0.1 Ω",
              "value": 0.10000000000021103,
              "unit": "Ω"
            },
            {
              "label": "Resistor power",
              "expression": "(2.0001 V − 2 V) × 0.001 A = 1.000000e-7 W",
              "value": 1.0000000000021104e-7,
              "unit": "W"
            }
          ],
          "explanation": "The required series resistance is 0.1 ohms and the resistor dissipates 1.000000e-7 watts."
        },
        "display": "Resistance: 0.10000000000021103 Ω"
      },
      "expected": {
        "value": {
          "resistanceOhms": 0.1
        },
        "display": "Resistance: 0.1 Ω",
        "source": "packages/calculator-core/tests/led-resistor.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "led-resistor",
      "methodVersion": "led-resistor@1.0.0",
      "runAt": "2026-10-29T06:04:06.924Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "supplyVoltageV": 12,
            "ledForwardVoltageV": 3.2,
            "ledCurrentMa": 30
          }
        ],
        "units": {
          "supplyVoltageV": "V",
          "ledForwardVoltageV": "V",
          "ledCurrentMa": "mA"
        },
        "display": "Supply voltage: 12 V; LED forward voltage: 3.2 V; LED current: 30 mA"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "currentA": 0.03,
            "resistanceOhms": 293.33333333333337,
            "resistorPowerW": 0.264
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Convert LED current",
              "expression": "30 mA ÷ 1000 = 0.03 A",
              "value": 0.03,
              "unit": "A"
            },
            {
              "label": "Series resistance",
              "expression": "(12 V − 3.2 V) ÷ 0.03 A = 293.333333 Ω",
              "value": 293.33333333333337,
              "unit": "Ω"
            },
            {
              "label": "Resistor power",
              "expression": "(12 V − 3.2 V) × 0.03 A = 0.264 W",
              "value": 0.264,
              "unit": "W"
            }
          ],
          "explanation": "The required series resistance is 293.333333 ohms and the resistor dissipates 0.264 watts."
        },
        "display": "Resistance: 293.33333333333337 Ω"
      },
      "expected": {
        "value": {
          "resistanceOhms": 293.333
        },
        "display": "Resistance: 293.333 Ω",
        "source": "packages/calculator-core/tests/led-resistor.test.ts"
      },
      "tolerance": 0.0005,
      "pass": true
    }
  ],
  "capacitor-energy": [
    {
      "calculatorId": "capacitor-energy",
      "methodVersion": "capacitor-energy@1.0.1",
      "runAt": "2026-10-29T06:04:06.924Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "capacitanceF": 0.001,
            "voltageV": 10
          }
        ],
        "units": {
          "capacitanceF": "F",
          "voltageV": "V"
        },
        "display": "Capacitance: 0.001 F; Voltage: 10 V"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "energyJ": 0.05,
            "chargeC": 0.01
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Stored energy",
              "expression": "0.5 × 0.001 F × 10 V × 10 V = 0.05 J",
              "value": 0.05,
              "unit": "J"
            },
            {
              "label": "Charge",
              "expression": "0.001 F × 10 V = 0.01 C",
              "value": 0.01,
              "unit": "C"
            }
          ],
          "explanation": "The capacitor stores 0.05 joules of energy and 0.01 coulombs of charge."
        },
        "display": "Charge: 0.01 C; Stored energy: 0.05 J"
      },
      "expected": {
        "value": {
          "chargeC": 0.01,
          "energyJ": 0.05
        },
        "display": "Charge: 0.01 C; Stored energy: 0.05 J",
        "source": "packages/calculator-core/tests/capacitor-energy.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "capacitor-energy",
      "methodVersion": "capacitor-energy@1.0.1",
      "runAt": "2026-10-29T06:04:06.924Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "capacitanceF": 1e-12,
            "voltageV": 0.001
          }
        ],
        "units": {
          "capacitanceF": "F",
          "voltageV": "V"
        },
        "display": "Capacitance: 1e-12 F; Voltage: 0.001 V"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "energyJ": 5e-19,
            "chargeC": 1e-15
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Stored energy",
              "expression": "0.5 × 1.000000e-12 F × 0.001 V × 0.001 V = 5.000000e-19 J",
              "value": 5e-19,
              "unit": "J"
            },
            {
              "label": "Charge",
              "expression": "1.000000e-12 F × 0.001 V = 1.000000e-15 C",
              "value": 1e-15,
              "unit": "C"
            }
          ],
          "explanation": "The capacitor stores 5.000000e-19 joules of energy and 1.000000e-15 coulombs of charge."
        },
        "display": "Stored energy: 5e-19 J; Charge: 1e-15 C"
      },
      "expected": {
        "value": {
          "energyJ": 5e-19,
          "chargeC": 1e-15
        },
        "display": "Stored energy: 5e-19 J; Charge: 1e-15 C",
        "source": "packages/calculator-core/tests/capacitor-energy.test.ts"
      },
      "tolerance": 1e-24,
      "pass": true
    },
    {
      "calculatorId": "capacitor-energy",
      "methodVersion": "capacitor-energy@1.0.1",
      "runAt": "2026-10-29T06:04:06.924Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "capacitanceF": 0.000001,
            "voltageV": 5
          }
        ],
        "units": {
          "capacitanceF": "F",
          "voltageV": "V"
        },
        "display": "Capacitance: 0.000001 F; Voltage: 5 V"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "energyJ": 0.000012499999999999999,
            "chargeC": 0.0000049999999999999996
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Stored energy",
              "expression": "0.5 × 0.000001 F × 5 V × 5 V = 0.000012 J",
              "value": 0.000012499999999999999,
              "unit": "J"
            },
            {
              "label": "Charge",
              "expression": "0.000001 F × 5 V = 0.000005 C",
              "value": 0.0000049999999999999996,
              "unit": "C"
            }
          ],
          "explanation": "The capacitor stores 0.000012 joules of energy and 0.000005 coulombs of charge."
        },
        "display": "Stored energy: 0.000012499999999999999 J; Charge: 0.0000049999999999999996 C"
      },
      "expected": {
        "value": {
          "energyJ": 0.0000125,
          "chargeC": 0.000005
        },
        "display": "Stored energy: 0.0000125 J; Charge: 0.000005 C",
        "source": "packages/calculator-core/tests/capacitor-energy.test.ts"
      },
      "tolerance": 1e-14,
      "pass": true
    }
  ],
  "battery-capacity": [
    {
      "calculatorId": "battery-capacity",
      "methodVersion": "battery-capacity@1.0.0",
      "runAt": "2026-10-29T06:04:06.924Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "capacityAh": 100,
            "voltageV": 12
          }
        ],
        "units": {
          "capacityAh": "Ah",
          "voltageV": "V"
        },
        "display": "Capacity: 100 Ah; Voltage: 12 V"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "energyWh": 1200,
            "energyKwh": 1.2
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Energy",
              "expression": "100 Ah × 12 V = 1,200 Wh",
              "value": 1200,
              "unit": "Wh"
            },
            {
              "label": "Kilowatt-hours",
              "expression": "1,200 Wh ÷ 1000 = 1.2 kWh",
              "value": 1.2,
              "unit": "kWh"
            }
          ],
          "explanation": "The battery's nominal energy is 1,200 watt-hours, or 1.2 kilowatt-hours."
        },
        "display": "Energy: 1200 Wh; Energy: 1.2 kWh"
      },
      "expected": {
        "value": {
          "energyWh": 1200,
          "energyKwh": 1.2
        },
        "display": "Energy: 1200 Wh; Energy: 1.2 kWh",
        "source": "packages/calculator-core/tests/battery-capacity.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "battery-capacity",
      "methodVersion": "battery-capacity@1.0.0",
      "runAt": "2026-10-29T06:04:06.925Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "capacityAh": 0,
            "voltageV": 12
          }
        ],
        "units": {
          "capacityAh": "Ah",
          "voltageV": "V"
        },
        "display": "Capacity: 0 Ah; Voltage: 12 V"
      },
      "output": {
        "returned": {
          "ok": false,
          "errors": [
            "Capacity must be a positive finite number."
          ],
          "warnings": [],
          "steps": [],
          "explanation": ""
        },
        "display": "Rejected: Capacity must be a positive finite number."
      },
      "expected": {
        "value": {
          "ok": false
        },
        "display": "Rejected",
        "source": "packages/calculator-core/tests/battery-capacity.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "battery-capacity",
      "methodVersion": "battery-capacity@1.0.0",
      "runAt": "2026-10-29T06:04:06.925Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "capacityAh": 200,
            "voltageV": 12
          }
        ],
        "units": {
          "capacityAh": "Ah",
          "voltageV": "V"
        },
        "display": "Capacity: 200 Ah; Voltage: 12 V"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "energyWh": 2400,
            "energyKwh": 2.4
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Energy",
              "expression": "200 Ah × 12 V = 2,400 Wh",
              "value": 2400,
              "unit": "Wh"
            },
            {
              "label": "Kilowatt-hours",
              "expression": "2,400 Wh ÷ 1000 = 2.4 kWh",
              "value": 2.4,
              "unit": "kWh"
            }
          ],
          "explanation": "The battery's nominal energy is 2,400 watt-hours, or 2.4 kilowatt-hours."
        },
        "display": "Energy: 2400 Wh; Energy: 2.4 kWh"
      },
      "expected": {
        "value": {
          "energyWh": 2400,
          "energyKwh": 2.4
        },
        "display": "Energy: 2400 Wh; Energy: 2.4 kWh",
        "source": "Hand arithmetic: 200 × 12 = 2400 Wh; 2400 / 1000 = 2.4 kWh."
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "transformer": [
    {
      "calculatorId": "transformer",
      "methodVersion": "transformer@1.0.0",
      "runAt": "2026-10-29T06:04:06.925Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "primaryVoltageV": 230,
            "primaryTurns": 100,
            "secondaryTurns": 50
          }
        ],
        "units": {
          "primaryVoltageV": "V",
          "primaryTurns": "turns",
          "secondaryTurns": "turns"
        },
        "display": "Primary voltage: 230 V; Primary turns: 100 turns; Secondary turns: 50 turns"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "secondaryVoltageV": 115,
            "turnsRatio": 2
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Secondary voltage",
              "expression": "230 V × (50 ÷ 100) = 115 V",
              "value": 115,
              "unit": "V"
            },
            {
              "label": "Turns ratio",
              "expression": "100 ÷ 50 = 2:1",
              "value": 2
            }
          ],
          "explanation": "The ideal secondary voltage is 115 volts and the primary-to-secondary turns ratio is 2 to 1."
        },
        "display": "Secondary voltage: 115 V; Turns ratio: 2 ratio"
      },
      "expected": {
        "value": {
          "secondaryVoltageV": 115,
          "turnsRatio": 2
        },
        "display": "Secondary voltage: 115 V; Turns ratio: 2 ratio",
        "source": "packages/calculator-core/tests/transformer.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "transformer",
      "methodVersion": "transformer@1.0.0",
      "runAt": "2026-10-29T06:04:06.925Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "primaryVoltageV": 230,
            "primaryTurns": 100,
            "secondaryTurns": 0
          }
        ],
        "units": {
          "primaryVoltageV": "V",
          "primaryTurns": "turns",
          "secondaryTurns": "turns"
        },
        "display": "Primary voltage: 230 V; Primary turns: 100 turns; Secondary turns: 0 turns"
      },
      "output": {
        "returned": {
          "ok": false,
          "errors": [
            "Secondary turns must be a positive finite number."
          ],
          "warnings": [],
          "steps": [],
          "explanation": ""
        },
        "display": "Rejected: Secondary turns must be a positive finite number."
      },
      "expected": {
        "value": {
          "ok": false
        },
        "display": "Rejected",
        "source": "packages/calculator-core/tests/transformer.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "transformer",
      "methodVersion": "transformer@1.0.0",
      "runAt": "2026-10-29T06:04:06.925Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "primaryVoltageV": 230,
            "primaryTurns": 100,
            "secondaryTurns": 100
          }
        ],
        "units": {
          "primaryVoltageV": "V",
          "primaryTurns": "turns",
          "secondaryTurns": "turns"
        },
        "display": "Primary voltage: 230 V; Primary turns: 100 turns; Secondary turns: 100 turns"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "secondaryVoltageV": 230,
            "turnsRatio": 1
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Secondary voltage",
              "expression": "230 V × (100 ÷ 100) = 230 V",
              "value": 230,
              "unit": "V"
            },
            {
              "label": "Turns ratio",
              "expression": "100 ÷ 100 = 1:1",
              "value": 1
            }
          ],
          "explanation": "The ideal secondary voltage is 230 volts and the primary-to-secondary turns ratio is 1 to 1."
        },
        "display": "Secondary voltage: 230 V; Turns ratio: 1 ratio"
      },
      "expected": {
        "value": {
          "secondaryVoltageV": 230,
          "turnsRatio": 1
        },
        "display": "Secondary voltage: 230 V; Turns ratio: 1 ratio",
        "source": "Hand arithmetic: 100/100 = 1; 230 × 100/100 = 230 V."
      },
      "tolerance": 0,
      "pass": true
    }
  ],
  "pcb-trace-resistance": [
    {
      "calculatorId": "pcb-trace-resistance",
      "methodVersion": "pcb-trace-resistance-dc@1.0.0",
      "runAt": "2026-10-29T06:04:06.925Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "lengthMm": 100,
            "widthMm": 1,
            "copperWeightOz": 1,
            "currentA": 1,
            "temperatureC": 20
          }
        ],
        "units": {
          "lengthMm": "mm",
          "widthMm": "mm",
          "copperWeightOz": "oz/ft²",
          "currentA": "A",
          "temperatureC": "°C"
        },
        "display": "Length: 100 mm; Width: 1 mm; Copper weight: 1 oz/ft²; Current: 1 A; Temperature: 20 °C"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "resistanceOhms": 0.04955734406438632,
            "resistanceMilliohms": 49.55734406438632,
            "voltageDropV": 0.04955734406438632,
            "powerDissipationW": 0.04955734406438632,
            "crossSectionMm2": 0.034789999999999995
          },
          "errors": [],
          "warnings": [
            {
              "code": "DC_IDEAL_TRACE",
              "severity": "info",
              "message": "DC resistance of a plain rectangular trace. It ignores skin effect at high frequency, vias, connectors, plating variation and etch tolerance."
            }
          ],
          "steps": [
            {
              "label": "Resistivity at temperature",
              "expression": "1.7241e-8 × (1 + 0.00393 × (20 − 20)) = 1.72410e-8 Ω·m",
              "value": 1.7241e-8,
              "unit": "Ω·m"
            },
            {
              "label": "Cross-section",
              "expression": "1 mm × (1 oz × 34.79 µm) = 0.03479 mm²",
              "value": 0.034789999999999995,
              "unit": "mm²"
            },
            {
              "label": "Resistance",
              "expression": "1.72410e-8 Ω·m × 0.1 m ÷ 3.47900e-8 m² = 49.557344 mΩ",
              "value": 49.55734406438632,
              "unit": "mΩ"
            },
            {
              "label": "Voltage drop",
              "expression": "1 A × 0.049557 Ω = 0.049557 V",
              "value": 0.04955734406438632,
              "unit": "V"
            }
          ],
          "explanation": "A 100 mm × 1 mm 1 oz copper trace has about 49.557 mΩ resistance, dropping 0.0496 V and dissipating 0.0496 W at 1 A."
        },
        "display": "Resistance: 0.04955734406438632 Ω; Voltage drop: 0.04955734406438632 V; Power dissipation: 0.04955734406438632 W"
      },
      "expected": {
        "value": {
          "resistanceOhms": 0.0495573,
          "voltageDropV": 0.0495573,
          "powerDissipationW": 0.0495573
        },
        "display": "Resistance: 0.0495573 Ω; Voltage drop: 0.0495573 V; Power dissipation: 0.0495573 W",
        "source": "packages/calculator-core/tests/pcb-trace-resistance.test.ts"
      },
      "tolerance": 5e-7,
      "pass": true
    },
    {
      "calculatorId": "pcb-trace-resistance",
      "methodVersion": "pcb-trace-resistance-dc@1.0.0",
      "runAt": "2026-10-29T06:04:06.925Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "lengthMm": 100,
            "widthMm": 0,
            "copperWeightOz": 1,
            "currentA": 1,
            "temperatureC": 20
          }
        ],
        "units": {
          "lengthMm": "mm",
          "widthMm": "mm",
          "copperWeightOz": "oz/ft²",
          "currentA": "A",
          "temperatureC": "°C"
        },
        "display": "Length: 100 mm; Width: 0 mm; Copper weight: 1 oz/ft²; Current: 1 A; Temperature: 20 °C"
      },
      "output": {
        "returned": {
          "ok": false,
          "errors": [
            "Trace width must be a positive number."
          ],
          "warnings": [],
          "steps": [],
          "explanation": ""
        },
        "display": "Rejected: Trace width must be a positive number."
      },
      "expected": {
        "value": {
          "ok": false
        },
        "display": "Rejected",
        "source": "packages/calculator-core/tests/pcb-trace-resistance.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "pcb-trace-resistance",
      "methodVersion": "pcb-trace-resistance-dc@1.0.0",
      "runAt": "2026-10-29T06:04:06.925Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "lengthMm": 100,
            "widthMm": 1,
            "copperWeightOz": 1,
            "currentA": 2,
            "temperatureC": 20
          }
        ],
        "units": {
          "lengthMm": "mm",
          "widthMm": "mm",
          "copperWeightOz": "oz/ft²",
          "currentA": "A",
          "temperatureC": "°C"
        },
        "display": "Length: 100 mm; Width: 1 mm; Copper weight: 1 oz/ft²; Current: 2 A; Temperature: 20 °C"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "resistanceOhms": 0.04955734406438632,
            "resistanceMilliohms": 49.55734406438632,
            "voltageDropV": 0.09911468812877264,
            "powerDissipationW": 0.19822937625754528,
            "crossSectionMm2": 0.034789999999999995
          },
          "errors": [],
          "warnings": [
            {
              "code": "DC_IDEAL_TRACE",
              "severity": "info",
              "message": "DC resistance of a plain rectangular trace. It ignores skin effect at high frequency, vias, connectors, plating variation and etch tolerance."
            }
          ],
          "steps": [
            {
              "label": "Resistivity at temperature",
              "expression": "1.7241e-8 × (1 + 0.00393 × (20 − 20)) = 1.72410e-8 Ω·m",
              "value": 1.7241e-8,
              "unit": "Ω·m"
            },
            {
              "label": "Cross-section",
              "expression": "1 mm × (1 oz × 34.79 µm) = 0.03479 mm²",
              "value": 0.034789999999999995,
              "unit": "mm²"
            },
            {
              "label": "Resistance",
              "expression": "1.72410e-8 Ω·m × 0.1 m ÷ 3.47900e-8 m² = 49.557344 mΩ",
              "value": 49.55734406438632,
              "unit": "mΩ"
            },
            {
              "label": "Voltage drop",
              "expression": "2 A × 0.049557 Ω = 0.099115 V",
              "value": 0.09911468812877264,
              "unit": "V"
            }
          ],
          "explanation": "A 100 mm × 1 mm 1 oz copper trace has about 49.557 mΩ resistance, dropping 0.0991 V and dissipating 0.1982 W at 2 A."
        },
        "display": "Resistance: 0.04955734406438632 Ω; Voltage drop: 0.09911468812877264 V; Power dissipation: 0.19822937625754528 W"
      },
      "expected": {
        "value": {
          "resistanceOhms": 0.04955734406438632,
          "voltageDropV": 0.09911468812877264,
          "powerDissipationW": 0.19822937625754528
        },
        "display": "Resistance: 0.04955734406438632 Ω; Voltage drop: 0.09911468812877264 V; Power dissipation: 0.19822937625754528 W",
        "source": "packages/calculator-core/tests/pcb-trace-resistance.test.ts"
      },
      "tolerance": 1e-12,
      "pass": true
    }
  ],
  "motor-current": [
    {
      "calculatorId": "motor-current",
      "methodVersion": "motor-current-1ph@1.0.0",
      "runAt": "2026-10-29T06:04:06.925Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "powerW": 1000,
            "voltageV": 230,
            "powerFactor": 0.85
          }
        ],
        "units": {
          "powerW": "W electrical input",
          "voltageV": "V",
          "powerFactor": "ratio"
        },
        "display": "Electrical input power: 1000 W electrical input; Voltage: 230 V; Power factor: 0.85 ratio"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "currentA": 5.115089514066496
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Single-phase current",
              "expression": "1,000 W ÷ (230 V × 0.85) = 5.11509 A",
              "value": 5.115089514066496,
              "unit": "A"
            }
          ],
          "explanation": "The estimated single-phase motor current is 5.11509 amperes."
        },
        "display": "Current: 5.115089514066496 A"
      },
      "expected": {
        "value": {
          "currentA": 5.1151
        },
        "display": "Current: 5.1151 A",
        "source": "packages/calculator-core/tests/motor-current.test.ts"
      },
      "tolerance": 0.0005,
      "pass": true
    },
    {
      "calculatorId": "motor-current",
      "methodVersion": "motor-current-1ph@1.0.0",
      "runAt": "2026-10-29T06:04:06.926Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "powerW": 1000,
            "voltageV": 230,
            "powerFactor": 0
          }
        ],
        "units": {
          "powerW": "W electrical input",
          "voltageV": "V",
          "powerFactor": "ratio"
        },
        "display": "Electrical input power: 1000 W electrical input; Voltage: 230 V; Power factor: 0 ratio"
      },
      "output": {
        "returned": {
          "ok": false,
          "errors": [
            "Power factor must be a finite number greater than 0 and at most 1."
          ],
          "warnings": [],
          "steps": [],
          "explanation": ""
        },
        "display": "Rejected: Power factor must be a finite number greater than 0 and at most 1."
      },
      "expected": {
        "value": {
          "ok": false
        },
        "display": "Rejected",
        "source": "packages/calculator-core/tests/motor-current.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "motor-current",
      "methodVersion": "motor-current-1ph@1.0.0",
      "runAt": "2026-10-29T06:04:06.926Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "powerW": 746,
            "voltageV": 120,
            "powerFactor": 1
          }
        ],
        "units": {
          "powerW": "W electrical input",
          "voltageV": "V",
          "powerFactor": "ratio"
        },
        "display": "Electrical input power: 746 W electrical input; Voltage: 120 V; Power factor: 1 ratio"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "currentA": 6.216666666666667
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Single-phase current",
              "expression": "746 W ÷ (120 V × 1) = 6.216667 A",
              "value": 6.216666666666667,
              "unit": "A"
            }
          ],
          "explanation": "The estimated single-phase motor current is 6.216667 amperes."
        },
        "display": "Current: 6.216666666666667 A"
      },
      "expected": {
        "value": {
          "currentA": 6.2167
        },
        "display": "Current: 6.2167 A",
        "source": "packages/calculator-core/tests/motor-current.test.ts"
      },
      "tolerance": 0.0005,
      "pass": true
    }
  ],
  "takt-time": [
    {
      "calculatorId": "takt-time",
      "methodVersion": "takt-time@1.0.0",
      "runAt": "2026-10-29T06:04:06.926Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "availableMinutes": 480,
            "demandUnits": 240
          }
        ],
        "units": {
          "availableMinutes": "min",
          "demandUnits": "units"
        },
        "display": "Available time: 480 min; Demand: 240 units"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "taktMinutes": 2,
            "taktSeconds": 120
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Takt time",
              "expression": "480 min ÷ 240 units = 2 min/unit",
              "value": 2,
              "unit": "min/unit"
            },
            {
              "label": "Takt time in seconds",
              "expression": "2 min/unit × 60 = 120 s/unit",
              "value": 120,
              "unit": "s/unit"
            }
          ],
          "explanation": "The target production pace is one unit every 2 minutes, or 120 seconds."
        },
        "display": "Takt time: 2 min/unit; Takt time: 120 s/unit"
      },
      "expected": {
        "value": {
          "taktMinutes": 2,
          "taktSeconds": 120
        },
        "display": "Takt time: 2 min/unit; Takt time: 120 s/unit",
        "source": "packages/calculator-core/tests/takt-time.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "takt-time",
      "methodVersion": "takt-time@1.0.0",
      "runAt": "2026-10-29T06:04:06.926Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "availableMinutes": 0.5,
            "demandUnits": 1
          }
        ],
        "units": {
          "availableMinutes": "min",
          "demandUnits": "units"
        },
        "display": "Available time: 0.5 min; Demand: 1 units"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "taktMinutes": 0.5,
            "taktSeconds": 30
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Takt time",
              "expression": "0.5 min ÷ 1 units = 0.5 min/unit",
              "value": 0.5,
              "unit": "min/unit"
            },
            {
              "label": "Takt time in seconds",
              "expression": "0.5 min/unit × 60 = 30 s/unit",
              "value": 30,
              "unit": "s/unit"
            }
          ],
          "explanation": "The target production pace is one unit every 0.5 minutes, or 30 seconds."
        },
        "display": "Takt time: 0.5 min/unit; Takt time: 30 s/unit"
      },
      "expected": {
        "value": {
          "taktMinutes": 0.5,
          "taktSeconds": 30
        },
        "display": "Takt time: 0.5 min/unit; Takt time: 30 s/unit",
        "source": "packages/calculator-core/tests/takt-time.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "takt-time",
      "methodVersion": "takt-time@1.0.0",
      "runAt": "2026-10-29T06:04:06.926Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "availableMinutes": 450,
            "demandUnits": 300
          }
        ],
        "units": {
          "availableMinutes": "min",
          "demandUnits": "units"
        },
        "display": "Available time: 450 min; Demand: 300 units"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "taktMinutes": 1.5,
            "taktSeconds": 90
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Takt time",
              "expression": "450 min ÷ 300 units = 1.5 min/unit",
              "value": 1.5,
              "unit": "min/unit"
            },
            {
              "label": "Takt time in seconds",
              "expression": "1.5 min/unit × 60 = 90 s/unit",
              "value": 90,
              "unit": "s/unit"
            }
          ],
          "explanation": "The target production pace is one unit every 1.5 minutes, or 90 seconds."
        },
        "display": "Takt time: 1.5 min/unit; Takt time: 90 s/unit"
      },
      "expected": {
        "value": {
          "taktMinutes": 1.5,
          "taktSeconds": 90
        },
        "display": "Takt time: 1.5 min/unit; Takt time: 90 s/unit",
        "source": "packages/calculator-core/tests/takt-time.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "scrap-rate": [
    {
      "calculatorId": "scrap-rate",
      "methodVersion": "scrap-rate@1.0.0",
      "runAt": "2026-10-29T06:04:06.926Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "scrapUnits": 18,
            "totalUnits": 600
          }
        ],
        "units": {
          "scrapUnits": "units",
          "totalUnits": "units"
        },
        "display": "Scrap units: 18 units; Total units: 600 units"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "scrapRatePercent": 3,
            "goodUnits": 582
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Scrap rate",
              "expression": "(18 ÷ 600) × 100 = 3%",
              "value": 3,
              "unit": "%"
            },
            {
              "label": "Non-scrap units",
              "expression": "600 − 18 = 582",
              "value": 582,
              "unit": "units"
            }
          ],
          "explanation": "3% of total units are scrap, leaving 582 non-scrap units."
        },
        "display": "Scrap rate: 3 %; Non-scrap units: 582 units"
      },
      "expected": {
        "value": {
          "scrapRatePercent": 3,
          "goodUnits": 582
        },
        "display": "Scrap rate: 3 %; Non-scrap units: 582 units",
        "source": "packages/calculator-core/tests/scrap-rate.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "scrap-rate",
      "methodVersion": "scrap-rate@1.0.0",
      "runAt": "2026-10-29T06:04:06.926Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "scrapUnits": 0,
            "totalUnits": 600
          }
        ],
        "units": {
          "scrapUnits": "units",
          "totalUnits": "units"
        },
        "display": "Scrap units: 0 units; Total units: 600 units"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "scrapRatePercent": 0,
            "goodUnits": 600
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Scrap rate",
              "expression": "(0 ÷ 600) × 100 = 0%",
              "value": 0,
              "unit": "%"
            },
            {
              "label": "Non-scrap units",
              "expression": "600 − 0 = 600",
              "value": 600,
              "unit": "units"
            }
          ],
          "explanation": "0% of total units are scrap, leaving 600 non-scrap units."
        },
        "display": "Scrap rate: 0 %; Non-scrap units: 600 units"
      },
      "expected": {
        "value": {
          "scrapRatePercent": 0,
          "goodUnits": 600
        },
        "display": "Scrap rate: 0 %; Non-scrap units: 600 units",
        "source": "packages/calculator-core/tests/scrap-rate.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "scrap-rate",
      "methodVersion": "scrap-rate@1.0.0",
      "runAt": "2026-10-29T06:04:06.926Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "scrapUnits": 5,
            "totalUnits": 100
          }
        ],
        "units": {
          "scrapUnits": "units",
          "totalUnits": "units"
        },
        "display": "Scrap units: 5 units; Total units: 100 units"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "scrapRatePercent": 5,
            "goodUnits": 95
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Scrap rate",
              "expression": "(5 ÷ 100) × 100 = 5%",
              "value": 5,
              "unit": "%"
            },
            {
              "label": "Non-scrap units",
              "expression": "100 − 5 = 95",
              "value": 95,
              "unit": "units"
            }
          ],
          "explanation": "5% of total units are scrap, leaving 95 non-scrap units."
        },
        "display": "Scrap rate: 5 %; Non-scrap units: 95 units"
      },
      "expected": {
        "value": {
          "scrapRatePercent": 5,
          "goodUnits": 95
        },
        "display": "Scrap rate: 5 %; Non-scrap units: 95 units",
        "source": "packages/calculator-core/tests/scrap-rate.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "oee": [
    {
      "calculatorId": "oee",
      "methodVersion": "oee@1.0.0",
      "runAt": "2026-10-29T06:04:06.926Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "availabilityPercent": 90,
            "performancePercent": 95,
            "qualityPercent": 99
          }
        ],
        "units": {
          "availabilityPercent": "%",
          "performancePercent": "%",
          "qualityPercent": "%"
        },
        "display": "Availability: 90 %; Performance: 95 %; Quality: 99 %"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "oeePercent": 84.645
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Overall equipment effectiveness",
              "expression": "(90 ÷ 100) × (95 ÷ 100) × (99 ÷ 100) × 100 = 84.645%",
              "value": 84.645,
              "unit": "%"
            }
          ],
          "explanation": "The overall equipment effectiveness is 84.645%."
        },
        "display": "OEE: 84.645 %"
      },
      "expected": {
        "value": {
          "oeePercent": 84.645
        },
        "display": "OEE: 84.645 %",
        "source": "packages/calculator-core/tests/oee.test.ts"
      },
      "tolerance": 0.0005,
      "pass": true
    },
    {
      "calculatorId": "oee",
      "methodVersion": "oee@1.0.0",
      "runAt": "2026-10-29T06:04:06.927Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "availabilityPercent": 0,
            "performancePercent": 100,
            "qualityPercent": 100
          }
        ],
        "units": {
          "availabilityPercent": "%",
          "performancePercent": "%",
          "qualityPercent": "%"
        },
        "display": "Availability: 0 %; Performance: 100 %; Quality: 100 %"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "oeePercent": 0
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Overall equipment effectiveness",
              "expression": "(0 ÷ 100) × (100 ÷ 100) × (100 ÷ 100) × 100 = 0%",
              "value": 0,
              "unit": "%"
            }
          ],
          "explanation": "The overall equipment effectiveness is 0%."
        },
        "display": "OEE: 0 %"
      },
      "expected": {
        "value": {
          "oeePercent": 0
        },
        "display": "OEE: 0 %",
        "source": "packages/calculator-core/tests/oee.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "oee",
      "methodVersion": "oee@1.0.0",
      "runAt": "2026-10-29T06:04:06.927Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "availabilityPercent": 80,
            "performancePercent": 90,
            "qualityPercent": 95
          }
        ],
        "units": {
          "availabilityPercent": "%",
          "performancePercent": "%",
          "qualityPercent": "%"
        },
        "display": "Availability: 80 %; Performance: 90 %; Quality: 95 %"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "oeePercent": 68.4
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Overall equipment effectiveness",
              "expression": "(80 ÷ 100) × (90 ÷ 100) × (95 ÷ 100) × 100 = 68.4%",
              "value": 68.4,
              "unit": "%"
            }
          ],
          "explanation": "The overall equipment effectiveness is 68.4%."
        },
        "display": "OEE: 68.4 %"
      },
      "expected": {
        "value": {
          "oeePercent": 68.4
        },
        "display": "OEE: 68.4 %",
        "source": "packages/calculator-core/tests/oee.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "subtract-time": [
    {
      "calculatorId": "subtract-time",
      "methodVersion": "subtract-time@1.0.0",
      "runAt": "2026-10-29T06:04:06.927Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "startTime": "11:30",
            "subHours": 2,
            "subMinutes": 30
          }
        ],
        "units": {
          "startTime": "HH:MM (24-hour clock)",
          "subHours": "h",
          "subMinutes": "min"
        },
        "display": "Start time: 11:30 HH:MM (24-hour clock); Hours subtracted: 2 h; Minutes subtracted: 30 min"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "resultTime": "09:00"
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Time after subtraction",
              "expression": "11:30 - 2 hours - 30 minutes = 09:00",
              "value": 540,
              "unit": "minute of day"
            }
          ],
          "explanation": "The resulting 24-hour time is 09:00."
        },
        "display": "Result time: 09:00 HH:MM"
      },
      "expected": {
        "value": {
          "resultTime": "09:00"
        },
        "display": "Result time: 09:00 HH:MM",
        "source": "packages/calculator-core/tests/subtract-time.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "subtract-time",
      "methodVersion": "subtract-time@1.0.0",
      "runAt": "2026-10-29T06:04:06.927Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "startTime": "01:00",
            "subHours": 2,
            "subMinutes": 0
          }
        ],
        "units": {
          "startTime": "HH:MM (24-hour clock)",
          "subHours": "h",
          "subMinutes": "min"
        },
        "display": "Start time: 01:00 HH:MM (24-hour clock); Hours subtracted: 2 h; Minutes subtracted: 0 min"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "resultTime": "23:00"
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Time after subtraction",
              "expression": "01:00 - 2 hours - 0 minutes = 23:00",
              "value": 1380,
              "unit": "minute of day"
            }
          ],
          "explanation": "The resulting 24-hour time is 23:00."
        },
        "display": "Result time: 23:00 HH:MM"
      },
      "expected": {
        "value": {
          "resultTime": "23:00"
        },
        "display": "Result time: 23:00 HH:MM",
        "source": "packages/calculator-core/tests/subtract-time.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "subtract-time",
      "methodVersion": "subtract-time@1.0.0",
      "runAt": "2026-10-29T06:04:06.927Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "startTime": "11:30",
            "subHours": 1,
            "subMinutes": 0
          }
        ],
        "units": {
          "startTime": "HH:MM (24-hour clock)",
          "subHours": "h",
          "subMinutes": "min"
        },
        "display": "Start time: 11:30 HH:MM (24-hour clock); Hours subtracted: 1 h; Minutes subtracted: 0 min"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "resultTime": "10:30"
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Time after subtraction",
              "expression": "11:30 - 1 hours - 0 minutes = 10:30",
              "value": 630,
              "unit": "minute of day"
            }
          ],
          "explanation": "The resulting 24-hour time is 10:30."
        },
        "display": "Result time: 10:30 HH:MM"
      },
      "expected": {
        "value": {
          "resultTime": "10:30"
        },
        "display": "Result time: 10:30 HH:MM",
        "source": "Hand arithmetic: 11:30 − 1 h = 10:30."
      },
      "tolerance": 0,
      "pass": true
    }
  ],
  "material-yield": [
    {
      "calculatorId": "material-yield",
      "methodVersion": "material-yield@1.0.1",
      "runAt": "2026-10-29T06:04:06.927Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "goodUnits": 90,
            "inputUnits": 100
          }
        ],
        "units": {
          "goodUnits": "units",
          "inputUnits": "units"
        },
        "display": "Good units: 90 units; Input units: 100 units"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "yieldPercent": 90,
            "scrapUnits": 10
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Material yield",
              "expression": "90 ÷ 100 × 100 = 90",
              "value": 90,
              "unit": "%"
            },
            {
              "label": "Non-good units",
              "expression": "100 - 90 = 10",
              "value": 10,
              "unit": "units"
            }
          ],
          "explanation": "90% of input units are good, leaving 10 non-good units (which may include rework, scrap or unclassified units)."
        },
        "display": "Yield: 90 %; Non-good units: 10 units"
      },
      "expected": {
        "value": {
          "yieldPercent": 90,
          "scrapUnits": 10
        },
        "display": "Yield: 90 %; Non-good units: 10 units",
        "source": "packages/calculator-core/tests/material-yield.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "material-yield",
      "methodVersion": "material-yield@1.0.1",
      "runAt": "2026-10-29T06:04:06.927Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "goodUnits": 50,
            "inputUnits": 50
          }
        ],
        "units": {
          "goodUnits": "units",
          "inputUnits": "units"
        },
        "display": "Good units: 50 units; Input units: 50 units"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "yieldPercent": 100,
            "scrapUnits": 0
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Material yield",
              "expression": "50 ÷ 50 × 100 = 100",
              "value": 100,
              "unit": "%"
            },
            {
              "label": "Non-good units",
              "expression": "50 - 50 = 0",
              "value": 0,
              "unit": "units"
            }
          ],
          "explanation": "100% of input units are good, leaving 0 non-good units (which may include rework, scrap or unclassified units)."
        },
        "display": "Yield: 100 %; Non-good units: 0 units"
      },
      "expected": {
        "value": {
          "yieldPercent": 100,
          "scrapUnits": 0
        },
        "display": "Yield: 100 %; Non-good units: 0 units",
        "source": "packages/calculator-core/tests/material-yield.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "material-yield",
      "methodVersion": "material-yield@1.0.1",
      "runAt": "2026-10-29T06:04:06.927Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "goodUnits": 80,
            "inputUnits": 100
          }
        ],
        "units": {
          "goodUnits": "units",
          "inputUnits": "units"
        },
        "display": "Good units: 80 units; Input units: 100 units"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "yieldPercent": 80,
            "scrapUnits": 20
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Material yield",
              "expression": "80 ÷ 100 × 100 = 80",
              "value": 80,
              "unit": "%"
            },
            {
              "label": "Non-good units",
              "expression": "100 - 80 = 20",
              "value": 20,
              "unit": "units"
            }
          ],
          "explanation": "80% of input units are good, leaving 20 non-good units (which may include rework, scrap or unclassified units)."
        },
        "display": "Yield: 80 %; Non-good units: 20 units"
      },
      "expected": {
        "value": {
          "yieldPercent": 80,
          "scrapUnits": 20
        },
        "display": "Yield: 80 %; Non-good units: 20 units",
        "source": "Hand arithmetic: 80/100 × 100 = 80%; 100 − 80 = 20 non-good units."
      },
      "tolerance": 0,
      "pass": true
    }
  ],
  "production-cycle-time": [
    {
      "calculatorId": "production-cycle-time",
      "methodVersion": "production-cycle-time@1.0.0",
      "runAt": "2026-10-29T06:04:06.927Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "totalMinutes": 480,
            "unitsProduced": 240
          }
        ],
        "units": {
          "totalMinutes": "min",
          "unitsProduced": "units"
        },
        "display": "Production time: 480 min; Units produced: 240 units"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "cycleMinutes": 2,
            "cycleSeconds": 120
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Cycle time in minutes",
              "expression": "480 ÷ 240 = 2",
              "value": 2,
              "unit": "min/unit"
            },
            {
              "label": "Cycle time in seconds",
              "expression": "2 × 60 = 120",
              "value": 120,
              "unit": "s/unit"
            }
          ],
          "explanation": "Each unit takes 2 minutes, or 120 seconds, on average."
        },
        "display": "Cycle time: 2 min/unit; Cycle time: 120 s/unit"
      },
      "expected": {
        "value": {
          "cycleMinutes": 2,
          "cycleSeconds": 120
        },
        "display": "Cycle time: 2 min/unit; Cycle time: 120 s/unit",
        "source": "packages/calculator-core/tests/production-cycle-time.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "production-cycle-time",
      "methodVersion": "production-cycle-time@1.0.0",
      "runAt": "2026-10-29T06:04:06.927Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "totalMinutes": 480,
            "unitsProduced": 0
          }
        ],
        "units": {
          "totalMinutes": "min",
          "unitsProduced": "units"
        },
        "display": "Production time: 480 min; Units produced: 0 units"
      },
      "output": {
        "returned": {
          "ok": false,
          "errors": [
            "Units produced must be a positive integer."
          ],
          "warnings": [],
          "steps": [],
          "explanation": ""
        },
        "display": "Rejected: Units produced must be a positive integer."
      },
      "expected": {
        "value": {
          "ok": false
        },
        "display": "Rejected",
        "source": "packages/calculator-core/tests/production-cycle-time.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "production-cycle-time",
      "methodVersion": "production-cycle-time@1.0.0",
      "runAt": "2026-10-29T06:04:06.927Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "totalMinutes": 480,
            "unitsProduced": 120
          }
        ],
        "units": {
          "totalMinutes": "min",
          "unitsProduced": "units"
        },
        "display": "Production time: 480 min; Units produced: 120 units"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "cycleMinutes": 4,
            "cycleSeconds": 240
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Cycle time in minutes",
              "expression": "480 ÷ 120 = 4",
              "value": 4,
              "unit": "min/unit"
            },
            {
              "label": "Cycle time in seconds",
              "expression": "4 × 60 = 240",
              "value": 240,
              "unit": "s/unit"
            }
          ],
          "explanation": "Each unit takes 4 minutes, or 240 seconds, on average."
        },
        "display": "Cycle time: 4 min/unit; Cycle time: 240 s/unit"
      },
      "expected": {
        "value": {
          "cycleMinutes": 4,
          "cycleSeconds": 240
        },
        "display": "Cycle time: 4 min/unit; Cycle time: 240 s/unit",
        "source": "Hand arithmetic: 480/120 = 4 min/unit; 4 × 60 = 240 s/unit."
      },
      "tolerance": 0,
      "pass": true
    }
  ],
  "energy-converter": [
    {
      "calculatorId": "energy-converter",
      "methodVersion": "energy-linear@1.0.1",
      "runAt": "2026-10-29T06:04:06.928Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "value": 1,
            "from": "kWh",
            "to": "kJ"
          }
        ],
        "units": {
          "value": "from unit",
          "from": "source unit",
          "to": "target unit"
        },
        "display": "Value: 1 kWh; From unit: kWh; To unit: kJ"
      },
      "output": {
        "returned": {
          "ok": true,
          "errors": [],
          "output": {
            "value": 3600,
            "base": 3600000,
            "from": "kWh",
            "to": "kJ"
          },
          "warnings": [],
          "steps": [
            {
              "label": "Normalise to base unit",
              "expression": "1 kWh → J",
              "value": 3600000,
              "unit": "J"
            },
            {
              "label": "Convert to target unit",
              "expression": "3,600,000 J → kJ",
              "value": 3600,
              "unit": "kJ"
            }
          ],
          "explanation": "1 kWh equals 3,600 kJ."
        },
        "display": "Value: 3600 kJ"
      },
      "expected": {
        "value": {
          "value": 3600
        },
        "display": "Value: 3600 kJ",
        "source": "packages/calculator-core/tests/energy-converter.test.ts"
      },
      "tolerance": 5e-7,
      "pass": true
    },
    {
      "calculatorId": "energy-converter",
      "methodVersion": "energy-linear@1.0.1",
      "runAt": "2026-10-29T06:04:06.928Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "value": 0,
            "from": "kWh",
            "to": "kJ"
          }
        ],
        "units": {
          "value": "from unit",
          "from": "source unit",
          "to": "target unit"
        },
        "display": "Value: 0 kWh; From unit: kWh; To unit: kJ"
      },
      "output": {
        "returned": {
          "ok": true,
          "errors": [],
          "output": {
            "value": 0,
            "base": 0,
            "from": "kWh",
            "to": "kJ"
          },
          "warnings": [],
          "steps": [
            {
              "label": "Normalise to base unit",
              "expression": "0 kWh → J",
              "value": 0,
              "unit": "J"
            },
            {
              "label": "Convert to target unit",
              "expression": "0 J → kJ",
              "value": 0,
              "unit": "kJ"
            }
          ],
          "explanation": "0 kWh equals 0 kJ."
        },
        "display": "Value: 0 kJ"
      },
      "expected": {
        "value": {
          "value": 0
        },
        "display": "Value: 0 kJ",
        "source": "Hand arithmetic: 0 kWh × the finite conversion factor = 0 kJ."
      },
      "tolerance": 0,
      "pass": true
    },
    {
      "calculatorId": "energy-converter",
      "methodVersion": "energy-linear@1.0.1",
      "runAt": "2026-10-29T06:04:06.928Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "value": 1,
            "from": "BTU",
            "to": "J"
          }
        ],
        "units": {
          "value": "from unit",
          "from": "source unit",
          "to": "target unit"
        },
        "display": "Value: 1 BTU; From unit: BTU; To unit: J"
      },
      "output": {
        "returned": {
          "ok": true,
          "errors": [],
          "output": {
            "value": 1055.05585262,
            "base": 1055.05585262,
            "from": "BTU",
            "to": "J"
          },
          "warnings": [],
          "steps": [
            {
              "label": "Normalise to base unit",
              "expression": "1 BTU → J",
              "value": 1055.05585262,
              "unit": "J"
            },
            {
              "label": "Convert to target unit",
              "expression": "1,055.055853 J → J",
              "value": 1055.05585262,
              "unit": "J"
            }
          ],
          "explanation": "1 BTU equals 1,055.055853 J."
        },
        "display": "Value: 1055.05585262 J"
      },
      "expected": {
        "value": {
          "value": 1055.05585262
        },
        "display": "Value: 1055.05585262 J",
        "source": "packages/calculator-core/tests/energy-converter.test.ts"
      },
      "tolerance": 5e-7,
      "pass": true
    }
  ],
  "power-converter": [
    {
      "calculatorId": "power-converter",
      "methodVersion": "power-linear@1.0.1",
      "runAt": "2026-10-29T06:04:06.928Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "value": 1,
            "from": "hp",
            "to": "W"
          }
        ],
        "units": {
          "value": "from unit",
          "from": "source unit",
          "to": "target unit"
        },
        "display": "Value: 1 hp; From unit: hp; To unit: W"
      },
      "output": {
        "returned": {
          "ok": true,
          "errors": [],
          "output": {
            "value": 745.6998715822702,
            "base": 745.6998715822702,
            "from": "hp",
            "to": "W"
          },
          "warnings": [],
          "steps": [
            {
              "label": "Normalise to base unit",
              "expression": "1 hp → W",
              "value": 745.6998715822702,
              "unit": "W"
            },
            {
              "label": "Convert to target unit",
              "expression": "745.699872 W → W",
              "value": 745.6998715822702,
              "unit": "W"
            }
          ],
          "explanation": "1 hp equals 745.699872 W."
        },
        "display": "Value: 745.6998715822702 W"
      },
      "expected": {
        "value": {
          "value": 745.6998715822702
        },
        "display": "Value: 745.6998715822702 W",
        "source": "packages/calculator-core/tests/power-converter.test.ts"
      },
      "tolerance": 5e-7,
      "pass": true
    },
    {
      "calculatorId": "power-converter",
      "methodVersion": "power-linear@1.0.1",
      "runAt": "2026-10-29T06:04:06.928Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "value": 0,
            "from": "hp",
            "to": "W"
          }
        ],
        "units": {
          "value": "from unit",
          "from": "source unit",
          "to": "target unit"
        },
        "display": "Value: 0 hp; From unit: hp; To unit: W"
      },
      "output": {
        "returned": {
          "ok": true,
          "errors": [],
          "output": {
            "value": 0,
            "base": 0,
            "from": "hp",
            "to": "W"
          },
          "warnings": [],
          "steps": [
            {
              "label": "Normalise to base unit",
              "expression": "0 hp → W",
              "value": 0,
              "unit": "W"
            },
            {
              "label": "Convert to target unit",
              "expression": "0 W → W",
              "value": 0,
              "unit": "W"
            }
          ],
          "explanation": "0 hp equals 0 W."
        },
        "display": "Value: 0 W"
      },
      "expected": {
        "value": {
          "value": 0
        },
        "display": "Value: 0 W",
        "source": "Hand arithmetic: 0 hp × the finite conversion factor = 0 W."
      },
      "tolerance": 0,
      "pass": true
    },
    {
      "calculatorId": "power-converter",
      "methodVersion": "power-linear@1.0.1",
      "runAt": "2026-10-29T06:04:06.928Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "value": 1,
            "from": "kW",
            "to": "W"
          }
        ],
        "units": {
          "value": "from unit",
          "from": "source unit",
          "to": "target unit"
        },
        "display": "Value: 1 kW; From unit: kW; To unit: W"
      },
      "output": {
        "returned": {
          "ok": true,
          "errors": [],
          "output": {
            "value": 1000,
            "base": 1000,
            "from": "kW",
            "to": "W"
          },
          "warnings": [],
          "steps": [
            {
              "label": "Normalise to base unit",
              "expression": "1 kW → W",
              "value": 1000,
              "unit": "W"
            },
            {
              "label": "Convert to target unit",
              "expression": "1,000 W → W",
              "value": 1000,
              "unit": "W"
            }
          ],
          "explanation": "1 kW equals 1,000 W."
        },
        "display": "Value: 1000 W"
      },
      "expected": {
        "value": {
          "value": 1000
        },
        "display": "Value: 1000 W",
        "source": "packages/calculator-core/tests/power-converter.test.ts"
      },
      "tolerance": 5e-7,
      "pass": true
    }
  ],
  "force-converter": [
    {
      "calculatorId": "force-converter",
      "methodVersion": "force-linear@1.0.1",
      "runAt": "2026-10-29T06:04:06.928Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "value": 1,
            "from": "kgf",
            "to": "N"
          }
        ],
        "units": {
          "value": "from unit",
          "from": "source unit",
          "to": "target unit"
        },
        "display": "Value: 1 kgf; From unit: kgf; To unit: N"
      },
      "output": {
        "returned": {
          "ok": true,
          "errors": [],
          "output": {
            "value": 9.80665,
            "base": 9.80665,
            "from": "kgf",
            "to": "N"
          },
          "warnings": [],
          "steps": [
            {
              "label": "Normalise to base unit",
              "expression": "1 kgf → N",
              "value": 9.80665,
              "unit": "N"
            },
            {
              "label": "Convert to target unit",
              "expression": "9.80665 N → N",
              "value": 9.80665,
              "unit": "N"
            }
          ],
          "explanation": "1 kgf equals 9.80665 N."
        },
        "display": "Value: 9.80665 N"
      },
      "expected": {
        "value": {
          "value": 9.80665
        },
        "display": "Value: 9.80665 N",
        "source": "packages/calculator-core/tests/force-converter.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "force-converter",
      "methodVersion": "force-linear@1.0.1",
      "runAt": "2026-10-29T06:04:06.928Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "value": 0,
            "from": "kgf",
            "to": "N"
          }
        ],
        "units": {
          "value": "from unit",
          "from": "source unit",
          "to": "target unit"
        },
        "display": "Value: 0 kgf; From unit: kgf; To unit: N"
      },
      "output": {
        "returned": {
          "ok": true,
          "errors": [],
          "output": {
            "value": 0,
            "base": 0,
            "from": "kgf",
            "to": "N"
          },
          "warnings": [],
          "steps": [
            {
              "label": "Normalise to base unit",
              "expression": "0 kgf → N",
              "value": 0,
              "unit": "N"
            },
            {
              "label": "Convert to target unit",
              "expression": "0 N → N",
              "value": 0,
              "unit": "N"
            }
          ],
          "explanation": "0 kgf equals 0 N."
        },
        "display": "Value: 0 N"
      },
      "expected": {
        "value": {
          "value": 0
        },
        "display": "Value: 0 N",
        "source": "Hand arithmetic: 0 kgf × the finite conversion factor = 0 N."
      },
      "tolerance": 0,
      "pass": true
    },
    {
      "calculatorId": "force-converter",
      "methodVersion": "force-linear@1.0.1",
      "runAt": "2026-10-29T06:04:06.928Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "value": 1,
            "from": "lbf",
            "to": "N"
          }
        ],
        "units": {
          "value": "from unit",
          "from": "source unit",
          "to": "target unit"
        },
        "display": "Value: 1 lbf; From unit: lbf; To unit: N"
      },
      "output": {
        "returned": {
          "ok": true,
          "errors": [],
          "output": {
            "value": 4.4482216152605,
            "base": 4.4482216152605,
            "from": "lbf",
            "to": "N"
          },
          "warnings": [],
          "steps": [
            {
              "label": "Normalise to base unit",
              "expression": "1 lbf → N",
              "value": 4.4482216152605,
              "unit": "N"
            },
            {
              "label": "Convert to target unit",
              "expression": "4.448222 N → N",
              "value": 4.4482216152605,
              "unit": "N"
            }
          ],
          "explanation": "1 lbf equals 4.448222 N."
        },
        "display": "Value: 4.4482216152605 N"
      },
      "expected": {
        "value": {
          "value": 4.4482216152605
        },
        "display": "Value: 4.4482216152605 N",
        "source": "packages/calculator-core/tests/force-converter.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "angle-converter": [
    {
      "calculatorId": "angle-converter",
      "methodVersion": "angle-linear@1.0.1",
      "runAt": "2026-10-29T06:04:06.928Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "value": 1,
            "from": "turn",
            "to": "deg"
          }
        ],
        "units": {
          "value": "from unit",
          "from": "source unit",
          "to": "target unit"
        },
        "display": "Value: 1 turn; From unit: turn; To unit: °"
      },
      "output": {
        "returned": {
          "ok": true,
          "errors": [],
          "output": {
            "value": 360,
            "base": 6.283185307179586,
            "from": "turn",
            "to": "deg"
          },
          "warnings": [],
          "steps": [
            {
              "label": "Normalise to base unit",
              "expression": "1 turn → rad",
              "value": 6.283185307179586,
              "unit": "rad"
            },
            {
              "label": "Convert to target unit",
              "expression": "6.283185 rad → deg",
              "value": 360,
              "unit": "deg"
            }
          ],
          "explanation": "1 turn equals 360 deg."
        },
        "display": "Value: 360 °"
      },
      "expected": {
        "value": {
          "value": 360
        },
        "display": "Value: 360 °",
        "source": "packages/calculator-core/tests/angle-converter.test.ts"
      },
      "tolerance": 5e-10,
      "pass": true
    },
    {
      "calculatorId": "angle-converter",
      "methodVersion": "angle-linear@1.0.1",
      "runAt": "2026-10-29T06:04:06.928Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "value": 0,
            "from": "turn",
            "to": "deg"
          }
        ],
        "units": {
          "value": "from unit",
          "from": "source unit",
          "to": "target unit"
        },
        "display": "Value: 0 turn; From unit: turn; To unit: °"
      },
      "output": {
        "returned": {
          "ok": true,
          "errors": [],
          "output": {
            "value": 0,
            "base": 0,
            "from": "turn",
            "to": "deg"
          },
          "warnings": [],
          "steps": [
            {
              "label": "Normalise to base unit",
              "expression": "0 turn → rad",
              "value": 0,
              "unit": "rad"
            },
            {
              "label": "Convert to target unit",
              "expression": "0 rad → deg",
              "value": 0,
              "unit": "deg"
            }
          ],
          "explanation": "0 turn equals 0 deg."
        },
        "display": "Value: 0 °"
      },
      "expected": {
        "value": {
          "value": 0
        },
        "display": "Value: 0 °",
        "source": "Hand arithmetic: 0 turn × the finite conversion factor = 0 deg."
      },
      "tolerance": 0,
      "pass": true
    },
    {
      "calculatorId": "angle-converter",
      "methodVersion": "angle-linear@1.0.1",
      "runAt": "2026-10-29T06:04:06.928Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "value": 60,
            "from": "arcmin",
            "to": "deg"
          }
        ],
        "units": {
          "value": "from unit",
          "from": "source unit",
          "to": "target unit"
        },
        "display": "Value: 60 arcminutes; From unit: arcminutes; To unit: °"
      },
      "output": {
        "returned": {
          "ok": true,
          "errors": [],
          "output": {
            "value": 1,
            "base": 0.017453292519943295,
            "from": "arcmin",
            "to": "deg"
          },
          "warnings": [],
          "steps": [
            {
              "label": "Normalise to base unit",
              "expression": "60 arcmin → rad",
              "value": 0.017453292519943295,
              "unit": "rad"
            },
            {
              "label": "Convert to target unit",
              "expression": "0.017453 rad → deg",
              "value": 1,
              "unit": "deg"
            }
          ],
          "explanation": "60 arcmin equals 1 deg."
        },
        "display": "Value: 1 °"
      },
      "expected": {
        "value": {
          "value": 1
        },
        "display": "Value: 1 °",
        "source": "packages/calculator-core/tests/angle-converter.test.ts"
      },
      "tolerance": 5e-10,
      "pass": true
    }
  ],
  "frequency-converter": [
    {
      "calculatorId": "frequency-converter",
      "methodVersion": "frequency-linear@1.0.1",
      "runAt": "2026-10-29T06:04:06.928Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "value": 1,
            "from": "kHz",
            "to": "Hz"
          }
        ],
        "units": {
          "value": "from unit",
          "from": "source unit",
          "to": "target unit"
        },
        "display": "Value: 1 kHz; From unit: kHz; To unit: Hz"
      },
      "output": {
        "returned": {
          "ok": true,
          "errors": [],
          "output": {
            "value": 1000,
            "base": 1000,
            "from": "kHz",
            "to": "Hz"
          },
          "warnings": [],
          "steps": [
            {
              "label": "Normalise to base unit",
              "expression": "1 kHz → Hz",
              "value": 1000,
              "unit": "Hz"
            },
            {
              "label": "Convert to target unit",
              "expression": "1,000 Hz → Hz",
              "value": 1000,
              "unit": "Hz"
            }
          ],
          "explanation": "1 kHz equals 1,000 Hz."
        },
        "display": "Value: 1000 Hz"
      },
      "expected": {
        "value": {
          "value": 1000
        },
        "display": "Value: 1000 Hz",
        "source": "packages/calculator-core/tests/frequency-converter.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "frequency-converter",
      "methodVersion": "frequency-linear@1.0.1",
      "runAt": "2026-10-29T06:04:06.929Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "value": 0,
            "from": "kHz",
            "to": "Hz"
          }
        ],
        "units": {
          "value": "from unit",
          "from": "source unit",
          "to": "target unit"
        },
        "display": "Value: 0 kHz; From unit: kHz; To unit: Hz"
      },
      "output": {
        "returned": {
          "ok": true,
          "errors": [],
          "output": {
            "value": 0,
            "base": 0,
            "from": "kHz",
            "to": "Hz"
          },
          "warnings": [],
          "steps": [
            {
              "label": "Normalise to base unit",
              "expression": "0 kHz → Hz",
              "value": 0,
              "unit": "Hz"
            },
            {
              "label": "Convert to target unit",
              "expression": "0 Hz → Hz",
              "value": 0,
              "unit": "Hz"
            }
          ],
          "explanation": "0 kHz equals 0 Hz."
        },
        "display": "Value: 0 Hz"
      },
      "expected": {
        "value": {
          "value": 0
        },
        "display": "Value: 0 Hz",
        "source": "Hand arithmetic: 0 kHz × the finite conversion factor = 0 Hz."
      },
      "tolerance": 0,
      "pass": true
    },
    {
      "calculatorId": "frequency-converter",
      "methodVersion": "frequency-linear@1.0.1",
      "runAt": "2026-10-29T06:04:06.929Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "value": 1,
            "from": "GHz",
            "to": "MHz"
          }
        ],
        "units": {
          "value": "from unit",
          "from": "source unit",
          "to": "target unit"
        },
        "display": "Value: 1 GHz; From unit: GHz; To unit: MHz"
      },
      "output": {
        "returned": {
          "ok": true,
          "errors": [],
          "output": {
            "value": 1000,
            "base": 1000000000,
            "from": "GHz",
            "to": "MHz"
          },
          "warnings": [],
          "steps": [
            {
              "label": "Normalise to base unit",
              "expression": "1 GHz → Hz",
              "value": 1000000000,
              "unit": "Hz"
            },
            {
              "label": "Convert to target unit",
              "expression": "1,000,000,000 Hz → MHz",
              "value": 1000,
              "unit": "MHz"
            }
          ],
          "explanation": "1 GHz equals 1,000 MHz."
        },
        "display": "Value: 1000 MHz"
      },
      "expected": {
        "value": {
          "value": 1000
        },
        "display": "Value: 1000 MHz",
        "source": "packages/calculator-core/tests/frequency-converter.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "acceleration-converter": [
    {
      "calculatorId": "acceleration-converter",
      "methodVersion": "acceleration-linear@1.0.1",
      "runAt": "2026-10-29T06:04:06.929Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "value": 1,
            "from": "g",
            "to": "mps2"
          }
        ],
        "units": {
          "value": "from unit",
          "from": "source unit",
          "to": "target unit"
        },
        "display": "Value: 1 g; From unit: g; To unit: m/s²"
      },
      "output": {
        "returned": {
          "ok": true,
          "errors": [],
          "output": {
            "value": 9.80665,
            "base": 9.80665,
            "from": "g",
            "to": "mps2"
          },
          "warnings": [],
          "steps": [
            {
              "label": "Normalise to base unit",
              "expression": "1 g → m/s²",
              "value": 9.80665,
              "unit": "m/s²"
            },
            {
              "label": "Convert to target unit",
              "expression": "9.80665 m/s² → mps2",
              "value": 9.80665,
              "unit": "mps2"
            }
          ],
          "explanation": "1 g equals 9.80665 mps2."
        },
        "display": "Value: 9.80665 m/s²"
      },
      "expected": {
        "value": {
          "value": 9.80665
        },
        "display": "Value: 9.80665 m/s²",
        "source": "packages/calculator-core/tests/acceleration-converter.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "acceleration-converter",
      "methodVersion": "acceleration-linear@1.0.1",
      "runAt": "2026-10-29T06:04:06.929Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "value": 0,
            "from": "g",
            "to": "mps2"
          }
        ],
        "units": {
          "value": "from unit",
          "from": "source unit",
          "to": "target unit"
        },
        "display": "Value: 0 g; From unit: g; To unit: m/s²"
      },
      "output": {
        "returned": {
          "ok": true,
          "errors": [],
          "output": {
            "value": 0,
            "base": 0,
            "from": "g",
            "to": "mps2"
          },
          "warnings": [],
          "steps": [
            {
              "label": "Normalise to base unit",
              "expression": "0 g → m/s²",
              "value": 0,
              "unit": "m/s²"
            },
            {
              "label": "Convert to target unit",
              "expression": "0 m/s² → mps2",
              "value": 0,
              "unit": "mps2"
            }
          ],
          "explanation": "0 g equals 0 mps2."
        },
        "display": "Value: 0 m/s²"
      },
      "expected": {
        "value": {
          "value": 0
        },
        "display": "Value: 0 m/s²",
        "source": "Hand arithmetic: 0 g × the finite conversion factor = 0 mps2."
      },
      "tolerance": 0,
      "pass": true
    },
    {
      "calculatorId": "acceleration-converter",
      "methodVersion": "acceleration-linear@1.0.1",
      "runAt": "2026-10-29T06:04:06.929Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "value": 1,
            "from": "ftps2",
            "to": "mps2"
          }
        ],
        "units": {
          "value": "from unit",
          "from": "source unit",
          "to": "target unit"
        },
        "display": "Value: 1 ft/s²; From unit: ft/s²; To unit: m/s²"
      },
      "output": {
        "returned": {
          "ok": true,
          "errors": [],
          "output": {
            "value": 0.3048,
            "base": 0.3048,
            "from": "ftps2",
            "to": "mps2"
          },
          "warnings": [],
          "steps": [
            {
              "label": "Normalise to base unit",
              "expression": "1 ftps2 → m/s²",
              "value": 0.3048,
              "unit": "m/s²"
            },
            {
              "label": "Convert to target unit",
              "expression": "0.3048 m/s² → mps2",
              "value": 0.3048,
              "unit": "mps2"
            }
          ],
          "explanation": "1 ftps2 equals 0.3048 mps2."
        },
        "display": "Value: 0.3048 m/s²"
      },
      "expected": {
        "value": {
          "value": 0.3048
        },
        "display": "Value: 0.3048 m/s²",
        "source": "packages/calculator-core/tests/acceleration-converter.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    }
  ],
  "density-converter": [
    {
      "calculatorId": "density-converter",
      "methodVersion": "density-linear@1.0.1",
      "runAt": "2026-10-29T06:04:06.929Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "value": 1,
            "from": "gcm3",
            "to": "kgm3"
          }
        ],
        "units": {
          "value": "from unit",
          "from": "source unit",
          "to": "target unit"
        },
        "display": "Value: 1 g/cm³; From unit: g/cm³; To unit: kg/m³"
      },
      "output": {
        "returned": {
          "ok": true,
          "errors": [],
          "output": {
            "value": 1000,
            "base": 1000,
            "from": "gcm3",
            "to": "kgm3"
          },
          "warnings": [],
          "steps": [
            {
              "label": "Normalise to base unit",
              "expression": "1 gcm3 → kg/m³",
              "value": 1000,
              "unit": "kg/m³"
            },
            {
              "label": "Convert to target unit",
              "expression": "1,000 kg/m³ → kgm3",
              "value": 1000,
              "unit": "kgm3"
            }
          ],
          "explanation": "1 gcm3 equals 1,000 kgm3."
        },
        "display": "Value: 1000 kg/m³"
      },
      "expected": {
        "value": {
          "value": 1000
        },
        "display": "Value: 1000 kg/m³",
        "source": "packages/calculator-core/tests/density-converter.test.ts"
      },
      "tolerance": 5e-7,
      "pass": true
    },
    {
      "calculatorId": "density-converter",
      "methodVersion": "density-linear@1.0.1",
      "runAt": "2026-10-29T06:04:06.929Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "value": 0,
            "from": "gcm3",
            "to": "kgm3"
          }
        ],
        "units": {
          "value": "from unit",
          "from": "source unit",
          "to": "target unit"
        },
        "display": "Value: 0 g/cm³; From unit: g/cm³; To unit: kg/m³"
      },
      "output": {
        "returned": {
          "ok": true,
          "errors": [],
          "output": {
            "value": 0,
            "base": 0,
            "from": "gcm3",
            "to": "kgm3"
          },
          "warnings": [],
          "steps": [
            {
              "label": "Normalise to base unit",
              "expression": "0 gcm3 → kg/m³",
              "value": 0,
              "unit": "kg/m³"
            },
            {
              "label": "Convert to target unit",
              "expression": "0 kg/m³ → kgm3",
              "value": 0,
              "unit": "kgm3"
            }
          ],
          "explanation": "0 gcm3 equals 0 kgm3."
        },
        "display": "Value: 0 kg/m³"
      },
      "expected": {
        "value": {
          "value": 0
        },
        "display": "Value: 0 kg/m³",
        "source": "Hand arithmetic: 0 gcm3 × the finite conversion factor = 0 kgm3."
      },
      "tolerance": 0,
      "pass": true
    },
    {
      "calculatorId": "density-converter",
      "methodVersion": "density-linear@1.0.1",
      "runAt": "2026-10-29T06:04:06.929Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "value": 1,
            "from": "lbft3",
            "to": "kgm3"
          }
        ],
        "units": {
          "value": "from unit",
          "from": "source unit",
          "to": "target unit"
        },
        "display": "Value: 1 lb/ft³; From unit: lb/ft³; To unit: kg/m³"
      },
      "output": {
        "returned": {
          "ok": true,
          "errors": [],
          "output": {
            "value": 16.018463373960138,
            "base": 16.018463373960138,
            "from": "lbft3",
            "to": "kgm3"
          },
          "warnings": [],
          "steps": [
            {
              "label": "Normalise to base unit",
              "expression": "1 lbft3 → kg/m³",
              "value": 16.018463373960138,
              "unit": "kg/m³"
            },
            {
              "label": "Convert to target unit",
              "expression": "16.018463 kg/m³ → kgm3",
              "value": 16.018463373960138,
              "unit": "kgm3"
            }
          ],
          "explanation": "1 lbft3 equals 16.018463 kgm3."
        },
        "display": "Value: 16.018463373960138 kg/m³"
      },
      "expected": {
        "value": {
          "value": 16.018463373960138
        },
        "display": "Value: 16.018463373960138 kg/m³",
        "source": "packages/calculator-core/tests/density-converter.test.ts"
      },
      "tolerance": 5e-7,
      "pass": true
    }
  ],
  "bmr": [
    {
      "calculatorId": "bmr",
      "methodVersion": "mifflin-st-jeor@1.0.1",
      "runAt": "2026-10-29T06:04:06.929Z",
      "buildRevision": "24533ff",
      "kind": "normal",
      "inputs": {
        "arguments": [
          {
            "sex": "male",
            "weightKg": 80,
            "heightCm": 180,
            "ageYears": 30
          }
        ],
        "units": {
          "sex": "equation coefficient selection",
          "weightKg": "kg",
          "heightCm": "cm",
          "ageYears": "years"
        },
        "display": "Equation selection: male equation coefficient selection; Weight: 80 kg; Height: 180 cm; Age: 30 years"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "bmrKcal": 1780
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Mifflin-St Jeor",
              "expression": "10×80 + 6.25×180 − 5×30 + 5 = 1,780",
              "value": 1780,
              "unit": "kcal/day"
            }
          ],
          "explanation": "Predicted resting energy expenditure (Mifflin–St Jeor) is 1,780 kcal per day at rest."
        },
        "display": "Predicted resting energy expenditure: 1780 kcal/day"
      },
      "expected": {
        "value": {
          "bmrKcal": 1780
        },
        "display": "Predicted resting energy expenditure: 1780 kcal/day",
        "source": "packages/calculator-core/tests/bmr.test.ts"
      },
      "tolerance": 5e-7,
      "pass": true
    },
    {
      "calculatorId": "bmr",
      "methodVersion": "mifflin-st-jeor@1.0.1",
      "runAt": "2026-10-29T06:04:06.929Z",
      "buildRevision": "24533ff",
      "kind": "boundary",
      "inputs": {
        "arguments": [
          {
            "sex": "male",
            "weightKg": 0,
            "heightCm": 180,
            "ageYears": 30
          }
        ],
        "units": {
          "sex": "equation coefficient selection",
          "weightKg": "kg",
          "heightCm": "cm",
          "ageYears": "years"
        },
        "display": "Equation selection: male equation coefficient selection; Weight: 0 kg; Height: 180 cm; Age: 30 years"
      },
      "output": {
        "returned": {
          "ok": false,
          "errors": [
            "Weight must be 20–350 kg: this tool excludes extreme or likely mistyped adult measurements."
          ],
          "warnings": [],
          "steps": [],
          "explanation": ""
        },
        "display": "Rejected: Weight must be 20–350 kg: this tool excludes extreme or likely mistyped adult measurements."
      },
      "expected": {
        "value": {
          "ok": false
        },
        "display": "Rejected",
        "source": "packages/calculator-core/tests/bmr.test.ts"
      },
      "tolerance": 1e-10,
      "pass": true
    },
    {
      "calculatorId": "bmr",
      "methodVersion": "mifflin-st-jeor@1.0.1",
      "runAt": "2026-10-29T06:04:06.929Z",
      "buildRevision": "24533ff",
      "kind": "sensitivity",
      "inputs": {
        "arguments": [
          {
            "sex": "female",
            "weightKg": 80,
            "heightCm": 180,
            "ageYears": 30
          }
        ],
        "units": {
          "sex": "equation coefficient selection",
          "weightKg": "kg",
          "heightCm": "cm",
          "ageYears": "years"
        },
        "display": "Equation selection: female equation coefficient selection; Weight: 80 kg; Height: 180 cm; Age: 30 years"
      },
      "output": {
        "returned": {
          "ok": true,
          "output": {
            "bmrKcal": 1614
          },
          "errors": [],
          "warnings": [],
          "steps": [
            {
              "label": "Mifflin-St Jeor",
              "expression": "10×80 + 6.25×180 − 5×30 − 161 = 1,614",
              "value": 1614,
              "unit": "kcal/day"
            }
          ],
          "explanation": "Predicted resting energy expenditure (Mifflin–St Jeor) is 1,614 kcal per day at rest."
        },
        "display": "Predicted resting energy expenditure: 1614 kcal/day"
      },
      "expected": {
        "value": {
          "bmrKcal": 1614
        },
        "display": "Predicted resting energy expenditure: 1614 kcal/day",
        "source": "packages/calculator-core/tests/bmr.test.ts"
      },
      "tolerance": 5e-7,
      "pass": true
    }
  ]
}
