{
  "capability_id": "mechanical.statics.incline_slip_or_tip",
  "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": "incline-slip-or-tip-mpmath-o3",
    "generator_version": "1.0.0",
    "generator_sha256": "9e152b9f51fbbd58bb25f5d550abd28212fcf1377f8723065b2c5f357d175cda",
    "table_sha256": "8ba32e927daed91fa803ce216846427b3ad51cec6c51c83daa50d2c480fd8fbc",
    "seed": "20260927.incline-slip-or-tip-o3",
    "independent_of_iut": true
  },
  "claim_scope": "O2: theta_deg vs a separate-module identity (≤2 ULP). Not a level surface, not wedges, not screws, and not belts. ≤2 ULP vs O3 applies only to the published tabulated incline-slip-or-tip vectors.",
  "commands": {
    "regenerate_table": "python3 generate-incline-slip-or-tip-o3.py",
    "regenerate_table_repo": "python3 scripts/lib/cvp/oracles/generate-incline-slip-or-tip-o3.py",
    "independent_rest": "Compare POST /api/v1/calc/incline-slip-or-tip against /developers/cvp/reproduce/incline-slip-or-tip-o3-tables.json",
    "run_cvp": "npm run cvp:run -- --capability mechanical.statics.incline_slip_or_tip",
    "rest_example": "POST https://www.calculatorx.com/api/v1/calc/incline-slip-or-tip"
  },
  "public_files": {
    "table": "/developers/cvp/reproduce/incline-slip-or-tip-o3-tables.json",
    "table_url": "https://www.calculatorx.com/developers/cvp/reproduce/incline-slip-or-tip-o3-tables.json",
    "generator": "/developers/cvp/reproduce/generate-incline-slip-or-tip-o3.py",
    "generator_url": "https://www.calculatorx.com/developers/cvp/reproduce/generate-incline-slip-or-tip-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.incline_slip_or_tip/1.0.0.cvp.json",
    "this_file": "/evidence/mechanical.statics.incline_slip_or_tip/reproduce.json"
  },
  "result_summary": {
    "passed": 8,
    "total": 8,
    "failed": 0,
    "max_error_ulp": 1,
    "threshold_ulp": 2,
    "max_threshold_ulp": 2
  },
  "vectors": [
    {
      "id": "o3-either",
      "kind": "either",
      "inputs": {
        "mu": "1",
        "b": "2",
        "h": "2"
      },
      "expected_f64": {
        "oracle_layer": "analytic",
        "theta_deg": 45,
        "theta_slip_deg": 45,
        "theta_tip_deg": 45
      },
      "actual": {
        "model": "incline_slip_or_tip",
        "mu": 1,
        "b": 2,
        "h": 2,
        "mode": "either",
        "theta_deg": 45,
        "theta_slip_deg": 45,
        "theta_tip_deg": 45,
        "solver": "incline friction + moment about the downhill edge",
        "convention": "A homogeneous rectangle rests on the incline under its own weight. b is the base along the incline. h is the height perpendicular to the incline. θslip is the friction angle. θtip is the angle where the vertical through the center passes through the downhill edge, so tanθtip = b/h. The smaller angle happens first as the incline is raised."
      },
      "error_ulp": 0,
      "threshold_ulp": 2,
      "ok": true
    },
    {
      "id": "o3-slip",
      "kind": "slip",
      "inputs": {
        "mu": "0.25",
        "b": "2",
        "h": "1"
      },
      "expected_f64": {
        "oracle_layer": "analytic",
        "theta_deg": 14.036243467926479,
        "theta_slip_deg": 14.036243467926479,
        "theta_tip_deg": 63.43494882292201
      },
      "actual": {
        "model": "incline_slip_or_tip",
        "mu": 0.25,
        "b": 2,
        "h": 1,
        "mode": "slip",
        "theta_deg": 14.036243467926479,
        "theta_slip_deg": 14.036243467926479,
        "theta_tip_deg": 63.43494882292201,
        "solver": "incline friction + moment about the downhill edge",
        "convention": "A homogeneous rectangle rests on the incline under its own weight. b is the base along the incline. h is the height perpendicular to the incline. θslip is the friction angle. θtip is the angle where the vertical through the center passes through the downhill edge, so tanθtip = b/h. The smaller angle happens first as the incline is raised."
      },
      "error_ulp": 0,
      "threshold_ulp": 2,
      "ok": true
    },
    {
      "id": "o3-tip",
      "kind": "tip",
      "inputs": {
        "mu": "0.8",
        "b": "1",
        "h": "2"
      },
      "expected_f64": {
        "oracle_layer": "analytic",
        "theta_deg": 26.56505117707799,
        "theta_slip_deg": 38.65980825409009,
        "theta_tip_deg": 26.56505117707799
      },
      "actual": {
        "model": "incline_slip_or_tip",
        "mu": 0.8,
        "b": 1,
        "h": 2,
        "mode": "tip",
        "theta_deg": 26.56505117707799,
        "theta_slip_deg": 38.659808254090095,
        "theta_tip_deg": 26.56505117707799,
        "solver": "incline friction + moment about the downhill edge",
        "convention": "A homogeneous rectangle rests on the incline under its own weight. b is the base along the incline. h is the height perpendicular to the incline. θslip is the friction angle. θtip is the angle where the vertical through the center passes through the downhill edge, so tanθtip = b/h. The smaller angle happens first as the incline is raised."
      },
      "error_ulp": 1,
      "threshold_ulp": 2,
      "ok": true
    },
    {
      "id": "o3-alias",
      "kind": "alias",
      "inputs": {
        "mu_s": "0.5",
        "width": "3",
        "height": "3"
      },
      "expected_f64": {
        "oracle_layer": "analytic",
        "theta_deg": 26.56505117707799,
        "theta_slip_deg": 26.56505117707799,
        "theta_tip_deg": 45
      },
      "actual": {
        "model": "incline_slip_or_tip",
        "mu": 0.5,
        "b": 3,
        "h": 3,
        "mode": "slip",
        "theta_deg": 26.56505117707799,
        "theta_slip_deg": 26.56505117707799,
        "theta_tip_deg": 45,
        "solver": "incline friction + moment about the downhill edge",
        "convention": "A homogeneous rectangle rests on the incline under its own weight. b is the base along the incline. h is the height perpendicular to the incline. θslip is the friction angle. θtip is the angle where the vertical through the center passes through the downhill edge, so tanθtip = b/h. The smaller angle happens first as the incline is raised."
      },
      "error_ulp": 0,
      "threshold_ulp": 2,
      "ok": true
    },
    {
      "id": "o3-awkward",
      "kind": "awkward",
      "inputs": {
        "mu": "0.37",
        "b": "2.5",
        "h": "1.8"
      },
      "expected_f64": {
        "oracle_layer": "analytic",
        "theta_deg": 20.304473709960437,
        "theta_slip_deg": 20.304473709960437,
        "theta_tip_deg": 54.24611274556325
      },
      "actual": {
        "model": "incline_slip_or_tip",
        "mu": 0.37,
        "b": 2.5,
        "h": 1.8,
        "mode": "slip",
        "theta_deg": 20.304473709960437,
        "theta_slip_deg": 20.304473709960437,
        "theta_tip_deg": 54.24611274556325,
        "solver": "incline friction + moment about the downhill edge",
        "convention": "A homogeneous rectangle rests on the incline under its own weight. b is the base along the incline. h is the height perpendicular to the incline. θslip is the friction angle. θtip is the angle where the vertical through the center passes through the downhill edge, so tanθtip = b/h. The smaller angle happens first as the incline is raised."
      },
      "error_ulp": 0,
      "threshold_ulp": 2,
      "ok": true
    },
    {
      "id": "o3-steep",
      "kind": "steep",
      "inputs": {
        "mu": "0.1",
        "b": "0.5",
        "h": "4"
      },
      "expected_f64": {
        "oracle_layer": "analytic",
        "theta_deg": 5.710593137499642,
        "theta_slip_deg": 5.710593137499642,
        "theta_tip_deg": 7.125016348901798
      },
      "actual": {
        "model": "incline_slip_or_tip",
        "mu": 0.1,
        "b": 0.5,
        "h": 4,
        "mode": "slip",
        "theta_deg": 5.710593137499643,
        "theta_slip_deg": 5.710593137499643,
        "theta_tip_deg": 7.125016348901798,
        "solver": "incline friction + moment about the downhill edge",
        "convention": "A homogeneous rectangle rests on the incline under its own weight. b is the base along the incline. h is the height perpendicular to the incline. θslip is the friction angle. θtip is the angle where the vertical through the center passes through the downhill edge, so tanθtip = b/h. The smaller angle happens first as the incline is raised."
      },
      "error_ulp": 1,
      "threshold_ulp": 2,
      "ok": true
    },
    {
      "id": "o3-flat",
      "kind": "flat",
      "inputs": {
        "mu": "0.9",
        "b": "4",
        "h": "0.5"
      },
      "expected_f64": {
        "oracle_layer": "analytic",
        "theta_deg": 41.98721249581666,
        "theta_slip_deg": 41.98721249581666,
        "theta_tip_deg": 82.8749836510982
      },
      "actual": {
        "model": "incline_slip_or_tip",
        "mu": 0.9,
        "b": 4,
        "h": 0.5,
        "mode": "slip",
        "theta_deg": 41.98721249581666,
        "theta_slip_deg": 41.98721249581666,
        "theta_tip_deg": 82.8749836510982,
        "solver": "incline friction + moment about the downhill edge",
        "convention": "A homogeneous rectangle rests on the incline under its own weight. b is the base along the incline. h is the height perpendicular to the incline. θslip is the friction angle. θtip is the angle where the vertical through the center passes through the downhill edge, so tanθtip = b/h. The smaller angle happens first as the incline is raised."
      },
      "error_ulp": 0,
      "threshold_ulp": 2,
      "ok": true
    },
    {
      "id": "o3-mild",
      "kind": "mild",
      "inputs": {
        "mu": "0.3",
        "b": "1.5",
        "h": "1.5"
      },
      "expected_f64": {
        "oracle_layer": "analytic",
        "theta_deg": 16.69924423399362,
        "theta_slip_deg": 16.69924423399362,
        "theta_tip_deg": 45
      },
      "actual": {
        "model": "incline_slip_or_tip",
        "mu": 0.3,
        "b": 1.5,
        "h": 1.5,
        "mode": "slip",
        "theta_deg": 16.69924423399362,
        "theta_slip_deg": 16.69924423399362,
        "theta_tip_deg": 45,
        "solver": "incline friction + moment about the downhill edge",
        "convention": "A homogeneous rectangle rests on the incline under its own weight. b is the base along the incline. h is the height perpendicular to the incline. θslip is the friction angle. θtip is the angle where the vertical through the center passes through the downhill edge, so tanθtip = b/h. The smaller angle happens first as the incline is raised."
      },
      "error_ulp": 0,
      "threshold_ulp": 2,
      "ok": true
    }
  ]
}
