{
  "capability_id": "math.multiplication",
  "tool_id": "multiplication",
  "engine": "multiplication",
  "calculation_version": "1.0.3",
  "generated_at": "2026-09-16T22:03:43.784Z",
  "engine_build": "2026-09-16",
  "test_count": 15,
  "passed": 15,
  "failed": 0,
  "tests_summary": {
    "golden": {
      "total": 10,
      "passed": 10
    },
    "boundary": {
      "total": 5,
      "passed": 5
    },
    "property": {
      "total": 0,
      "passed": 0
    }
  },
  "engine_tested": true,
  "expert_reviewed": false,
  "internally_reviewed": false,
  "review_kind": null,
  "source_checked": true,
  "reviewed_by": null,
  "reviewer_role": null,
  "last_reviewed": null,
  "expert_review": {
    "status": "optional_not_performed",
    "reviewer": null,
    "scope": [
      "formula",
      "input semantics",
      "assumptions",
      "limitations",
      "sources",
      "tests"
    ],
    "note": "Domain expert review is optional under CVP (CVP-EXP-01). Absence does not block CVP Verified. See Review policy for supplemental domain assurance."
  },
  "internal_review": {
    "status": "not_applicable",
    "reviewer": null
  },
  "page": "https://www.calculatorx.com/calc/math/multiplication",
  "api": "https://www.calculatorx.com/api/v1/calc/multiplication",
  "schema_input": "https://www.calculatorx.com/schemas/math.multiplication.input.json",
  "schema_output": "https://www.calculatorx.com/schemas/math.multiplication.output.json",
  "assumptions": [
    "Real decimal inputs parsed as exact decimal strings (integer mantissa × 10^−scale), not binary floating-point.",
    "Product mode and Long multiplication mode use the same exact mantissa multiplication; Long adds partial-product steps."
  ],
  "limitations": [
    "Missing a or b → INVALID_INPUT",
    "Product and long modes share exact decimal mantissa × BigInt arithmetic",
    "Very wide long grids may set LONG_GRID_TRUNCATED"
  ],
  "boundary_conditions": [
    "Non-numeric input → error",
    "Scientific notation (e.g. 1.2e3) → error; use plain decimals only",
    "Product mode: up to 48 significant digits per factor",
    "Long visual grid: up to 24 significant digits per factor; larger factors still return an exact product with LONG_GRID_TRUNCATED (working steps omitted — never silently truncated)"
  ],
  "sources": [
    {
      "title": "OpenStax Prealgebra 2e — Multiply Whole Numbers",
      "section": "1.4 Product of two numbers",
      "url": "https://openstax.org/books/prealgebra-2e/pages/1-4-multiply-whole-numbers",
      "supports": "Standard multiplication as the product of a multiplicand and a multiplier.",
      "kind": "reference"
    },
    {
      "title": "CalculatorX mathematical conventions",
      "section": "Exact decimal place-count multiplication",
      "supports": "Long-multiplication algorithm with partial products; exact decimal mantissa × BigInt; sign rules for negatives.",
      "kind": "definition"
    }
  ],
  "methods": [],
  "fingerprint": "sha256:390204c17741107554921e0df97b92e39c1abeb92f6fc6d12aabcea1757958a9",
  "tests": [
    {
      "id": "basic",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "a": 8,
        "b": 6
      },
      "expect": {
        "product": 48
      },
      "expectWarning": null,
      "actual": {
        "product": 48,
        "productStr": "48",
        "mode": "product",
        "work": null,
        "gridTruncated": false,
        "warning": null
      },
      "tol": 0
    },
    {
      "id": "large",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "a": 2552,
        "b": 64
      },
      "expect": {
        "product": 163328
      },
      "expectWarning": null,
      "actual": {
        "product": 163328,
        "productStr": "163328",
        "mode": "product",
        "work": null,
        "gridTruncated": false,
        "warning": null
      },
      "tol": 0
    },
    {
      "id": "decimal",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "a": "45.2",
        "b": "0.21"
      },
      "expect": {
        "product": 9.492
      },
      "expectWarning": null,
      "actual": {
        "product": 9.492,
        "productStr": "9.492",
        "mode": "product",
        "work": null,
        "gridTruncated": false,
        "warning": null
      },
      "tol": 1e-12
    },
    {
      "id": "negative",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "a": -5,
        "b": 11
      },
      "expect": {
        "product": -55
      },
      "expectWarning": null,
      "actual": {
        "product": -55,
        "productStr": "-55",
        "mode": "product",
        "work": null,
        "gridTruncated": false,
        "warning": null
      },
      "tol": 0
    },
    {
      "id": "zero",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "a": 0,
        "b": 99
      },
      "expect": {
        "product": 0
      },
      "expectWarning": null,
      "actual": {
        "product": 0,
        "productStr": "0",
        "mode": "product",
        "work": null,
        "gridTruncated": false,
        "warning": null
      },
      "tol": 0
    },
    {
      "id": "long-mode",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "a": 12,
        "b": 12,
        "mode": "long"
      },
      "expect": {
        "product": 144,
        "productStr": "144",
        "mode": "long"
      },
      "expectWarning": null,
      "actual": {
        "product": 144,
        "productStr": "144",
        "mode": "long",
        "work": "Long multiplication (standard algorithm)\n\n   12\n × 12\n ----\n   24\n+ 120\n--------\n= 144\n\nStep-by-step:\n  1. Multiply by the ones digit (2): 12 × 2 = 24\n  2. Multiply by the tens digit (1): 12 × 1 = 12 (shift 1 place → 120)\n\nAdd the partial products.\nTherefore: 12 × 12 = 144",
        "gridTruncated": false,
        "warning": null
      },
      "tol": 0
    },
    {
      "id": "exact-0p1-0p2",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "a": "0.1",
        "b": "0.2"
      },
      "expect": {
        "productStr": "0.02"
      },
      "expectWarning": null,
      "actual": {
        "product": 0.02,
        "productStr": "0.02",
        "mode": "product",
        "work": null,
        "gridTruncated": false,
        "warning": null
      },
      "tol": null
    },
    {
      "id": "forty-eight-digits",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "a": "111111111111111111111111111111111111111111111111",
        "b": "1"
      },
      "expect": {
        "productStr": "111111111111111111111111111111111111111111111111"
      },
      "expectWarning": null,
      "actual": {
        "product": 1.1111111111111111e+47,
        "productStr": "111111111111111111111111111111111111111111111111",
        "mode": "product",
        "work": null,
        "gridTruncated": false,
        "warning": null
      },
      "tol": null
    },
    {
      "id": "long-carry",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "a": 999,
        "b": 999,
        "mode": "long"
      },
      "expect": {
        "productStr": "998001",
        "mode": "long"
      },
      "expectWarning": null,
      "actual": {
        "product": 998001,
        "productStr": "998001",
        "mode": "long",
        "work": "Long multiplication (standard algorithm)\n\n     999\n   × 999\n   -----\n    8991\n + 89910\n+ 899100\n--------\n= 998001\n\nStep-by-step:\n  1. Multiply by the ones digit (9): 999 × 9 = 8991\n  2. Multiply by the tens digit (9): 999 × 9 = 8991 (shift 1 place → 89910)\n  3. Multiply by the 10^2 digit (9): 999 × 9 = 8991 (shift 2 places → 899100)\n\nAdd the partial products.\nTherefore: 999 × 999 = 998001",
        "gridTruncated": false,
        "warning": null
      },
      "tol": null
    },
    {
      "id": "long-24-digit",
      "ok": true,
      "kind": "golden",
      "inputs": {
        "a": "111111111111111111111111",
        "b": "2",
        "mode": "long"
      },
      "expect": {
        "productStr": "222222222222222222222222",
        "mode": "long",
        "gridTruncated": false
      },
      "expectWarning": null,
      "actual": {
        "product": 2.2222222222222222e+23,
        "productStr": "222222222222222222222222",
        "mode": "long",
        "work": "Long multiplication (standard algorithm)\n\n   111111111111111111111111\n                        × 2\n   ------------------------\n   222222222222222222222222\n   ------------------------\n = 222222222222222222222222\n\nStep-by-step:\n  1. Multiply by the ones digit (2): 111111111111111111111111 × 2 = 222222222222222222222222\n\nAdd the partial products.\nTherefore: 111111111111111111111111 × 2 = 222222222222222222222222",
        "gridTruncated": false,
        "warning": null
      },
      "tol": null
    },
    {
      "id": "missing-a",
      "ok": true,
      "kind": "boundary",
      "inputs": {
        "b": 6
      },
      "expectError": "INVALID_INPUT",
      "code": "INVALID_INPUT",
      "error": "Enter the multiplicand."
    },
    {
      "id": "missing-b",
      "ok": true,
      "kind": "boundary",
      "inputs": {
        "a": 6
      },
      "expectError": "INVALID_INPUT",
      "code": "INVALID_INPUT",
      "error": "Enter the multiplier."
    },
    {
      "id": "boundary-mul-sci",
      "ok": true,
      "kind": "boundary",
      "inputs": {
        "a": "1.2e3",
        "b": "2"
      },
      "expectError": "SCIENTIFIC_NOT_SUPPORTED",
      "code": "SCIENTIFIC_NOT_SUPPORTED",
      "error": "Use a plain decimal (scientific notation like 1.2e3 is not supported)."
    },
    {
      "id": "boundary-mul-49-digits",
      "ok": true,
      "kind": "boundary",
      "inputs": {
        "a": "1111111111111111111111111111111111111111111111111",
        "b": "1"
      },
      "expectError": "TOO_MANY_DIGITS",
      "code": "TOO_MANY_DIGITS",
      "error": "Supports up to 48 significant digits per factor."
    },
    {
      "id": "boundary-mul-long-25-grid",
      "ok": true,
      "kind": "boundary",
      "inputs": {
        "a": "1111111111111111111111111",
        "b": "2",
        "mode": "long"
      },
      "expect": {
        "productStr": "2222222222222222222222222",
        "gridTruncated": true,
        "warning": "LONG_GRID_TRUNCATED"
      },
      "expectWarning": null,
      "actual": {
        "product": 2.2222222222222222e+24,
        "productStr": "2222222222222222222222222",
        "mode": "long",
        "work": null,
        "gridTruncated": true,
        "warning": "LONG_GRID_TRUNCATED"
      },
      "tol": null
    }
  ],
  "tier": "engine_tested",
  "verification": {
    "tests": {
      "passed": 15,
      "total": 15,
      "golden": 10,
      "boundary": 5,
      "property": 0
    },
    "contract_checks": {
      "passed": 4,
      "total": 4
    }
  },
  "evidence_core_generated_at": "2026-09-16T06:41:00.884Z",
  "rendered_at": "2026-09-16T22:03:43.784Z",
  "release_integrity": {
    "status": "verified",
    "scope": "workspace",
    "production_attestation_required": true,
    "calculation_version": "1.0.3",
    "artifacts": {
      "engine": "1.0.3",
      "page": "1.0.3",
      "capability": "1.0.3",
      "evidence": "1.0.3",
      "input_schema": "1.0.3",
      "output_schema": "1.0.3",
      "mcp_contract": "1.0.3"
    },
    "digests": {
      "input_schema_sha256": "694d72a0edef2b5a16d886a9b9d3aab856f17118d177c4fbb72bc3648a508d20",
      "output_schema_sha256": "82034e8d4b53198a999d386a7775a13a278e82762b93bfbfa317f5e7a1a11ae9",
      "evidence_sha256": "a48b9e17cc7c9ef3ddbf94bb2f7a249016809afaa19450f402240215f93653c2",
      "evidence_core_sha256": "a48b9e17cc7c9ef3ddbf94bb2f7a249016809afaa19450f402240215f93653c2",
      "capability_sha256": "38d22f8c3edf9a5ded40a3d333d0f4e2f25c70b605d6dbf14c1e403cedd2d73f",
      "engine_sha256": "c8d4ccdbfeaf61d7b024d4e1babb0c2ba3b324c1b37bd0cb456a526d8d2b1bd1",
      "mcp_contract_sha256": "863098b311a7b17dc4b229a6302b90b3545b175f716e5d84772c7be8e9716b86"
    },
    "contract_checks": {
      "total": 4,
      "passed": 4,
      "failed": 0,
      "items": [
        {
          "id": "release-artifacts-aligned",
          "status": "pass",
          "detail": "1.0.3"
        },
        {
          "id": "schema-valid-input-executes",
          "status": "pass"
        },
        {
          "id": "engine-success-output-validates-schema",
          "status": "pass"
        },
        {
          "id": "schema-rejects-incomplete-input",
          "status": "pass"
        }
      ]
    },
    "report": "https://www.calculatorx.com/.well-known/calculatorx-release-integrity.json"
  }
}
