{
  "capability_id": "mechanical.statics.plastic_moment",
  "calculation_version": "1.0.0",
  "protocol_version": "1.0.0-proposed",
  "protocol_document_status": "proposed",
  "verification_revision": "2026-09-27.o2-o3",
  "oracle": {
    "class": "O3",
    "library": "mpmath 1.4.1",
    "mpmath_dps": 80,
    "backend": null,
    "rounding": null,
    "generator_id": "plastic-moment-mpmath-o3",
    "generator_version": "1.0.0",
    "generator_sha256": "05738f4cf41cfd62285278b38d1ad4d7df2ee4cf1fe83b37bc39e21966408702",
    "table_sha256": "5645808124b39ef1383ee3476d8048e610ac808088a83558528854dcbe3aa95c",
    "seed": "20260927.plastic-moment-o3",
    "independent_of_iut": true
  },
  "claim_scope": "O2: Mp = σ_y Z vs a separate-module identity (≤2 ULP). Not elastic S, not transverse shear, and not beam deflection. ≤2 ULP vs O3 applies only to the published tabulated plastic-moment vectors. Not elastic S.",
  "commands": {
    "regenerate_table": "python3 generate-plastic-moment-o3.py",
    "regenerate_table_repo": "python3 scripts/lib/cvp/oracles/generate-plastic-moment-o3.py",
    "independent_rest": "Compare POST /api/v1/calc/plastic-moment against /developers/cvp/reproduce/plastic-moment-o3-tables.json",
    "run_cvp": "npm run cvp:run -- --capability mechanical.statics.plastic_moment",
    "rest_example": "POST https://www.calculatorx.com/api/v1/calc/plastic-moment"
  },
  "public_files": {
    "table": "/developers/cvp/reproduce/plastic-moment-o3-tables.json",
    "table_url": "https://www.calculatorx.com/developers/cvp/reproduce/plastic-moment-o3-tables.json",
    "generator": "/developers/cvp/reproduce/generate-plastic-moment-o3.py",
    "generator_url": "https://www.calculatorx.com/developers/cvp/reproduce/generate-plastic-moment-o3.py",
    "checker": "/developers/cvp/reproduce/check-math-o3-rest.py",
    "checker_url": "https://www.calculatorx.com/developers/cvp/reproduce/check-math-o3-rest.py",
    "manifest": "/evidence/mechanical.statics.plastic_moment/1.0.0.cvp.json",
    "this_file": "/evidence/mechanical.statics.plastic_moment/reproduce.json"
  },
  "result_summary": {
    "passed": 8,
    "total": 8,
    "failed": 0,
    "max_error_ulp": 0,
    "threshold_ulp": 2,
    "max_threshold_ulp": 2
  },
  "vectors": [
    {
      "id": "o3-unit",
      "kind": "unit",
      "inputs": {
        "sigma_y": "250",
        "Z": "18"
      },
      "expected_f64": {
        "oracle_layer": "analytic",
        "Mp": 4500,
        "sigma_y": 250,
        "Z": 18
      },
      "actual": {
        "model": "plastic_moment",
        "sigma_y": 250,
        "Z": 18,
        "Mp": 4500,
        "solver": "plastic moment",
        "convention": "Mp = σ_y Z on one centroidal axis. Z comes from a plastic-modulus page. This page does not rebuild the section. Transverse shear is its own page."
      },
      "error_ulp": 0,
      "threshold_ulp": 2,
      "ok": true
    },
    {
      "id": "o3-SI",
      "kind": "SI",
      "inputs": {
        "sigma_y": "250e6",
        "Z": "8e-6"
      },
      "expected_f64": {
        "oracle_layer": "analytic",
        "Mp": 2000,
        "sigma_y": 250000000,
        "Z": 0.000008
      },
      "actual": {
        "model": "plastic_moment",
        "sigma_y": 250000000,
        "Z": 0.000008,
        "Mp": 2000,
        "solver": "plastic moment",
        "convention": "Mp = σ_y Z on one centroidal axis. Z comes from a plastic-modulus page. This page does not rebuild the section. Transverse shear is its own page."
      },
      "error_ulp": 0,
      "threshold_ulp": 2,
      "ok": true
    },
    {
      "id": "o3-alias",
      "kind": "alias",
      "inputs": {
        "Fy": "300",
        "plastic_modulus": "12"
      },
      "expected_f64": {
        "oracle_layer": "analytic",
        "Mp": 3600,
        "sigma_y": 300,
        "Z": 12
      },
      "actual": {
        "model": "plastic_moment",
        "sigma_y": 300,
        "Z": 12,
        "Mp": 3600,
        "solver": "plastic moment",
        "convention": "Mp = σ_y Z on one centroidal axis. Z comes from a plastic-modulus page. This page does not rebuild the section. Transverse shear is its own page."
      },
      "error_ulp": 0,
      "threshold_ulp": 2,
      "ok": true
    },
    {
      "id": "o3-awkward",
      "kind": "awkward",
      "inputs": {
        "sigma_y": "255.5",
        "Z": "17.25"
      },
      "expected_f64": {
        "oracle_layer": "analytic",
        "Mp": 4407.375,
        "sigma_y": 255.5,
        "Z": 17.25
      },
      "actual": {
        "model": "plastic_moment",
        "sigma_y": 255.5,
        "Z": 17.25,
        "Mp": 4407.375,
        "solver": "plastic moment",
        "convention": "Mp = σ_y Z on one centroidal axis. Z comes from a plastic-modulus page. This page does not rebuild the section. Transverse shear is its own page."
      },
      "error_ulp": 0,
      "threshold_ulp": 2,
      "ok": true
    },
    {
      "id": "o3-Zx",
      "kind": "Zx",
      "inputs": {
        "sigma_y": "400",
        "Zx": "10"
      },
      "expected_f64": {
        "oracle_layer": "analytic",
        "Mp": 4000,
        "sigma_y": 400,
        "Z": 10
      },
      "actual": {
        "model": "plastic_moment",
        "sigma_y": 400,
        "Z": 10,
        "Mp": 4000,
        "solver": "plastic moment",
        "convention": "Mp = σ_y Z on one centroidal axis. Z comes from a plastic-modulus page. This page does not rebuild the section. Transverse shear is its own page."
      },
      "error_ulp": 0,
      "threshold_ulp": 2,
      "ok": true
    },
    {
      "id": "o3-small",
      "kind": "small",
      "inputs": {
        "sigma_y": "0.5",
        "Z": "0.02"
      },
      "expected_f64": {
        "oracle_layer": "analytic",
        "Mp": 0.01,
        "sigma_y": 0.5,
        "Z": 0.02
      },
      "actual": {
        "model": "plastic_moment",
        "sigma_y": 0.5,
        "Z": 0.02,
        "Mp": 0.01,
        "solver": "plastic moment",
        "convention": "Mp = σ_y Z on one centroidal axis. Z comes from a plastic-modulus page. This page does not rebuild the section. Transverse shear is its own page."
      },
      "error_ulp": 0,
      "threshold_ulp": 2,
      "ok": true
    },
    {
      "id": "o3-large",
      "kind": "large",
      "inputs": {
        "sigma_y": "1e9",
        "Z": "1e-3"
      },
      "expected_f64": {
        "oracle_layer": "analytic",
        "Mp": 1000000,
        "sigma_y": 1000000000,
        "Z": 0.001
      },
      "actual": {
        "model": "plastic_moment",
        "sigma_y": 1000000000,
        "Z": 0.001,
        "Mp": 1000000,
        "solver": "plastic moment",
        "convention": "Mp = σ_y Z on one centroidal axis. Z comes from a plastic-modulus page. This page does not rebuild the section. Transverse shear is its own page."
      },
      "error_ulp": 0,
      "threshold_ulp": 2,
      "ok": true
    },
    {
      "id": "o3-mild",
      "kind": "mild",
      "inputs": {
        "sigma_y": "36",
        "Z": "100"
      },
      "expected_f64": {
        "oracle_layer": "analytic",
        "Mp": 3600,
        "sigma_y": 36,
        "Z": 100
      },
      "actual": {
        "model": "plastic_moment",
        "sigma_y": 36,
        "Z": 100,
        "Mp": 3600,
        "solver": "plastic moment",
        "convention": "Mp = σ_y Z on one centroidal axis. Z comes from a plastic-modulus page. This page does not rebuild the section. Transverse shear is its own page."
      },
      "error_ulp": 0,
      "threshold_ulp": 2,
      "ok": true
    }
  ]
}
