[
 {
  "slug": "pulley-belt-calculator",
  "name": "Default belt length 90/280 mm, C=450 (mm)",
  "reference": "Shigley's MED 10th ed., eq. 17-1 (open-belt length L=√(4C²−(D−d)²)+½(DθD+dθd), θd=π−2asin((D−d)/2C))",
  "steps": [],
  "read": {
   "label": "Belt length",
   "part": "v",
   "index": 0
  },
  "expected": 1501.325699,
  "tol_pct": 0.5
 },
 {
  "slug": "pulley-belt-calculator",
  "name": "Center distance for SPZ 1500 datum belt (mm)",
  "reference": "Shigley's MED 10th ed., eq. 17-1 (open-belt length L=√(4C²−(D−d)²)+½(DθD+dθd), θd=π−2asin((D−d)/2C)) solved for C; ISO 4184 R40 length 1500",
  "steps": [
   {
    "click": "#m-l"
   },
   {
    "fill": "#blen",
    "value": "1500"
   }
  ],
  "read": {
   "label": "Center distance (solved)",
   "part": "v",
   "index": 0
  },
  "expected": 449.321843,
  "tol_pct": 0.5
 },
 {
  "slug": "pulley-belt-calculator",
  "name": "Driven speed (rpm)",
  "reference": "n2=n1·d1/d2 (kinematics)",
  "steps": [],
  "read": {
   "label": "Driven speed",
   "part": "v",
   "index": 0
  },
  "expected": 466.071429,
  "tol_pct": 0.5
 },
 {
  "slug": "pulley-belt-calculator",
  "name": "Belt speed (m/s)",
  "reference": "v=π·d·n/60000",
  "steps": [],
  "read": {
   "label": "Belt speed",
   "part": "v",
   "index": 0
  },
  "expected": 6.832964,
  "tol_pct": 0.5
 },
 {
  "slug": "pulley-belt-calculator",
  "name": "Effective pull Fe (N)",
  "reference": "Fe=P/v",
  "steps": [],
  "read": {
   "label": "Effective belt pull",
   "part": "v",
   "index": 0
  },
  "expected": 321.968621,
  "tol_pct": 0.5
 },
 {
  "slug": "pulley-belt-calculator",
  "name": "Wrap on small pulley (deg)",
  "reference": "Shigley's MED 10th ed., eq. 17-1 (open-belt length L=√(4C²−(D−d)²)+½(DθD+dθd), θd=π−2asin((D−d)/2C)) θd",
  "steps": [],
  "read": {
   "label": "Wrap small pulley",
   "part": "v",
   "index": 0
  },
  "expected": 155.625052,
  "tol_pct": 0.5
 },
 {
  "slug": "pulley-belt-calculator",
  "name": "Shigley Ex. 17-1 (6 in / 18 in, C = 96 in): belt length (in)",
  "reference": "Shigley MED 10th ed. Ex. 17-1 (L = 230.1 in)",
  "steps": [
   {
    "click": "#u-in"
   },
   {
    "click": "#tiles .tile[data-k=any]"
   },
   {
    "fill": "#d1",
    "value": "6"
   },
   {
    "fill": "#d2",
    "value": "18"
   },
   {
    "fill": "#cdist",
    "value": "96"
   },
   {
    "fill": "#rpm",
    "value": "1750"
   },
   {
    "fill": "#kw",
    "value": "11.19"
   }
  ],
  "read": {
   "label": "Belt length",
   "part": "v",
   "index": 0
  },
  "expected": 230.074234,
  "tol_pct": 0.5
 },
 {
  "slug": "pulley-belt-calculator",
  "name": "Shigley Ex. 17-1: belt speed at 1750 rpm (ft/min)",
  "reference": "Shigley MED 10th ed. Ex. 17-1 (V = 2749 ft/min)",
  "steps": [
   {
    "click": "#u-in"
   },
   {
    "click": "#tiles .tile[data-k=any]"
   },
   {
    "fill": "#d1",
    "value": "6"
   },
   {
    "fill": "#d2",
    "value": "18"
   },
   {
    "fill": "#cdist",
    "value": "96"
   },
   {
    "fill": "#rpm",
    "value": "1750"
   },
   {
    "fill": "#kw",
    "value": "11.19"
   }
  ],
  "read": {
   "label": "Belt speed",
   "part": "alt",
   "index": 0
  },
  "expected": 2748.893572,
  "tol_pct": 0.5
 },
 {
  "slug": "pulley-belt-calculator",
  "name": "Shigley Ex. 17-1: small-pulley wrap (deg)",
  "reference": "Shigley MED 10th ed. Ex. 17-1 (φd = 3.0165 rad = 172.83°)",
  "steps": [
   {
    "click": "#u-in"
   },
   {
    "click": "#tiles .tile[data-k=any]"
   },
   {
    "fill": "#d1",
    "value": "6"
   },
   {
    "fill": "#d2",
    "value": "18"
   },
   {
    "fill": "#cdist",
    "value": "96"
   },
   {
    "fill": "#rpm",
    "value": "1750"
   },
   {
    "fill": "#kw",
    "value": "11.19"
   }
  ],
  "read": {
   "label": "Wrap small pulley",
   "part": "v",
   "index": 0
  },
  "expected": 172.832719,
  "tol_pct": 0.5
 },
 {
  "slug": "pulley-belt-calculator",
  "name": "HTD 5M 20T/60T at C=300 mm: pitch length (mm)",
  "reference": "d=z·p/π (Gates HTD), open-belt length eq. 17-1",
  "steps": [
   {
    "click": "#tiles .tile[data-k=\"5M\"]"
   },
   {
    "fill": "#z1",
    "value": "20"
   },
   {
    "fill": "#z2",
    "value": "60"
   },
   {
    "fill": "#cdist",
    "value": "300"
   }
  ],
  "read": {
   "label": "Belt length",
   "part": "v",
   "index": 0
  },
  "expected": 803.380552,
  "tol_pct": 0.5
 },
 {
  "slug": "pulley-belt-calculator",
  "name": "HTD 5M 20T/60T: teeth in mesh on small pulley",
  "reference": "z·θ/360 (Gates design manual, ≥6 teeth)",
  "steps": [
   {
    "click": "#tiles .tile[data-k=\"5M\"]"
   },
   {
    "fill": "#z1",
    "value": "20"
   },
   {
    "fill": "#z2",
    "value": "60"
   },
   {
    "fill": "#cdist",
    "value": "300"
   }
  ],
  "read": {
   "label": "Wrap small pulley",
   "part": "alt",
   "index": 0
  },
  "expected": 9.323252,
  "tol_pct": 0.6
 },
 {
  "slug": "chain-sprocket-calculator",
  "name": "Exact link count 17T/42T 08B at C=450 mm",
  "reference": "Shigley's MED 10th ed. eq. 17-34/17-35 (chain length / center distance)",
  "steps": [],
  "read": {
   "label": "Chain length",
   "part": "alt",
   "index": 0
  },
  "expected": 100.81294,
  "tol_pct": 0.5
 },
 {
  "slug": "chain-sprocket-calculator",
  "name": "Center distance for 102 links (mm)",
  "reference": "Shigley's MED 10th ed. eq. 17-34/17-35 (chain length / center distance)",
  "steps": [],
  "read": {
   "label": "Center distance for 102 links",
   "part": "v",
   "index": 0
  },
  "expected": 457.584859,
  "tol_pct": 0.5
 },
 {
  "slug": "chain-sprocket-calculator",
  "name": "Pitch diameter z17 (mm)",
  "reference": "Dp=p/sin(180°/z) (Machinery's Handbook / Shigley eq. 17-31)",
  "steps": [],
  "read": {
   "selector": "#sp tr:nth-of-type(2) td:nth-of-type(2)",
   "index": 0
  },
  "expected": 69.115828,
  "tol_pct": 0.5
 },
 {
  "slug": "chain-sprocket-calculator",
  "name": "Outside diameter z17 (mm)",
  "reference": "Do=p(0.6+cot(180°/z)) (Machinery's Handbook, ANSI sprocket OD)",
  "steps": [],
  "read": {
   "selector": "#sp tr:nth-of-type(3) td:nth-of-type(2)",
   "index": 0
  },
  "expected": 75.558999,
  "tol_pct": 0.5
 },
 {
  "slug": "chain-sprocket-calculator",
  "name": "Chain speed (m/s)",
  "reference": "v=z1·p·n1/60000 (Shigley eq. 17-32)",
  "steps": [],
  "read": {
   "label": "Chain speed",
   "part": "v",
   "index": 0
  },
  "expected": 2.518833,
  "tol_pct": 0.5
 },
 {
  "slug": "chain-sprocket-calculator",
  "name": "Chain pull (N)",
  "reference": "F=P/v",
  "steps": [],
  "read": {
   "label": "Chain pull",
   "part": "v",
   "index": 0
  },
  "expected": 595.513796,
  "tol_pct": 0.5
 },
 {
  "slug": "chain-sprocket-calculator",
  "name": "Static SF vs ISO 606 08B-1 17.8 kN",
  "reference": "ISO 606:2015 min. tensile 08B-1 = 17.8 kN",
  "steps": [],
  "read": {
   "label": "Chain pull",
   "part": "alt",
   "index": 0
  },
  "expected": 29.890156,
  "tol_pct": 0.5
 },
 {
  "slug": "chain-sprocket-calculator",
  "name": "Wrap on small sprocket at installed C (deg)",
  "reference": "180°−2·asin((D2−D1)/2C) with pitch diameters",
  "steps": [],
  "read": {
   "label": "Wrap small sprocket",
   "part": "v",
   "index": 0
  },
  "expected": 167.349158,
  "tol_pct": 0.5
 },
 {
  "slug": "chain-sprocket-calculator",
  "name": "Chordal speed variation z17 (%)",
  "reference": "Shigley eq. 17-37 / 1−cos(180°/z)",
  "steps": [],
  "read": {
   "selector": "#sp tr:nth-of-type(5) td:nth-of-type(2)",
   "index": 0
  },
  "expected": 1.70269,
  "tol_pct": 0.6
 },
 {
  "slug": "chain-sprocket-calculator",
  "name": "Tsubaki selection example 17T/51T, C = 19 pitches: links (rounded up even)",
  "reference": "U.S. Tsubaki \"Chain Drive Selection\" Step 5 (73.5 → 74 links)",
  "steps": [
   {
    "fill": "#z2",
    "value": "51"
   },
   {
    "fill": "#cdist",
    "value": "241.29999999999998"
   }
  ],
  "read": {
   "label": "Chain length",
   "part": "v",
   "index": 0
  },
  "expected": 74,
  "tol_pct": 0.5
 },
 {
  "slug": "chain-sprocket-calculator",
  "name": "ANSI #40 static SF (break 13.9 kN = 12 500·p² lbf)",
  "reference": "ASME B29.1 min. ultimate tensile 3125 lbf (#40)",
  "steps": [
   {
    "click": "#stdsel button[data-s=ansi]"
   }
  ],
  "read": {
   "label": "Chain pull",
   "part": "alt",
   "index": 0
  },
  "expected": 23.341189,
  "tol_pct": 0.6
 },
 {
  "slug": "cvt-variator-calculator",
  "name": "Low ratio 50 cc preset (41 mm primary)",
  "reference": "Open-belt length L=2C+π(d1+d2)/2+(d2−d1)²/4C solved for d2 (Shigley eq. 17-1 approx.)",
  "steps": [],
  "read": {
   "label": "Ratio range",
   "part": "v",
   "index": 0
  },
  "expected": 2.653716,
  "tol_pct": 0.5
 },
 {
  "slug": "cvt-variator-calculator",
  "name": "Overdrive ratio (92 mm primary)",
  "reference": "Open-belt length L=2C+π(d1+d2)/2+(d2−d1)²/4C solved for d2 (Shigley eq. 17-1 approx.)",
  "steps": [],
  "read": {
   "label": "Ratio range",
   "part": "v",
   "index": 1
  },
  "expected": 0.653575,
  "tol_pct": 0.8
 },
 {
  "slug": "cvt-variator-calculator",
  "name": "Ratio spread",
  "reference": "Open-belt length L=2C+π(d1+d2)/2+(d2−d1)²/4C solved for d2 (Shigley eq. 17-1 approx.)",
  "steps": [],
  "read": {
   "label": "Ratio range",
   "part": "alt",
   "index": 0
  },
  "expected": 4.06031,
  "tol_pct": 0.5
 },
 {
  "slug": "cvt-variator-calculator",
  "name": "Top speed in overdrive at 7500 rpm (km/h)",
  "reference": "v=n/(i·i_f)·π·D_tire",
  "steps": [],
  "read": {
   "label": "Top speed at 7500 rpm",
   "part": "v",
   "index": 0
  },
  "expected": 68.897222,
  "tol_pct": 0.5
 },
 {
  "slug": "cvt-variator-calculator",
  "name": "Speed in lowest ratio (km/h)",
  "reference": "v=n/(i·i_f)·π·D_tire",
  "steps": [],
  "read": {
   "label": "Top speed at 7500 rpm",
   "part": "alt",
   "index": 0
  },
  "expected": 16.968465,
  "tol_pct": 0.5
 },
 {
  "slug": "cvt-variator-calculator",
  "name": "Primary sheave travel (mm)",
  "reference": "x=Δd·tan(α/2) for one moving half (Δr=x·tan(α/2)... geometry of a V-groove)",
  "steps": [],
  "read": {
   "label": "Sheave travel",
   "part": "v",
   "index": 0
  },
  "expected": 12.715728,
  "tol_pct": 0.5
 },
 {
  "slug": "cvt-variator-calculator",
  "name": "Secondary sheave travel (mm)",
  "reference": "x=Δd·tan(α/2)",
  "steps": [],
  "read": {
   "label": "Sheave travel",
   "part": "v",
   "index": 1
  },
  "expected": 12.135662,
  "tol_pct": 0.6
 },
 {
  "slug": "cvt-variator-calculator",
  "name": "Wrap small pulley, low ratio (deg)",
  "reference": "180°−2asin(|D−d|/2C)",
  "steps": [],
  "read": {
   "label": "Belt wrap, small pulley",
   "part": "alt",
   "index": 0
  },
  "expected": 164.092674,
  "tol_pct": 0.5
 },
 {
  "slug": "cvt-variator-calculator",
  "name": "Belt speed in overdrive (m/s)",
  "reference": "v=π·d1·n/60000",
  "steps": [],
  "read": {
   "label": "Belt speed in overdrive",
   "part": "v",
   "index": 0
  },
  "expected": 36.128316,
  "tol_pct": 0.5
 },
 {
  "slug": "cvt-variator-calculator",
  "name": "740 mm belt (secondary-limited): low ratio",
  "reference": "same equation solved for d1 with d2 = 112 mm",
  "steps": [
   {
    "fill": "#L",
    "value": "740"
   }
  ],
  "read": {
   "label": "Ratio range",
   "part": "v",
   "index": 0
  },
  "expected": 2.535901,
  "tol_pct": 0.5
 },
 {
  "slug": "cvt-variator-calculator",
  "name": "740 mm belt: overdrive ratio",
  "reference": "same equation",
  "steps": [
   {
    "fill": "#L",
    "value": "740"
   }
  ],
  "read": {
   "label": "Ratio range",
   "part": "v",
   "index": 1
  },
  "expected": 0.72544,
  "tol_pct": 0.8
 },
 {
  "slug": "gear-calculator",
  "name": "Center distance m2 18/45 (mm)",
  "reference": "ISO 21771: a=m(z1+z2)/2",
  "steps": [],
  "read": {
   "label": "Center distance",
   "part": "v",
   "index": 0
  },
  "expected": 63.0,
  "tol_pct": 0.5
 },
 {
  "slug": "gear-calculator",
  "name": "Contact ratio m2 18/45",
  "reference": "ISO 21771 transverse contact ratio εα",
  "steps": [],
  "read": {
   "label": "Contact ratio",
   "part": "v",
   "index": 0
  },
  "expected": 1.632807,
  "tol_pct": 0.7
 },
 {
  "slug": "gear-calculator",
  "name": "Output torque (N·m)",
  "reference": "T2=T1·i·η, η=0.98 per stated note",
  "steps": [],
  "read": {
   "label": "Output torque",
   "part": "v",
   "index": 0
  },
  "expected": 24.5,
  "tol_pct": 0.5
 },
 {
  "slug": "gear-calculator",
  "name": "Tangential tooth force (N)",
  "reference": "Ft=2000T/d1",
  "steps": [],
  "read": {
   "label": "Tooth force",
   "part": "v",
   "index": 0
  },
  "expected": 555.555556,
  "tol_pct": 0.5
 },
 {
  "slug": "gear-calculator",
  "name": "KHK profile-shift example: working center distance (mm)",
  "reference": "KHK Gear Technical Reference, profile-shifted spur gear example (m3, z12/24, x 0.6/0.36: αw 26.0886°, a 56.4999, da 44.840/79.400, df 32.100/66.660)",
  "steps": [
   {
    "fill": "#mod",
    "value": "3"
   },
   {
    "fill": "#z1",
    "value": "12"
   },
   {
    "fill": "#z2",
    "value": "24"
   },
   {
    "fill": "#x1",
    "value": "0.6"
   },
   {
    "fill": "#x2",
    "value": "0.36"
   }
  ],
  "read": {
   "label": "Center distance",
   "part": "v",
   "index": 0
  },
  "expected": 56.4999,
  "tol_pct": 0.5
 },
 {
  "slug": "gear-calculator",
  "name": "KHK example: working pressure angle (deg)",
  "reference": "KHK Gear Technical Reference, profile-shifted spur gear example (m3, z12/24, x 0.6/0.36: αw 26.0886°, a 56.4999, da 44.840/79.400, df 32.100/66.660)",
  "steps": [
   {
    "fill": "#mod",
    "value": "3"
   },
   {
    "fill": "#z1",
    "value": "12"
   },
   {
    "fill": "#z2",
    "value": "24"
   },
   {
    "fill": "#x1",
    "value": "0.6"
   },
   {
    "fill": "#x2",
    "value": "0.36"
   }
  ],
  "read": {
   "label": "Center distance",
   "part": "alt",
   "index": 1
  },
  "expected": 26.0886,
  "tol_pct": 0.5
 },
 {
  "slug": "gear-calculator",
  "name": "KHK example: tip diameter da1 (mm)",
  "reference": "KHK Gear Technical Reference, profile-shifted spur gear example (m3, z12/24, x 0.6/0.36: αw 26.0886°, a 56.4999, da 44.840/79.400, df 32.100/66.660)",
  "steps": [
   {
    "fill": "#mod",
    "value": "3"
   },
   {
    "fill": "#z1",
    "value": "12"
   },
   {
    "fill": "#z2",
    "value": "24"
   },
   {
    "fill": "#x1",
    "value": "0.6"
   },
   {
    "fill": "#x2",
    "value": "0.36"
   }
  ],
  "read": {
   "selector": "#tbody tr:nth-of-type(4) td:nth-of-type(2)",
   "index": 0
  },
  "expected": 44.84,
  "tol_pct": 0.1
 },
 {
  "slug": "gear-calculator",
  "name": "KHK example: root diameter df2 (mm)",
  "reference": "KHK Gear Technical Reference, profile-shifted spur gear example (m3, z12/24, x 0.6/0.36: αw 26.0886°, a 56.4999, da 44.840/79.400, df 32.100/66.660)",
  "steps": [
   {
    "fill": "#mod",
    "value": "3"
   },
   {
    "fill": "#z1",
    "value": "12"
   },
   {
    "fill": "#z2",
    "value": "24"
   },
   {
    "fill": "#x1",
    "value": "0.6"
   },
   {
    "fill": "#x2",
    "value": "0.36"
   }
  ],
  "read": {
   "selector": "#tbody tr:nth-of-type(5) td:nth-of-type(3)",
   "index": 0
  },
  "expected": 66.66,
  "tol_pct": 0.1
 },
 {
  "slug": "gear-calculator",
  "name": "KHK helical example: center distance (mm)",
  "reference": "KHK Gear Technical Reference, normal-system helical example (mn3, z12/60, β30°, xn 0.09809/0 → a = 125 mm)",
  "steps": [
   {
    "fill": "#mod",
    "value": "3"
   },
   {
    "fill": "#z1",
    "value": "12"
   },
   {
    "fill": "#z2",
    "value": "60"
   },
   {
    "click": "#htiles .tile[data-b=\"30\"]"
   },
   {
    "fill": "#x1",
    "value": "0.09809"
   }
  ],
  "read": {
   "label": "Center distance",
   "part": "v",
   "index": 0
  },
  "expected": 125.000001,
  "tol_pct": 0.5
 },
 {
  "slug": "gear-calculator",
  "name": "KHK helical example: tip diameter da1 (mm)",
  "reference": "KHK Gear Technical Reference, normal-system helical example (mn3, z12/60, β30°, xn 0.09809/0 → a = 125 mm) (da1 = d1 + 2(1+y−xn2)mn)",
  "steps": [
   {
    "fill": "#mod",
    "value": "3"
   },
   {
    "fill": "#z1",
    "value": "12"
   },
   {
    "fill": "#z2",
    "value": "60"
   },
   {
    "click": "#htiles .tile[data-b=\"30\"]"
   },
   {
    "fill": "#x1",
    "value": "0.09809"
   }
  ],
  "read": {
   "selector": "#tbody tr:nth-of-type(8) td:nth-of-type(2)",
   "index": 0
  },
  "expected": 48.153905,
  "tol_pct": 0.2
 },
 {
  "slug": "gear-calculator",
  "name": "FAQ 12/30 m2 x1=0.3: working center distance (mm)",
  "reference": "involute function inv αw = 2tanα·Σx/Σz + inv α (ISO 21771)",
  "steps": [
   {
    "fill": "#z1",
    "value": "12"
   },
   {
    "fill": "#z2",
    "value": "30"
   },
   {
    "fill": "#x1",
    "value": "0.3"
   }
  ],
  "read": {
   "label": "Center distance",
   "part": "v",
   "index": 0
  },
  "expected": 42.571911,
  "tol_pct": 0.5
 },
 {
  "slug": "gear-tooth-strength-calculator",
  "name": "Default pinion bending σF (MPa)",
  "reference": "Shigley's MED 10th ed. ch. 14 (Lewis Y Table 14-2, AGMA Kv eq. 14-27, I eq. 14-23, YN/ZN Figs 14-14/14-15, grade 1 St/Sc Figs 14-2/14-5) Lewis σ=Ft·Ka·Kv·Km/(b·m·Y)",
  "steps": [],
  "read": {
   "label": "Bending, pinion",
   "part": "v",
   "index": 0
  },
  "expected": 126.197802,
  "tol_pct": 0.6
 },
 {
  "slug": "gear-tooth-strength-calculator",
  "name": "Default contact stress σH (MPa)",
  "reference": "Shigley's MED 10th ed. ch. 14 (Lewis Y Table 14-2, AGMA Kv eq. 14-27, I eq. 14-23, YN/ZN Figs 14-14/14-15, grade 1 St/Sc Figs 14-2/14-5) eq. 14-16 with ZE=191 √MPa",
  "steps": [],
  "read": {
   "label": "Contact stress",
   "part": "v",
   "index": 0
  },
  "expected": 784.219825,
  "tol_pct": 0.5
 },
 {
  "slug": "gear-tooth-strength-calculator",
  "name": "Default pinion bending SF (300 HB, 1.74e9 cycles)",
  "reference": "Shigley's MED 10th ed. ch. 14 (Lewis Y Table 14-2, AGMA Kv eq. 14-27, I eq. 14-23, YN/ZN Figs 14-14/14-15, grade 1 St/Sc Figs 14-2/14-5) SF=St·YN/σ",
  "steps": [],
  "read": {
   "label": "Bending, pinion",
   "part": "alt",
   "index": 0
  },
  "expected": 1.825845,
  "tol_pct": 0.6
 },
 {
  "slug": "gear-tooth-strength-calculator",
  "name": "Default pinion SH",
  "reference": "Shigley's MED 10th ed. ch. 14 (Lewis Y Table 14-2, AGMA Kv eq. 14-27, I eq. 14-23, YN/ZN Figs 14-14/14-15, grade 1 St/Sc Figs 14-2/14-5) SH=Sc·ZN/σH",
  "steps": [],
  "read": {
   "label": "Contact stress",
   "part": "alt",
   "index": 0
  },
  "expected": 0.980744,
  "tol_pct": 1.1
 },
 {
  "slug": "gear-tooth-strength-calculator",
  "name": "Shigley Ex. 14-4 spur: transmitted load Wt (lbf)",
  "reference": "Shigley MED 10th ed. Ex. 14-4 (17/52T, Pd 10, F 1.5 in, 1800 rpm, 4 hp, Qv 6, gear 200 HB, 1e8 pinion cycles, R 0.90): Wt 164.8 lbf, Kv 1.377, Ks 1.052 (gear), Km 1.22, JG 0.40, KR 0.85, σG 4854 psi, SF,G 6.82, σc,G 70 660 psi, SH,G 1.52",
  "steps": [
   {
    "click": "#useg button[data-u=i]"
   },
   {
    "fill": "#pw",
    "value": "4"
   },
   {
    "fill": "#n1",
    "value": "1800"
   },
   {
    "fill": "#m",
    "value": "10"
   },
   {
    "fill": "#b",
    "value": "1.5"
   },
   {
    "fill": "#z1",
    "value": "17"
   },
   {
    "fill": "#z2",
    "value": "52"
   },
   {
    "fill": "#hr",
    "value": "925.926"
   },
   {
    "click": "#mtiles .tile[data-i=\"0\"]"
   },
   {
    "click": "#ktiles .tile[data-i=\"0\"]"
   },
   {
    "click": "#qtiles .tile[data-i=\"1\"]"
   }
  ],
  "read": {
   "label": "Tooth force Ft",
   "part": "v",
   "index": 0
  },
  "expected": 164.8,
  "tol_pct": 0.5
 },
 {
  "slug": "gear-tooth-strength-calculator",
  "name": "Shigley Ex. 14-4 contact-stress formula with page factors (Kv 1.304, Km 1.30, Ks=1) (ksi)",
  "reference": "Shigley eq. 14-16 σc=Cp√(Wt·Ko·Kv·Ks·Km·Cf/(dP·F·I)), Cp 2300, I 0.1211",
  "steps": [
   {
    "click": "#useg button[data-u=i]"
   },
   {
    "fill": "#pw",
    "value": "4"
   },
   {
    "fill": "#n1",
    "value": "1800"
   },
   {
    "fill": "#m",
    "value": "10"
   },
   {
    "fill": "#b",
    "value": "1.5"
   },
   {
    "fill": "#z1",
    "value": "17"
   },
   {
    "fill": "#z2",
    "value": "52"
   },
   {
    "fill": "#hr",
    "value": "925.926"
   },
   {
    "click": "#mtiles .tile[data-i=\"0\"]"
   },
   {
    "click": "#ktiles .tile[data-i=\"0\"]"
   },
   {
    "click": "#qtiles .tile[data-i=\"1\"]"
   }
  ],
  "read": {
   "label": "Contact stress",
   "part": "v",
   "index": 0
  },
  "expected": 69.183904,
  "tol_pct": 0.5
 },
 {
  "slug": "gear-tooth-strength-calculator",
  "name": "Shigley Ex. 14-4 gear contact stress (method: Ks=1, Km 1.30, Qv 7; tol 3 %)",
  "reference": "Shigley MED 10th ed. Ex. 14-4 (17/52T, Pd 10, F 1.5 in, 1800 rpm, 4 hp, Qv 6, gear 200 HB, 1e8 pinion cycles, R 0.90): Wt 164.8 lbf, Kv 1.377, Ks 1.052 (gear), Km 1.22, JG 0.40, KR 0.85, σG 4854 psi, SF,G 6.82, σc,G 70 660 psi, SH,G 1.52",
  "steps": [
   {
    "click": "#useg button[data-u=i]"
   },
   {
    "fill": "#pw",
    "value": "4"
   },
   {
    "fill": "#n1",
    "value": "1800"
   },
   {
    "fill": "#m",
    "value": "10"
   },
   {
    "fill": "#b",
    "value": "1.5"
   },
   {
    "fill": "#z1",
    "value": "17"
   },
   {
    "fill": "#z2",
    "value": "52"
   },
   {
    "fill": "#hr",
    "value": "925.926"
   },
   {
    "click": "#mtiles .tile[data-i=\"0\"]"
   },
   {
    "click": "#ktiles .tile[data-i=\"0\"]"
   },
   {
    "click": "#qtiles .tile[data-i=\"1\"]"
   }
  ],
  "read": {
   "label": "Contact stress",
   "part": "v",
   "index": 0
  },
  "expected": 70.66,
  "tol_pct": 3.0
 },
 {
  "slug": "gear-tooth-strength-calculator",
  "name": "Shigley Ex. 14-4 gear bending SF (method: Ks=KR=1, Km 1.30, Lewis Y, Qv 7; tol 10 %)",
  "reference": "Shigley MED 10th ed. Ex. 14-4 (17/52T, Pd 10, F 1.5 in, 1800 rpm, 4 hp, Qv 6, gear 200 HB, 1e8 pinion cycles, R 0.90): Wt 164.8 lbf, Kv 1.377, Ks 1.052 (gear), Km 1.22, JG 0.40, KR 0.85, σG 4854 psi, SF,G 6.82, σc,G 70 660 psi, SH,G 1.52",
  "steps": [
   {
    "click": "#useg button[data-u=i]"
   },
   {
    "fill": "#pw",
    "value": "4"
   },
   {
    "fill": "#n1",
    "value": "1800"
   },
   {
    "fill": "#m",
    "value": "10"
   },
   {
    "fill": "#b",
    "value": "1.5"
   },
   {
    "fill": "#z1",
    "value": "17"
   },
   {
    "fill": "#z2",
    "value": "52"
   },
   {
    "fill": "#hr",
    "value": "925.926"
   },
   {
    "click": "#mtiles .tile[data-i=\"0\"]"
   },
   {
    "click": "#ktiles .tile[data-i=\"0\"]"
   },
   {
    "click": "#qtiles .tile[data-i=\"1\"]"
   }
  ],
  "read": {
   "label": "Bending, pinion",
   "part": "alt",
   "index": 2
  },
  "expected": 6.82,
  "tol_pct": 10.0
 },
 {
  "slug": "gear-tooth-strength-calculator",
  "name": "Shigley Ex. 14-4 gear wear SH (method: Ks=KR=1, CH=1, Km 1.30, Qv 7; tol 15 %)",
  "reference": "Shigley MED 10th ed. Ex. 14-4 (17/52T, Pd 10, F 1.5 in, 1800 rpm, 4 hp, Qv 6, gear 200 HB, 1e8 pinion cycles, R 0.90): Wt 164.8 lbf, Kv 1.377, Ks 1.052 (gear), Km 1.22, JG 0.40, KR 0.85, σG 4854 psi, SF,G 6.82, σc,G 70 660 psi, SH,G 1.52",
  "steps": [
   {
    "click": "#useg button[data-u=i]"
   },
   {
    "fill": "#pw",
    "value": "4"
   },
   {
    "fill": "#n1",
    "value": "1800"
   },
   {
    "fill": "#m",
    "value": "10"
   },
   {
    "fill": "#b",
    "value": "1.5"
   },
   {
    "fill": "#z1",
    "value": "17"
   },
   {
    "fill": "#z2",
    "value": "52"
   },
   {
    "fill": "#hr",
    "value": "925.926"
   },
   {
    "click": "#mtiles .tile[data-i=\"0\"]"
   },
   {
    "click": "#ktiles .tile[data-i=\"0\"]"
   },
   {
    "click": "#qtiles .tile[data-i=\"1\"]"
   }
  ],
  "read": {
   "label": "Contact stress",
   "part": "alt",
   "index": 1
  },
  "expected": 1.52,
  "tol_pct": 15.0
 },
 {
  "slug": "gear-tooth-strength-calculator",
  "name": "Shigley Ex. 14-5 helical: load-sharing ratio mN",
  "reference": "Shigley MED 10th ed. Ex. 14-5 (Ex. 14-4 as helical, ψ 30°, Pn 10): Pt 8.660, dP 1.963 in, V 925 ft/min, Wt 142.7 lbf, Kv 1.404, Km 1.208, mN 0.6895, I 0.195, JG 0.529, σG 2779 psi, SF,G 11.9, σc,G 48 440 psi, SH,G 2.22",
  "steps": [
   {
    "click": "#useg button[data-u=i]"
   },
   {
    "fill": "#pw",
    "value": "4"
   },
   {
    "fill": "#n1",
    "value": "1800"
   },
   {
    "fill": "#m",
    "value": "10"
   },
   {
    "fill": "#b",
    "value": "1.5"
   },
   {
    "fill": "#z1",
    "value": "17"
   },
   {
    "fill": "#z2",
    "value": "52"
   },
   {
    "fill": "#hr",
    "value": "925.926"
   },
   {
    "click": "#mtiles .tile[data-i=\"0\"]"
   },
   {
    "click": "#ktiles .tile[data-i=\"0\"]"
   },
   {
    "click": "#qtiles .tile[data-i=\"1\"]"
   },
   {
    "fill": "#hb",
    "value": "30"
   }
  ],
  "read": {
   "selector": "#chips .chip:nth-of-type(3)",
   "index": 4
  },
  "expected": 0.6895,
  "tol_pct": 1.0
 },
 {
  "slug": "gear-tooth-strength-calculator",
  "name": "Shigley Ex. 14-5 helical gear wear SH (method: Ks=KR=1, CH=1, Km 1.30, Qv 7; tol 16 %)",
  "reference": "Shigley MED 10th ed. Ex. 14-5 (Ex. 14-4 as helical, ψ 30°, Pn 10): Pt 8.660, dP 1.963 in, V 925 ft/min, Wt 142.7 lbf, Kv 1.404, Km 1.208, mN 0.6895, I 0.195, JG 0.529, σG 2779 psi, SF,G 11.9, σc,G 48 440 psi, SH,G 2.22",
  "steps": [
   {
    "click": "#useg button[data-u=i]"
   },
   {
    "fill": "#pw",
    "value": "4"
   },
   {
    "fill": "#n1",
    "value": "1800"
   },
   {
    "fill": "#m",
    "value": "10"
   },
   {
    "fill": "#b",
    "value": "1.5"
   },
   {
    "fill": "#z1",
    "value": "17"
   },
   {
    "fill": "#z2",
    "value": "52"
   },
   {
    "fill": "#hr",
    "value": "925.926"
   },
   {
    "click": "#mtiles .tile[data-i=\"0\"]"
   },
   {
    "click": "#ktiles .tile[data-i=\"0\"]"
   },
   {
    "click": "#qtiles .tile[data-i=\"1\"]"
   },
   {
    "fill": "#hb",
    "value": "30"
   }
  ],
  "read": {
   "label": "Contact stress",
   "part": "alt",
   "index": 1
  },
  "expected": 2.22,
  "tol_pct": 16.0
 },
 {
  "slug": "gear-tooth-strength-calculator",
  "name": "Shigley Ex. 14-5 helical gear bending SF (method: Lewis Y on zv with mn, Ks=KR=1; tol 40 %)",
  "reference": "Shigley MED 10th ed. Ex. 14-5 (Ex. 14-4 as helical, ψ 30°, Pn 10): Pt 8.660, dP 1.963 in, V 925 ft/min, Wt 142.7 lbf, Kv 1.404, Km 1.208, mN 0.6895, I 0.195, JG 0.529, σG 2779 psi, SF,G 11.9, σc,G 48 440 psi, SH,G 2.22",
  "steps": [
   {
    "click": "#useg button[data-u=i]"
   },
   {
    "fill": "#pw",
    "value": "4"
   },
   {
    "fill": "#n1",
    "value": "1800"
   },
   {
    "fill": "#m",
    "value": "10"
   },
   {
    "fill": "#b",
    "value": "1.5"
   },
   {
    "fill": "#z1",
    "value": "17"
   },
   {
    "fill": "#z2",
    "value": "52"
   },
   {
    "fill": "#hr",
    "value": "925.926"
   },
   {
    "click": "#mtiles .tile[data-i=\"0\"]"
   },
   {
    "click": "#ktiles .tile[data-i=\"0\"]"
   },
   {
    "click": "#qtiles .tile[data-i=\"1\"]"
   },
   {
    "fill": "#hb",
    "value": "30"
   }
  ],
  "read": {
   "label": "Bending, pinion",
   "part": "alt",
   "index": 2
  },
  "expected": 11.9,
  "tol_pct": 40.0
 },
 {
  "slug": "worm-gear-calculator",
  "name": "Center distance (mm)",
  "reference": "DIN 3975 a=(d1+d2)/2=(q+z2)m/2",
  "steps": [],
  "read": {
   "label": "Center distance",
   "part": "v",
   "index": 0
  },
  "expected": 62.5,
  "tol_pct": 0.5
 },
 {
  "slug": "worm-gear-calculator",
  "name": "Lead angle (deg)",
  "reference": "DIN 3975 tanγ=z1/q",
  "steps": [],
  "read": {
   "label": "Lead angle",
   "part": "v",
   "index": 0
  },
  "expected": 11.309932,
  "tol_pct": 0.3
 },
 {
  "slug": "worm-gear-calculator",
  "name": "Sliding speed (m/s)",
  "reference": "vs=π·d1·n1/(60000·cosγ)",
  "steps": [],
  "read": {
   "label": "Sliding speed",
   "part": "v",
   "index": 0
  },
  "expected": 1.935634,
  "tol_pct": 0.5
 },
 {
  "slug": "worm-gear-calculator",
  "name": "Efficiency with AGMA friction (%)",
  "reference": "DIN 3975 geometry; AGMA 6034 / Shigley eq. 15-38 friction; η=tanγ/tan(γ+ρ′) ≡ Shigley eq. 13-46",
  "steps": [],
  "read": {
   "label": "Efficiency",
   "part": "v",
   "index": 0
  },
  "expected": 84.508446,
  "tol_pct": 0.5
 },
 {
  "slug": "worm-gear-calculator",
  "name": "Output torque (N·m)",
  "reference": "T2=9549P/n1·i·η",
  "steps": [],
  "read": {
   "label": "Output torque",
   "part": "v",
   "index": 0
  },
  "expected": 166.959549,
  "tol_pct": 0.5
 },
 {
  "slug": "worm-gear-calculator",
  "name": "Heat to remove (W)",
  "reference": "P(1−η)",
  "steps": [],
  "read": {
   "label": "Heat to remove",
   "part": "v",
   "index": 0
  },
  "expected": 232.373304,
  "tol_pct": 0.6
 },
 {
  "slug": "worm-gear-calculator",
  "name": "Shigley worm example: efficiency (%)",
  "reference": "Shigley MED ch. 15 worm example (1 start, 75T, px 0.375 in, dW 2 in, 1750 rpm): λ 3.42°, Vs 917.9 ft/min, f 0.0216, e 0.721, C 5.476 in (https://gennonotes.github.io/EMEC-4438/EngDes2-W13.pdf)",
  "steps": [
   {
    "click": "#stiles .tile[data-z=\"1\"]"
   },
   {
    "fill": "#z2",
    "value": "75"
   },
   {
    "fill": "#mod",
    "value": "3.0319"
   },
   {
    "fill": "#q",
    "value": "16.7552"
   },
   {
    "fill": "#rpm",
    "value": "1750"
   }
  ],
  "read": {
   "label": "Efficiency",
   "part": "v",
   "index": 0
  },
  "expected": 72.06,
  "tol_pct": 0.5
 },
 {
  "slug": "worm-gear-calculator",
  "name": "Shigley worm example: AGMA friction f",
  "reference": "Shigley MED ch. 15 worm example (1 start, 75T, px 0.375 in, dW 2 in, 1750 rpm): λ 3.42°, Vs 917.9 ft/min, f 0.0216, e 0.721, C 5.476 in (https://gennonotes.github.io/EMEC-4438/EngDes2-W13.pdf)",
  "steps": [
   {
    "click": "#stiles .tile[data-z=\"1\"]"
   },
   {
    "fill": "#z2",
    "value": "75"
   },
   {
    "fill": "#mod",
    "value": "3.0319"
   },
   {
    "fill": "#q",
    "value": "16.7552"
   },
   {
    "fill": "#rpm",
    "value": "1750"
   }
  ],
  "read": {
   "label": "Efficiency",
   "part": "alt",
   "index": 0
  },
  "expected": 0.0216,
  "tol_pct": 2.5
 },
 {
  "slug": "worm-gear-calculator",
  "name": "Shigley worm example: sliding speed (m/s; 917.9 ft/min)",
  "reference": "Shigley MED ch. 15 worm example (1 start, 75T, px 0.375 in, dW 2 in, 1750 rpm): λ 3.42°, Vs 917.9 ft/min, f 0.0216, e 0.721, C 5.476 in (https://gennonotes.github.io/EMEC-4438/EngDes2-W13.pdf)",
  "steps": [
   {
    "click": "#stiles .tile[data-z=\"1\"]"
   },
   {
    "fill": "#z2",
    "value": "75"
   },
   {
    "fill": "#mod",
    "value": "3.0319"
   },
   {
    "fill": "#q",
    "value": "16.7552"
   },
   {
    "fill": "#rpm",
    "value": "1750"
   }
  ],
  "read": {
   "label": "Sliding speed",
   "part": "v",
   "index": 0
  },
  "expected": 4.662941,
  "tol_pct": 0.5
 },
 {
  "slug": "worm-gear-calculator",
  "name": "Shigley worm example: center distance (in)",
  "reference": "Shigley MED ch. 15 worm example (1 start, 75T, px 0.375 in, dW 2 in, 1750 rpm): λ 3.42°, Vs 917.9 ft/min, f 0.0216, e 0.721, C 5.476 in (https://gennonotes.github.io/EMEC-4438/EngDes2-W13.pdf)",
  "steps": [
   {
    "click": "#stiles .tile[data-z=\"1\"]"
   },
   {
    "fill": "#z2",
    "value": "75"
   },
   {
    "fill": "#mod",
    "value": "3.0319"
   },
   {
    "fill": "#q",
    "value": "16.7552"
   },
   {
    "fill": "#rpm",
    "value": "1750"
   }
  ],
  "read": {
   "label": "Center distance",
   "part": "alt",
   "index": 0
  },
  "expected": 5.476,
  "tol_pct": 0.3
 },
 {
  "slug": "worm-gear-calculator",
  "name": "Static friction angle for self-locking (deg), 1-start q=10",
  "reference": "AGMA static f=0.15 → ρ′=atan(0.15/cos20°)",
  "steps": [
   {
    "click": "#stiles .tile[data-z=\"1\"]"
   }
  ],
  "read": {
   "selector": "#lock span",
   "index": 1
  },
  "expected": 9.069419,
  "tol_pct": 0.5
 },
 {
  "slug": "planetary-gear-calculator",
  "name": "Ratio, ring held (21/27/75)",
  "reference": "Willis equation (KHK Gear Technical Reference, planetary gear systems): i=1+Zr/Zs",
  "steps": [],
  "read": {
   "label": "Ratio",
   "part": "v",
   "index": 0
  },
  "expected": 4.571429,
  "tol_pct": 0.3
 },
 {
  "slug": "planetary-gear-calculator",
  "name": "Carrier speed (rpm)",
  "reference": "Willis equation (KHK Gear Technical Reference, planetary gear systems)",
  "steps": [],
  "read": {
   "label": "Output speed",
   "part": "v",
   "index": 0
  },
  "expected": 656.25,
  "tol_pct": 0.5
 },
 {
  "slug": "planetary-gear-calculator",
  "name": "Output torque (N·m)",
  "reference": "T·i·0.97 (stated η)",
  "steps": [],
  "read": {
   "label": "Output torque",
   "part": "v",
   "index": 0
  },
  "expected": 22.171429,
  "tol_pct": 0.5
 },
 {
  "slug": "planetary-gear-calculator",
  "name": "Ring reaction (N·m)",
  "reference": "torque balance Tout−Tin",
  "steps": [],
  "read": {
   "label": "Held part reaction",
   "part": "v",
   "index": 0
  },
  "expected": 17.171429,
  "tol_pct": 0.6
 },
 {
  "slug": "planetary-gear-calculator",
  "name": "Planet speed relative to carrier (rpm)",
  "reference": "Willis equation (KHK Gear Technical Reference, planetary gear systems): (ns−nc)Zs/Zp",
  "steps": [],
  "read": {
   "label": "Planet bearing speed",
   "part": "v",
   "index": 0
  },
  "expected": 1822.916667,
  "tol_pct": 0.5
 },
 {
  "slug": "planetary-gear-calculator",
  "name": "Sun-to-planet center distance (mm)",
  "reference": "a=m(Zs+Zp)/2",
  "steps": [],
  "read": {
   "label": "Center distance",
   "part": "v",
   "index": 0
  },
  "expected": 36.0,
  "tol_pct": 0.3
 },
 {
  "slug": "planetary-gear-calculator",
  "name": "KHK example Zs16/Zp16/Zr48, ring fixed, N=4: ratio",
  "reference": "KHK Gear Technical Reference planetary example (i = 1+Zr/Zs = 4)",
  "steps": [
   {
    "fill": "#zs",
    "value": "16"
   },
   {
    "fill": "#zp",
    "value": "16"
   },
   {
    "click": "#nseg button[data-n=\"4\"]"
   }
  ],
  "read": {
   "label": "Ratio",
   "part": "v",
   "index": 0
  },
  "expected": 4,
  "tol_pct": 0.3
 },
 {
  "slug": "planetary-gear-calculator",
  "name": "Sun held, ring → carrier ratio",
  "reference": "Willis equation (KHK Gear Technical Reference, planetary gear systems): 1+Zs/Zr",
  "steps": [
   {
    "click": "#ctiles .tile[data-k=s-rc]"
   }
  ],
  "read": {
   "label": "Ratio",
   "part": "v",
   "index": 0
  },
  "expected": 1.28,
  "tol_pct": 0.3
 },
 {
  "slug": "planetary-gear-calculator",
  "name": "Carrier held, sun → ring ratio (magnitude, reversed)",
  "reference": "Willis equation (KHK Gear Technical Reference, planetary gear systems): −Zr/Zs",
  "steps": [
   {
    "click": "#ctiles .tile[data-k=c-sr]"
   }
  ],
  "read": {
   "label": "Ratio",
   "part": "v",
   "index": 0
  },
  "expected": 3.571429,
  "tol_pct": 0.3
 },
 {
  "slug": "planetary-gear-calculator",
  "name": "Carrier held: carrier reaction (N·m)",
  "reference": "torque balance Ts+Tr+Tc=0",
  "steps": [
   {
    "click": "#ctiles .tile[data-k=c-sr]"
   }
  ],
  "read": {
   "label": "Held part reaction",
   "part": "v",
   "index": 0
  },
  "expected": 22.321429,
  "tol_pct": 0.6
 },
 {
  "slug": "rack-and-pinion-calculator",
  "name": "Travel per pinion turn (mm)",
  "reference": "KHK Gear Technical Reference (rack & pinion: travel per turn = π·m·z)",
  "steps": [],
  "read": {
   "label": "Travel per pinion turn",
   "part": "v",
   "index": 0
  },
  "expected": 125.663706,
  "tol_pct": 0.3
 },
 {
  "slug": "rack-and-pinion-calculator",
  "name": "Linear speed (mm/s)",
  "reference": "v=s·n/60",
  "steps": [],
  "read": {
   "label": "Linear speed",
   "part": "v",
   "index": 0
  },
  "expected": 125.663706,
  "tol_pct": 0.5
 },
 {
  "slug": "rack-and-pinion-calculator",
  "name": "Rack force (N)",
  "reference": "F=2T/d",
  "steps": [],
  "read": {
   "label": "Rack force",
   "part": "v",
   "index": 0
  },
  "expected": 500.0,
  "tol_pct": 0.5
 },
 {
  "slug": "rack-and-pinion-calculator",
  "name": "Separating force (N)",
  "reference": "Fr=F·tan20°",
  "steps": [],
  "read": {
   "label": "Rack force",
   "part": "alt",
   "index": 0
  },
  "expected": 181.985117,
  "tol_pct": 0.5
 },
 {
  "slug": "rack-and-pinion-calculator",
  "name": "Turns for 500 mm stroke",
  "reference": "stroke/s",
  "steps": [],
  "read": {
   "label": "Turns for the stroke",
   "part": "v",
   "index": 0
  },
  "expected": 3.978874,
  "tol_pct": 0.5
 },
 {
  "slug": "rack-and-pinion-calculator",
  "name": "Rack length (mm)",
  "reference": "stroke+2p+40 (rule stated in notes)",
  "steps": [],
  "read": {
   "label": "Rack length",
   "part": "v",
   "index": 0
  },
  "expected": 552.566371,
  "tol_pct": 0.5
 },
 {
  "slug": "rack-and-pinion-calculator",
  "name": "Resolution, 200 steps direct (µm/step)",
  "reference": "s/(steps·gr)",
  "steps": [],
  "read": {
   "label": "Resolution",
   "part": "v",
   "index": 0
  },
  "expected": 628.318531,
  "tol_pct": 0.5
 },
 {
  "slug": "rack-and-pinion-calculator",
  "name": "Resolution with 5:1 gearbox (µm/step)",
  "reference": "s/(steps·gr)",
  "steps": [
   {
    "fill": "#gr",
    "value": "5"
   }
  ],
  "read": {
   "label": "Resolution",
   "part": "v",
   "index": 0
  },
  "expected": 125.663706,
  "tol_pct": 0.5
 },
 {
  "slug": "motor-speed-vfd-calculator",
  "name": "Synchronous speed 4-pole 50 Hz (rpm)",
  "reference": "IEC 60034-1 / ns=120f/p, T=9549P/n",
  "steps": [],
  "read": {
   "label": "Synchronous speed",
   "part": "v",
   "index": 0
  },
  "expected": 1500,
  "tol_pct": 0.3
 },
 {
  "slug": "motor-speed-vfd-calculator",
  "name": "Slip (%)",
  "reference": "IEC 60034-1 / ns=120f/p, T=9549P/n",
  "steps": [],
  "read": {
   "label": "Slip",
   "part": "v",
   "index": 0
  },
  "expected": 4.0,
  "tol_pct": 0.3
 },
 {
  "slug": "motor-speed-vfd-calculator",
  "name": "Rated torque 4 kW @1440 (N·m)",
  "reference": "IEC 60034-1 / ns=120f/p, T=9549P/n",
  "steps": [],
  "read": {
   "label": "Rated torque",
   "part": "v",
   "index": 0
  },
  "expected": 26.525,
  "tol_pct": 0.5
 },
 {
  "slug": "motor-speed-vfd-calculator",
  "name": "Speed at 35 Hz, constant torque (rpm)",
  "reference": "constant slip-speed approximation n=120f/p−Δn",
  "steps": [
   {
    "fill": "#fv",
    "value": "35"
   }
  ],
  "read": {
   "label": "Shaft speed at 35 Hz",
   "part": "v",
   "index": 0
  },
  "expected": 990,
  "tol_pct": 0.3
 },
 {
  "slug": "motor-speed-vfd-calculator",
  "name": "Power at 35 Hz (kW)",
  "reference": "P=T·n/9549",
  "steps": [
   {
    "fill": "#fv",
    "value": "35"
   }
  ],
  "read": {
   "label": "Shaft power",
   "part": "v",
   "index": 0
  },
  "expected": 2.75,
  "tol_pct": 0.5
 },
 {
  "slug": "motor-speed-vfd-calculator",
  "name": "Voltage at 35 Hz (V)",
  "reference": "V/f constant",
  "steps": [
   {
    "fill": "#fv",
    "value": "35"
   }
  ],
  "read": {
   "label": "Motor voltage",
   "part": "v",
   "index": 0
  },
  "expected": 280,
  "tol_pct": 0.3
 },
 {
  "slug": "motor-speed-vfd-calculator",
  "name": "Available torque at 75 Hz (N·m)",
  "reference": "constant-power field weakening T=Tr·fb/f",
  "steps": [
   {
    "fill": "#fv",
    "value": "75"
   }
  ],
  "read": {
   "label": "Torque available",
   "part": "v",
   "index": 0
  },
  "expected": 17.683333,
  "tol_pct": 0.5
 },
 {
  "slug": "motor-speed-vfd-calculator",
  "name": "Fan load at 35 Hz: load torque (N·m)",
  "reference": "affinity law T∝n², slip ∝ torque",
  "steps": [
   {
    "click": "#ltiles .tile[data-l=vt]"
   },
   {
    "fill": "#fv",
    "value": "35"
   }
  ],
  "read": {
   "label": "Load torque",
   "part": "v",
   "index": 0
  },
  "expected": 13.305984,
  "tol_pct": 0.6
 },
 {
  "slug": "motor-speed-vfd-calculator",
  "name": "Speed at 75 Hz in field weakening (method: slip not scaled for weakened flux; tol 2.5 %)",
  "reference": "induction-motor slip ∝ T/Φ², Φ∝fb/f → slip 90 rpm",
  "steps": [
   {
    "fill": "#fv",
    "value": "75"
   }
  ],
  "read": {
   "label": "Shaft speed at 75 Hz",
   "part": "v",
   "index": 0
  },
  "expected": 2160.0,
  "tol_pct": 2.5
 },
 {
  "slug": "motor-speed-vfd-calculator",
  "name": "FAQ: 7.5 kW @1460 rpm rated torque (N·m)",
  "reference": "IEC 60034-1 / ns=120f/p, T=9549P/n",
  "steps": [
   {
    "fill": "#nr",
    "value": "1460"
   },
   {
    "fill": "#kw",
    "value": "7.5"
   }
  ],
  "read": {
   "label": "Rated torque",
   "part": "v",
   "index": 0
  },
  "expected": 49.053082,
  "tol_pct": 0.5
 },
 {
  "slug": "hydraulic-cylinder-calculator",
  "name": "Push force @160 bar (kN)",
  "reference": "Bosch Rexroth CDT3 data sheet RE 17032 (63/36: A1 31.17 cm², A3 20.99 cm², 160 bar push 49.87 kN / pull 33.58 kN, 18.7 L/min ≙ 0.1 m/s)",
  "steps": [],
  "read": {
   "label": "Push force",
   "part": "v",
   "index": 0
  },
  "expected": 49.87,
  "tol_pct": 0.5
 },
 {
  "slug": "hydraulic-cylinder-calculator",
  "name": "Pull force @160 bar (kN)",
  "reference": "Bosch Rexroth CDT3 data sheet RE 17032 (63/36: A1 31.17 cm², A3 20.99 cm², 160 bar push 49.87 kN / pull 33.58 kN, 18.7 L/min ≙ 0.1 m/s)",
  "steps": [],
  "read": {
   "label": "Pull force",
   "part": "v",
   "index": 0
  },
  "expected": 33.58,
  "tol_pct": 0.5
 },
 {
  "slug": "hydraulic-cylinder-calculator",
  "name": "Extend speed @18.7 L/min (mm/s)",
  "reference": "Bosch Rexroth CDT3 data sheet RE 17032 (63/36: A1 31.17 cm², A3 20.99 cm², 160 bar push 49.87 kN / pull 33.58 kN, 18.7 L/min ≙ 0.1 m/s)",
  "steps": [
   {
    "fill": "#Q",
    "value": "18.7"
   }
  ],
  "read": {
   "label": "Extend",
   "part": "v",
   "index": 0
  },
  "expected": 100,
  "tol_pct": 0.5
 },
 {
  "slug": "hydraulic-cylinder-calculator",
  "name": "Retract speed @20 L/min (mm/s)",
  "reference": "v=Q/A2 (ISO 4413 basics)",
  "steps": [],
  "read": {
   "label": "Retract",
   "part": "v",
   "index": 0
  },
  "expected": 158.777846,
  "tol_pct": 0.5
 },
 {
  "slug": "hydraulic-cylinder-calculator",
  "name": "Return flow retracting (L/min)",
  "reference": "Q·A1/A2",
  "steps": [],
  "read": {
   "label": "Return flow",
   "part": "v",
   "index": 0
  },
  "expected": 29.69697,
  "tol_pct": 0.5
 },
 {
  "slug": "hydraulic-cylinder-calculator",
  "name": "Return flow extending (L/min)",
  "reference": "Q·A2/A1",
  "steps": [],
  "read": {
   "label": "Return flow",
   "part": "alt",
   "index": 0
  },
  "expected": 13.469388,
  "tol_pct": 0.8
 },
 {
  "slug": "hydraulic-cylinder-calculator",
  "name": "Pump power @160 bar, 20 L/min, η 0.85 (kW)",
  "reference": "P=p·Q/(600η)",
  "steps": [],
  "read": {
   "label": "Pump power",
   "part": "v",
   "index": 0
  },
  "expected": 6.27451,
  "tol_pct": 0.5
 },
 {
  "slug": "hydraulic-cylinder-calculator",
  "name": "Buckling utilisation, pinned–pinned (%)",
  "reference": "Euler Fk=π²EI/(KL)², E 210 GPa, L=s+1.5D, S=3.5 (Rexroth buckling method)",
  "steps": [],
  "read": {
   "selector": "#chips",
   "index": 3
  },
  "expected": 36.100415,
  "tol_pct": 1.5
 },
 {
  "slug": "hydraulic-cylinder-calculator",
  "name": "Pressure needed for 40 kN (bar)",
  "reference": "p=F/A1",
  "steps": [],
  "read": {
   "selector": "#chips",
   "index": 1
  },
  "expected": 128.318422,
  "tol_pct": 0.5
 },
 {
  "slug": "hydraulic-cylinder-calculator",
  "name": "Regenerative extend force (kN)",
  "reference": "F=p·A_rod",
  "steps": [
   {
    "click": "#ctiles .tile[data-c=regen]"
   }
  ],
  "read": {
   "label": "Push force",
   "part": "v",
   "index": 0
  },
  "expected": 16.286016,
  "tol_pct": 0.5
 },
 {
  "slug": "hydraulic-cylinder-calculator",
  "name": "Regenerative extend speed (mm/s)",
  "reference": "v=Q/A_rod",
  "steps": [
   {
    "click": "#ctiles .tile[data-c=regen]"
   }
  ],
  "read": {
   "label": "Extend",
   "part": "v",
   "index": 0
  },
  "expected": 327.479307,
  "tol_pct": 0.5
 },
 {
  "slug": "lead-screw-calculator",
  "name": "Default ball 16x5, F 2000 N: drive torque N·m, T = F·d2/2·tan(λ+ρ'), μ 0.005",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) eq. 8-1 (power screw torque)",
  "steps": [],
  "read": {
   "label": "Drive torque",
   "part": "v",
   "index": 0
  },
  "expected": 1.6724,
  "tol_pct": 0.5
 },
 {
  "slug": "lead-screw-calculator",
  "name": "Default ball 16x5: efficiency %",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) eq. 8-4 (e = tanλ/tan(λ+ρ'))",
  "steps": [],
  "read": {
   "label": "Efficiency",
   "part": "v",
   "index": 0
  },
  "expected": 95.167,
  "tol_pct": 0.5
 },
 {
  "slug": "lead-screw-calculator",
  "name": "Default critical speed rpm, fixed-supported, dr 12.2 mm (λ2 15.1 incl. 0.8 SF)",
  "reference": "THK ball screw catalogue, permissible rotational speed n = λ2·d1/L²·10^7",
  "steps": [],
  "read": {
   "label": "Critical speed",
   "part": "v",
   "index": 0
  },
  "expected": 2878.4,
  "tol_pct": 0.5
 },
 {
  "slug": "lead-screw-calculator",
  "name": "Default buckling limit N (η2 10.2 incl. 0.5 SF)",
  "reference": "THK ball screw catalogue, permissible axial load P = η2·d1^4/L²·10^4",
  "steps": [],
  "read": {
   "label": "Buckling limit",
   "part": "v",
   "index": 0
  },
  "expected": 3530.7,
  "tol_pct": 0.5
 },
 {
  "slug": "lead-screw-calculator",
  "name": "Default steps per mm (200 steps × 16 µsteps / 5 mm)",
  "reference": "Definition",
  "steps": [],
  "read": {
   "label": "Steps per mm",
   "part": "v",
   "index": 0
  },
  "expected": 640,
  "tol_pct": 0.5
 },
 {
  "slug": "lead-screw-calculator",
  "name": "Published: Shigley Example 8-1 (32 mm square thread, p 4, double start, f 0.08, F 6.4 kN): raising torque, thread only, N·m (page run as Tr with μ = 0.08·cos15° so ρ' = atan 0.08, starts 2)",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Example 8-1 (TR = 15.94 N·m)",
  "steps": [
   {
    "click": "#ttiles > button:nth-of-type(2)"
   },
   {
    "fill": "#d",
    "value": "32"
   },
   {
    "fill": "#lead",
    "value": "8"
   },
   {
    "fill": "#ns",
    "value": "2"
   },
   {
    "fill": "#mu",
    "value": "0.077274"
   },
   {
    "fill": "#F",
    "value": "6400"
   }
  ],
  "read": {
   "label": "Drive torque",
   "part": "v",
   "index": 0
  },
  "expected": 15.94,
  "tol_pct": 0.5
 },
 {
  "slug": "lead-screw-calculator",
  "name": "Shigley Example 8-1: lead angle λ ° (dm 30 mm, l 8 mm)",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Example 8-1",
  "steps": [
   {
    "click": "#ttiles > button:nth-of-type(2)"
   },
   {
    "fill": "#d",
    "value": "32"
   },
   {
    "fill": "#lead",
    "value": "8"
   },
   {
    "fill": "#ns",
    "value": "2"
   },
   {
    "fill": "#mu",
    "value": "0.077274"
   },
   {
    "fill": "#F",
    "value": "6400"
   }
  ],
  "read": {
   "label": "Efficiency",
   "part": "alt",
   "index": 0
  },
  "expected": 4.852,
  "tol_pct": 0.5
 },
 {
  "slug": "lead-screw-calculator",
  "name": "Tr16x4 μ 0.12, F 2000 N: drive torque N·m",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) eq. 8-1 with ρ' = atan(μ/cos15°)",
  "steps": [
   {
    "click": "#ttiles > button:nth-of-type(2)"
   }
  ],
  "read": {
   "label": "Drive torque",
   "part": "v",
   "index": 0
  },
  "expected": 3.0469,
  "tol_pct": 0.5
 },
 {
  "slug": "lead-screw-calculator",
  "name": "Tr30x6 root diameter d3 mm (d − P − 2ac, ac 0.5)",
  "reference": "ISO 2904 (RoyMech trapezoidal table, d3 = 23.0)",
  "steps": [
   {
    "click": "#ttiles > button:nth-of-type(2)"
   },
   {
    "click": "#stiles > button:nth-of-type(8)"
   }
  ],
  "read": {
   "label": "Buckling limit",
   "part": "alt",
   "index": 0
  },
  "expected": 23.0,
  "tol_pct": 0.5
 },
 {
  "slug": "lead-screw-calculator",
  "name": "Tr8x1.5 root diameter d3 mm (ac 0.15)",
  "reference": "ISO 2904 (d3 = 6.2)",
  "steps": [
   {
    "click": "#ttiles > button:nth-of-type(2)"
   },
   {
    "click": "#stiles > button:nth-of-type(1)"
   }
  ],
  "read": {
   "label": "Buckling limit",
   "part": "alt",
   "index": 0
  },
  "expected": 6.2,
  "tol_pct": 0.5
 },
 {
  "slug": "lead-screw-calculator",
  "name": "Tr40x7 root diameter d3 mm (ac 0.5)",
  "reference": "ISO 2904 (d3 = 32.0)",
  "steps": [
   {
    "click": "#ttiles > button:nth-of-type(2)"
   },
   {
    "click": "#stiles > button:nth-of-type(9)"
   }
  ],
  "read": {
   "label": "Buckling limit",
   "part": "alt",
   "index": 0
  },
  "expected": 32.0,
  "tol_pct": 0.5
 },
 {
  "slug": "lead-screw-calculator",
  "name": "Tr8x8 P2 (4 starts): lead angle ° (d2 = 8 − 2/2 = 7)",
  "reference": "ISO 2904 d2 = d − P/2; λ = atan(Ph/(π d2))",
  "steps": [
   {
    "click": "#ttiles > button:nth-of-type(2)"
   },
   {
    "click": "#stiles > button:nth-of-type(2)"
   }
  ],
  "read": {
   "label": "Efficiency",
   "part": "alt",
   "index": 0
  },
  "expected": 19.991,
  "tol_pct": 0.5
 },
 {
  "slug": "block-and-tackle-calculator",
  "name": "Default 200 kg, 4 parts, η 0.96, pulled down from top block: pull N",
  "reference": "Sheave-friction (lead-line) method: W = P·Σηᵏ, Crosby \"How to figure line parts\" LF = Kᴺ(K−1)/(Kᴺ−1), η = 1/K",
  "steps": [],
  "read": {
   "label": "Pull force",
   "part": "v",
   "index": 0
  },
  "expected": 542.45,
  "tol_pct": 0.5
 },
 {
  "slug": "block-and-tackle-calculator",
  "name": "Default top anchor load N (W + P)",
  "reference": "Statics",
  "steps": [],
  "read": {
   "label": "Top anchor load",
   "part": "v",
   "index": 0
  },
  "expected": 2503.8,
  "tol_pct": 0.5
 },
 {
  "slug": "block-and-tackle-calculator",
  "name": "Default rope to pull m (4 × 2 m)",
  "reference": "Kinematics",
  "steps": [],
  "read": {
   "label": "Rope to pull",
   "part": "v",
   "index": 0
  },
  "expected": 8.0,
  "tol_pct": 0.5
 },
 {
  "slug": "block-and-tackle-calculator",
  "name": "Default friction loss % (1 − MA/n = 9.61 %, page shows whole %)",
  "reference": "Energy balance",
  "steps": [],
  "read": {
   "label": "Lost to friction",
   "part": "v",
   "index": 0
  },
  "expected": 9.61,
  "tol_pct": 5
 },
 {
  "slug": "block-and-tackle-calculator",
  "name": "Pull-up from moving block, 4 parts: pull N (Σηᵏ, k = 0..3)",
  "reference": "Sheave-friction (lead-line) method: W = P·Σηᵏ, Crosby \"How to figure line parts\" LF = Kᴺ(K−1)/(Kᴺ−1), η = 1/K",
  "steps": [
   {
    "click": "#leadseg > button:nth-of-type(2)"
   }
  ],
  "read": {
   "label": "Pull force",
   "part": "v",
   "index": 0
  },
  "expected": 520.75,
  "tol_pct": 0.5
 },
 {
  "slug": "block-and-tackle-calculator",
  "name": "Pull-up from moving block: top anchor load N (W − P)",
  "reference": "Statics",
  "steps": [
   {
    "click": "#leadseg > button:nth-of-type(2)"
   }
  ],
  "read": {
   "label": "Top anchor load",
   "part": "v",
   "index": 0
  },
  "expected": 1440.6,
  "tol_pct": 0.5
 },
 {
  "slug": "block-and-tackle-calculator",
  "name": "6 parts pulled down: pull N",
  "reference": "Sheave-friction (lead-line) method: W = P·Σηᵏ, Crosby \"How to figure line parts\" LF = Kᴺ(K−1)/(Kᴺ−1), η = 1/K",
  "steps": [
   {
    "click": "#ntiles > button:nth-of-type(6)"
   }
  ],
  "read": {
   "label": "Pull force",
   "part": "v",
   "index": 0
  },
  "expected": 376.18,
  "tol_pct": 0.5
 },
 {
  "slug": "block-and-tackle-calculator",
  "name": "8 parts over carabiners (η 0.5): real mechanical advantage (0.996, shown to 2 decimals)",
  "reference": "Sheave-friction (lead-line) method: W = P·Σηᵏ, Crosby \"How to figure line parts\" LF = Kᴺ(K−1)/(Kᴺ−1), η = 1/K",
  "steps": [
   {
    "click": "#ntiles > button:nth-of-type(8)"
   },
   {
    "click": "#etiles > button:nth-of-type(4)"
   }
  ],
  "read": {
   "selector": "#bigma b",
   "index": 0
  },
  "expected": 0.9961,
  "tol_pct": 0.5
 },
 {
  "slug": "block-and-tackle-calculator",
  "name": "Published: Crosby lead-line factor, roller-bearing sheaves K 1.04, 4 parts (LF 0.2755): pull for 1000 kg, η = 1/1.04",
  "reference": "Sheave-friction (lead-line) method: W = P·Σηᵏ, Crosby \"How to figure line parts\" LF = Kᴺ(K−1)/(Kᴺ−1), η = 1/K",
  "steps": [
   {
    "fill": "#W",
    "value": "1000"
   },
   {
    "fill": "#eff",
    "value": "0.961538"
   }
  ],
  "read": {
   "label": "Pull force",
   "part": "v",
   "index": 0
  },
  "expected": 2701.6,
  "tol_pct": 0.5
 },
 {
  "slug": "block-and-tackle-calculator",
  "name": "Published: Crosby lead-line factor, bronze-bushed sheaves K 1.09, 6 parts (LF 0.2225): pull for 1000 kg, η = 1/1.09",
  "reference": "Sheave-friction (lead-line) method: W = P·Σηᵏ, Crosby \"How to figure line parts\" LF = Kᴺ(K−1)/(Kᴺ−1), η = 1/K",
  "steps": [
   {
    "fill": "#W",
    "value": "1000"
   },
   {
    "fill": "#eff",
    "value": "0.917431"
   },
   {
    "click": "#ntiles > button:nth-of-type(6)"
   }
  ],
  "read": {
   "label": "Pull force",
   "part": "v",
   "index": 0
  },
  "expected": 2186.1,
  "tol_pct": 0.5
 },
 {
  "slug": "block-and-tackle-calculator",
  "name": "4 parts + 2:1 stage on the hauling line: pull N (MA = 3.6157 × (1 + η))",
  "reference": "Statics of compound tackle with η per sheave",
  "steps": [
   {
    "click": "#ctiles > button:nth-of-type(2)"
   }
  ],
  "read": {
   "label": "Pull force",
   "part": "v",
   "index": 0
  },
  "expected": 276.76,
  "tol_pct": 0.5
 },
 {
  "slug": "bolt-torque-calculator",
  "name": "Default M10 8.8, K 0.20, 75 % proof: tightening torque N·m",
  "reference": "T = K·F·d (Shigley eq. 8-27); proof strengths ISO 898-1 / SAE J429; stress areas ISO 898-1 / ASME B1.1",
  "steps": [],
  "read": {
   "label": "Tightening torque",
   "part": "v",
   "index": 0
  },
  "expected": 50.46,
  "tol_pct": 0.5
 },
 {
  "slug": "bolt-torque-calculator",
  "name": "Default clamp force kN (0.75 × 580 MPa × 58.0 mm²)",
  "reference": "T = K·F·d (Shigley eq. 8-27); proof strengths ISO 898-1 / SAE J429; stress areas ISO 898-1 / ASME B1.1",
  "steps": [],
  "read": {
   "label": "Clamp force",
   "part": "v",
   "index": 0
  },
  "expected": 25.23,
  "tol_pct": 0.5
 },
 {
  "slug": "bolt-torque-calculator",
  "name": "Default bolt stretch mm (F·L/(E·As), E 205 GPa, grip 30)",
  "reference": "Hooke's law",
  "steps": [],
  "read": {
   "label": "Bolt stretch",
   "part": "v",
   "index": 0
  },
  "expected": 0.06366,
  "tol_pct": 0.8
 },
 {
  "slug": "bolt-torque-calculator",
  "name": "Default hand force N at 300 mm wrench",
  "reference": "Statics",
  "steps": [],
  "read": {
   "label": "Hand force",
   "part": "v",
   "index": 0
  },
  "expected": 168.2,
  "tol_pct": 0.5
 },
 {
  "slug": "bolt-torque-calculator",
  "name": "Published: Fastenal Grade 5 3/8-16, 75 % proof, K 0.20: clamp load lbf (4940)",
  "reference": "Fastenal Torque-Tension chart for A307/Gr5/Gr8 (crafter.fastenal.com Torque-Tension_Chart_for_A307_Gr5_Gr8_Gr9.pdf)",
  "steps": [
   {
    "click": "#stdsel > button:nth-of-type(2)"
   },
   {
    "click": "#gtiles > button:nth-of-type(2)"
   },
   {
    "click": "#stiles > button:nth-of-type(3)"
   }
  ],
  "read": {
   "label": "Clamp force",
   "part": "alt",
   "index": 1
  },
  "expected": 4940,
  "tol_pct": 0.5
 },
 {
  "slug": "bolt-torque-calculator",
  "name": "Published: Fastenal Grade 5 3/8-16 dry torque ft·lb (31)",
  "reference": "Fastenal Torque-Tension chart",
  "steps": [
   {
    "click": "#stdsel > button:nth-of-type(2)"
   },
   {
    "click": "#gtiles > button:nth-of-type(2)"
   },
   {
    "click": "#stiles > button:nth-of-type(3)"
   }
  ],
  "read": {
   "label": "Tightening torque",
   "part": "alt",
   "index": 0
  },
  "expected": 31,
  "tol_pct": 1.0
 },
 {
  "slug": "bolt-torque-calculator",
  "name": "Published: Fastenal Grade 5 3/4-16 UNF clamp load lbf (23 776)",
  "reference": "Fastenal Torque-Tension chart",
  "steps": [
   {
    "click": "#stdsel > button:nth-of-type(2)"
   },
   {
    "click": "#gtiles > button:nth-of-type(2)"
   },
   {
    "click": "#stiles > button:nth-of-type(8)"
   },
   {
    "click": "#pitchseg > button:nth-of-type(2)"
   }
  ],
  "read": {
   "label": "Clamp force",
   "part": "alt",
   "index": 1
  },
  "expected": 23776,
  "tol_pct": 0.5
 },
 {
  "slug": "bolt-torque-calculator",
  "name": "M20 8.8 proof load kN (600 MPa above M16 × 245 mm²)",
  "reference": "ISO 898-1 Table 5/7",
  "steps": [
   {
    "click": "#stiles > button:nth-of-type(10)"
   }
  ],
  "read": {
   "label": "Proof load",
   "part": "v",
   "index": 0
  },
  "expected": 147.0,
  "tol_pct": 0.5
 },
 {
  "slug": "bolt-torque-calculator",
  "name": "M12x1.25 10.9, moly K 0.13, 75 %: torque N·m (As 92.1)",
  "reference": "T = K·F·d (Shigley eq. 8-27); proof strengths ISO 898-1 / SAE J429; stress areas ISO 898-1 / ASME B1.1",
  "steps": [
   {
    "click": "#stiles > button:nth-of-type(7)"
   },
   {
    "click": "#pitchseg > button:nth-of-type(2)"
   },
   {
    "click": "#gtiles > button:nth-of-type(4)"
   },
   {
    "click": "#ltiles > button:nth-of-type(5)"
   }
  ],
  "read": {
   "label": "Tightening torque",
   "part": "v",
   "index": 0
  },
  "expected": 89.438,
  "tol_pct": 0.5
 },
 {
  "slug": "bolt-torque-calculator",
  "name": "SAE Grade 2 7/8-9: proof load kN (33 ksi = 228 MPa above 3/4 in × 298 mm²)",
  "reference": "SAE J429 Grade 2",
  "steps": [
   {
    "click": "#stdsel > button:nth-of-type(2)"
   },
   {
    "click": "#gtiles > button:nth-of-type(1)"
   },
   {
    "click": "#stiles > button:nth-of-type(9)"
   }
  ],
  "read": {
   "label": "Proof load",
   "part": "v",
   "index": 0
  },
  "expected": 67.94,
  "tol_pct": 0.5
 },
 {
  "slug": "compression-spring-calculator",
  "name": "Default rate N/mm (k = G d⁴/(8 D³ Na), G 81 GPa, Na 8)",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) eq. 10-9, Table 10-1",
  "steps": [],
  "read": {
   "label": "Spring rate",
   "part": "v",
   "index": 0
  },
  "expected": 3.4722,
  "tol_pct": 0.5
 },
 {
  "slug": "compression-spring-calculator",
  "name": "Default stress at working length MPa (KB Bergsträsser)",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) eqs. 10-5, 10-7",
  "steps": [],
  "read": {
   "label": "Stress at working length",
   "part": "v",
   "index": 0
  },
  "expected": 343.63,
  "tol_pct": 0.5
 },
 {
  "slug": "compression-spring-calculator",
  "name": "Default allowable MPa (0.45 × 2211/2^0.145)",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Tables 10-4, 10-6",
  "steps": [],
  "read": {
   "label": "Stress at working length",
   "part": "alt",
   "index": 1
  },
  "expected": 899.81,
  "tol_pct": 0.5
 },
 {
  "slug": "compression-spring-calculator",
  "name": "Default surge frequency Hz (d/(2π Na D²)·√(G/2ρ))",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) eq. 10-25",
  "steps": [],
  "read": {
   "label": "Surge frequency",
   "part": "v",
   "index": 0
  },
  "expected": 278.94,
  "tol_pct": 0.5
 },
 {
  "slug": "compression-spring-calculator",
  "name": "Published: Shigley Example 10-1 (No. 16 music wire d 0.037 in, OD 7/16 in, squared ends, 12.5 turns): rate lbf/in with Table 10-5 G 11.85 Mpsi (page G 81.0 GPa = 11.75 Mpsi)",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Example 10-1; Table 10-5",
  "steps": [
   {
    "click": "#useg > button:nth-of-type(2)"
   },
   {
    "click": "#etiles > button:nth-of-type(2)"
   },
   {
    "fill": "#d",
    "value": "0.037"
   },
   {
    "fill": "#od",
    "value": "0.4375"
   },
   {
    "fill": "#nt",
    "value": "12.5"
   },
   {
    "fill": "#l0",
    "value": "2"
   },
   {
    "fill": "#l2",
    "value": "1.5"
   },
   {
    "fill": "#l1",
    "value": "1"
   }
  ],
  "read": {
   "label": "Spring rate",
   "part": "v",
   "index": 0
  },
  "expected": 4.116,
  "tol_pct": 1.0
 },
 {
  "slug": "compression-spring-calculator",
  "name": "Shigley Example 10-1: Ssy = 0.45·Sut ksi (Sut = 201/0.037^0.145 = 324 kpsi)",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Example 10-1",
  "steps": [
   {
    "click": "#useg > button:nth-of-type(2)"
   },
   {
    "click": "#etiles > button:nth-of-type(2)"
   },
   {
    "fill": "#d",
    "value": "0.037"
   },
   {
    "fill": "#od",
    "value": "0.4375"
   },
   {
    "fill": "#nt",
    "value": "12.5"
   },
   {
    "fill": "#l0",
    "value": "2"
   },
   {
    "fill": "#l2",
    "value": "1.5"
   },
   {
    "fill": "#l1",
    "value": "1"
   }
  ],
  "read": {
   "label": "Stress at working length",
   "part": "alt",
   "index": 1
  },
  "expected": 145.89,
  "tol_pct": 0.5
 },
 {
  "slug": "compression-spring-calculator",
  "name": "Stainless 302 d 1 mm: allowable 0.35·Sut MPa (Sut 1867.0)",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Table 10-4 (Sut = A/d^m by wire size) and Table 10-6 (allowable 35 % Sut for stainless/nonferrous)",
  "steps": [
   {
    "click": "#mtiles > button:nth-of-type(5)"
   },
   {
    "fill": "#d",
    "value": "1"
   },
   {
    "fill": "#od",
    "value": "10"
   },
   {
    "fill": "#nt",
    "value": "10"
   },
   {
    "fill": "#l0",
    "value": "20"
   },
   {
    "fill": "#l2",
    "value": "18"
   },
   {
    "fill": "#l1",
    "value": "15"
   }
  ],
  "read": {
   "label": "Stress at working length",
   "part": "alt",
   "index": 1
  },
  "expected": 653.45,
  "tol_pct": 0.5
 },
 {
  "slug": "compression-spring-calculator",
  "name": "Stainless 302 d 3 mm: allowable 0.35·Sut MPa (Sut 1546.8)",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Table 10-4 (Sut = A/d^m by wire size) and Table 10-6 (allowable 35 % Sut for stainless/nonferrous)",
  "steps": [
   {
    "click": "#mtiles > button:nth-of-type(5)"
   },
   {
    "fill": "#d",
    "value": "3"
   },
   {
    "fill": "#od",
    "value": "30"
   },
   {
    "fill": "#nt",
    "value": "10"
   },
   {
    "fill": "#l0",
    "value": "60"
   },
   {
    "fill": "#l2",
    "value": "54"
   },
   {
    "fill": "#l1",
    "value": "45"
   }
  ],
  "read": {
   "label": "Stress at working length",
   "part": "alt",
   "index": 1
  },
  "expected": 541.38,
  "tol_pct": 0.5
 },
 {
  "slug": "compression-spring-calculator",
  "name": "Stainless 302 d 6 mm: allowable 0.35·Sut MPa (Sut 1236.2)",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Table 10-4 (Sut = A/d^m by wire size) and Table 10-6 (allowable 35 % Sut for stainless/nonferrous)",
  "steps": [
   {
    "click": "#mtiles > button:nth-of-type(5)"
   },
   {
    "fill": "#d",
    "value": "6"
   },
   {
    "fill": "#od",
    "value": "60"
   },
   {
    "fill": "#nt",
    "value": "10"
   },
   {
    "fill": "#l0",
    "value": "120"
   },
   {
    "fill": "#l2",
    "value": "108"
   },
   {
    "fill": "#l1",
    "value": "90"
   }
  ],
  "read": {
   "label": "Stress at working length",
   "part": "alt",
   "index": 1
  },
  "expected": 432.67,
  "tol_pct": 0.5
 },
 {
  "slug": "compression-spring-calculator",
  "name": "Phosphor bronze d 0.5 mm: allowable 0.35·Sut MPa (Sut 1000.0)",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Table 10-4 (Sut = A/d^m by wire size) and Table 10-6 (allowable 35 % Sut for stainless/nonferrous)",
  "steps": [
   {
    "click": "#mtiles > button:nth-of-type(6)"
   },
   {
    "fill": "#d",
    "value": "0.5"
   },
   {
    "fill": "#od",
    "value": "5.0"
   },
   {
    "fill": "#nt",
    "value": "10"
   },
   {
    "fill": "#l0",
    "value": "10.0"
   },
   {
    "fill": "#l2",
    "value": "9.0"
   },
   {
    "fill": "#l1",
    "value": "7.5"
   }
  ],
  "read": {
   "label": "Stress at working length",
   "part": "alt",
   "index": 1
  },
  "expected": 350.0,
  "tol_pct": 0.5
 },
 {
  "slug": "compression-spring-calculator",
  "name": "Phosphor bronze d 1.5 mm: allowable 0.35·Sut MPa (Sut 902.7)",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Table 10-4 (Sut = A/d^m by wire size) and Table 10-6 (allowable 35 % Sut for stainless/nonferrous)",
  "steps": [
   {
    "click": "#mtiles > button:nth-of-type(6)"
   },
   {
    "fill": "#d",
    "value": "1.5"
   },
   {
    "fill": "#od",
    "value": "15.0"
   },
   {
    "fill": "#nt",
    "value": "10"
   },
   {
    "fill": "#l0",
    "value": "30.0"
   },
   {
    "fill": "#l2",
    "value": "27.0"
   },
   {
    "fill": "#l1",
    "value": "22.5"
   }
  ],
  "read": {
   "label": "Stress at working length",
   "part": "alt",
   "index": 1
  },
  "expected": 315.94,
  "tol_pct": 0.5
 },
 {
  "slug": "compression-spring-calculator",
  "name": "Phosphor bronze d 4 mm: allowable 0.35·Sut MPa (Sut 852.9)",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Table 10-4 (Sut = A/d^m by wire size) and Table 10-6 (allowable 35 % Sut for stainless/nonferrous)",
  "steps": [
   {
    "click": "#mtiles > button:nth-of-type(6)"
   },
   {
    "fill": "#d",
    "value": "4"
   },
   {
    "fill": "#od",
    "value": "40"
   },
   {
    "fill": "#nt",
    "value": "10"
   },
   {
    "fill": "#l0",
    "value": "80"
   },
   {
    "fill": "#l2",
    "value": "72"
   },
   {
    "fill": "#l1",
    "value": "60"
   }
  ],
  "read": {
   "label": "Stress at working length",
   "part": "alt",
   "index": 1
  },
  "expected": 298.51,
  "tol_pct": 0.5
 },
 {
  "slug": "extension-spring-calculator",
  "name": "Default rate N/mm (Na = Nb + G/E)",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) eqs. 10-9, 10-39",
  "steps": [],
  "read": {
   "label": "Spring rate",
   "part": "v",
   "index": 0
  },
  "expected": 1.705,
  "tol_pct": 0.5
 },
 {
  "slug": "extension-spring-calculator",
  "name": "Default body stress MPa",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) eq. 10-7",
  "steps": [],
  "read": {
   "label": "Body stress",
   "part": "v",
   "index": 0
  },
  "expected": 338.29,
  "tol_pct": 0.5
 },
 {
  "slug": "extension-spring-calculator",
  "name": "Default hook bending σA MPa (C1 = C)",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) eqs. 10-34, 10-35",
  "steps": [],
  "read": {
   "label": "Hook bending",
   "part": "v",
   "index": 0
  },
  "expected": 653.64,
  "tol_pct": 0.5
 },
 {
  "slug": "extension-spring-calculator",
  "name": "Published: Shigley Example 10-6 (hard-drawn d 0.035 in, OD 0.248 in, Nb 12.17, Fi 1.19 lbf): rate lbf/in (17.91, G 11.6/E 28.7 Mpsi; page uses 11.5/28.5)",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Example 10-6",
  "steps": [
   {
    "click": "#useg > button:nth-of-type(2)"
   },
   {
    "click": "#mtiles > button:nth-of-type(2)"
   },
   {
    "fill": "#d",
    "value": "0.035"
   },
   {
    "fill": "#od",
    "value": "0.248"
   },
   {
    "fill": "#nb",
    "value": "12.17"
   },
   {
    "fill": "#fi",
    "value": "1.19"
   },
   {
    "fill": "#l1",
    "value": "1.04561"
   },
   {
    "fill": "#l2",
    "value": "0.867"
   }
  ],
  "read": {
   "label": "Spring rate",
   "part": "v",
   "index": 0
  },
  "expected": 17.91,
  "tol_pct": 1.0
 },
 {
  "slug": "extension-spring-calculator",
  "name": "Shigley Example 10-6: body stress at 5.25 lbf ksi (L1 set so page force = 5.25 lbf)",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Example 10-6",
  "steps": [
   {
    "click": "#useg > button:nth-of-type(2)"
   },
   {
    "click": "#mtiles > button:nth-of-type(2)"
   },
   {
    "fill": "#d",
    "value": "0.035"
   },
   {
    "fill": "#od",
    "value": "0.248"
   },
   {
    "fill": "#nb",
    "value": "12.17"
   },
   {
    "fill": "#fi",
    "value": "1.19"
   },
   {
    "fill": "#l1",
    "value": "1.04561"
   },
   {
    "fill": "#l2",
    "value": "0.867"
   }
  ],
  "read": {
   "label": "Body stress",
   "part": "v",
   "index": 0
  },
  "expected": 81.98,
  "tol_pct": 0.6
 },
 {
  "slug": "extension-spring-calculator",
  "name": "Shigley Example 10-6: hook torsion utilisation % (τB 78.6 ksi with r2 0.089 in, C2 5.09, / 0.40·Sut); page assumes C2 = 4 (tol 8 % covers that)",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Example 10-6",
  "steps": [
   {
    "click": "#useg > button:nth-of-type(2)"
   },
   {
    "click": "#mtiles > button:nth-of-type(2)"
   },
   {
    "fill": "#d",
    "value": "0.035"
   },
   {
    "fill": "#od",
    "value": "0.248"
   },
   {
    "fill": "#nb",
    "value": "12.17"
   },
   {
    "fill": "#fi",
    "value": "1.19"
   },
   {
    "fill": "#l1",
    "value": "1.04561"
   },
   {
    "fill": "#l2",
    "value": "0.867"
   }
  ],
  "read": {
   "label": "Hook bending",
   "part": "alt",
   "index": 1
  },
  "expected": 74.24,
  "tol_pct": 8
 },
 {
  "slug": "extension-spring-calculator",
  "name": "Stainless 302 d 1 mm: wire Sut MPa",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Table 10-4 (by wire size)",
  "steps": [
   {
    "click": "#mtiles > button:nth-of-type(5)"
   },
   {
    "fill": "#d",
    "value": "1"
   },
   {
    "fill": "#od",
    "value": "10"
   },
   {
    "fill": "#nb",
    "value": "20"
   },
   {
    "fill": "#fi",
    "value": "0"
   },
   {
    "fill": "#l1",
    "value": "45"
   },
   {
    "fill": "#l2",
    "value": "40"
   }
  ],
  "read": {
   "label": "Max safe stretch",
   "part": "alt",
   "index": 1
  },
  "expected": 1867.0,
  "tol_pct": 0.5
 },
 {
  "slug": "extension-spring-calculator",
  "name": "Stainless 302 d 3 mm: wire Sut MPa",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Table 10-4 (by wire size)",
  "steps": [
   {
    "click": "#mtiles > button:nth-of-type(5)"
   },
   {
    "fill": "#d",
    "value": "3"
   },
   {
    "fill": "#od",
    "value": "30"
   },
   {
    "fill": "#nb",
    "value": "20"
   },
   {
    "fill": "#fi",
    "value": "0"
   },
   {
    "fill": "#l1",
    "value": "135"
   },
   {
    "fill": "#l2",
    "value": "120"
   }
  ],
  "read": {
   "label": "Max safe stretch",
   "part": "alt",
   "index": 1
  },
  "expected": 1546.81,
  "tol_pct": 0.5
 },
 {
  "slug": "extension-spring-calculator",
  "name": "Stainless 302 d 6 mm: wire Sut MPa",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Table 10-4 (by wire size)",
  "steps": [
   {
    "click": "#mtiles > button:nth-of-type(5)"
   },
   {
    "fill": "#d",
    "value": "6"
   },
   {
    "fill": "#od",
    "value": "60"
   },
   {
    "fill": "#nb",
    "value": "20"
   },
   {
    "fill": "#fi",
    "value": "0"
   },
   {
    "fill": "#l1",
    "value": "270"
   },
   {
    "fill": "#l2",
    "value": "240"
   }
  ],
  "read": {
   "label": "Max safe stretch",
   "part": "alt",
   "index": 1
  },
  "expected": 1236.19,
  "tol_pct": 0.5
 },
 {
  "slug": "extension-spring-calculator",
  "name": "Phosphor bronze d 0.5 mm: wire Sut MPa",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Table 10-4 (by wire size)",
  "steps": [
   {
    "click": "#mtiles > button:nth-of-type(6)"
   },
   {
    "fill": "#d",
    "value": "0.5"
   },
   {
    "fill": "#od",
    "value": "5.0"
   },
   {
    "fill": "#nb",
    "value": "20"
   },
   {
    "fill": "#fi",
    "value": "0"
   },
   {
    "fill": "#l1",
    "value": "22.5"
   },
   {
    "fill": "#l2",
    "value": "20.0"
   }
  ],
  "read": {
   "label": "Max safe stretch",
   "part": "alt",
   "index": 1
  },
  "expected": 1000.0,
  "tol_pct": 0.5
 },
 {
  "slug": "extension-spring-calculator",
  "name": "Phosphor bronze d 1.5 mm: wire Sut MPa",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Table 10-4 (by wire size)",
  "steps": [
   {
    "click": "#mtiles > button:nth-of-type(6)"
   },
   {
    "fill": "#d",
    "value": "1.5"
   },
   {
    "fill": "#od",
    "value": "15.0"
   },
   {
    "fill": "#nb",
    "value": "20"
   },
   {
    "fill": "#fi",
    "value": "0"
   },
   {
    "fill": "#l1",
    "value": "67.5"
   },
   {
    "fill": "#l2",
    "value": "60.0"
   }
  ],
  "read": {
   "label": "Max safe stretch",
   "part": "alt",
   "index": 1
  },
  "expected": 902.69,
  "tol_pct": 0.5
 },
 {
  "slug": "extension-spring-calculator",
  "name": "Phosphor bronze d 4 mm: wire Sut MPa",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Table 10-4 (by wire size)",
  "steps": [
   {
    "click": "#mtiles > button:nth-of-type(6)"
   },
   {
    "fill": "#d",
    "value": "4"
   },
   {
    "fill": "#od",
    "value": "40"
   },
   {
    "fill": "#nb",
    "value": "20"
   },
   {
    "fill": "#fi",
    "value": "0"
   },
   {
    "fill": "#l1",
    "value": "180"
   },
   {
    "fill": "#l2",
    "value": "160"
   }
  ],
  "read": {
   "label": "Max safe stretch",
   "part": "alt",
   "index": 1
  },
  "expected": 852.87,
  "tol_pct": 0.5
 },
 {
  "slug": "torsion-spring-calculator",
  "name": "Default rate N·mm/turn (k' = d⁴E/(10.8 D Na), Na = Nb + (l1 + l2)/(3πD))",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) eqs. 10-51, 10-52",
  "steps": [],
  "read": {
   "label": "Spring rate",
   "part": "alt",
   "index": 0
  },
  "expected": 470.73,
  "tol_pct": 0.5
 },
 {
  "slug": "torsion-spring-calculator",
  "name": "Default bending stress MPa (Ki inner fibre)",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) eqs. 10-43, 10-44",
  "steps": [],
  "read": {
   "label": "Bending stress",
   "part": "v",
   "index": 0
  },
  "expected": 323.77,
  "tol_pct": 0.5
 },
 {
  "slug": "torsion-spring-calculator",
  "name": "Default wound inside Ø mm (D' = D·Nb/(Nb + θ') − d)",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) eq. 10-54",
  "steps": [],
  "read": {
   "label": "Wound inside Ø",
   "part": "v",
   "index": 0
  },
  "expected": 10.6469,
  "tol_pct": 0.5
 },
 {
  "slug": "torsion-spring-calculator",
  "name": "Published: Shigley Example 10-8 (music wire d 0.072 in, OD 19/32 in, Nb 4.25, legs 1 in): Sy = 0.78·Sut ksi (229.6)",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Example 10-8",
  "steps": [
   {
    "click": "#useg > button:nth-of-type(2)"
   },
   {
    "fill": "#d",
    "value": "0.072"
   },
   {
    "fill": "#od",
    "value": "0.59375"
   },
   {
    "fill": "#nb",
    "value": "4.25"
   },
   {
    "fill": "#la",
    "value": "1"
   },
   {
    "fill": "#lb",
    "value": "1"
   },
   {
    "fill": "#a2",
    "value": "0"
   },
   {
    "fill": "#ar",
    "value": "0.4"
   },
   {
    "fill": "#a1",
    "value": "93.1"
   }
  ],
  "read": {
   "label": "Bending stress",
   "part": "alt",
   "index": 1
  },
  "expected": 229.6,
  "tol_pct": 0.5
 },
 {
  "slug": "torsion-spring-calculator",
  "name": "Shigley Example 10-8: rate lbf·in/turn (E 28.5 Mpsi)",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Example 10-8",
  "steps": [
   {
    "click": "#useg > button:nth-of-type(2)"
   },
   {
    "fill": "#d",
    "value": "0.072"
   },
   {
    "fill": "#od",
    "value": "0.59375"
   },
   {
    "fill": "#nb",
    "value": "4.25"
   },
   {
    "fill": "#la",
    "value": "1"
   },
   {
    "fill": "#lb",
    "value": "1"
   },
   {
    "fill": "#a2",
    "value": "0"
   },
   {
    "fill": "#ar",
    "value": "0.4"
   },
   {
    "fill": "#a1",
    "value": "93.1"
   }
  ],
  "read": {
   "label": "Spring rate",
   "part": "alt",
   "index": 0
  },
  "expected": 29.188,
  "tol_pct": 0.5
 },
 {
  "slug": "torsion-spring-calculator",
  "name": "Shigley Example 10-8: max static angle ° (θ' = Mmax/k')",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Example 10-8",
  "steps": [
   {
    "click": "#useg > button:nth-of-type(2)"
   },
   {
    "fill": "#d",
    "value": "0.072"
   },
   {
    "fill": "#od",
    "value": "0.59375"
   },
   {
    "fill": "#nb",
    "value": "4.25"
   },
   {
    "fill": "#la",
    "value": "1"
   },
   {
    "fill": "#lb",
    "value": "1"
   },
   {
    "fill": "#a2",
    "value": "0"
   },
   {
    "fill": "#ar",
    "value": "0.4"
   },
   {
    "fill": "#a1",
    "value": "93.1"
   }
  ],
  "read": {
   "label": "Max safe angle",
   "part": "v",
   "index": 0
  },
  "expected": 93.1,
  "tol_pct": 0.6
 },
 {
  "slug": "torsion-spring-calculator",
  "name": "Stainless 302 d 1 mm: allowable Sy = 0.61·Sut MPa",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Tables 10-4, 10-10 (61 % for stainless/nonferrous)",
  "steps": [
   {
    "click": "#mtiles > button:nth-of-type(5)"
   },
   {
    "fill": "#d",
    "value": "1"
   },
   {
    "fill": "#od",
    "value": "10"
   },
   {
    "fill": "#nb",
    "value": "10"
   },
   {
    "fill": "#la",
    "value": "5"
   },
   {
    "fill": "#lb",
    "value": "5"
   },
   {
    "fill": "#a2",
    "value": "0"
   },
   {
    "fill": "#ar",
    "value": "0"
   },
   {
    "fill": "#a1",
    "value": "30"
   }
  ],
  "read": {
   "label": "Bending stress",
   "part": "alt",
   "index": 1
  },
  "expected": 1138.87,
  "tol_pct": 0.5
 },
 {
  "slug": "torsion-spring-calculator",
  "name": "Stainless 302 d 3 mm: allowable Sy = 0.61·Sut MPa",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Tables 10-4, 10-10 (61 % for stainless/nonferrous)",
  "steps": [
   {
    "click": "#mtiles > button:nth-of-type(5)"
   },
   {
    "fill": "#d",
    "value": "3"
   },
   {
    "fill": "#od",
    "value": "30"
   },
   {
    "fill": "#nb",
    "value": "10"
   },
   {
    "fill": "#la",
    "value": "15"
   },
   {
    "fill": "#lb",
    "value": "15"
   },
   {
    "fill": "#a2",
    "value": "0"
   },
   {
    "fill": "#ar",
    "value": "0"
   },
   {
    "fill": "#a1",
    "value": "30"
   }
  ],
  "read": {
   "label": "Bending stress",
   "part": "alt",
   "index": 1
  },
  "expected": 943.55,
  "tol_pct": 0.5
 },
 {
  "slug": "torsion-spring-calculator",
  "name": "Stainless 302 d 6 mm: allowable Sy = 0.61·Sut MPa",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Tables 10-4, 10-10 (61 % for stainless/nonferrous)",
  "steps": [
   {
    "click": "#mtiles > button:nth-of-type(5)"
   },
   {
    "fill": "#d",
    "value": "6"
   },
   {
    "fill": "#od",
    "value": "60"
   },
   {
    "fill": "#nb",
    "value": "10"
   },
   {
    "fill": "#la",
    "value": "30"
   },
   {
    "fill": "#lb",
    "value": "30"
   },
   {
    "fill": "#a2",
    "value": "0"
   },
   {
    "fill": "#ar",
    "value": "0"
   },
   {
    "fill": "#a1",
    "value": "30"
   }
  ],
  "read": {
   "label": "Bending stress",
   "part": "alt",
   "index": 1
  },
  "expected": 754.08,
  "tol_pct": 0.5
 },
 {
  "slug": "torsion-spring-calculator",
  "name": "Phosphor bronze d 0.5 mm: allowable Sy = 0.61·Sut MPa",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Tables 10-4, 10-10 (61 % for stainless/nonferrous)",
  "steps": [
   {
    "click": "#mtiles > button:nth-of-type(6)"
   },
   {
    "fill": "#d",
    "value": "0.5"
   },
   {
    "fill": "#od",
    "value": "5.0"
   },
   {
    "fill": "#nb",
    "value": "10"
   },
   {
    "fill": "#la",
    "value": "2.5"
   },
   {
    "fill": "#lb",
    "value": "2.5"
   },
   {
    "fill": "#a2",
    "value": "0"
   },
   {
    "fill": "#ar",
    "value": "0"
   },
   {
    "fill": "#a1",
    "value": "30"
   }
  ],
  "read": {
   "label": "Bending stress",
   "part": "alt",
   "index": 1
  },
  "expected": 610.0,
  "tol_pct": 0.5
 },
 {
  "slug": "torsion-spring-calculator",
  "name": "Phosphor bronze d 1.5 mm: allowable Sy = 0.61·Sut MPa",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Tables 10-4, 10-10 (61 % for stainless/nonferrous)",
  "steps": [
   {
    "click": "#mtiles > button:nth-of-type(6)"
   },
   {
    "fill": "#d",
    "value": "1.5"
   },
   {
    "fill": "#od",
    "value": "15.0"
   },
   {
    "fill": "#nb",
    "value": "10"
   },
   {
    "fill": "#la",
    "value": "7.5"
   },
   {
    "fill": "#lb",
    "value": "7.5"
   },
   {
    "fill": "#a2",
    "value": "0"
   },
   {
    "fill": "#ar",
    "value": "0"
   },
   {
    "fill": "#a1",
    "value": "30"
   }
  ],
  "read": {
   "label": "Bending stress",
   "part": "alt",
   "index": 1
  },
  "expected": 550.64,
  "tol_pct": 0.5
 },
 {
  "slug": "torsion-spring-calculator",
  "name": "Phosphor bronze d 4 mm: allowable Sy = 0.61·Sut MPa",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Tables 10-4, 10-10 (61 % for stainless/nonferrous)",
  "steps": [
   {
    "click": "#mtiles > button:nth-of-type(6)"
   },
   {
    "fill": "#d",
    "value": "4"
   },
   {
    "fill": "#od",
    "value": "40"
   },
   {
    "fill": "#nb",
    "value": "10"
   },
   {
    "fill": "#la",
    "value": "20"
   },
   {
    "fill": "#lb",
    "value": "20"
   },
   {
    "fill": "#a2",
    "value": "0"
   },
   {
    "fill": "#ar",
    "value": "0"
   },
   {
    "fill": "#a1",
    "value": "30"
   }
  ],
  "read": {
   "label": "Bending stress",
   "part": "alt",
   "index": 1
  },
  "expected": 520.25,
  "tol_pct": 0.5
 },
 {
  "slug": "bevel-gear-calculator",
  "name": "Default pinion cone angle ° (tan δ1 = sinΣ/(z2/z1 + cosΣ))",
  "reference": "Gleason / KHK",
  "steps": [],
  "read": {
   "label": "Cone angles",
   "part": "v",
   "index": 0
  },
  "expected": 26.5651,
  "tol_pct": 0.5
 },
 {
  "slug": "bevel-gear-calculator",
  "name": "Default cone distance R mm",
  "reference": "Gleason / KHK",
  "steps": [],
  "read": {
   "label": "Cone distance R",
   "part": "v",
   "index": 0
  },
  "expected": 44.7214,
  "tol_pct": 0.5
 },
 {
  "slug": "bevel-gear-calculator",
  "name": "Default tangential force kN at dm1 = d1 − b sinδ1 (1.186, shown to 0.01 kN)",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) §13-15 bevel force analysis",
  "steps": [],
  "read": {
   "label": "Tangential force",
   "part": "v",
   "index": 0
  },
  "expected": 1.1856,
  "tol_pct": 0.6
 },
 {
  "slug": "bevel-gear-calculator",
  "name": "Default pinion radial force kN (Wt tanφ cosγ)",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) eq. 13-38",
  "steps": [],
  "read": {
   "label": "Pinion radial / axial",
   "part": "v",
   "index": 0
  },
  "expected": 0.386,
  "tol_pct": 1.5
 },
 {
  "slug": "bevel-gear-calculator",
  "name": "Published: KHK Gleason example: ha1",
  "reference": "KHK Gear Technical Reference, Calculation of Gear Dimensions, Table 4.12 Gleason straight bevel example (m 3, z 20/40, α 20°, Σ 90°, b 22)",
  "steps": [
   {
    "fill": "#m",
    "value": "3"
   },
   {
    "fill": "#b",
    "value": "22"
   }
  ],
  "read": {
   "selector": "#tb tr:nth-of-type(4) td:nth-of-type(3)",
   "index": 0
  },
  "expected": 4.035,
  "tol_pct": 0.5
 },
 {
  "slug": "bevel-gear-calculator",
  "name": "Published: KHK Gleason example: hf1",
  "reference": "KHK Gear Technical Reference, Calculation of Gear Dimensions, Table 4.12 Gleason straight bevel example (m 3, z 20/40, α 20°, Σ 90°, b 22)",
  "steps": [
   {
    "fill": "#m",
    "value": "3"
   },
   {
    "fill": "#b",
    "value": "22"
   }
  ],
  "read": {
   "selector": "#tb tr:nth-of-type(5) td:nth-of-type(3)",
   "index": 0
  },
  "expected": 2.529,
  "tol_pct": 0.5
 },
 {
  "slug": "bevel-gear-calculator",
  "name": "Published: KHK Gleason example: θf1",
  "reference": "KHK Gear Technical Reference, Calculation of Gear Dimensions, Table 4.12 Gleason straight bevel example (m 3, z 20/40, α 20°, Σ 90°, b 22)",
  "steps": [
   {
    "fill": "#m",
    "value": "3"
   },
   {
    "fill": "#b",
    "value": "22"
   }
  ],
  "read": {
   "selector": "#tb tr:nth-of-type(8) td:nth-of-type(3)",
   "index": 0
  },
  "expected": 2.15903,
  "tol_pct": 0.5
 },
 {
  "slug": "bevel-gear-calculator",
  "name": "Published: KHK Gleason example: da1",
  "reference": "KHK Gear Technical Reference, Calculation of Gear Dimensions, Table 4.12 Gleason straight bevel example (m 3, z 20/40, α 20°, Σ 90°, b 22)",
  "steps": [
   {
    "fill": "#m",
    "value": "3"
   },
   {
    "fill": "#b",
    "value": "22"
   }
  ],
  "read": {
   "selector": "#tb tr:nth-of-type(11) td:nth-of-type(3)",
   "index": 0
  },
  "expected": 67.218,
  "tol_pct": 0.5
 },
 {
  "slug": "bevel-gear-calculator",
  "name": "Published: KHK Gleason example: da2",
  "reference": "KHK Gear Technical Reference, Calculation of Gear Dimensions, Table 4.12 Gleason straight bevel example (m 3, z 20/40, α 20°, Σ 90°, b 22)",
  "steps": [
   {
    "fill": "#m",
    "value": "3"
   },
   {
    "fill": "#b",
    "value": "22"
   }
  ],
  "read": {
   "selector": "#tb tr:nth-of-type(11) td:nth-of-type(4)",
   "index": 0
  },
  "expected": 121.7575,
  "tol_pct": 0.5
 },
 {
  "slug": "bevel-gear-calculator",
  "name": "Published: KHK Gleason example: di1",
  "reference": "KHK Gear Technical Reference, Calculation of Gear Dimensions, Table 4.12 Gleason straight bevel example (m 3, z 20/40, α 20°, Σ 90°, b 22)",
  "steps": [
   {
    "fill": "#m",
    "value": "3"
   },
   {
    "fill": "#b",
    "value": "22"
   }
  ],
  "read": {
   "selector": "#tb tr:nth-of-type(14) td:nth-of-type(3)",
   "index": 0
  },
  "expected": 44.8425,
  "tol_pct": 0.5
 },
 {
  "slug": "bevel-gear-calculator",
  "name": "Published: KHK example: Xb1 axial face width mm",
  "reference": "KHK Gear Technical Reference, Calculation of Gear Dimensions, Table 4.12 Gleason straight bevel example (m 3, z 20/40, α 20°, Σ 90°, b 22)",
  "steps": [
   {
    "fill": "#m",
    "value": "3"
   },
   {
    "fill": "#b",
    "value": "22"
   }
  ],
  "read": {
   "selector": "#tb tr:nth-of-type(13) td:nth-of-type(3)",
   "index": 0
  },
  "expected": 19.0029,
  "tol_pct": 0.5
 },
 {
  "slug": "bevel-gear-calculator",
  "name": "Σ 60° shaft angle, 20/40: pinion cone angle °",
  "reference": "Gleason / KHK general shaft angle tan δ1 = sinΣ/(z2/z1 + cosΣ)",
  "steps": [
   {
    "click": "#atiles > button:nth-of-type(2)"
   }
  ],
  "read": {
   "label": "Cone angles",
   "part": "v",
   "index": 0
  },
  "expected": 19.1066,
  "tol_pct": 0.5
 },
 {
  "slug": "bearing-life-calculator",
  "name": "Default 6205: L10h h ((14.8/2)^3 × 10^6/(60·1500))",
  "reference": "ISO 281:2007 (L10 = (C/P)^p, X/Y table for radial ball bearings), SKF catalogue",
  "steps": [],
  "read": {
   "label": "Rating life L10h",
   "part": "v",
   "index": 0
  },
  "expected": 4502.49,
  "tol_pct": 0.5
 },
 {
  "slug": "bearing-life-calculator",
  "name": "Default e (f0·Fa/C0 = 0.897, f0 14; 0.272 shown as 0.27)",
  "reference": "ISO 281 Table 4 interpolation",
  "steps": [],
  "read": {
   "label": "Equivalent load P",
   "part": "alt",
   "index": 2
  },
  "expected": 0.2719,
  "tol_pct": 1.0
 },
 {
  "slug": "bearing-life-calculator",
  "name": "Default required C kN for 20 000 h",
  "reference": "ISO 281 inverted",
  "steps": [],
  "read": {
   "label": "Required C",
   "part": "v",
   "index": 0
  },
  "expected": 24.329,
  "tol_pct": 0.5
 },
 {
  "slug": "bearing-life-calculator",
  "name": "Default static safety s0 (P0 = max(Fr, 0.6Fr + 0.5Fa))",
  "reference": "ISO 76 / SKF",
  "steps": [],
  "read": {
   "label": "Static safety s₀",
   "part": "v",
   "index": 0
  },
  "expected": 3.9,
  "tol_pct": 0.5
 },
 {
  "slug": "bearing-life-calculator",
  "name": "Published: JTEKT/Koyo example, 6308 (Cr 50.9, C0r 24.0 kN, f0 13.2), Fr 3.5, Fa 1.0 kN: equivalent load P kN (3.78; page fixes f0 = 14)",
  "reference": "JTEKT bearing knowledge, applied calculation examples (jtekt.co.jp .../5-7000.html: X 0.56, Y 1.82, P 3 780 N)",
  "steps": [
   {
    "fill": "#C",
    "value": "50.9"
   },
   {
    "fill": "#C0",
    "value": "24.0"
   },
   {
    "fill": "#Fr",
    "value": "3.5"
   },
   {
    "fill": "#Fa",
    "value": "1.0"
   }
  ],
  "read": {
   "label": "Equivalent load P",
   "part": "v",
   "index": 0
  },
  "expected": 3.78,
  "tol_pct": 1.0
 },
 {
  "slug": "bearing-life-calculator",
  "name": "Angular contact 40° single, Fa/Fr = 1.13 (below e = 1.14): P kN, Fr 1",
  "reference": "SKF / NTN single-row angular contact 40° (B) catalogue: single or tandem P = Fr for Fa/Fr ≤ 1.14, P = 0.35Fr + 0.57Fa above; P0 = 0.5Fr + 0.26Fa, P0 ≥ Fr",
  "steps": [
   {
    "click": "#btiles > button:nth-of-type(2)"
   },
   {
    "fill": "#Fr",
    "value": "1"
   },
   {
    "fill": "#Fa",
    "value": "1.13"
   }
  ],
  "read": {
   "label": "Equivalent load P",
   "part": "v",
   "index": 0
  },
  "expected": 1.0,
  "tol_pct": 0.5
 },
 {
  "slug": "bearing-life-calculator",
  "name": "Angular contact 40° single, Fa/Fr = 1.15 (above e): P kN",
  "reference": "SKF / NTN single-row angular contact 40° (B) catalogue: single or tandem P = Fr for Fa/Fr ≤ 1.14, P = 0.35Fr + 0.57Fa above; P0 = 0.5Fr + 0.26Fa, P0 ≥ Fr",
  "steps": [
   {
    "click": "#btiles > button:nth-of-type(2)"
   },
   {
    "fill": "#Fr",
    "value": "1"
   },
   {
    "fill": "#Fa",
    "value": "1.15"
   }
  ],
  "read": {
   "label": "Equivalent load P",
   "part": "v",
   "index": 0
  },
  "expected": 1.0055,
  "tol_pct": 0.5
 },
 {
  "slug": "bearing-life-calculator",
  "name": "Angular contact 40° single, Fr 1, Fa 3 (well above e): P kN",
  "reference": "SKF / NTN single-row angular contact 40° (B) catalogue: single or tandem P = Fr for Fa/Fr ≤ 1.14, P = 0.35Fr + 0.57Fa above; P0 = 0.5Fr + 0.26Fa, P0 ≥ Fr",
  "steps": [
   {
    "click": "#btiles > button:nth-of-type(2)"
   },
   {
    "fill": "#Fr",
    "value": "1"
   },
   {
    "fill": "#Fa",
    "value": "3"
   }
  ],
  "read": {
   "label": "Equivalent load P",
   "part": "v",
   "index": 0
  },
  "expected": 2.06,
  "tol_pct": 0.5
 },
 {
  "slug": "bearing-life-calculator",
  "name": "Angular contact 7205 B, Fr 1, Fa 3: static safety s0 (P0 = 0.5 + 0.78 = 1.28 kN, C0 10)",
  "reference": "SKF / NTN single-row angular contact 40° (B) catalogue: single or tandem P = Fr for Fa/Fr ≤ 1.14, P = 0.35Fr + 0.57Fa above; P0 = 0.5Fr + 0.26Fa, P0 ≥ Fr",
  "steps": [
   {
    "click": "#btiles > button:nth-of-type(2)"
   },
   {
    "fill": "#Fr",
    "value": "1"
   },
   {
    "fill": "#Fa",
    "value": "3"
   }
  ],
  "read": {
   "label": "Static safety s₀",
   "part": "v",
   "index": 0
  },
  "expected": 7.8125,
  "tol_pct": 0.5
 },
 {
  "slug": "bearing-life-calculator",
  "name": "Angular contact 7205 B, Fr 2, Fa 1 (below e): static safety s0 (P0 = Fr = 2)",
  "reference": "SKF / NTN single-row angular contact 40° (B) catalogue: single or tandem P = Fr for Fa/Fr ≤ 1.14, P = 0.35Fr + 0.57Fa above; P0 = 0.5Fr + 0.26Fa, P0 ≥ Fr",
  "steps": [
   {
    "click": "#btiles > button:nth-of-type(2)"
   },
   {
    "fill": "#Fr",
    "value": "2"
   },
   {
    "fill": "#Fa",
    "value": "1"
   }
  ],
  "read": {
   "label": "Static safety s₀",
   "part": "v",
   "index": 0
  },
  "expected": 5.0,
  "tol_pct": 0.5
 },
 {
  "slug": "bearing-life-calculator",
  "name": "Tapered roller 30205 (C 37.4), Fr 4, Fa 2: P kN (0.4Fr + 1.6Fa)",
  "reference": "SKF 30205 J2/Q: e 0.37, Y 1.6",
  "steps": [
   {
    "click": "#btiles > button:nth-of-type(4)"
   },
   {
    "fill": "#Fr",
    "value": "4"
   },
   {
    "fill": "#Fa",
    "value": "2"
   }
  ],
  "read": {
   "label": "Equivalent load P",
   "part": "v",
   "index": 0
  },
  "expected": 4.8,
  "tol_pct": 0.5
 },
 {
  "slug": "bearing-life-calculator",
  "name": "Spherical roller 22208 E, Fr 5, Fa 1 (Fa/Fr 0.2 < e): P kN with SKF factors (Fr + Y1·Fa, Y1 2.4)",
  "reference": "SKF 22208 E product data: e 0.28, Y1 2.4, Y2 3.6, Y0 2.5 (coolenbearings.com/skf/roller-bearings/spherical/22208-e)",
  "steps": [
   {
    "click": "#btiles > button:nth-of-type(5)"
   },
   {
    "fill": "#Fr",
    "value": "5"
   },
   {
    "fill": "#Fa",
    "value": "1"
   }
  ],
  "read": {
   "label": "Equivalent load P",
   "part": "v",
   "index": 0
  },
  "expected": 7.4,
  "tol_pct": 1.0
 },
 {
  "slug": "shaft-diameter-calculator",
  "name": "Default torque N·m (9549 P/n)",
  "reference": "Standard",
  "steps": [],
  "read": {
   "label": "Torque",
   "part": "v",
   "index": 0
  },
  "expected": 49.391,
  "tol_pct": 0.5
 },
 {
  "slug": "shaft-diameter-calculator",
  "name": "Default bending moment N·m (F a (L − a)/L)",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Table A-9-5",
  "steps": [],
  "read": {
   "label": "Bending moment",
   "part": "v",
   "index": 0
  },
  "expected": 80.0,
  "tol_pct": 0.5
 },
 {
  "slug": "shaft-diameter-calculator",
  "name": "Default strength diameter mm (C45 305/580 MPa, keyway, Km 1.5, Kt 1.0)",
  "reference": "ASME Code for Design of Transmission Shafting (Bhandari, Design of Machine Elements): d³ = 16/(π τ)·√((Km M)² + (Kt T)²), τ = 0.75·min(0.3Sy, 0.18Su) with keyway",
  "steps": [],
  "read": {
   "label": "From strength",
   "part": "v",
   "index": 0
  },
  "expected": 21.276,
  "tol_pct": 0.5
 },
 {
  "slug": "shaft-diameter-calculator",
  "name": "Default twist diameter mm (0.25°/m, G 81 GPa)",
  "reference": "θ = T/(G J)",
  "steps": [],
  "read": {
   "label": "From twist",
   "part": "v",
   "index": 0
  },
  "expected": 34.541,
  "tol_pct": 0.5
 },
 {
  "slug": "shaft-diameter-calculator",
  "name": "Default safety factor at Ø35 (von Mises with Km, Kt, keyway 1/0.75)",
  "reference": "Page method: σv = √(σb² + 3τ²)/0.75",
  "steps": [],
  "read": {
   "label": "Safety factor at Ø35",
   "part": "v",
   "index": 0
  },
  "expected": 7.558,
  "tol_pct": 0.5
 },
 {
  "slug": "shaft-diameter-calculator",
  "name": "Default twist at Ø35 °/m (shown to 0.01)",
  "reference": "θ = T/(G J)",
  "steps": [],
  "read": {
   "selector": "#tb tr:nth-of-type(4) td:nth-of-type(4)",
   "index": 0
  },
  "expected": 0.2371,
  "tol_pct": 1.5
 },
 {
  "slug": "shaft-diameter-calculator",
  "name": "Default deflection at load, Ø35 µm (F a² b²/(3 E I L), shown to 1 µm)",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Table A-9-6",
  "steps": [],
  "read": {
   "selector": "#tb tr:nth-of-type(4) td:nth-of-type(5)",
   "index": 0
  },
  "expected": 34.48,
  "tol_pct": 1.6
 },
 {
  "slug": "shaft-diameter-calculator",
  "name": "Published: ASME worked example (20 kW, 200 rpm, M 500 N·m, Km 1.5, Kt 1.0, keyway, τ 81 MPa → d 42.4 mm), rescaled to the page's C45 QT τ 87.75 MPa: d = 42.4·(81/87.75)^(1/3)",
  "reference": "ASME Code for Design of Transmission Shafting (Bhandari, Design of Machine Elements): d³ = 16/(π τ)·√((Km M)² + (Kt T)²), τ = 0.75·min(0.3Sy, 0.18Su) with keyway; example from makeiteasyhub.com/design-of-shafts-2026-guide-formulas-materials-codes-and-examples",
  "steps": [
   {
    "click": "#mtiles > button:nth-of-type(4)"
   },
   {
    "fill": "#P",
    "value": "20"
   },
   {
    "fill": "#n",
    "value": "200"
   },
   {
    "fill": "#F",
    "value": "5"
   },
   {
    "fill": "#L",
    "value": "400"
   },
   {
    "fill": "#a",
    "value": "200"
   }
  ],
  "read": {
   "label": "From strength",
   "part": "v",
   "index": 0
  },
  "expected": 41.303,
  "tol_pct": 0.5
 },
 {
  "slug": "shaft-diameter-calculator",
  "name": "C45 normalised yield MPa (EN 10083-2 +N, 16 < d ≤ 100 mm: 305)",
  "reference": "EN 10083-2 (RoyMech Steel-10083 table)",
  "steps": [],
  "read": {
   "label": "Safety factor at Ø35",
   "part": "alt",
   "index": 1
  },
  "expected": 305,
  "tol_pct": 0.5
 },
 {
  "slug": "shaft-diameter-calculator",
  "name": "Overhung 1.2 kN at 100 mm beyond a 300 mm span: bending moment N·m (F·a)",
  "reference": "Shigley's Mechanical Engineering Design 10th ed. (Budynas/Nisbett) Table A-9-10",
  "steps": [
   {
    "click": "#ltiles > button:nth-of-type(2)"
   },
   {
    "fill": "#a",
    "value": "100"
   }
  ],
  "read": {
   "label": "Bending moment",
   "part": "v",
   "index": 0
  },
  "expected": 120.0,
  "tol_pct": 0.5
 },
 {
  "slug": "shaft-diameter-calculator",
  "name": "42CrMo4 QT, torque only, plain shaft, 7.5 kW 1450 rpm: strength diameter mm (τ = min(225, 180) = 180 MPa)",
  "reference": "ASME Code for Design of Transmission Shafting (Bhandari, Design of Machine Elements): d³ = 16/(π τ)·√((Km M)² + (Kt T)²), τ = 0.75·min(0.3Sy, 0.18Su) with keyway",
  "steps": [
   {
    "click": "#mtiles > button:nth-of-type(5)"
   },
   {
    "click": "#ltiles > button:nth-of-type(3)"
   },
   {
    "click": "#kw > button:nth-of-type(2)"
   }
  ],
  "read": {
   "label": "From strength",
   "part": "v",
   "index": 0
  },
  "expected": 11.18,
  "tol_pct": 0.5
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "name": "Default turning Ø50, Vc 220: spindle rpm",
  "reference": "Sandvik Coromant formulas & definitions (turning: Pc = vc·ap·fn·kc/60 000; milling: Pc = ap·ae·vf·kc/(60·10⁶), hm from engagement angle; drilling: Pc = fn·vc·Dc·kc/240 000), kc = kc1·h^−mc",
  "steps": [],
  "read": {
   "label": "Spindle speed",
   "part": "v",
   "index": 0
  },
  "expected": 1400.56,
  "tol_pct": 0.5
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "name": "Default feed rate mm/min (f·n)",
  "reference": "Sandvik Coromant formulas & definitions (turning: Pc = vc·ap·fn·kc/60 000; milling: Pc = ap·ae·vf·kc/(60·10⁶), hm from engagement angle; drilling: Pc = fn·vc·Dc·kc/240 000), kc = kc1·h^−mc",
  "steps": [],
  "read": {
   "label": "Feed rate",
   "part": "v",
   "index": 0
  },
  "expected": 280.11,
  "tol_pct": 0.5
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "name": "Default MRR cm³/min (Vc·ap·f)",
  "reference": "Sandvik Coromant formulas & definitions (turning: Pc = vc·ap·fn·kc/60 000; milling: Pc = ap·ae·vf·kc/(60·10⁶), hm from engagement angle; drilling: Pc = fn·vc·Dc·kc/240 000), kc = kc1·h^−mc",
  "steps": [],
  "read": {
   "label": "Metal removal",
   "part": "v",
   "index": 0
  },
  "expected": 88.0,
  "tol_pct": 0.5
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "name": "Default cutting power kW (kc1 1500, mc 0.25, h 0.2)",
  "reference": "Sandvik Coromant formulas & definitions (turning: Pc = vc·ap·fn·kc/60 000; milling: Pc = ap·ae·vf·kc/(60·10⁶), hm from engagement angle; drilling: Pc = fn·vc·Dc·kc/240 000), kc = kc1·h^−mc",
  "steps": [],
  "read": {
   "label": "Cutting power",
   "part": "v",
   "index": 0
  },
  "expected": 3.2898,
  "tol_pct": 0.5
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "name": "Default spindle torque N·m (Mc = Pc·30 000/(π n))",
  "reference": "Sandvik Coromant formulas & definitions (turning: Pc = vc·ap·fn·kc/60 000; milling: Pc = ap·ae·vf·kc/(60·10⁶), hm from engagement angle; drilling: Pc = fn·vc·Dc·kc/240 000), kc = kc1·h^−mc",
  "steps": [],
  "read": {
   "label": "Spindle torque",
   "part": "v",
   "index": 0
  },
  "expected": 22.43,
  "tol_pct": 0.5
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "name": "Worked example Vc 200 m/min: cutting power kW (2.99)",
  "reference": "Sandvik Coromant formulas & definitions (turning: Pc = vc·ap·fn·kc/60 000; milling: Pc = ap·ae·vf·kc/(60·10⁶), hm from engagement angle; drilling: Pc = fn·vc·Dc·kc/240 000), kc = kc1·h^−mc",
  "steps": [
   {
    "fill": "#vc",
    "value": "200"
   }
  ],
  "read": {
   "label": "Cutting power",
   "part": "v",
   "index": 0
  },
  "expected": 2.9907,
  "tol_pct": 0.5
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "name": "Drilling Ø10, Vc 80, fn 0.2, mild steel: cutting power kW (hex = fn/2·sin 59°)",
  "reference": "Sandvik Coromant formulas & definitions (turning: Pc = vc·ap·fn·kc/60 000; milling: Pc = ap·ae·vf·kc/(60·10⁶), hm from engagement angle; drilling: Pc = fn·vc·Dc·kc/240 000), kc = kc1·h^−mc",
  "steps": [
   {
    "click": "#ptiles > button:nth-of-type(3)"
   },
   {
    "fill": "#D",
    "value": "10"
   },
   {
    "fill": "#vc",
    "value": "80"
   },
   {
    "fill": "#f",
    "value": "0.2"
   }
  ],
  "read": {
   "label": "Cutting power",
   "part": "v",
   "index": 0
  },
  "expected": 1.8481,
  "tol_pct": 0.5
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "name": "Milling full slot Ø12, z 3, fz 0.05, ap 6, Vc 150: mean chip thickness mm (2fz/π)",
  "reference": "Sandvik Coromant formulas & definitions (turning: Pc = vc·ap·fn·kc/60 000; milling: Pc = ap·ae·vf·kc/(60·10⁶), hm from engagement angle; drilling: Pc = fn·vc·Dc·kc/240 000), kc = kc1·h^−mc",
  "steps": [
   {
    "click": "#ptiles > button:nth-of-type(2)"
   },
   {
    "fill": "#D",
    "value": "12"
   },
   {
    "fill": "#vc",
    "value": "150"
   },
   {
    "fill": "#f",
    "value": "0.05"
   },
   {
    "fill": "#z",
    "value": "3"
   },
   {
    "fill": "#ap",
    "value": "6"
   },
   {
    "fill": "#ae",
    "value": "12"
   }
  ],
  "read": {
   "label": "Spindle torque",
   "part": "alt",
   "index": 0
  },
  "expected": 0.03183,
  "tol_pct": 1.6
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "name": "Milling full slot: cutting power kW",
  "reference": "Sandvik Coromant formulas & definitions (turning: Pc = vc·ap·fn·kc/60 000; milling: Pc = ap·ae·vf·kc/(60·10⁶), hm from engagement angle; drilling: Pc = fn·vc·Dc·kc/240 000), kc = kc1·h^−mc",
  "steps": [
   {
    "click": "#ptiles > button:nth-of-type(2)"
   },
   {
    "fill": "#D",
    "value": "12"
   },
   {
    "fill": "#vc",
    "value": "150"
   },
   {
    "fill": "#f",
    "value": "0.05"
   },
   {
    "fill": "#z",
    "value": "3"
   },
   {
    "fill": "#ap",
    "value": "6"
   },
   {
    "fill": "#ae",
    "value": "12"
   }
  ],
  "read": {
   "label": "Cutting power",
   "part": "v",
   "index": 0
  },
  "expected": 2.5434,
  "tol_pct": 0.5
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "name": "Side milling Ø12, ae 3 (φ 60°): mean chip thickness mm (fz·(2ae/D)/φ)",
  "reference": "Sandvik Coromant formulas & definitions (turning: Pc = vc·ap·fn·kc/60 000; milling: Pc = ap·ae·vf·kc/(60·10⁶), hm from engagement angle; drilling: Pc = fn·vc·Dc·kc/240 000), kc = kc1·h^−mc",
  "steps": [
   {
    "click": "#ptiles > button:nth-of-type(2)"
   },
   {
    "fill": "#D",
    "value": "12"
   },
   {
    "fill": "#vc",
    "value": "150"
   },
   {
    "fill": "#f",
    "value": "0.05"
   },
   {
    "fill": "#z",
    "value": "3"
   },
   {
    "fill": "#ap",
    "value": "6"
   },
   {
    "fill": "#ae",
    "value": "3"
   }
  ],
  "read": {
   "label": "Spindle torque",
   "part": "alt",
   "index": 0
  },
  "expected": 0.02387,
  "tol_pct": 2.2
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "name": "Spindle cap: turning Ø10 at Vc 220 with 3000 rpm max: rpm",
  "reference": "n = min(1000 Vc/(πD), nmax)",
  "steps": [
   {
    "fill": "#D",
    "value": "10"
   }
  ],
  "read": {
   "label": "Spindle speed",
   "part": "v",
   "index": 0
  },
  "expected": 3000,
  "tol_pct": 0.5
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "name": "Published rule: 0.5 in cutter at 500 SFM → 3820 rpm (RPM = 3.82·SFM/D); page run as milling Ø12.7 mm, Vc 152.4 m/min",
  "reference": "Machinery's Handbook RPM = 12·SFM/(π D)",
  "steps": [
   {
    "click": "#ptiles > button:nth-of-type(2)"
   },
   {
    "fill": "#D",
    "value": "12.7"
   },
   {
    "fill": "#vc",
    "value": "152.4"
   }
  ],
  "read": {
   "label": "Spindle speed",
   "part": "v",
   "index": 0
  },
  "expected": 3819.7,
  "tol_pct": 0.5
 },
 {
  "slug": "tap-drill-calculator",
  "name": "M3 coarse cutting tap drill (77 %) = 2.5 mm",
  "reference": "ISO 2306 / DIN 336 standard tap drill: M3 -> 2.5 mm",
  "steps": [
   {
    "click": "#stiles .tile[data-s=\"M3\"]"
   }
  ],
  "read": {
   "label": "Tap drill",
   "part": "v",
   "index": 0
  },
  "expected": 2.5,
  "tol_pct": 0.5
 },
 {
  "slug": "tap-drill-calculator",
  "name": "M6 coarse cutting tap drill (77 %) = 5.0 mm",
  "reference": "ISO 2306 / DIN 336 standard tap drill: M6 -> 5.0 mm",
  "steps": [
   {
    "click": "#stiles .tile[data-s=\"M6\"]"
   }
  ],
  "read": {
   "label": "Tap drill",
   "part": "v",
   "index": 0
  },
  "expected": 5.0,
  "tol_pct": 0.5
 },
 {
  "slug": "tap-drill-calculator",
  "name": "M8 coarse cutting tap drill (77 %) = 6.8 mm",
  "reference": "ISO 2306 / DIN 336 standard tap drill: M8 -> 6.8 mm",
  "steps": [
   {
    "click": "#stiles .tile[data-s=\"M8\"]"
   }
  ],
  "read": {
   "label": "Tap drill",
   "part": "v",
   "index": 0
  },
  "expected": 6.8,
  "tol_pct": 0.5
 },
 {
  "slug": "tap-drill-calculator",
  "name": "M10 coarse cutting tap drill (77 %) = 8.5 mm",
  "reference": "ISO 2306 / DIN 336 standard tap drill: M10 -> 8.5 mm",
  "steps": [
   {
    "click": "#stiles .tile[data-s=\"M10\"]"
   }
  ],
  "read": {
   "label": "Tap drill",
   "part": "v",
   "index": 0
  },
  "expected": 8.5,
  "tol_pct": 0.5
 },
 {
  "slug": "tap-drill-calculator",
  "name": "M12 coarse cutting tap drill (77 %) = 10.2 mm",
  "reference": "ISO 2306 / DIN 336 standard tap drill: M12 -> 10.2 mm",
  "steps": [
   {
    "click": "#stiles .tile[data-s=\"M12\"]"
   }
  ],
  "read": {
   "label": "Tap drill",
   "part": "v",
   "index": 0
  },
  "expected": 10.2,
  "tol_pct": 0.5
 },
 {
  "slug": "tap-drill-calculator",
  "name": "M16 coarse cutting tap drill (77 %) = 14 mm",
  "reference": "ISO 2306 / DIN 336 standard tap drill: M16 -> 14 mm",
  "steps": [
   {
    "click": "#stiles .tile[data-s=\"M16\"]"
   }
  ],
  "read": {
   "label": "Tap drill",
   "part": "v",
   "index": 0
  },
  "expected": 14,
  "tol_pct": 0.5
 },
 {
  "slug": "tap-drill-calculator",
  "name": "M20 coarse cutting tap drill (77 %) = 17.5 mm",
  "reference": "ISO 2306 / DIN 336 standard tap drill: M20 -> 17.5 mm",
  "steps": [
   {
    "click": "#stiles .tile[data-s=\"M20\"]"
   }
  ],
  "read": {
   "label": "Tap drill",
   "part": "v",
   "index": 0
  },
  "expected": 17.5,
  "tol_pct": 0.5
 },
 {
  "slug": "tap-drill-calculator",
  "name": "M12x1.25 fine tap drill = 10.8 mm",
  "reference": "ISO 2306 / DIN 336 standard tap drill: M12x1.25 -> 10.8 mm",
  "steps": [
   {
    "click": "#std button[data-s=\"mf\"]"
   },
   {
    "click": "#stiles .tile[data-s=\"M12×1.25\"]"
   }
  ],
  "read": {
   "label": "Tap drill",
   "part": "v",
   "index": 0
  },
  "expected": 10.8,
  "tol_pct": 0.5
 },
 {
  "slug": "tap-drill-calculator",
  "name": "M8 6H D1 min = 6.647 mm",
  "reference": "ISO 965-1/-2: M8 6H D1 6.647-6.912 mm",
  "steps": [
   {
    "click": "#stiles .tile[data-s=\"M8\"]"
   }
  ],
  "read": {
   "label": "6H minor diameter",
   "part": "v",
   "index": 0
  },
  "expected": 6.647,
  "tol_pct": 0.1
 },
 {
  "slug": "tap-drill-calculator",
  "name": "M8 6H D1 max = 6.912 mm",
  "reference": "ISO 965-1/-2: M8 6H D1 max 6.912 mm",
  "steps": [
   {
    "click": "#stiles .tile[data-s=\"M8\"]"
   }
  ],
  "read": {
   "label": "6H minor diameter",
   "part": "alt",
   "index": 0
  },
  "expected": 6.912,
  "tol_pct": 0.1
 },
 {
  "slug": "tap-drill-calculator",
  "name": "M10 6H D1 max = 8.676 mm",
  "reference": "ISO 965-2: M10 6H D1 8.376-8.676 mm",
  "steps": [
   {
    "click": "#stiles .tile[data-s=\"M10\"]"
   }
  ],
  "read": {
   "label": "6H minor diameter",
   "part": "alt",
   "index": 0
  },
  "expected": 8.676,
  "tol_pct": 0.1
 },
 {
  "slug": "tap-drill-calculator",
  "name": "M24 6H D1 min = 20.752 mm",
  "reference": "ISO 965-2: M24 6H D1 20.752-21.252 mm",
  "steps": [
   {
    "click": "#stiles .tile[data-s=\"M24\"]"
   }
  ],
  "read": {
   "label": "6H minor diameter",
   "part": "v",
   "index": 0
  },
  "expected": 20.752,
  "tol_pct": 0.1
 },
 {
  "slug": "tap-drill-calculator",
  "name": "M3 6H D1 max = 2.599 mm (P0.5, TD1=0.140)",
  "reference": "ISO 965-2: M3 6H D1 2.459-2.599 mm",
  "steps": [
   {
    "click": "#stiles .tile[data-s=\"M3\"]"
   }
  ],
  "read": {
   "label": "6H minor diameter",
   "part": "alt",
   "index": 0
  },
  "expected": 2.599,
  "tol_pct": 0.1
 },
 {
  "slug": "tap-drill-calculator",
  "name": "M10 8.5 mm drill gives 77 % thread",
  "reference": "Machinery's Handbook % thread = (D-d)/(1.299P): (10-8.5)/(1.299*1.5)=77 %",
  "steps": [
   {
    "click": "#stiles .tile[data-s=\"M10\"]"
   }
  ],
  "read": {
   "label": "Thread engagement",
   "part": "v",
   "index": 0
  },
  "expected": 77,
  "tol_pct": 0.7
 },
 {
  "slug": "tap-drill-calculator",
  "name": "M8 forming tap drill 7.4 mm (65 %)",
  "reference": "Forming-tap drill charts (OSG/Emuge): M8x1.25 -> 7.4 mm",
  "steps": [
   {
    "click": "#stiles .tile[data-s=\"M8\"]"
   },
   {
    "click": "#ttiles .tile[data-k=\"form\"]"
   }
  ],
  "read": {
   "label": "Tap drill",
   "part": "v",
   "index": 0
  },
  "expected": 7.4,
  "tol_pct": 0.5
 },
 {
  "slug": "tap-drill-calculator",
  "name": "1/4-20 UNC at 75 % -> #7 drill 0.2010 in",
  "reference": "Machinery's Handbook tap drill table: 1/4-20 -> #7 (0.201 in) for 75 %",
  "steps": [
   {
    "click": "#std button[data-s=\"unc\"]"
   },
   {
    "fill": "#pct",
    "value": "75"
   }
  ],
  "read": {
   "label": "Tap drill",
   "part": "alt",
   "index": 0
  },
  "expected": 0.201,
  "tol_pct": 0.1
 },
 {
  "slug": "tap-drill-calculator",
  "name": "1/4-20 2B minor dia min 0.196 in (page 0.1959)",
  "reference": "ASME B1.1 1/4-20 UNC-2B minor dia 0.196-0.207 in",
  "steps": [
   {
    "click": "#std button[data-s=\"unc\"]"
   }
  ],
  "read": {
   "label": "Minor diameter (≈2B)",
   "part": "v",
   "index": 0
  },
  "expected": 0.196,
  "tol_pct": 0.5
 },
 {
  "slug": "tap-drill-calculator",
  "name": "1/4-20 2B minor dia max 0.207 in, page uses ISO 6H band (method, tol 1.5 %)",
  "reference": "ASME B1.1 1/4-20 UNC-2B minor dia max 0.207 in",
  "steps": [
   {
    "click": "#std button[data-s=\"unc\"]"
   }
  ],
  "read": {
   "label": "Minor diameter (≈2B)",
   "part": "alt",
   "index": 0
  },
  "expected": 0.207,
  "tol_pct": 1.5
 },
 {
  "slug": "tap-drill-calculator",
  "name": "M8 blind hole depth 17.8 mm for 12 mm thread",
  "reference": "Page worked example / rule 12 + 3P + 0.3d",
  "steps": [
   {
    "click": "#stiles .tile[data-s=\"M8\"]"
   }
  ],
  "read": {
   "label": "Blind hole depth",
   "part": "v",
   "index": 0
  },
  "expected": 17.79,
  "tol_pct": 0.5
 },
 {
  "slug": "bolt-circle-pcd-calculator",
  "name": "5x112 hole-to-hole chord 65.832 mm",
  "reference": "Machinery's Handbook: chord = D sin(180/n), 5 holes K=0.58779",
  "steps": [],
  "read": {
   "label": "Hole to next hole",
   "part": "v",
   "index": 0
  },
  "expected": 65.832,
  "tol_pct": 0.1
 },
 {
  "slug": "bolt-circle-pcd-calculator",
  "name": "5x112 hole to farthest hole 106.52 mm (0.951 D)",
  "reference": "D cos(90/n); 5-stud 0.951·D",
  "steps": [],
  "read": {
   "label": "Hole to farthest hole",
   "part": "v",
   "index": 0
  },
  "expected": 106.518,
  "tol_pct": 0.1
 },
 {
  "slug": "bolt-circle-pcd-calculator",
  "name": "12 holes on D10 chord 2.588 (K=0.25882)",
  "reference": "Machinery's Handbook bolt-circle constant n=12: 0.25882",
  "steps": [
   {
    "fill": "#D",
    "value": "10"
   },
   {
    "fill": "#n",
    "value": "12"
   },
   {
    "fill": "#hd",
    "value": "0.5"
   },
   {
    "fill": "#od",
    "value": ""
   },
   {
    "fill": "#bd",
    "value": ""
   }
  ],
  "read": {
   "label": "Hole to next hole",
   "part": "v",
   "index": 0
  },
  "expected": 2.588,
  "tol_pct": 0.1
 },
 {
  "slug": "bolt-circle-pcd-calculator",
  "name": "6x139.7 opposite hole 139.7 / chord 69.85",
  "reference": "Machinery's Handbook n=6 K=0.5",
  "steps": [
   {
    "fill": "#D",
    "value": "139.7"
   },
   {
    "fill": "#n",
    "value": "6"
   },
   {
    "fill": "#od",
    "value": ""
   },
   {
    "fill": "#bd",
    "value": ""
   }
  ],
  "read": {
   "label": "Hole to next hole",
   "part": "v",
   "index": 0
  },
  "expected": 69.85,
  "tol_pct": 0.1
 },
 {
  "slug": "bolt-circle-pcd-calculator",
  "name": "Measured 65.83 mm on 5 studs -> PCD 112.0",
  "reference": "PCD = C / sin(180/n)",
  "steps": [
   {
    "click": "#mseg button[data-m=\"meas\"]"
   },
   {
    "fill": "#C",
    "value": "65.83"
   }
  ],
  "read": {
   "label": "PCD from your measurement",
   "part": "v",
   "index": 0
  },
  "expected": 112.0,
  "tol_pct": 0.1
 },
 {
  "slug": "bolt-circle-pcd-calculator",
  "name": "8 holes D100: hole 2 X = 35.355",
  "reference": "x = R cos(45°)",
  "steps": [
   {
    "fill": "#D",
    "value": "100"
   },
   {
    "fill": "#n",
    "value": "8"
   },
   {
    "fill": "#a0",
    "value": "0"
   },
   {
    "fill": "#hd",
    "value": "8"
   },
   {
    "fill": "#od",
    "value": ""
   },
   {
    "fill": "#bd",
    "value": ""
   }
  ],
  "read": {
   "selector": "#ctab tr:nth-of-type(2) td:nth-of-type(3)",
   "index": 0
  },
  "expected": 35.355,
  "tol_pct": 0.05
 },
 {
  "slug": "bolt-circle-pcd-calculator",
  "name": "Ligament 65.83-14 = 51.83 mm",
  "reference": "c - hole dia",
  "steps": [],
  "read": {
   "label": "Ligament between holes",
   "part": "v",
   "index": 0
  },
  "expected": 51.83,
  "tol_pct": 0.1
 },
 {
  "slug": "bolt-circle-pcd-calculator",
  "name": "Edge distance (150-112)/2-7 = 12 mm",
  "reference": "geometry",
  "steps": [],
  "read": {
   "label": "Edge distance",
   "part": "v",
   "index": 0
  },
  "expected": 12,
  "tol_pct": 0.1
 },
 {
  "slug": "bolt-circle-pcd-calculator",
  "name": "Inch: 4 holes on 4.5 in -> chord 3.182 in",
  "reference": "Machinery's Handbook n=4 K=0.70711",
  "steps": [
   {
    "click": "#useg button[data-u=\"i\"]"
   },
   {
    "fill": "#D",
    "value": "4.5"
   },
   {
    "fill": "#n",
    "value": "4"
   },
   {
    "fill": "#hd",
    "value": "0.5"
   },
   {
    "fill": "#od",
    "value": ""
   },
   {
    "fill": "#bd",
    "value": ""
   }
  ],
  "read": {
   "label": "Hole to next hole",
   "part": "v",
   "index": 0
  },
  "expected": 3.182,
  "tol_pct": 0.1
 },
 {
  "slug": "surface-roughness-calculator",
  "name": "Turning f0.2 r0.8: Ra 1.60 µm",
  "reference": "Boothroyd/Shaw: Ra = f²/(18√3 r) = 1.604 µm",
  "steps": [],
  "read": {
   "label": "Theoretical Ra",
   "part": "v",
   "index": 0
  },
  "expected": 1.604,
  "tol_pct": 0.5
 },
 {
  "slug": "surface-roughness-calculator",
  "name": "Turning f0.2 r0.8: Rt 6.25 µm",
  "reference": "Rt = f²/(8r) (Sandvik/Kennametal)",
  "steps": [],
  "read": {
   "label": "Peak-to-valley Rt (≈ Rz)",
   "part": "v",
   "index": 0
  },
  "expected": 6.25,
  "tol_pct": 0.5
 },
 {
  "slug": "surface-roughness-calculator",
  "name": "Ra in µin = 63",
  "reference": "1 µm = 39.37 µin",
  "steps": [],
  "read": {
   "label": "Theoretical Ra",
   "part": "alt",
   "index": 1
  },
  "expected": 63,
  "tol_pct": 1
 },
 {
  "slug": "surface-roughness-calculator",
  "name": "Feed for Ra 0.8 with R0.8 = 0.141 mm/rev",
  "reference": "f = √(18√3·r·Ra)",
  "steps": [
   {
    "click": "#oseg button[data-o=\"target\"]"
   },
   {
    "fill": "#ra",
    "value": "0.8"
   }
  ],
  "read": {
   "label": "Feed for the target",
   "part": "v",
   "index": 0
  },
  "expected": 0.1413,
  "tol_pct": 0.5
 },
 {
  "slug": "surface-roughness-calculator",
  "name": "Ball Ø10, stepover 0.5: cusp 6.25 µm",
  "reference": "h = R − √(R² − (s/2)²) (Sandvik/Machinery's Handbook)",
  "steps": [
   {
    "click": "#oseg button[data-o=\"ball\"]"
   }
  ],
  "read": {
   "label": "Cusp (scallop) height",
   "part": "v",
   "index": 0
  },
  "expected": 6.254,
  "tol_pct": 0.5
 },
 {
  "slug": "surface-roughness-calculator",
  "name": "Ball-nose Ra ≈ cusp/4 vs arc-profile Ra = 0.2566·h (method, tol 3 %)",
  "reference": "Arc profile: Ra = h·8/(18√3) = 1.605 µm",
  "steps": [
   {
    "click": "#oseg button[data-o=\"ball\"]"
   }
  ],
  "read": {
   "label": "Approx. Ra",
   "part": "v",
   "index": 0
  },
  "expected": 1.605,
  "tol_pct": 3
 },
 {
  "slug": "surface-roughness-calculator",
  "name": "Turning f0.1 r0.4: Ra 0.802 µm",
  "reference": "Ra = f²/(31.18 r)",
  "steps": [
   {
    "fill": "#r",
    "value": "0.4"
   },
   {
    "fill": "#f",
    "value": "0.1"
   }
  ],
  "read": {
   "label": "Theoretical Ra",
   "part": "v",
   "index": 0
  },
  "expected": 0.8018,
  "tol_pct": 0.5
 },
 {
  "slug": "surface-roughness-calculator",
  "name": "Inch: f 0.008 in/rev, r 1/32 in: Ra ≈ 66 µin",
  "reference": "Ra = f²/(18√3·r) ·1e6 µin",
  "steps": [
   {
    "click": "#useg button[data-u=\"i\"]"
   },
   {
    "fill": "#r",
    "value": "0.03125"
   },
   {
    "fill": "#f",
    "value": "0.008"
   }
  ],
  "read": {
   "label": "Theoretical Ra",
   "part": "v",
   "index": 0
  },
  "expected": 65.68,
  "tol_pct": 1
 },
 {
  "slug": "iso-fits-tolerances-calculator",
  "name": "Ø25 H7 ES = +21 µm",
  "reference": "ISO 286-2:2010 table: H7 18-30 = +21/0",
  "steps": [
   {
    "fill": "#D",
    "value": "25"
   },
   {
    "fill": "#hl",
    "value": "H7"
   },
   {
    "fill": "#sh",
    "value": "g6"
   }
  ],
  "read": {
   "label": "Hole H7",
   "part": "v",
   "index": 0
  },
  "expected": 21,
  "tol_pct": 0.1
 },
 {
  "slug": "iso-fits-tolerances-calculator",
  "name": "Ø25 g6 es = −7 µm",
  "reference": "ISO 286-2:2010 table: g6 18-30 = −7/−20",
  "steps": [
   {
    "fill": "#D",
    "value": "25"
   },
   {
    "fill": "#hl",
    "value": "H7"
   },
   {
    "fill": "#sh",
    "value": "g6"
   }
  ],
  "read": {
   "label": "Shaft g6",
   "part": "v",
   "index": 0
  },
  "expected": -7,
  "tol_pct": 0.1
 },
 {
  "slug": "iso-fits-tolerances-calculator",
  "name": "Ø25 g6 ei = −20 µm",
  "reference": "ISO 286-2:2010 table: g6 18-30 = −7/−20",
  "steps": [
   {
    "fill": "#D",
    "value": "25"
   },
   {
    "fill": "#hl",
    "value": "H7"
   },
   {
    "fill": "#sh",
    "value": "g6"
   }
  ],
  "read": {
   "label": "Shaft g6",
   "part": "v",
   "index": 1
  },
  "expected": -20,
  "tol_pct": 0.1
 },
 {
  "slug": "iso-fits-tolerances-calculator",
  "name": "Ø25 K8 ES = +10 µm",
  "reference": "ISO 286-2:2010 table: K8 18-30 = +10/−23",
  "steps": [
   {
    "fill": "#D",
    "value": "25"
   },
   {
    "fill": "#hl",
    "value": "K8"
   },
   {
    "fill": "#sh",
    "value": "h7"
   }
  ],
  "read": {
   "label": "Hole K8",
   "part": "v",
   "index": 0
  },
  "expected": 10,
  "tol_pct": 0.1
 },
 {
  "slug": "iso-fits-tolerances-calculator",
  "name": "Ø25 K8 EI = −23 µm",
  "reference": "ISO 286-2:2010 table: K8 18-30 = +10/−23",
  "steps": [
   {
    "fill": "#D",
    "value": "25"
   },
   {
    "fill": "#hl",
    "value": "K8"
   },
   {
    "fill": "#sh",
    "value": "h7"
   }
  ],
  "read": {
   "label": "Hole K8",
   "part": "v",
   "index": 1
  },
  "expected": -23,
  "tol_pct": 0.1
 },
 {
  "slug": "iso-fits-tolerances-calculator",
  "name": "Ø300 M6 ES = −9 µm (special case)",
  "reference": "ISO 286-2:2010 table: M6 250-315 = −9/−41",
  "steps": [
   {
    "fill": "#D",
    "value": "300"
   },
   {
    "fill": "#hl",
    "value": "M6"
   },
   {
    "fill": "#sh",
    "value": "h5"
   }
  ],
  "read": {
   "label": "Hole M6",
   "part": "v",
   "index": 0
  },
  "expected": -9,
  "tol_pct": 0.1
 },
 {
  "slug": "iso-fits-tolerances-calculator",
  "name": "Ø300 M6 EI = −41 µm",
  "reference": "ISO 286-2:2010 table: M6 250-315 = −9/−41",
  "steps": [
   {
    "fill": "#D",
    "value": "300"
   },
   {
    "fill": "#hl",
    "value": "M6"
   },
   {
    "fill": "#sh",
    "value": "h5"
   }
  ],
  "read": {
   "label": "Hole M6",
   "part": "v",
   "index": 1
  },
  "expected": -41,
  "tol_pct": 0.1
 },
 {
  "slug": "iso-fits-tolerances-calculator",
  "name": "Ø25 M7 EI = −21 µm (ES 0)",
  "reference": "ISO 286-2:2010 table: M7 18-30 = 0/−21",
  "steps": [
   {
    "fill": "#D",
    "value": "25"
   },
   {
    "fill": "#hl",
    "value": "M7"
   },
   {
    "fill": "#sh",
    "value": "h6"
   }
  ],
  "read": {
   "label": "Hole M7",
   "part": "v",
   "index": 1
  },
  "expected": -21,
  "tol_pct": 0.1
 },
 {
  "slug": "iso-fits-tolerances-calculator",
  "name": "Ø25 N7 ES = −7 µm",
  "reference": "ISO 286-2:2010 table: N7 18-30 = −7/−28",
  "steps": [
   {
    "fill": "#D",
    "value": "25"
   },
   {
    "fill": "#hl",
    "value": "N7"
   },
   {
    "fill": "#sh",
    "value": "h6"
   }
  ],
  "read": {
   "label": "Hole N7",
   "part": "v",
   "index": 0
  },
  "expected": -7,
  "tol_pct": 0.1
 },
 {
  "slug": "iso-fits-tolerances-calculator",
  "name": "Ø40 P7 ES = −17 µm",
  "reference": "ISO 286-2:2010 table: P7 30-50 = −17/−42",
  "steps": [
   {
    "fill": "#D",
    "value": "40"
   },
   {
    "fill": "#hl",
    "value": "P7"
   },
   {
    "fill": "#sh",
    "value": "h6"
   }
  ],
  "read": {
   "label": "Hole P7",
   "part": "v",
   "index": 0
  },
  "expected": -17,
  "tol_pct": 0.1
 },
 {
  "slug": "iso-fits-tolerances-calculator",
  "name": "Ø25 P6 EI = −31 µm",
  "reference": "ISO 286-2:2010 table: P6 18-30 = −18/−31",
  "steps": [
   {
    "fill": "#D",
    "value": "25"
   },
   {
    "fill": "#hl",
    "value": "P6"
   },
   {
    "fill": "#sh",
    "value": "h5"
   }
  ],
  "read": {
   "label": "Hole P6",
   "part": "v",
   "index": 1
  },
  "expected": -31,
  "tol_pct": 0.1
 },
 {
  "slug": "iso-fits-tolerances-calculator",
  "name": "Ø100 s6 es = +93 µm",
  "reference": "ISO 286-2:2010 table: s6 80-100 = +93/+71",
  "steps": [
   {
    "fill": "#D",
    "value": "100"
   },
   {
    "fill": "#hl",
    "value": "H7"
   },
   {
    "fill": "#sh",
    "value": "s6"
   }
  ],
  "read": {
   "label": "Shaft s6",
   "part": "v",
   "index": 0
  },
  "expected": 93,
  "tol_pct": 0.1
 },
 {
  "slug": "iso-fits-tolerances-calculator",
  "name": "Ø150 r6 ei = +65 µm",
  "reference": "ISO 286-2:2010 table: r6 140-160 = +90/+65",
  "steps": [
   {
    "fill": "#D",
    "value": "150"
   },
   {
    "fill": "#hl",
    "value": "H7"
   },
   {
    "fill": "#sh",
    "value": "r6"
   }
  ],
  "read": {
   "label": "Shaft r6",
   "part": "v",
   "index": 1
  },
  "expected": 65,
  "tol_pct": 0.1
 },
 {
  "slug": "iso-fits-tolerances-calculator",
  "name": "Ø40 c11 ei = −280 µm",
  "reference": "ISO 286-2:2010 table: c11 30-40 = −120/−280",
  "steps": [
   {
    "fill": "#D",
    "value": "40"
   },
   {
    "fill": "#hl",
    "value": "H11"
   },
   {
    "fill": "#sh",
    "value": "c11"
   }
  ],
  "read": {
   "label": "Shaft c11",
   "part": "v",
   "index": 1
  },
  "expected": -280,
  "tol_pct": 0.1
 },
 {
  "slug": "iso-fits-tolerances-calculator",
  "name": "Ø25 H7/g6 max clearance 41 µm",
  "reference": "ISO 286-1: ES − ei = 21 + 20",
  "steps": [
   {
    "fill": "#D",
    "value": "25"
   },
   {
    "fill": "#hl",
    "value": "H7"
   },
   {
    "fill": "#sh",
    "value": "g6"
   }
  ],
  "read": {
   "label": "Max clearance",
   "part": "v",
   "index": 0
  },
  "expected": 41,
  "tol_pct": 0.1
 },
 {
  "slug": "iso-fits-tolerances-calculator",
  "name": "Ø25 H7/p6 max interference 35 µm",
  "reference": "ISO 286-2: p6 18-30 = +35/+22",
  "steps": [
   {
    "fill": "#D",
    "value": "25"
   },
   {
    "fill": "#hl",
    "value": "H7"
   },
   {
    "fill": "#sh",
    "value": "p6"
   }
  ],
  "read": {
   "label": "Max interference",
   "part": "v",
   "index": 0
  },
  "expected": 35,
  "tol_pct": 0.1
 },
 {
  "slug": "iso-fits-tolerances-calculator",
  "name": "Ø25 H7/p6 shrink temperature 229 °C",
  "reference": "ΔT = (i + 0.001D)/(αD) (Machinery's Handbook practice)",
  "steps": [
   {
    "fill": "#D",
    "value": "25"
   },
   {
    "fill": "#hl",
    "value": "H7"
   },
   {
    "fill": "#sh",
    "value": "p6"
   }
  ],
  "read": {
   "label": "Shrink-fit heating",
   "part": "v",
   "index": 0
  },
  "expected": 228.7,
  "tol_pct": 0.5
 },
 {
  "slug": "gearing-differential-calculator",
  "name": "RPM at 110 km/h in 6th = 2917",
  "reference": "n = v·i·1e6/(60·πD), D = 634.3 mm (225/45R17)",
  "steps": [],
  "read": {
   "label": "RPM at 110 km/h in 6th",
   "part": "v",
   "index": 0
  },
  "expected": 2916.9,
  "tol_pct": 0.1
 },
 {
  "slug": "gearing-differential-calculator",
  "name": "Top speed at 6500 rpm in 6th = 245 km/h",
  "reference": "v = n/i·πD·60/1e6",
  "steps": [],
  "read": {
   "label": "Top speed at redline",
   "part": "v",
   "index": 0
  },
  "expected": 245.1,
  "tol_pct": 0.5
 },
 {
  "slug": "gearing-differential-calculator",
  "name": "1st gear at redline = 51 km/h",
  "reference": "v = n/i·πD·60/1e6",
  "steps": [],
  "read": {
   "label": "1st gear at redline",
   "part": "v",
   "index": 0
  },
  "expected": 50.69,
  "tol_pct": 1.0
 },
 {
  "slug": "gearing-differential-calculator",
  "name": "Wheel torque in 1st = 4139 N·m (η 0.90)",
  "reference": "T·i·η",
  "steps": [],
  "read": {
   "label": "Wheel torque in 1st",
   "part": "v",
   "index": 0
  },
  "expected": 4139.2,
  "tol_pct": 0.1
 },
 {
  "slug": "gearing-differential-calculator",
  "name": "Tractive pull 13 051 N",
  "reference": "T_wheel / r (unloaded radius)",
  "steps": [],
  "read": {
   "label": "Wheel torque in 1st",
   "part": "alt",
   "index": 0
  },
  "expected": 13051,
  "tol_pct": 0.1
 },
 {
  "slug": "gearing-differential-calculator",
  "name": "Wheel speed at 110 km/h = 920 rpm",
  "reference": "1e6·v/(60·πD)",
  "steps": [],
  "read": {
   "label": "Wheel speed",
   "part": "v",
   "index": 0
  },
  "expected": 920.0,
  "tol_pct": 0.1
 },
 {
  "slug": "gearing-differential-calculator",
  "name": "Inner wheel 15 m turn = 872 rpm (Ackermann geometry)",
  "reference": "n·(R − t/2)/R",
  "steps": [],
  "read": {
   "label": "Inner / outer wheel",
   "part": "v",
   "index": 0
  },
  "expected": 872.5,
  "tol_pct": 0.1
 },
 {
  "slug": "gearing-differential-calculator",
  "name": "Outer wheel 15 m turn = 968 rpm",
  "reference": "n·(R + t/2)/R",
  "steps": [],
  "read": {
   "label": "Inner / outer wheel",
   "part": "v",
   "index": 1
  },
  "expected": 967.6,
  "tol_pct": 0.1
 },
 {
  "slug": "gearing-differential-calculator",
  "name": "mph: 70 mph in 6th = 2987 rpm",
  "reference": "1 mi = 1.609344 km",
  "steps": [
   {
    "click": "#u-mi"
   },
   {
    "fill": "#cruise",
    "value": "70"
   }
  ],
  "read": {
   "label": "RPM at 70 mph in 6th",
   "part": "v",
   "index": 0
  },
  "expected": 2987.3,
  "tol_pct": 0.1
 },
 {
  "slug": "gearing-differential-calculator",
  "name": "Ring/pinion 41/10 -> 4.10: 3206 rpm at 110 km/h",
  "reference": "i = 41/10",
  "steps": [
   {
    "fill": "#rp",
    "value": "41/10"
   }
  ],
  "read": {
   "label": "RPM at 110 km/h in 6th",
   "part": "v",
   "index": 0
  },
  "expected": 3206.3,
  "tol_pct": 0.1
 },
 {
  "slug": "tire-size-calculator",
  "name": "205/55R16 -> 225/45R17 diameter +0.38 %",
  "reference": "ISO 4000-1 size code: D = rim·25.4 + 2·w·AR",
  "steps": [],
  "read": {
   "label": "Diameter difference",
   "part": "v",
   "index": 0
  },
  "expected": 0.38,
  "tol_pct": 1.5
 },
 {
  "slug": "tire-size-calculator",
  "name": "Real speed at 100 km/h = 100.4",
  "reference": "v·D_new/D_old",
  "steps": [],
  "read": {
   "label": "Real speed",
   "part": "v",
   "index": 0
  },
  "expected": 100.38,
  "tol_pct": 0.1
 },
 {
  "slug": "tire-size-calculator",
  "name": "New diameter 634.3 mm (Tire Rack 24.97 in)",
  "reference": "tire spec tables",
  "steps": [],
  "read": {
   "label": "New diameter",
   "part": "v",
   "index": 0
  },
  "expected": 634.3,
  "tol_pct": 0.05
 },
 {
  "slug": "tire-size-calculator",
  "name": "Ground clearance +1.2 mm",
  "reference": "(D_new − D_old)/2",
  "steps": [],
  "read": {
   "label": "Ground clearance",
   "part": "v",
   "index": 0
  },
  "expected": 1.2,
  "tol_pct": 1
 },
 {
  "slug": "tire-size-calculator",
  "name": "Sidewall 101.25 mm",
  "reference": "225·0.45",
  "steps": [],
  "read": {
   "label": "Sidewall",
   "part": "v",
   "index": 0
  },
  "expected": 101.25,
  "tol_pct": 0.1
 },
 {
  "slug": "tire-size-calculator",
  "name": "Revs per km 502",
  "reference": "1e6/(π·634.3)",
  "steps": [],
  "read": {
   "label": "Revs per km",
   "part": "v",
   "index": 0
  },
  "expected": 501.8,
  "tol_pct": 0.2
 },
 {
  "slug": "tire-size-calculator",
  "name": "225/50R17 is +3.94 %",
  "reference": "D = 656.8 mm",
  "steps": [
   {
    "fill": "#a2",
    "value": "50"
   }
  ],
  "read": {
   "label": "Diameter difference",
   "part": "v",
   "index": 0
  },
  "expected": 3.94,
  "tol_pct": 0.5
 },
 {
  "slug": "tire-size-calculator",
  "name": "Inch: 265/70R17 diameter 31.61 in (published 31.6 in)",
  "reference": "Tire maker spec (BFGoodrich KO2 265/70R17: 31.6 in)",
  "steps": [
   {
    "click": "#useg button[data-u=\"i\"]"
   },
   {
    "fill": "#w2",
    "value": "265"
   },
   {
    "fill": "#a2",
    "value": "70"
   },
   {
    "fill": "#r2",
    "value": "17"
   }
  ],
  "read": {
   "label": "New diameter",
   "part": "v",
   "index": 0
  },
  "expected": 31.61,
  "tol_pct": 0.1
 },
 {
  "slug": "tire-size-calculator",
  "name": "Inch: revs per mile 808 for 225/45R17",
  "reference": "1.609344e6/(π·634.3)",
  "steps": [
   {
    "click": "#useg button[data-u=\"i\"]"
   }
  ],
  "read": {
   "label": "Revs per mile",
   "part": "v",
   "index": 0
  },
  "expected": 807.6,
  "tol_pct": 0.2
 },
 {
  "slug": "engine-displacement-compression-calculator",
  "name": "Honda K20 86x86x4 = 1998 cc (published 1998 cc)",
  "reference": "Honda K20A spec: 1998 cc",
  "steps": [],
  "read": {
   "label": "Displacement",
   "part": "v",
   "index": 0
  },
  "expected": 1998.2,
  "tol_pct": 0.1
 },
 {
  "slug": "engine-displacement-compression-calculator",
  "name": "Static CR 11.01:1",
  "reference": "CR = (Vs+Vc)/Vc, Vc = 49.91 cc",
  "steps": [],
  "read": {
   "label": "Static compression",
   "part": "v",
   "index": 0
  },
  "expected": 11.008,
  "tol_pct": 0.1
 },
 {
  "slug": "engine-displacement-compression-calculator",
  "name": "Dynamic CR 9.68:1 (IVC 50° ABDC, rod 139)",
  "reference": "slider-crank x(θ); DCR = (Vc + A·x)/Vc",
  "steps": [],
  "read": {
   "label": "Dynamic compression",
   "part": "v",
   "index": 0
  },
  "expected": 9.682,
  "tol_pct": 0.2
 },
 {
  "slug": "engine-displacement-compression-calculator",
  "name": "Mean piston speed 22.4 m/s at 7800 rpm",
  "reference": "cm = 2·s·n/60",
  "steps": [],
  "read": {
   "label": "Mean piston speed",
   "part": "v",
   "index": 0
  },
  "expected": 22.36,
  "tol_pct": 0.3
 },
 {
  "slug": "engine-displacement-compression-calculator",
  "name": "Chevy 350: 5733 cc",
  "reference": "4.000 in × 3.48 in × 8 = 350 ci = 5733 cc",
  "steps": [
   {
    "click": "#etiles .tile[data-i=\"4\"]"
   }
  ],
  "read": {
   "label": "Displacement",
   "part": "v",
   "index": 0
  },
  "expected": 5733.5,
  "tol_pct": 0.1
 },
 {
  "slug": "engine-displacement-compression-calculator",
  "name": "Chevy 350: 349.9 ci (published 350 ci)",
  "reference": "GM small-block 350 spec",
  "steps": [
   {
    "click": "#etiles .tile[data-i=\"4\"]"
   },
   {
    "click": "#useg button[data-u=\"i\"]"
   }
  ],
  "read": {
   "label": "Displacement",
   "part": "v",
   "index": 0
  },
  "expected": 349.9,
  "tol_pct": 0.1
 },
 {
  "slug": "engine-displacement-compression-calculator",
  "name": "V8 90° firing interval 90°",
  "reference": "720°/8",
  "steps": [
   {
    "click": "#etiles .tile[data-i=\"4\"]"
   }
  ],
  "read": {
   "label": "Firing interval",
   "part": "v",
   "index": 0
  },
  "expected": 90,
  "tol_pct": 0.1
 },
 {
  "slug": "engine-displacement-compression-calculator",
  "name": "Porsche 3.6 flat-6: 3600 cc",
  "reference": "Porsche 964 M64: 3600 cc",
  "steps": [
   {
    "click": "#etiles .tile[data-i=\"3\"]"
   }
  ],
  "read": {
   "label": "Displacement",
   "part": "v",
   "index": 0
  },
  "expected": 3600.3,
  "tol_pct": 0.1
 },
 {
  "slug": "engine-displacement-compression-calculator",
  "name": "Mazda 13B: 2 × 654 = 1309 cc (Mazda 1308 cc)",
  "reference": "Wankel Vh = 3√3·R·e·B",
  "steps": [
   {
    "click": "#tseg button[data-t=\"wk\"]"
   },
   {
    "click": "#etiles .tile[data-i=\"1\"]"
   }
  ],
  "read": {
   "label": "Displacement",
   "part": "v",
   "index": 0
  },
  "expected": 1308,
  "tol_pct": 0.2
 },
 {
  "slug": "engine-displacement-compression-calculator",
  "name": "Honda CR125: 124.8 cc",
  "reference": "Honda CR125R 54 × 54.5 mm = 124.8 cc",
  "steps": [
   {
    "click": "#tseg button[data-t=\"t2\"]"
   },
   {
    "click": "#etiles .tile[data-i=\"0\"]"
   }
  ],
  "read": {
   "label": "Displacement",
   "part": "v",
   "index": 0
  },
  "expected": 124.8,
  "tol_pct": 0.5
 },
 {
  "slug": "engine-displacement-compression-calculator",
  "name": "CR125 trapped CR ≈ 8.5 (preset target, exhaust closing → TDC)",
  "reference": "Blair, Design & Simulation of Two-Stroke Engines: TCR = (Vc + A·(port depth − deck))/Vc",
  "steps": [
   {
    "click": "#tseg button[data-t=\"t2\"]"
   },
   {
    "click": "#etiles .tile[data-i=\"0\"]"
   }
  ],
  "read": {
   "label": "Trapped compression",
   "part": "v",
   "index": 0
  },
  "expected": 8.5,
  "tol_pct": 1
 },
 {
  "slug": "engine-displacement-compression-calculator",
  "name": "CR125 exhaust duration 172° (opens 94° ATDC)",
  "reference": "360 − 2·94",
  "steps": [
   {
    "click": "#tseg button[data-t=\"t2\"]"
   },
   {
    "click": "#etiles .tile[data-i=\"0\"]"
   }
  ],
  "read": {
   "label": "Exhaust duration",
   "part": "v",
   "index": 0
  },
  "expected": 172,
  "tol_pct": 0.6
 },
 {
  "slug": "horsepower-torque-calculator",
  "name": "200 N·m @ 4500 rpm = 94.25 kW",
  "reference": "P = T·n/9549 (SI definition, 60000/2π)",
  "steps": [],
  "read": {
   "label": "Power",
   "part": "v",
   "index": 0
  },
  "expected": 94.248,
  "tol_pct": 0.1
 },
 {
  "slug": "horsepower-torque-calculator",
  "name": "= 126.4 hp (mechanical)",
  "reference": "1 hp = 745.7 W",
  "steps": [],
  "read": {
   "label": "Power",
   "part": "alt",
   "index": 0
  },
  "expected": 126.39,
  "tol_pct": 0.1
 },
 {
  "slug": "horsepower-torque-calculator",
  "name": "= 128.1 PS",
  "reference": "1 PS = 735.5 W",
  "steps": [],
  "read": {
   "label": "Power",
   "part": "alt",
   "index": 1
  },
  "expected": 128.14,
  "tol_pct": 0.1
 },
 {
  "slug": "horsepower-torque-calculator",
  "name": "At wheels with 15 % loss = 80.1 kW",
  "reference": "P·(1−loss)",
  "steps": [],
  "read": {
   "label": "At the wheels",
   "part": "v",
   "index": 0
  },
  "expected": 80.11,
  "tol_pct": 0.1
 },
 {
  "slug": "horsepower-torque-calculator",
  "name": "Torque for 150 kW @ 6000 rpm = 238.7 N·m",
  "reference": "T = 9549·P/n",
  "steps": [
   {
    "click": "#sseg button[data-s=\"T\"]"
   },
   {
    "fill": "#P",
    "value": "150"
   },
   {
    "fill": "#N",
    "value": "6000"
   }
  ],
  "read": {
   "label": "Torque",
   "part": "v",
   "index": 0
  },
  "expected": 238.73,
  "tol_pct": 0.1
 },
 {
  "slug": "horsepower-torque-calculator",
  "name": "Speed for 100 kW, 200 N·m = 4775 rpm",
  "reference": "n = 9549·P/T",
  "steps": [
   {
    "click": "#sseg button[data-s=\"N\"]"
   },
   {
    "fill": "#P",
    "value": "100"
   },
   {
    "fill": "#T",
    "value": "200"
   }
  ],
  "read": {
   "label": "Speed",
   "part": "v",
   "index": 0
  },
  "expected": 4774.6,
  "tol_pct": 0.1
 },
 {
  "slug": "horsepower-torque-calculator",
  "name": "US: 300 lb·ft @ 5000 rpm = 285.6 hp",
  "reference": "hp = lb·ft·rpm/5252",
  "steps": [
   {
    "click": "#useg button[data-u=\"i\"]"
   },
   {
    "fill": "#T",
    "value": "300"
   },
   {
    "fill": "#N",
    "value": "5000"
   }
  ],
  "read": {
   "label": "Power",
   "part": "v",
   "index": 0
  },
  "expected": 285.6,
  "tol_pct": 0.1
 },
 {
  "slug": "horsepower-torque-calculator",
  "name": "200 N·m = 20.39 kgf·m (unit table)",
  "reference": "1 kgf·m = 9.80665 N·m",
  "steps": [],
  "read": {
   "selector": "#utab tr:nth-of-type(4) td:nth-of-type(4)",
   "index": 0
  },
  "expected": 20.394,
  "tol_pct": 0.5
 },
 {
  "slug": "horsepower-torque-calculator",
  "name": "K20-type curve: peak power 146.6 kW",
  "reference": "piecewise-linear torque, max of T·n/9549 (independent calc: 7977 rpm, 175.5 N·m)",
  "steps": [
   {
    "click": "#ptiles .tile[data-i=\"0\"]"
   }
  ],
  "read": {
   "label": "Peak power (curve)",
   "part": "v",
   "index": 0
  },
  "expected": 146.61,
  "tol_pct": 0.2
 },
 {
  "slug": "u-joint-calculator",
  "name": "Single 10°: speed swing 3.06 %",
  "reference": "Hooke: 1/cosβ − cosβ (Shigley / Mabie & Reinholtz)",
  "steps": [
   {
    "click": "#ctiles .tile[data-k=\"single\"]"
   }
  ],
  "read": {
   "label": "Output speed swing",
   "part": "v",
   "index": 0
  },
  "expected": 3.063,
  "tol_pct": 0.3
 },
 {
  "slug": "u-joint-calculator",
  "name": "Single 10°: min output 2954 rpm",
  "reference": "n·cosβ",
  "steps": [
   {
    "click": "#ctiles .tile[data-k=\"single\"]"
   }
  ],
  "read": {
   "label": "Output speed",
   "part": "v",
   "index": 0
  },
  "expected": 2954.4,
  "tol_pct": 0.1
 },
 {
  "slug": "u-joint-calculator",
  "name": "Single 10°: max output 3046 rpm",
  "reference": "n/cosβ",
  "steps": [
   {
    "click": "#ctiles .tile[data-k=\"single\"]"
   }
  ],
  "read": {
   "label": "Output speed",
   "part": "v",
   "index": 1
  },
  "expected": 3046.3,
  "tol_pct": 0.1
 },
 {
  "slug": "u-joint-calculator",
  "name": "Single 10°: angle error 0.44°",
  "reference": "tan Δmax = (1−cosβ)/(2√cosβ)",
  "steps": [
   {
    "click": "#ctiles .tile[data-k=\"single\"]"
   }
  ],
  "read": {
   "label": "Angle error",
   "part": "v",
   "index": 0
  },
  "expected": 0.4386,
  "tol_pct": 1.5
 },
 {
  "slug": "u-joint-calculator",
  "name": "Single 10°: peak acceleration 3023 rad/s²",
  "reference": "max of ω²·sin²β·cosβ·sin2θ/(1−sin²β cos²θ)²",
  "steps": [
   {
    "click": "#ctiles .tile[data-k=\"single\"]"
   }
  ],
  "read": {
   "label": "Peak acceleration",
   "part": "v",
   "index": 0
  },
  "expected": 3022.7,
  "tol_pct": 0.5
 },
 {
  "slug": "u-joint-calculator",
  "name": "Single 10°: output torque max 203 N·m",
  "reference": "T1/cosβ",
  "steps": [
   {
    "click": "#ctiles .tile[data-k=\"single\"]"
   }
  ],
  "read": {
   "label": "Output torque",
   "part": "v",
   "index": 1
  },
  "expected": 203.1,
  "tol_pct": 0.5
 },
 {
  "slug": "u-joint-calculator",
  "name": "Z layout 10°/8°: output swing 1.11 %",
  "reference": "two-joint kinematics, numerical (independent)",
  "steps": [
   {
    "fill": "#b2",
    "value": "8"
   }
  ],
  "read": {
   "label": "Output speed swing",
   "part": "v",
   "index": 0
  },
  "expected": 1.106,
  "tol_pct": 1
 },
 {
  "slug": "u-joint-calculator",
  "name": "Z layout 10°/10°, 90° phasing error: swing 6.12 %",
  "reference": "1/cos²β − cos²β",
  "steps": [
   {
    "fill": "#ph",
    "value": "90"
   }
  ],
  "read": {
   "label": "Output speed swing",
   "part": "v",
   "index": 0
  },
  "expected": 6.124,
  "tol_pct": 0.3
 },
 {
  "slug": "u-joint-calculator",
  "name": "Z layout 90° error: max 3093 rpm",
  "reference": "n/cos²β",
  "steps": [
   {
    "fill": "#ph",
    "value": "90"
   }
  ],
  "read": {
   "label": "Output speed",
   "part": "v",
   "index": 1
  },
  "expected": 3093.3,
  "tol_pct": 0.1
 },
 {
  "slug": "u-joint-calculator",
  "name": "Z layout 10°/10° in phase: intermediate 2954 rpm",
  "reference": "n·cosβ",
  "steps": [],
  "read": {
   "label": "Intermediate shaft",
   "part": "v",
   "index": 0
  },
  "expected": 2954.4,
  "tol_pct": 0.1
 },
 {
  "slug": "engine-displacement-compression-calculator",
  "name": "Steam launch: MEP 6.14 bar (10 bar g, 40 % cut-off)",
  "reference": "Hyperbolic expansion MEP = p1·c·(1+ln 1/c) − pb, × 0.85 diagram factor (Rankine/Ripper)",
  "steps": [
   {
    "click": "#tseg button[data-t=\"st\"]"
   }
  ],
  "read": {
   "label": "Mean effective pressure",
   "part": "v",
   "index": 0
  },
  "expected": 6.144,
  "tol_pct": 0.5
 },
 {
  "slug": "engine-displacement-compression-calculator",
  "name": "Steam launch: swept volume/turn 1359 cc (double acting)",
  "reference": "(2A − A_rod)·s·n",
  "steps": [
   {
    "click": "#tseg button[data-t=\"st\"]"
   }
  ],
  "read": {
   "label": "Swept volume per turn",
   "part": "v",
   "index": 0
  },
  "expected": 1359.4,
  "tol_pct": 0.1
 },
 {
  "slug": "jet-engine-gas-turbine-calculator",
  "name": "J79 dry thrust vs GE J79-GE-17 52.8 kN (method, tol 6 %)",
  "reference": "GE J79-17 rating: 11,870 lbf (52.8 kN) dry",
  "steps": [
   {
    "click": "#ab"
   }
  ],
  "read": {
   "label": "Thrust",
   "part": "v",
   "index": 0
  },
  "expected": 52.8,
  "tol_pct": 6
 },
 {
  "slug": "jet-engine-gas-turbine-calculator",
  "name": "J79 AB thrust vs 79.6 kN (method, tol 4 %)",
  "reference": "GE J79-17 rating: 17,900 lbf (79.6 kN) with afterburner",
  "steps": [],
  "read": {
   "label": "Thrust",
   "part": "v",
   "index": 0
  },
  "expected": 79.6,
  "tol_pct": 4
 },
 {
  "slug": "jet-engine-gas-turbine-calculator",
  "name": "J79 dry TSFC vs 0.84 lb/lbf·h = 23.8 g/kN·s (method, tol 10 %)",
  "reference": "J79-17 published SFC 0.84 lb/(lbf·h) dry",
  "steps": [
   {
    "click": "#ab"
   }
  ],
  "read": {
   "label": "TSFC",
   "part": "v",
   "index": 0
  },
  "expected": 23.79,
  "tol_pct": 10
 },
 {
  "slug": "jet-engine-gas-turbine-calculator",
  "name": "J79 AB TSFC vs 1.965 lb/lbf·h = 55.7 g/kN·s (method, tol 9 %)",
  "reference": "J79-17 published SFC 1.965 lb/(lbf·h) wet",
  "steps": [],
  "read": {
   "label": "TSFC",
   "part": "v",
   "index": 0
  },
  "expected": 55.66,
  "tol_pct": 9
 },
 {
  "slug": "jet-engine-gas-turbine-calculator",
  "name": "J79 dry jet velocity 707 m/s (independent re-implementation, Saravanamuttoo method)",
  "reference": "Saravanamuttoo, Gas Turbine Theory ch. 3 cycle with page constants",
  "steps": [
   {
    "click": "#ab"
   }
  ],
  "read": {
   "label": "Exhaust velocity",
   "part": "v",
   "index": 0
  },
  "expected": 707.1,
  "tol_pct": 0.3
 },
 {
  "slug": "jet-engine-gas-turbine-calculator",
  "name": "Concorde (Olympus 593) cruise thrust vs ~44 kN (10,000 lbf)",
  "reference": "Wikipedia Olympus 593 (~10,000 lbf/44 kN per engine at M2.02); fuel-burn check 20 t/h ÷ (4 × 33.8 g/kN·s) ≈ 42 kN",
  "steps": [
   {
    "click": "#ptiles .tile[data-i=\"1\"]"
   }
  ],
  "read": {
   "label": "Thrust",
   "part": "v",
   "index": 0
  },
  "expected": 44.0,
  "tol_pct": 10
 },
 {
  "slug": "jet-engine-gas-turbine-calculator",
  "name": "Concorde cruise TSFC vs 1.195 lb/lbf·h = 33.8 g/kN·s (method, tol 11 %)",
  "reference": "Olympus 593 Mk610 published cruise SFC",
  "steps": [
   {
    "click": "#ptiles .tile[data-i=\"1\"]"
   }
  ],
  "read": {
   "label": "TSFC",
   "part": "v",
   "index": 0
  },
  "expected": 33.85,
  "tol_pct": 11
 },
 {
  "slug": "jet-engine-gas-turbine-calculator",
  "name": "CFM56 take-off thrust vs 120 kN (27,000 lbf, -5B4) (method, tol 6 %)",
  "reference": "CFM56-5B4 rating 27,000 lbf",
  "steps": [
   {
    "click": "#tseg button[data-t=\"fan\"]"
   }
  ],
  "read": {
   "label": "Thrust",
   "part": "v",
   "index": 0
  },
  "expected": 120.1,
  "tol_pct": 6
 },
 {
  "slug": "jet-engine-gas-turbine-calculator",
  "name": "CFM56 take-off TSFC vs 0.33-0.36 lb/lbf·h (≈ 9.8 g/kN·s) – documented: model reads 15–25 % high",
  "reference": "Jenkinson et al., Civil Jet Aircraft Design, engine data table: CFM56-5A1 0.33, -7B20 0.36 lb/lbf·h take-off",
  "steps": [
   {
    "click": "#tseg button[data-t=\"fan\"]"
   }
  ],
  "read": {
   "label": "TSFC",
   "part": "v",
   "index": 0
  },
  "expected": 9.77,
  "tol_pct": 25
 },
 {
  "slug": "jet-engine-gas-turbine-calculator",
  "name": "CFM56 cruise TSFC vs 0.545-0.596 lb/lbf·h (≈ 16.1 g/kN·s) – documented: model reads 15–25 % high",
  "reference": "Civil Jet Aircraft Design table: CFM56-5A1 0.596, -5C2 0.545 at 35,000 ft M0.80",
  "steps": [
   {
    "click": "#tseg button[data-t=\"fan\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"1\"]"
   }
  ],
  "read": {
   "label": "TSFC",
   "part": "v",
   "index": 0
  },
  "expected": 16.1,
  "tol_pct": 25
 },
 {
  "slug": "jet-engine-gas-turbine-calculator",
  "name": "PW127 shaft power vs 2,051 kW (2,750 shp) (method, tol 5 %)",
  "reference": "P&WC PW127F take-off rating 2,750 shp",
  "steps": [
   {
    "click": "#tseg button[data-t=\"shaft\"]"
   }
  ],
  "read": {
   "label": "Shaft power",
   "part": "v",
   "index": 0
  },
  "expected": 2.051,
  "tol_pct": 5
 },
 {
  "slug": "jet-engine-gas-turbine-calculator",
  "name": "T700 shaft power vs 1,410 kW (1,890 shp) (method, tol 9 %)",
  "reference": "GE T700-GE-701C rating 1,890 shp",
  "steps": [
   {
    "click": "#tseg button[data-t=\"shaft\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"1\"]"
   }
  ],
  "read": {
   "label": "Shaft power",
   "part": "v",
   "index": 0
  },
  "expected": 1.41,
  "tol_pct": 9
 },
 {
  "slug": "jet-engine-gas-turbine-calculator",
  "name": "T700 SFC vs 0.47 lb/shp·h = 0.286 kg/kWh (method, tol 9 %)",
  "reference": "GE T700-GE-701C published SFC",
  "steps": [
   {
    "click": "#tseg button[data-t=\"shaft\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"1\"]"
   }
  ],
  "read": {
   "label": "Specific fuel consumption",
   "part": "v",
   "index": 0
  },
  "expected": 0.286,
  "tol_pct": 9
 },
 {
  "slug": "gear-tooth-strength-calculator",
  "name": "Shigley Ex. 14-4 with AGMA rating (Ks, KR 0.85): gear contact SH (Qv 7 tile vs Qv 6 in book)",
  "reference": "Shigley MED 10th ed., Example 14-4: SH,G = 1.52",
  "steps": [
   {
    "fill": "#pw",
    "value": "2.983"
   },
   {
    "fill": "#n1",
    "value": "1800"
   },
   {
    "fill": "#m",
    "value": "2.54"
   },
   {
    "fill": "#b",
    "value": "38.1"
   },
   {
    "fill": "#z1",
    "value": "17"
   },
   {
    "fill": "#z2",
    "value": "52"
   },
   {
    "fill": "#hr",
    "value": "925.93"
   },
   {
    "click": "#mtiles .tile:nth-of-type(1)"
   },
   {
    "click": "#qtiles .tile:nth-of-type(2)"
   },
   {
    "click": "#ktiles .tile:nth-of-type(1)"
   },
   {
    "click": "#rtiles .tile:nth-of-type(2)"
   }
  ],
  "read": {
   "label": "Contact stress",
   "part": "alt",
   "index": 1
  },
  "expected": 1.52,
  "tol_pct": 3
 },
 {
  "slug": "gear-tooth-strength-calculator",
  "name": "Shigley Ex. 14-4 with AGMA rating: gear bending SF (Lewis Y vs AGMA J)",
  "reference": "Shigley MED 10th ed., Example 14-4: SF,G = 6.82",
  "steps": [
   {
    "fill": "#pw",
    "value": "2.983"
   },
   {
    "fill": "#n1",
    "value": "1800"
   },
   {
    "fill": "#m",
    "value": "2.54"
   },
   {
    "fill": "#b",
    "value": "38.1"
   },
   {
    "fill": "#z1",
    "value": "17"
   },
   {
    "fill": "#z2",
    "value": "52"
   },
   {
    "fill": "#hr",
    "value": "925.93"
   },
   {
    "click": "#mtiles .tile:nth-of-type(1)"
   },
   {
    "click": "#qtiles .tile:nth-of-type(2)"
   },
   {
    "click": "#ktiles .tile:nth-of-type(1)"
   },
   {
    "click": "#rtiles .tile:nth-of-type(2)"
   }
  ],
  "read": {
   "label": "Bending, pinion",
   "part": "alt",
   "index": 2
  },
  "expected": 6.82,
  "tol_pct": 4
 },
 {
  "slug": "gear-tooth-strength-calculator",
  "name": "Shigley Ex. 14-4 with AGMA rating: contact stress 70.66 ksi = 487.2 MPa",
  "reference": "Shigley MED 10th ed., Example 14-4: σc = 70 660 psi",
  "steps": [
   {
    "fill": "#pw",
    "value": "2.983"
   },
   {
    "fill": "#n1",
    "value": "1800"
   },
   {
    "fill": "#m",
    "value": "2.54"
   },
   {
    "fill": "#b",
    "value": "38.1"
   },
   {
    "fill": "#z1",
    "value": "17"
   },
   {
    "fill": "#z2",
    "value": "52"
   },
   {
    "fill": "#hr",
    "value": "925.93"
   },
   {
    "click": "#mtiles .tile:nth-of-type(1)"
   },
   {
    "click": "#qtiles .tile:nth-of-type(2)"
   },
   {
    "click": "#ktiles .tile:nth-of-type(1)"
   },
   {
    "click": "#rtiles .tile:nth-of-type(2)"
   }
  ],
  "read": {
   "label": "Contact stress",
   "part": "v",
   "index": 0
  },
  "expected": 487.2,
  "tol_pct": 2
 },
 {
  "slug": "gear-tooth-strength-calculator",
  "name": "Helical β 25°, mn 4, z 25, T 100 N·m: tangential force",
  "reference": "External review (ChatGPT), 30 Oct 2026: Ft = 2T/(mn·z/cosβ) = 1812.6 N",
  "steps": [
   {
    "fill": "#pw",
    "value": "0.010472"
   },
   {
    "fill": "#n1",
    "value": "1"
   },
   {
    "fill": "#m",
    "value": "4"
   },
   {
    "fill": "#z1",
    "value": "25"
   },
   {
    "fill": "#z2",
    "value": "50"
   },
   {
    "fill": "#b",
    "value": "30"
   },
   {
    "fill": "#hb",
    "value": "25"
   },
   {
    "click": "#ktiles .tile:nth-of-type(1)"
   }
  ],
  "read": {
   "label": "Tooth force Ft",
   "part": "v",
   "index": 0
  },
  "expected": 1.8126,
  "tol_pct": 0.5
 },
 {
  "slug": "gear-tooth-strength-calculator",
  "name": "Helical β 25°: radial force Fr = Ft·tanαn/cosβ",
  "reference": "External review (ChatGPT), 30 Oct 2026: Fr = 727.94 N",
  "steps": [
   {
    "fill": "#pw",
    "value": "0.010472"
   },
   {
    "fill": "#n1",
    "value": "1"
   },
   {
    "fill": "#m",
    "value": "4"
   },
   {
    "fill": "#z1",
    "value": "25"
   },
   {
    "fill": "#z2",
    "value": "50"
   },
   {
    "fill": "#b",
    "value": "30"
   },
   {
    "fill": "#hb",
    "value": "25"
   },
   {
    "click": "#ktiles .tile:nth-of-type(1)"
   }
  ],
  "read": {
   "label": "Tooth force Ft",
   "part": "alt",
   "index": 0
  },
  "expected": 728,
  "tol_pct": 0.5
 },
 {
  "slug": "gear-tooth-strength-calculator",
  "name": "Helical β 25°: axial force Fa = Ft·tanβ",
  "reference": "External review (ChatGPT), 30 Oct 2026: Fa = 845.24 N",
  "steps": [
   {
    "fill": "#pw",
    "value": "0.010472"
   },
   {
    "fill": "#n1",
    "value": "1"
   },
   {
    "fill": "#m",
    "value": "4"
   },
   {
    "fill": "#z1",
    "value": "25"
   },
   {
    "fill": "#z2",
    "value": "50"
   },
   {
    "fill": "#b",
    "value": "30"
   },
   {
    "fill": "#hb",
    "value": "25"
   },
   {
    "click": "#ktiles .tile:nth-of-type(1)"
   }
  ],
  "read": {
   "label": "Tooth force Ft",
   "part": "alt",
   "index": 1
  },
  "expected": 845,
  "tol_pct": 0.5
 },
 {
  "slug": "gear-tooth-strength-calculator",
  "name": "KR scaling: AGMA 99.9 % (KR 1.25) SH = 0.8 × the 99 % value (2.17 → 1.74)",
  "reference": "External review (ChatGPT), 30 Oct 2026: SH ∝ 1/KR, stress unchanged",
  "steps": [
   {
    "fill": "#pw",
    "value": "0.010472"
   },
   {
    "fill": "#n1",
    "value": "1"
   },
   {
    "fill": "#m",
    "value": "4"
   },
   {
    "fill": "#z1",
    "value": "25"
   },
   {
    "fill": "#z2",
    "value": "50"
   },
   {
    "fill": "#b",
    "value": "30"
   },
   {
    "fill": "#hb",
    "value": "25"
   },
   {
    "click": "#ktiles .tile:nth-of-type(1)"
   },
   {
    "click": "#rtiles .tile:nth-of-type(4)"
   }
  ],
  "read": {
   "label": "Contact stress",
   "part": "alt",
   "index": 0
  },
  "expected": 1.736,
  "tol_pct": 1
 },
 {
  "slug": "bearing-life-calculator",
  "name": "Angular contact exactly at e: Fa/Fr = 1.14 stays on the lower branch (P = Fr)",
  "reference": "External review (ChatGPT), 30 Oct 2026: SKF: P = Fr for Fa/Fr ≤ 1.14",
  "steps": [
   {
    "click": "#btiles .tile:nth-of-type(2)"
   },
   {
    "fill": "#C",
    "value": "30"
   },
   {
    "fill": "#Fr",
    "value": "5"
   },
   {
    "fill": "#Fa",
    "value": "5.70"
   },
   {
    "fill": "#n",
    "value": "1000"
   }
  ],
  "read": {
   "label": "Equivalent load P",
   "part": "v",
   "index": 0
  },
  "expected": 5.0,
  "tol_pct": 0.01
 },
 {
  "slug": "bearing-life-calculator",
  "name": "Angular contact Fa/Fr = 1.15: P = 0.35Fr + 0.57Fa = 5.0275 kN",
  "reference": "External review (ChatGPT), 30 Oct 2026: SKF single-row B/BE",
  "steps": [
   {
    "click": "#btiles .tile:nth-of-type(2)"
   },
   {
    "fill": "#C",
    "value": "30"
   },
   {
    "fill": "#Fr",
    "value": "5"
   },
   {
    "fill": "#Fa",
    "value": "5.75"
   },
   {
    "fill": "#n",
    "value": "1000"
   }
  ],
  "read": {
   "label": "Equivalent load P",
   "part": "v",
   "index": 0
  },
  "expected": 5.0275,
  "tol_pct": 0.05
 },
 {
  "slug": "bearing-life-calculator",
  "name": "L10 scaling: P doubled (10 kN) gives 1/8 of the life, 133.3 h",
  "reference": "External review (ChatGPT), 30 Oct 2026: ISO 281, L ∝ P^−3",
  "steps": [
   {
    "click": "#btiles .tile:nth-of-type(1)"
   },
   {
    "fill": "#C",
    "value": "20"
   },
   {
    "fill": "#C0",
    "value": "15"
   },
   {
    "fill": "#Fr",
    "value": "10"
   },
   {
    "fill": "#Fa",
    "value": "0"
   },
   {
    "fill": "#n",
    "value": "1000"
   }
  ],
  "read": {
   "label": "Rating life L10h",
   "part": "v",
   "index": 0
  },
  "expected": 133.33,
  "tol_pct": 0.5
 },
 {
  "slug": "shaft-diameter-calculator",
  "name": "DE-Goodman: d 40, M 150 N·m reversed, T 100 N·m, Kf 1.6, Kfs 1.3, Se 200, Sut 580 (C45): nf",
  "reference": "External review (ChatGPT), 30 Oct 2026: Shigley eq. 7-7; ChatGPT 4.528 at Sut 600 = 4.507 at Sut 580",
  "steps": [
   {
    "fill": "#P",
    "value": "15.185"
   },
   {
    "fill": "#n",
    "value": "1450"
   },
   {
    "fill": "#F",
    "value": "2.25"
   },
   {
    "fill": "#L",
    "value": "300"
   },
   {
    "fill": "#a",
    "value": "100"
   },
   {
    "fill": "#fd",
    "value": "40"
   },
   {
    "fill": "#fkf",
    "value": "1.6"
   },
   {
    "fill": "#fkfs",
    "value": "1.3"
   },
   {
    "fill": "#fse",
    "value": "200"
   }
  ],
  "read": {
   "selector": "#ftab tr:nth-of-type(6) td:nth-of-type(2)",
   "index": 0
  },
  "expected": 4.507,
  "tol_pct": 0.5
 },
 {
  "slug": "shaft-diameter-calculator",
  "name": "DE-Goodman load scaling: both loads doubled halves nf (2.25)",
  "reference": "External review (ChatGPT), 30 Oct 2026: invariant",
  "steps": [
   {
    "fill": "#P",
    "value": "30.37"
   },
   {
    "fill": "#n",
    "value": "1450"
   },
   {
    "fill": "#F",
    "value": "4.5"
   },
   {
    "fill": "#L",
    "value": "300"
   },
   {
    "fill": "#a",
    "value": "100"
   },
   {
    "fill": "#fd",
    "value": "40"
   },
   {
    "fill": "#fkf",
    "value": "1.6"
   },
   {
    "fill": "#fkfs",
    "value": "1.3"
   },
   {
    "fill": "#fse",
    "value": "200"
   }
  ],
  "read": {
   "selector": "#ftab tr:nth-of-type(6) td:nth-of-type(2)",
   "index": 0
  },
  "expected": 2.2535,
  "tol_pct": 0.5
 },
 {
  "slug": "timing-belt-calculator",
  "name": "Two pulleys z20/z40 HTD 5M at 300 mm: belt length = exact open-belt formula",
  "reference": "L = 2√(C² − (R − r)²) + π(R + r) + 2(R − r)·asin((R − r)/C) = 750.84 mm",
  "steps": [
   {
    "click": "#ptiles .tile:nth-of-type(4)"
   }
  ],
  "read": {
   "label": "Belt length (pitch)",
   "part": "v",
   "index": 0
  },
  "expected": 750.84,
  "tol_pct": 0.05
 },
 {
  "slug": "timing-belt-calculator",
  "name": "DOHC preset: one belt tooth on a 44-tooth cam = 720/44 = 16.36° crank",
  "reference": "geometry",
  "steps": [
   {
    "click": "#ptiles .tile:nth-of-type(2)"
   }
  ],
  "read": {
   "label": "One belt tooth on the cam",
   "part": "v",
   "index": 0
  },
  "expected": 16.364,
  "tol_pct": 0.1
 },
 {
  "slug": "timing-belt-calculator",
  "name": "SOHC preset: crank : cam = 42/21 = 2.000",
  "reference": "four-stroke 2:1",
  "steps": [
   {
    "click": "#ptiles .tile:nth-of-type(1)"
   }
  ],
  "read": {
   "label": "Crank : cam",
   "part": "v",
   "index": 0
  },
  "expected": 2.0,
  "tol_pct": 0.01
 },
 {
  "slug": "press-fit-calculator",
  "name": "Ø40 H7/s6 steel/steel, Do 80, Rz 10: pressure at min fit (Lamé)",
  "reference": "p = δ/(d·Σk/E), δ = 18 − 8 µm",
  "steps": [],
  "read": {
   "label": "Contact pressure",
   "part": "v",
   "index": 0
  },
  "expected": 19.69,
  "tol_pct": 0.5
 },
 {
  "slug": "press-fit-calculator",
  "name": "Ø40 H7/s6: torque capacity at min fit = μ·p·π·d·L·d/2",
  "reference": "237.5 N·m",
  "steps": [],
  "read": {
   "label": "Torque capacity (min fit)",
   "part": "v",
   "index": 0
  },
  "expected": 237.5,
  "tol_pct": 0.5
 },
 {
  "slug": "press-fit-calculator",
  "name": "Ø40 H7/s6: hub von Mises at the bore, max fit",
  "reference": "σt = 167.3, σr = −100.4 → 234.2 MPa",
  "steps": [],
  "read": {
   "label": "Hub stress (max fit)",
   "part": "v",
   "index": 0
  },
  "expected": 234.2,
  "tol_pct": 0.5
 },
 {
  "slug": "press-fit-calculator",
  "name": "Ø40 H7/s6: shrink temperature = 20 + (0.051 + 0.04)/(11.5e-6·40)",
  "reference": "217.8 °C",
  "steps": [],
  "read": {
   "label": "Shrink fit: heat hub to",
   "part": "v",
   "index": 0
  },
  "expected": 217.8,
  "tol_pct": 0.5
 },
 {
  "slug": "shaft-key-calculator",
  "name": "Ø40, 300 N·m, KA 1.25, 12×8×50 form A: hub flank pressure",
  "reference": "F/((h − t1)·(l − b)) = 18 750/(3·38)",
  "steps": [],
  "read": {
   "label": "Hub side pressure",
   "part": "v",
   "index": 0
  },
  "expected": 164.5,
  "tol_pct": 0.5
 },
 {
  "slug": "shaft-key-calculator",
  "name": "Ø40: key shear",
  "reference": "18 750/(12·38)",
  "steps": [],
  "read": {
   "label": "Key shear",
   "part": "v",
   "index": 0
  },
  "expected": 41.12,
  "tol_pct": 0.5
 },
 {
  "slug": "shaft-key-calculator",
  "name": "DIN 6885-1 key for Ø40 is 12 × 8",
  "reference": "DIN 6885-1 table, over 38 to 44 mm",
  "steps": [],
  "read": {
   "label": "Key (DIN 6885-1)",
   "part": "v",
   "index": 0
  },
  "expected": 12,
  "tol_pct": 0
 },
 {
  "slug": "shaft-key-calculator",
  "name": "Ø25: key 8 × 7",
  "reference": "DIN 6885-1, over 22 to 30 mm",
  "steps": [
   {
    "fill": "#d",
    "value": "25"
   },
   {
    "fill": "#l",
    "value": "40"
   }
  ],
  "read": {
   "label": "Key (DIN 6885-1)",
   "part": "v",
   "index": 1
  },
  "expected": 7,
  "tol_pct": 0
 },
 {
  "slug": "bolted-joint-calculator",
  "name": "BJ-001: joint constant C",
  "reference": "External review (ChatGPT) case BJ-001",
  "steps": [
   {
    "fill": "#L",
    "value": "50"
   },
   {
    "fill": "#P",
    "value": "10"
   }
  ],
  "read": {
   "label": "Joint constant C",
   "part": "v",
   "index": 0
  },
  "expected": 0.201194,
  "tol_pct": 0.3
 },
 {
  "slug": "bolted-joint-calculator",
  "name": "BJ-001: bolt force",
  "reference": "External review (ChatGPT) case BJ-001",
  "steps": [
   {
    "fill": "#L",
    "value": "50"
   },
   {
    "fill": "#P",
    "value": "10"
   }
  ],
  "read": {
   "label": "Bolt force",
   "part": "v",
   "index": 0
  },
  "expected": 27.242,
  "tol_pct": 0.3
 },
 {
  "slug": "bolted-joint-calculator",
  "name": "BJ-001: remaining clamp force",
  "reference": "External review (ChatGPT) case BJ-001",
  "steps": [
   {
    "fill": "#L",
    "value": "50"
   },
   {
    "fill": "#P",
    "value": "10"
   }
  ],
  "read": {
   "label": "Remaining clamp force",
   "part": "v",
   "index": 0
  },
  "expected": 17.242,
  "tol_pct": 0.3
 },
 {
  "slug": "bolted-joint-calculator",
  "name": "BJ-001: separation load",
  "reference": "External review (ChatGPT) case BJ-001",
  "steps": [
   {
    "fill": "#L",
    "value": "50"
   },
   {
    "fill": "#P",
    "value": "10"
   }
  ],
  "read": {
   "label": "Separation load",
   "part": "v",
   "index": 0
  },
  "expected": 31.585,
  "tol_pct": 0.3
 },
 {
  "slug": "bolted-joint-calculator",
  "name": "BJ-001: Goodman fatigue factor",
  "reference": "External review (ChatGPT) case BJ-001",
  "steps": [
   {
    "fill": "#L",
    "value": "50"
   },
   {
    "fill": "#P",
    "value": "10"
   }
  ],
  "read": {
   "label": "Fatigue (Goodman)",
   "part": "v",
   "index": 0
  },
  "expected": 2.922,
  "tol_pct": 0.5
 },
 {
  "slug": "bolted-joint-calculator",
  "name": "BJ-001: margin to proof load (piecewise: separation first in BJ-001/003)",
  "reference": "External review (ChatGPT) case BJ-001",
  "steps": [
   {
    "fill": "#L",
    "value": "50"
   },
   {
    "fill": "#P",
    "value": "10"
   }
  ],
  "read": {
   "label": "Margin to proof load",
   "part": "v",
   "index": 0
  },
  "expected": 3.36,
  "tol_pct": 0.5
 },
 {
  "slug": "bolted-joint-calculator",
  "name": "BJ-002: joint constant C",
  "reference": "External review (ChatGPT) case BJ-002",
  "steps": [
   {
    "click": "#ttiles .tile:nth-of-type(4)"
   },
   {
    "click": "#ctiles .tile:nth-of-type(2)"
   },
   {
    "click": "#mtiles .tile:nth-of-type(2)"
   },
   {
    "fill": "#grip",
    "value": "40"
   },
   {
    "fill": "#L",
    "value": "60"
   },
   {
    "fill": "#pct",
    "value": "70"
   },
   {
    "fill": "#P",
    "value": "20"
   }
  ],
  "read": {
   "label": "Joint constant C",
   "part": "v",
   "index": 0
  },
  "expected": 0.396129,
  "tol_pct": 0.3
 },
 {
  "slug": "bolted-joint-calculator",
  "name": "BJ-002: bolt force",
  "reference": "External review (ChatGPT) case BJ-002",
  "steps": [
   {
    "click": "#ttiles .tile:nth-of-type(4)"
   },
   {
    "click": "#ctiles .tile:nth-of-type(2)"
   },
   {
    "click": "#mtiles .tile:nth-of-type(2)"
   },
   {
    "fill": "#grip",
    "value": "40"
   },
   {
    "fill": "#L",
    "value": "60"
   },
   {
    "fill": "#pct",
    "value": "70"
   },
   {
    "fill": "#P",
    "value": "20"
   }
  ],
  "read": {
   "label": "Bolt force",
   "part": "v",
   "index": 0
  },
  "expected": 56.901,
  "tol_pct": 0.3
 },
 {
  "slug": "bolted-joint-calculator",
  "name": "BJ-002: remaining clamp force",
  "reference": "External review (ChatGPT) case BJ-002",
  "steps": [
   {
    "click": "#ttiles .tile:nth-of-type(4)"
   },
   {
    "click": "#ctiles .tile:nth-of-type(2)"
   },
   {
    "click": "#mtiles .tile:nth-of-type(2)"
   },
   {
    "fill": "#grip",
    "value": "40"
   },
   {
    "fill": "#L",
    "value": "60"
   },
   {
    "fill": "#pct",
    "value": "70"
   },
   {
    "fill": "#P",
    "value": "20"
   }
  ],
  "read": {
   "label": "Remaining clamp force",
   "part": "v",
   "index": 0
  },
  "expected": 36.901,
  "tol_pct": 0.3
 },
 {
  "slug": "bolted-joint-calculator",
  "name": "BJ-002: separation load",
  "reference": "External review (ChatGPT) case BJ-002",
  "steps": [
   {
    "click": "#ttiles .tile:nth-of-type(4)"
   },
   {
    "click": "#ctiles .tile:nth-of-type(2)"
   },
   {
    "click": "#mtiles .tile:nth-of-type(2)"
   },
   {
    "fill": "#grip",
    "value": "40"
   },
   {
    "fill": "#L",
    "value": "60"
   },
   {
    "fill": "#pct",
    "value": "70"
   },
   {
    "fill": "#P",
    "value": "20"
   }
  ],
  "read": {
   "label": "Separation load",
   "part": "v",
   "index": 0
  },
  "expected": 81.107,
  "tol_pct": 0.3
 },
 {
  "slug": "bolted-joint-calculator",
  "name": "BJ-002: Goodman fatigue factor",
  "reference": "External review (ChatGPT) case BJ-002",
  "steps": [
   {
    "click": "#ttiles .tile:nth-of-type(4)"
   },
   {
    "click": "#ctiles .tile:nth-of-type(2)"
   },
   {
    "click": "#mtiles .tile:nth-of-type(2)"
   },
   {
    "fill": "#grip",
    "value": "40"
   },
   {
    "fill": "#L",
    "value": "60"
   },
   {
    "fill": "#pct",
    "value": "70"
   },
   {
    "fill": "#P",
    "value": "20"
   }
  ],
  "read": {
   "label": "Fatigue (Goodman)",
   "part": "v",
   "index": 0
  },
  "expected": 1.316,
  "tol_pct": 0.5
 },
 {
  "slug": "bolted-joint-calculator",
  "name": "BJ-002: margin to proof load (piecewise: separation first in BJ-001/003)",
  "reference": "External review (ChatGPT) case BJ-002",
  "steps": [
   {
    "click": "#ttiles .tile:nth-of-type(4)"
   },
   {
    "click": "#ctiles .tile:nth-of-type(2)"
   },
   {
    "click": "#mtiles .tile:nth-of-type(2)"
   },
   {
    "fill": "#grip",
    "value": "40"
   },
   {
    "fill": "#L",
    "value": "60"
   },
   {
    "fill": "#pct",
    "value": "70"
   },
   {
    "fill": "#P",
    "value": "20"
   }
  ],
  "read": {
   "label": "Margin to proof load",
   "part": "v",
   "index": 0
  },
  "expected": 2.649,
  "tol_pct": 0.5
 },
 {
  "slug": "bolted-joint-calculator",
  "name": "BJ-003: joint constant C",
  "reference": "External review (ChatGPT) case BJ-003",
  "steps": [
   {
    "click": "#ttiles .tile:nth-of-type(8)"
   },
   {
    "fill": "#grip",
    "value": "60"
   },
   {
    "fill": "#L",
    "value": "90"
   },
   {
    "fill": "#P",
    "value": "40"
   }
  ],
  "read": {
   "label": "Joint constant C",
   "part": "v",
   "index": 0
  },
  "expected": 0.200529,
  "tol_pct": 0.3
 },
 {
  "slug": "bolted-joint-calculator",
  "name": "BJ-003: bolt force",
  "reference": "External review (ChatGPT) case BJ-003",
  "steps": [
   {
    "click": "#ttiles .tile:nth-of-type(8)"
   },
   {
    "fill": "#grip",
    "value": "60"
   },
   {
    "fill": "#L",
    "value": "90"
   },
   {
    "fill": "#P",
    "value": "40"
   }
  ],
  "read": {
   "label": "Bolt force",
   "part": "v",
   "index": 0
  },
  "expected": 118.271,
  "tol_pct": 0.3
 },
 {
  "slug": "bolted-joint-calculator",
  "name": "BJ-003: remaining clamp force",
  "reference": "External review (ChatGPT) case BJ-003",
  "steps": [
   {
    "click": "#ttiles .tile:nth-of-type(8)"
   },
   {
    "fill": "#grip",
    "value": "60"
   },
   {
    "fill": "#L",
    "value": "90"
   },
   {
    "fill": "#P",
    "value": "40"
   }
  ],
  "read": {
   "label": "Remaining clamp force",
   "part": "v",
   "index": 0
  },
  "expected": 78.271,
  "tol_pct": 0.3
 },
 {
  "slug": "bolted-joint-calculator",
  "name": "BJ-003: separation load",
  "reference": "External review (ChatGPT) case BJ-003",
  "steps": [
   {
    "click": "#ttiles .tile:nth-of-type(8)"
   },
   {
    "fill": "#grip",
    "value": "60"
   },
   {
    "fill": "#L",
    "value": "90"
   },
   {
    "fill": "#P",
    "value": "40"
   }
  ],
  "read": {
   "label": "Separation load",
   "part": "v",
   "index": 0
  },
  "expected": 137.904,
  "tol_pct": 0.3
 },
 {
  "slug": "bolted-joint-calculator",
  "name": "BJ-003: Goodman fatigue factor",
  "reference": "External review (ChatGPT) case BJ-003",
  "steps": [
   {
    "click": "#ttiles .tile:nth-of-type(8)"
   },
   {
    "fill": "#grip",
    "value": "60"
   },
   {
    "fill": "#L",
    "value": "90"
   },
   {
    "fill": "#P",
    "value": "40"
   }
  ],
  "read": {
   "label": "Fatigue (Goodman)",
   "part": "v",
   "index": 0
  },
  "expected": 3.123,
  "tol_pct": 0.5
 },
 {
  "slug": "bolted-joint-calculator",
  "name": "BJ-003: margin to proof load (piecewise: separation first in BJ-001/003)",
  "reference": "External review (ChatGPT) case BJ-003",
  "steps": [
   {
    "click": "#ttiles .tile:nth-of-type(8)"
   },
   {
    "fill": "#grip",
    "value": "60"
   },
   {
    "fill": "#L",
    "value": "90"
   },
   {
    "fill": "#P",
    "value": "40"
   }
  ],
  "read": {
   "label": "Margin to proof load",
   "part": "v",
   "index": 0
  },
  "expected": 3.675,
  "tol_pct": 0.5
 },
 {
  "slug": "pulley-belt-calculator",
  "edge": true,
  "name": "Edge: zero value in 'd1' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#d1",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "pulley-belt-calculator",
  "edge": true,
  "name": "Edge: negative value in 'd1' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#d1",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "pulley-belt-calculator",
  "edge": true,
  "name": "Edge: huge value in 'd1' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#d1",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "pulley-belt-calculator",
  "edge": true,
  "name": "Edge: empty value in 'd1' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#d1",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "chain-sprocket-calculator",
  "edge": true,
  "name": "Edge: zero value in 'z1' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#z1",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "chain-sprocket-calculator",
  "edge": true,
  "name": "Edge: negative value in 'z1' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#z1",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "chain-sprocket-calculator",
  "edge": true,
  "name": "Edge: huge value in 'z1' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#z1",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "chain-sprocket-calculator",
  "edge": true,
  "name": "Edge: empty value in 'z1' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#z1",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "timing-belt-calculator",
  "edge": true,
  "name": "Edge: switch to inch units – results stay finite",
  "reference": "robustness",
  "steps": [
   {
    "click": "#useg button:nth-of-type(2)"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "timing-belt-calculator",
  "edge": true,
  "name": "Edge: zero value in 'rpm' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#rpm",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "timing-belt-calculator",
  "edge": true,
  "name": "Edge: negative value in 'rpm' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#rpm",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "timing-belt-calculator",
  "edge": true,
  "name": "Edge: huge value in 'rpm' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#rpm",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "timing-belt-calculator",
  "edge": true,
  "name": "Edge: empty value in 'rpm' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#rpm",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "cvt-variator-calculator",
  "edge": true,
  "name": "Edge: switch to inch units – results stay finite",
  "reference": "robustness",
  "steps": [
   {
    "click": "#useg button:nth-of-type(2)"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "cvt-variator-calculator",
  "edge": true,
  "name": "Edge: zero value in 'C' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#C",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "cvt-variator-calculator",
  "edge": true,
  "name": "Edge: negative value in 'C' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#C",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "cvt-variator-calculator",
  "edge": true,
  "name": "Edge: huge value in 'C' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#C",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "cvt-variator-calculator",
  "edge": true,
  "name": "Edge: empty value in 'C' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#C",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "gear-calculator",
  "edge": true,
  "name": "Edge: zero value in 'mod' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#mod",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "gear-calculator",
  "edge": true,
  "name": "Edge: negative value in 'mod' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#mod",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "gear-calculator",
  "edge": true,
  "name": "Edge: huge value in 'mod' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#mod",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "gear-calculator",
  "edge": true,
  "name": "Edge: empty value in 'mod' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#mod",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "gear-tooth-strength-calculator",
  "edge": true,
  "name": "Edge: switch to inch units – results stay finite",
  "reference": "robustness",
  "steps": [
   {
    "click": "#useg button:nth-of-type(2)"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "gear-tooth-strength-calculator",
  "edge": true,
  "name": "Edge: zero value in 'pw' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#pw",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "gear-tooth-strength-calculator",
  "edge": true,
  "name": "Edge: negative value in 'pw' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#pw",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "gear-tooth-strength-calculator",
  "edge": true,
  "name": "Edge: huge value in 'pw' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#pw",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "gear-tooth-strength-calculator",
  "edge": true,
  "name": "Edge: empty value in 'pw' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#pw",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "worm-gear-calculator",
  "edge": true,
  "name": "Edge: zero value in 'z2' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#z2",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "worm-gear-calculator",
  "edge": true,
  "name": "Edge: negative value in 'z2' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#z2",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "worm-gear-calculator",
  "edge": true,
  "name": "Edge: huge value in 'z2' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#z2",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "worm-gear-calculator",
  "edge": true,
  "name": "Edge: empty value in 'z2' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#z2",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "planetary-gear-calculator",
  "edge": true,
  "name": "Edge: zero value in 'zs' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#zs",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "planetary-gear-calculator",
  "edge": true,
  "name": "Edge: negative value in 'zs' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#zs",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "planetary-gear-calculator",
  "edge": true,
  "name": "Edge: huge value in 'zs' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#zs",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "planetary-gear-calculator",
  "edge": true,
  "name": "Edge: empty value in 'zs' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#zs",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "rack-and-pinion-calculator",
  "edge": true,
  "name": "Edge: zero value in 'm' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#m",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "rack-and-pinion-calculator",
  "edge": true,
  "name": "Edge: negative value in 'm' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#m",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "rack-and-pinion-calculator",
  "edge": true,
  "name": "Edge: huge value in 'm' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#m",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "rack-and-pinion-calculator",
  "edge": true,
  "name": "Edge: empty value in 'm' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#m",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "motor-speed-vfd-calculator",
  "edge": true,
  "name": "Edge: zero value in 'nr' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#nr",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "motor-speed-vfd-calculator",
  "edge": true,
  "name": "Edge: negative value in 'nr' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#nr",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "motor-speed-vfd-calculator",
  "edge": true,
  "name": "Edge: huge value in 'nr' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#nr",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "motor-speed-vfd-calculator",
  "edge": true,
  "name": "Edge: empty value in 'nr' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#nr",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "hydraulic-cylinder-calculator",
  "edge": true,
  "name": "Edge: zero value in 'D' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#D",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "hydraulic-cylinder-calculator",
  "edge": true,
  "name": "Edge: negative value in 'D' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#D",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "hydraulic-cylinder-calculator",
  "edge": true,
  "name": "Edge: huge value in 'D' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#D",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "hydraulic-cylinder-calculator",
  "edge": true,
  "name": "Edge: empty value in 'D' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#D",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "lead-screw-calculator",
  "edge": true,
  "name": "Edge: zero value in 'd' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#d",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "lead-screw-calculator",
  "edge": true,
  "name": "Edge: negative value in 'd' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#d",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "lead-screw-calculator",
  "edge": true,
  "name": "Edge: huge value in 'd' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#d",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "lead-screw-calculator",
  "edge": true,
  "name": "Edge: empty value in 'd' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#d",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "block-and-tackle-calculator",
  "edge": true,
  "name": "Edge: zero value in 'eff' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#eff",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "block-and-tackle-calculator",
  "edge": true,
  "name": "Edge: negative value in 'eff' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#eff",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "block-and-tackle-calculator",
  "edge": true,
  "name": "Edge: huge value in 'eff' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#eff",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "block-and-tackle-calculator",
  "edge": true,
  "name": "Edge: empty value in 'eff' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#eff",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "bolt-torque-calculator",
  "edge": true,
  "name": "Edge: zero value in 'K' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#K",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "bolt-torque-calculator",
  "edge": true,
  "name": "Edge: negative value in 'K' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#K",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "bolt-torque-calculator",
  "edge": true,
  "name": "Edge: huge value in 'K' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#K",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "bolt-torque-calculator",
  "edge": true,
  "name": "Edge: empty value in 'K' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#K",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "bolted-joint-calculator",
  "edge": true,
  "name": "Edge: switch to inch units – results stay finite",
  "reference": "robustness",
  "steps": [
   {
    "click": "#useg button:nth-of-type(2)"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "bolted-joint-calculator",
  "edge": true,
  "name": "Edge: zero value in 'grip' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#grip",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "bolted-joint-calculator",
  "edge": true,
  "name": "Edge: negative value in 'grip' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#grip",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "bolted-joint-calculator",
  "edge": true,
  "name": "Edge: huge value in 'grip' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#grip",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "bolted-joint-calculator",
  "edge": true,
  "name": "Edge: empty value in 'grip' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#grip",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "compression-spring-calculator",
  "edge": true,
  "name": "Edge: switch to inch units – results stay finite",
  "reference": "robustness",
  "steps": [
   {
    "click": "#useg button:nth-of-type(2)"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "compression-spring-calculator",
  "edge": true,
  "name": "Edge: zero value in 'd' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#d",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "compression-spring-calculator",
  "edge": true,
  "name": "Edge: negative value in 'd' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#d",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "compression-spring-calculator",
  "edge": true,
  "name": "Edge: huge value in 'd' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#d",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "compression-spring-calculator",
  "edge": true,
  "name": "Edge: empty value in 'd' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#d",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "extension-spring-calculator",
  "edge": true,
  "name": "Edge: switch to inch units – results stay finite",
  "reference": "robustness",
  "steps": [
   {
    "click": "#useg button:nth-of-type(2)"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "extension-spring-calculator",
  "edge": true,
  "name": "Edge: zero value in 'd' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#d",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "extension-spring-calculator",
  "edge": true,
  "name": "Edge: negative value in 'd' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#d",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "extension-spring-calculator",
  "edge": true,
  "name": "Edge: huge value in 'd' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#d",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "extension-spring-calculator",
  "edge": true,
  "name": "Edge: empty value in 'd' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#d",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "torsion-spring-calculator",
  "edge": true,
  "name": "Edge: switch to inch units – results stay finite",
  "reference": "robustness",
  "steps": [
   {
    "click": "#useg button:nth-of-type(2)"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "torsion-spring-calculator",
  "edge": true,
  "name": "Edge: zero value in 'd' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#d",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "torsion-spring-calculator",
  "edge": true,
  "name": "Edge: negative value in 'd' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#d",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "torsion-spring-calculator",
  "edge": true,
  "name": "Edge: huge value in 'd' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#d",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "torsion-spring-calculator",
  "edge": true,
  "name": "Edge: empty value in 'd' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#d",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "bevel-gear-calculator",
  "edge": true,
  "name": "Edge: zero value in 'sig' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#sig",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "bevel-gear-calculator",
  "edge": true,
  "name": "Edge: negative value in 'sig' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#sig",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "bevel-gear-calculator",
  "edge": true,
  "name": "Edge: huge value in 'sig' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#sig",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "bevel-gear-calculator",
  "edge": true,
  "name": "Edge: empty value in 'sig' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#sig",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "press-fit-calculator",
  "edge": true,
  "name": "Edge: switch to inch units – results stay finite",
  "reference": "robustness",
  "steps": [
   {
    "click": "#useg button:nth-of-type(2)"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "press-fit-calculator",
  "edge": true,
  "name": "Edge: zero value in 'd' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#d",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "press-fit-calculator",
  "edge": true,
  "name": "Edge: negative value in 'd' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#d",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "press-fit-calculator",
  "edge": true,
  "name": "Edge: huge value in 'd' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#d",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "press-fit-calculator",
  "edge": true,
  "name": "Edge: empty value in 'd' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#d",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "shaft-key-calculator",
  "edge": true,
  "name": "Edge: switch to inch units – results stay finite",
  "reference": "robustness",
  "steps": [
   {
    "click": "#useg button:nth-of-type(2)"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "shaft-key-calculator",
  "edge": true,
  "name": "Edge: zero value in 'd' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#d",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "shaft-key-calculator",
  "edge": true,
  "name": "Edge: negative value in 'd' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#d",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "shaft-key-calculator",
  "edge": true,
  "name": "Edge: huge value in 'd' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#d",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "shaft-key-calculator",
  "edge": true,
  "name": "Edge: empty value in 'd' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#d",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "bearing-life-calculator",
  "edge": true,
  "name": "Edge: zero value in 'C' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#C",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "bearing-life-calculator",
  "edge": true,
  "name": "Edge: negative value in 'C' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#C",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "bearing-life-calculator",
  "edge": true,
  "name": "Edge: huge value in 'C' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#C",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "bearing-life-calculator",
  "edge": true,
  "name": "Edge: empty value in 'C' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#C",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "shaft-diameter-calculator",
  "edge": true,
  "name": "Edge: zero value in 'P' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#P",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "shaft-diameter-calculator",
  "edge": true,
  "name": "Edge: negative value in 'P' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#P",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "shaft-diameter-calculator",
  "edge": true,
  "name": "Edge: huge value in 'P' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#P",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "shaft-diameter-calculator",
  "edge": true,
  "name": "Edge: empty value in 'P' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#P",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "edge": true,
  "name": "Edge: zero value in 'D' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#D",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "edge": true,
  "name": "Edge: negative value in 'D' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#D",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "edge": true,
  "name": "Edge: huge value in 'D' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#D",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "edge": true,
  "name": "Edge: empty value in 'D' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#D",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "tap-drill-calculator",
  "edge": true,
  "name": "Edge: zero value in 'pct' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#pct",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "tap-drill-calculator",
  "edge": true,
  "name": "Edge: negative value in 'pct' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#pct",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "tap-drill-calculator",
  "edge": true,
  "name": "Edge: huge value in 'pct' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#pct",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "tap-drill-calculator",
  "edge": true,
  "name": "Edge: empty value in 'pct' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#pct",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "bolt-circle-pcd-calculator",
  "edge": true,
  "name": "Edge: switch to inch units – results stay finite",
  "reference": "robustness",
  "steps": [
   {
    "click": "#useg button:nth-of-type(2)"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "bolt-circle-pcd-calculator",
  "edge": true,
  "name": "Edge: zero value in 'D' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#D",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "bolt-circle-pcd-calculator",
  "edge": true,
  "name": "Edge: negative value in 'D' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#D",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "bolt-circle-pcd-calculator",
  "edge": true,
  "name": "Edge: huge value in 'D' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#D",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "bolt-circle-pcd-calculator",
  "edge": true,
  "name": "Edge: empty value in 'D' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#D",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "surface-roughness-calculator",
  "edge": true,
  "name": "Edge: switch to inch units – results stay finite",
  "reference": "robustness",
  "steps": [
   {
    "click": "#useg button:nth-of-type(2)"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "surface-roughness-calculator",
  "edge": true,
  "name": "Edge: zero value in 'r' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#r",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "surface-roughness-calculator",
  "edge": true,
  "name": "Edge: negative value in 'r' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#r",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "surface-roughness-calculator",
  "edge": true,
  "name": "Edge: huge value in 'r' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#r",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "surface-roughness-calculator",
  "edge": true,
  "name": "Edge: empty value in 'r' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#r",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "iso-fits-tolerances-calculator",
  "edge": true,
  "name": "Edge: switch to inch units – results stay finite",
  "reference": "robustness",
  "steps": [
   {
    "click": "#useg button:nth-of-type(2)"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "iso-fits-tolerances-calculator",
  "edge": true,
  "name": "Edge: zero value in 'D' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#D",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "iso-fits-tolerances-calculator",
  "edge": true,
  "name": "Edge: negative value in 'D' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#D",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "iso-fits-tolerances-calculator",
  "edge": true,
  "name": "Edge: huge value in 'D' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#D",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "iso-fits-tolerances-calculator",
  "edge": true,
  "name": "Edge: empty value in 'D' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#D",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "gearing-differential-calculator",
  "edge": true,
  "name": "Edge: zero value in 'tw' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#tw",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "gearing-differential-calculator",
  "edge": true,
  "name": "Edge: negative value in 'tw' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#tw",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "gearing-differential-calculator",
  "edge": true,
  "name": "Edge: huge value in 'tw' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#tw",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "gearing-differential-calculator",
  "edge": true,
  "name": "Edge: empty value in 'tw' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#tw",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "tire-size-calculator",
  "edge": true,
  "name": "Edge: switch to inch units – results stay finite",
  "reference": "robustness",
  "steps": [
   {
    "click": "#useg button:nth-of-type(2)"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "tire-size-calculator",
  "edge": true,
  "name": "Edge: zero value in 'w1' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#w1",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "tire-size-calculator",
  "edge": true,
  "name": "Edge: negative value in 'w1' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#w1",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "tire-size-calculator",
  "edge": true,
  "name": "Edge: huge value in 'w1' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#w1",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "tire-size-calculator",
  "edge": true,
  "name": "Edge: empty value in 'w1' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#w1",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "engine-displacement-compression-calculator",
  "edge": true,
  "name": "Edge: switch to inch units – results stay finite",
  "reference": "robustness",
  "steps": [
   {
    "click": "#useg button:nth-of-type(2)"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "engine-displacement-compression-calculator",
  "edge": true,
  "name": "Edge: zero value in 'b' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#b",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "engine-displacement-compression-calculator",
  "edge": true,
  "name": "Edge: negative value in 'b' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#b",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "engine-displacement-compression-calculator",
  "edge": true,
  "name": "Edge: huge value in 'b' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#b",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "engine-displacement-compression-calculator",
  "edge": true,
  "name": "Edge: empty value in 'b' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#b",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "horsepower-torque-calculator",
  "edge": true,
  "name": "Edge: switch to inch units – results stay finite",
  "reference": "robustness",
  "steps": [
   {
    "click": "#useg button:nth-of-type(2)"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "horsepower-torque-calculator",
  "edge": true,
  "name": "Edge: zero value in 'P' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#P",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "horsepower-torque-calculator",
  "edge": true,
  "name": "Edge: negative value in 'P' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#P",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "horsepower-torque-calculator",
  "edge": true,
  "name": "Edge: huge value in 'P' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#P",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "horsepower-torque-calculator",
  "edge": true,
  "name": "Edge: empty value in 'P' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#P",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "jet-engine-gas-turbine-calculator",
  "edge": true,
  "name": "Edge: switch to inch units – results stay finite",
  "reference": "robustness",
  "steps": [
   {
    "click": "#useg button:nth-of-type(2)"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "jet-engine-gas-turbine-calculator",
  "edge": true,
  "name": "Edge: zero value in 'h' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#h",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "jet-engine-gas-turbine-calculator",
  "edge": true,
  "name": "Edge: negative value in 'h' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#h",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "jet-engine-gas-turbine-calculator",
  "edge": true,
  "name": "Edge: huge value in 'h' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#h",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "jet-engine-gas-turbine-calculator",
  "edge": true,
  "name": "Edge: empty value in 'h' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#h",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "u-joint-calculator",
  "edge": true,
  "name": "Edge: zero value in 'b1' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#b1",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "u-joint-calculator",
  "edge": true,
  "name": "Edge: negative value in 'b1' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#b1",
    "value": "-5"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "u-joint-calculator",
  "edge": true,
  "name": "Edge: huge value in 'b1' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#b1",
    "value": "1e9"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "u-joint-calculator",
  "edge": true,
  "name": "Edge: empty value in 'b1' – no NaN, range shown or valid result",
  "reference": "robustness",
  "steps": [
   {
    "fill": "#b1",
    "value": ""
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "bolted-joint-calculator",
  "edge": true,
  "name": "Edge: P = 0 – bolt force equals preload",
  "reference": "External review boundary list",
  "steps": [
   {
    "fill": "#P",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "bolted-joint-calculator",
  "edge": true,
  "name": "Edge: P above separation – no NaN, separated state shown",
  "reference": "External review boundary list",
  "steps": [
   {
    "fill": "#P",
    "value": "40"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "BEAM-001: left reaction",
  "reference": "External review (ChatGPT) case BEAM-001",
  "steps": [
   {
    "click": "#ptiles .tile[data-i=\"5\"]"
   },
   {
    "fill": "#I",
    "value": "800"
   },
   {
    "fill": "#W",
    "value": "160"
   }
  ],
  "read": {
   "label": "Left reaction",
   "part": "v",
   "index": 0
  },
  "expected": 9.666667,
  "tol_pct": 0.1
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "BEAM-001: right reaction",
  "reference": "External review (ChatGPT) case BEAM-001",
  "steps": [
   {
    "click": "#ptiles .tile[data-i=\"5\"]"
   },
   {
    "fill": "#I",
    "value": "800"
   },
   {
    "fill": "#W",
    "value": "160"
   }
  ],
  "read": {
   "label": "Right reaction",
   "part": "v",
   "index": 0
  },
  "expected": 6.333333,
  "tol_pct": 0.1
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "BEAM-001: max moment",
  "reference": "External review (ChatGPT) case BEAM-001",
  "steps": [
   {
    "click": "#ptiles .tile[data-i=\"5\"]"
   },
   {
    "fill": "#I",
    "value": "800"
   },
   {
    "fill": "#W",
    "value": "160"
   }
  ],
  "read": {
   "label": "Maximum bending moment",
   "part": "v",
   "index": 0
  },
  "expected": 8.666667,
  "tol_pct": 0.1
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "BEAM-001: bending stress",
  "reference": "External review (ChatGPT) case BEAM-001",
  "steps": [
   {
    "click": "#ptiles .tile[data-i=\"5\"]"
   },
   {
    "fill": "#I",
    "value": "800"
   },
   {
    "fill": "#W",
    "value": "160"
   }
  ],
  "read": {
   "label": "Bending stress",
   "part": "v",
   "index": 0
  },
  "expected": 54.1667,
  "tol_pct": 0.2
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "BEAM-001: max deflection",
  "reference": "External review (ChatGPT) case BEAM-001",
  "steps": [
   {
    "click": "#ptiles .tile[data-i=\"5\"]"
   },
   {
    "fill": "#I",
    "value": "800"
   },
   {
    "fill": "#W",
    "value": "160"
   }
  ],
  "read": {
   "label": "Maximum deflection",
   "part": "v",
   "index": 0
  },
  "expected": 4.12728,
  "tol_pct": 0.1
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "BEAM-001: position of max deflection",
  "reference": "External review (ChatGPT) case BEAM-001",
  "steps": [
   {
    "click": "#ptiles .tile[data-i=\"5\"]"
   },
   {
    "fill": "#I",
    "value": "800"
   },
   {
    "fill": "#W",
    "value": "160"
   }
  ],
  "read": {
   "label": "Maximum deflection",
   "part": "alt",
   "index": 0
  },
  "expected": 1406.2,
  "tol_pct": 0.1
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "BEAM-002: tip deflection",
  "reference": "External review (ChatGPT) case BEAM-002",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"1\"]"
   },
   {
    "fill": "#L",
    "value": "2000"
   },
   {
    "click": "#etiles .tile[data-i=\"1\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"5\"]"
   },
   {
    "fill": "#I",
    "value": "500"
   },
   {
    "fill": "#W",
    "value": "100"
   },
   {
    "fill": "#lv0",
    "value": "3"
   },
   {
    "fill": "#la0",
    "value": "2000"
   },
   {
    "fill": "#lv1",
    "value": "1"
   },
   {
    "fill": "#la1",
    "value": "0"
   },
   {
    "fill": "#lb1",
    "value": "2000"
   },
   {
    "click": "#addl"
   },
   {
    "fill": "#lt2",
    "value": "moment"
   },
   {
    "fill": "#lv2",
    "value": "0.5"
   },
   {
    "fill": "#la2",
    "value": "2000"
   }
  ],
  "read": {
   "label": "Maximum deflection",
   "part": "v",
   "index": 0
  },
  "expected": 11.0,
  "tol_pct": 0.1
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "BEAM-002: free-end rotation",
  "reference": "External review (ChatGPT) case BEAM-002",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"1\"]"
   },
   {
    "fill": "#L",
    "value": "2000"
   },
   {
    "click": "#etiles .tile[data-i=\"1\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"5\"]"
   },
   {
    "fill": "#I",
    "value": "500"
   },
   {
    "fill": "#W",
    "value": "100"
   },
   {
    "fill": "#lv0",
    "value": "3"
   },
   {
    "fill": "#la0",
    "value": "2000"
   },
   {
    "fill": "#lv1",
    "value": "1"
   },
   {
    "fill": "#la1",
    "value": "0"
   },
   {
    "fill": "#lb1",
    "value": "2000"
   },
   {
    "click": "#addl"
   },
   {
    "fill": "#lt2",
    "value": "moment"
   },
   {
    "fill": "#lv2",
    "value": "0.5"
   },
   {
    "fill": "#la2",
    "value": "2000"
   }
  ],
  "read": {
   "label": "Maximum deflection",
   "part": "alt",
   "index": 1
  },
  "expected": 0.008333,
  "tol_pct": 0.2
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "BEAM-002: vertical reaction",
  "reference": "External review (ChatGPT) case BEAM-002",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"1\"]"
   },
   {
    "fill": "#L",
    "value": "2000"
   },
   {
    "click": "#etiles .tile[data-i=\"1\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"5\"]"
   },
   {
    "fill": "#I",
    "value": "500"
   },
   {
    "fill": "#W",
    "value": "100"
   },
   {
    "fill": "#lv0",
    "value": "3"
   },
   {
    "fill": "#la0",
    "value": "2000"
   },
   {
    "fill": "#lv1",
    "value": "1"
   },
   {
    "fill": "#la1",
    "value": "0"
   },
   {
    "fill": "#lb1",
    "value": "2000"
   },
   {
    "click": "#addl"
   },
   {
    "fill": "#lt2",
    "value": "moment"
   },
   {
    "fill": "#lv2",
    "value": "0.5"
   },
   {
    "fill": "#la2",
    "value": "2000"
   }
  ],
  "read": {
   "label": "Left reaction",
   "part": "v",
   "index": 0
  },
  "expected": 5.0,
  "tol_pct": 0.1
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "BEAM-002: fixed-end moment",
  "reference": "External review (ChatGPT) case BEAM-002",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"1\"]"
   },
   {
    "fill": "#L",
    "value": "2000"
   },
   {
    "click": "#etiles .tile[data-i=\"1\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"5\"]"
   },
   {
    "fill": "#I",
    "value": "500"
   },
   {
    "fill": "#W",
    "value": "100"
   },
   {
    "fill": "#lv0",
    "value": "3"
   },
   {
    "fill": "#la0",
    "value": "2000"
   },
   {
    "fill": "#lv1",
    "value": "1"
   },
   {
    "fill": "#la1",
    "value": "0"
   },
   {
    "fill": "#lb1",
    "value": "2000"
   },
   {
    "click": "#addl"
   },
   {
    "fill": "#lt2",
    "value": "moment"
   },
   {
    "fill": "#lv2",
    "value": "0.5"
   },
   {
    "fill": "#la2",
    "value": "2000"
   }
  ],
  "read": {
   "label": "Left reaction",
   "part": "alt",
   "index": 0
  },
  "expected": -8.5,
  "tol_pct": 0.1
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "BEAM-003: fixed-end reaction",
  "reference": "External review (ChatGPT) case BEAM-003",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"3\"]"
   },
   {
    "fill": "#L",
    "value": "4000"
   },
   {
    "click": "#ptiles .tile[data-i=\"5\"]"
   },
   {
    "fill": "#I",
    "value": "1200"
   },
   {
    "fill": "#W",
    "value": "100"
   },
   {
    "click": "#ltab [data-del=\"0\"]"
   },
   {
    "fill": "#lv0",
    "value": "3"
   },
   {
    "fill": "#la0",
    "value": "0"
   },
   {
    "fill": "#lb0",
    "value": "4000"
   }
  ],
  "read": {
   "label": "Left reaction",
   "part": "v",
   "index": 0
  },
  "expected": 7.5,
  "tol_pct": 0.1
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "BEAM-003: prop reaction",
  "reference": "External review (ChatGPT) case BEAM-003",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"3\"]"
   },
   {
    "fill": "#L",
    "value": "4000"
   },
   {
    "click": "#ptiles .tile[data-i=\"5\"]"
   },
   {
    "fill": "#I",
    "value": "1200"
   },
   {
    "fill": "#W",
    "value": "100"
   },
   {
    "click": "#ltab [data-del=\"0\"]"
   },
   {
    "fill": "#lv0",
    "value": "3"
   },
   {
    "fill": "#la0",
    "value": "0"
   },
   {
    "fill": "#lb0",
    "value": "4000"
   }
  ],
  "read": {
   "label": "Right reaction",
   "part": "v",
   "index": 0
  },
  "expected": 4.5,
  "tol_pct": 0.1
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "BEAM-003: fixed-end moment",
  "reference": "External review (ChatGPT) case BEAM-003",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"3\"]"
   },
   {
    "fill": "#L",
    "value": "4000"
   },
   {
    "click": "#ptiles .tile[data-i=\"5\"]"
   },
   {
    "fill": "#I",
    "value": "1200"
   },
   {
    "fill": "#W",
    "value": "100"
   },
   {
    "click": "#ltab [data-del=\"0\"]"
   },
   {
    "fill": "#lv0",
    "value": "3"
   },
   {
    "fill": "#la0",
    "value": "0"
   },
   {
    "fill": "#lb0",
    "value": "4000"
   }
  ],
  "read": {
   "label": "Maximum bending moment",
   "part": "v",
   "index": 0
  },
  "expected": -6.0,
  "tol_pct": 0.1
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "BEAM-003: max sagging moment",
  "reference": "External review (ChatGPT) case BEAM-003",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"3\"]"
   },
   {
    "fill": "#L",
    "value": "4000"
   },
   {
    "click": "#ptiles .tile[data-i=\"5\"]"
   },
   {
    "fill": "#I",
    "value": "1200"
   },
   {
    "fill": "#W",
    "value": "100"
   },
   {
    "click": "#ltab [data-del=\"0\"]"
   },
   {
    "fill": "#lv0",
    "value": "3"
   },
   {
    "fill": "#la0",
    "value": "0"
   },
   {
    "fill": "#lb0",
    "value": "4000"
   }
  ],
  "read": {
   "label": "Maximum bending moment",
   "part": "alt",
   "index": 2
  },
  "expected": 3.375,
  "tol_pct": 0.1
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "BEAM-003: max deflection",
  "reference": "External review (ChatGPT) case BEAM-003",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"3\"]"
   },
   {
    "fill": "#L",
    "value": "4000"
   },
   {
    "click": "#ptiles .tile[data-i=\"5\"]"
   },
   {
    "fill": "#I",
    "value": "1200"
   },
   {
    "fill": "#W",
    "value": "100"
   },
   {
    "click": "#ltab [data-del=\"0\"]"
   },
   {
    "fill": "#lv0",
    "value": "3"
   },
   {
    "fill": "#la0",
    "value": "0"
   },
   {
    "fill": "#lb0",
    "value": "4000"
   }
  ],
  "read": {
   "label": "Maximum deflection",
   "part": "v",
   "index": 0
  },
  "expected": 1.65063,
  "tol_pct": 0.1
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "BEAM-003: position of max deflection",
  "reference": "External review (ChatGPT) case BEAM-003",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"3\"]"
   },
   {
    "fill": "#L",
    "value": "4000"
   },
   {
    "click": "#ptiles .tile[data-i=\"5\"]"
   },
   {
    "fill": "#I",
    "value": "1200"
   },
   {
    "fill": "#W",
    "value": "100"
   },
   {
    "click": "#ltab [data-del=\"0\"]"
   },
   {
    "fill": "#lv0",
    "value": "3"
   },
   {
    "fill": "#la0",
    "value": "0"
   },
   {
    "fill": "#lb0",
    "value": "4000"
   }
  ],
  "read": {
   "label": "Maximum deflection",
   "part": "alt",
   "index": 0
  },
  "expected": 2313.86,
  "tol_pct": 0.1
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "BEAM-003: rotation at prop",
  "reference": "External review (ChatGPT) case BEAM-003",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"3\"]"
   },
   {
    "fill": "#L",
    "value": "4000"
   },
   {
    "click": "#ptiles .tile[data-i=\"5\"]"
   },
   {
    "fill": "#I",
    "value": "1200"
   },
   {
    "fill": "#W",
    "value": "100"
   },
   {
    "click": "#ltab [data-del=\"0\"]"
   },
   {
    "fill": "#lv0",
    "value": "3"
   },
   {
    "fill": "#la0",
    "value": "0"
   },
   {
    "fill": "#lb0",
    "value": "4000"
   }
  ],
  "read": {
   "label": "Maximum deflection",
   "part": "alt",
   "index": 1
  },
  "expected": 0.0015873,
  "tol_pct": 0.3
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Fixed–fixed UDL: end reaction wL/2",
  "reference": "Classical closed form (Roark / any mechanics text)",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"2\"]"
   },
   {
    "fill": "#L",
    "value": "4000"
   },
   {
    "click": "#ptiles .tile[data-i=\"5\"]"
   },
   {
    "fill": "#I",
    "value": "1200"
   },
   {
    "fill": "#W",
    "value": "100"
   },
   {
    "click": "#ltab [data-del=\"0\"]"
   },
   {
    "fill": "#lv0",
    "value": "3"
   },
   {
    "fill": "#la0",
    "value": "0"
   },
   {
    "fill": "#lb0",
    "value": "4000"
   }
  ],
  "read": {
   "label": "Left reaction",
   "part": "v",
   "index": 0
  },
  "expected": 6.0,
  "tol_pct": 0.1
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Fixed–fixed UDL: end moment wL²/12",
  "reference": "Classical closed form (Roark / any mechanics text)",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"2\"]"
   },
   {
    "fill": "#L",
    "value": "4000"
   },
   {
    "click": "#ptiles .tile[data-i=\"5\"]"
   },
   {
    "fill": "#I",
    "value": "1200"
   },
   {
    "fill": "#W",
    "value": "100"
   },
   {
    "click": "#ltab [data-del=\"0\"]"
   },
   {
    "fill": "#lv0",
    "value": "3"
   },
   {
    "fill": "#la0",
    "value": "0"
   },
   {
    "fill": "#lb0",
    "value": "4000"
   }
  ],
  "read": {
   "label": "Left reaction",
   "part": "alt",
   "index": 0
  },
  "expected": -4.0,
  "tol_pct": 0.1
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Fixed–fixed UDL: deflection wL⁴/384EI",
  "reference": "Classical closed form (Roark / any mechanics text)",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"2\"]"
   },
   {
    "fill": "#L",
    "value": "4000"
   },
   {
    "click": "#ptiles .tile[data-i=\"5\"]"
   },
   {
    "fill": "#I",
    "value": "1200"
   },
   {
    "fill": "#W",
    "value": "100"
   },
   {
    "click": "#ltab [data-del=\"0\"]"
   },
   {
    "fill": "#lv0",
    "value": "3"
   },
   {
    "fill": "#la0",
    "value": "0"
   },
   {
    "fill": "#lb0",
    "value": "4000"
   }
  ],
  "read": {
   "label": "Maximum deflection",
   "part": "v",
   "index": 0
  },
  "expected": 0.79365,
  "tol_pct": 0.15
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Simply supported UDL on IPE 200: 5wL⁴/384EI",
  "reference": "Classical closed form (Roark / any mechanics text)",
  "steps": [
   {
    "click": "#ltab [data-del=\"0\"]"
   }
  ],
  "read": {
   "label": "Maximum deflection",
   "part": "v",
   "index": 0
  },
  "expected": 0.51695,
  "tol_pct": 0.15
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Simply supported UDL on IPE 200: σ = wL²/8W",
  "reference": "Classical closed form (Roark / any mechanics text)",
  "steps": [
   {
    "click": "#ltab [data-del=\"0\"]"
   }
  ],
  "read": {
   "label": "Bending stress",
   "part": "v",
   "index": 0
  },
  "expected": 11.598,
  "tol_pct": 0.5
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Point load on a support: no bending",
  "reference": "Invariant (ChatGPT review): load at a support",
  "steps": [
   {
    "click": "#ptiles .tile[data-i=\"5\"]"
   },
   {
    "fill": "#I",
    "value": "800"
   },
   {
    "fill": "#W",
    "value": "160"
   },
   {
    "fill": "#la0",
    "value": "0"
   },
   {
    "fill": "#lv1",
    "value": "0"
   }
  ],
  "read": {
   "label": "Maximum bending moment",
   "part": "v",
   "index": 0
  },
  "expected": 0,
  "tol_pct": 0.1,
  "edge": true
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Load outside the span is rejected",
  "reference": "Invariant (ChatGPT review)",
  "steps": [
   {
    "fill": "#la0",
    "value": "3500"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Zero span rejected",
  "reference": "Invariant",
  "steps": [
   {
    "fill": "#L",
    "value": "0"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Imperial units sane",
  "reference": "Unit switch",
  "steps": [
   {
    "click": "#useg button[data-u=\"i\"]"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Sane: supports 0, section 0",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"0\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"0\"]"
   },
   {
    "click": "#sw"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Sane: supports 0, section 1",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"0\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"1\"]"
   },
   {
    "click": "#sw"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Sane: supports 0, section 2",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"0\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"2\"]"
   },
   {
    "click": "#sw"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Sane: supports 0, section 3",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"0\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"3\"]"
   },
   {
    "click": "#sw"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Sane: supports 0, section 4",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"0\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"4\"]"
   },
   {
    "click": "#sw"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Sane: supports 0, section 5",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"0\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"5\"]"
   },
   {
    "click": "#sw"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Sane: supports 1, section 0",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"1\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"0\"]"
   },
   {
    "click": "#sw"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Sane: supports 1, section 1",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"1\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"1\"]"
   },
   {
    "click": "#sw"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Sane: supports 1, section 2",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"1\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"2\"]"
   },
   {
    "click": "#sw"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Sane: supports 1, section 3",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"1\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"3\"]"
   },
   {
    "click": "#sw"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Sane: supports 1, section 4",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"1\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"4\"]"
   },
   {
    "click": "#sw"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Sane: supports 1, section 5",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"1\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"5\"]"
   },
   {
    "click": "#sw"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Sane: supports 2, section 0",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"2\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"0\"]"
   },
   {
    "click": "#sw"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Sane: supports 2, section 1",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"2\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"1\"]"
   },
   {
    "click": "#sw"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Sane: supports 2, section 2",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"2\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"2\"]"
   },
   {
    "click": "#sw"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Sane: supports 2, section 3",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"2\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"3\"]"
   },
   {
    "click": "#sw"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Sane: supports 2, section 4",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"2\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"4\"]"
   },
   {
    "click": "#sw"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Sane: supports 2, section 5",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"2\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"5\"]"
   },
   {
    "click": "#sw"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Sane: supports 3, section 0",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"3\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"0\"]"
   },
   {
    "click": "#sw"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Sane: supports 3, section 1",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"3\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"1\"]"
   },
   {
    "click": "#sw"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Sane: supports 3, section 2",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"3\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"2\"]"
   },
   {
    "click": "#sw"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Sane: supports 3, section 3",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"3\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"3\"]"
   },
   {
    "click": "#sw"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Sane: supports 3, section 4",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"3\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"4\"]"
   },
   {
    "click": "#sw"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "beam-deflection-calculator",
  "name": "Sane: supports 3, section 5",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#stiles .tile[data-i=\"3\"]"
   },
   {
    "click": "#ptiles .tile[data-i=\"5\"]"
   },
   {
    "click": "#sw"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "name": "Wood: 12 mm 2-flute router bit in softwood, chip load",
  "reference": "Router chip-load practice (Onsrud/Amana charts): 12 mm 2-flute bit in softwood ≈ 0.4–0.5 mm/tooth",
  "steps": [
   {
    "click": "#ptiles .tile[data-k=\"mill\"]"
   },
   {
    "click": "#mtiles .tile[data-k=\"soft\"]"
   },
   {
    "fill": "#nmax",
    "value": "24000"
   }
  ],
  "read": {
   "selector": "#chips .chip:nth-child(2)",
   "index": 0
  },
  "expected": 0.44,
  "tol_pct": 0.5
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "name": "Wood: feed = chip load × 2 × 24 000 rpm",
  "reference": "vf = fz·z·n",
  "steps": [
   {
    "click": "#ptiles .tile[data-k=\"mill\"]"
   },
   {
    "click": "#mtiles .tile[data-k=\"soft\"]"
   },
   {
    "fill": "#nmax",
    "value": "24000"
   }
  ],
  "read": {
   "label": "Feed rate",
   "part": "v",
   "index": 0
  },
  "expected": 21120,
  "tol_pct": 0.1
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "name": "Wood: spindle capped at machine max",
  "reference": "n = min(1000·Vc/πD, nmax)",
  "steps": [
   {
    "click": "#ptiles .tile[data-k=\"mill\"]"
   },
   {
    "click": "#mtiles .tile[data-k=\"soft\"]"
   },
   {
    "fill": "#nmax",
    "value": "24000"
   }
  ],
  "read": {
   "label": "Spindle speed",
   "part": "v",
   "index": 0
  },
  "expected": 24000,
  "tol_pct": 0.1
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "name": "Wood sane: soft turn",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#ptiles .tile[data-k=\"turn\"]"
   },
   {
    "click": "#mtiles .tile[data-k=\"soft\"]"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "name": "Wood sane: soft mill",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#ptiles .tile[data-k=\"mill\"]"
   },
   {
    "click": "#mtiles .tile[data-k=\"soft\"]"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "name": "Wood sane: soft drill",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#ptiles .tile[data-k=\"drill\"]"
   },
   {
    "click": "#mtiles .tile[data-k=\"soft\"]"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "name": "Wood sane: hardw turn",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#ptiles .tile[data-k=\"turn\"]"
   },
   {
    "click": "#mtiles .tile[data-k=\"hardw\"]"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "name": "Wood sane: hardw mill",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#ptiles .tile[data-k=\"mill\"]"
   },
   {
    "click": "#mtiles .tile[data-k=\"hardw\"]"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "name": "Wood sane: hardw drill",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#ptiles .tile[data-k=\"drill\"]"
   },
   {
    "click": "#mtiles .tile[data-k=\"hardw\"]"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "name": "Wood sane: mdf turn",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#ptiles .tile[data-k=\"turn\"]"
   },
   {
    "click": "#mtiles .tile[data-k=\"mdf\"]"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "name": "Wood sane: mdf mill",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#ptiles .tile[data-k=\"mill\"]"
   },
   {
    "click": "#mtiles .tile[data-k=\"mdf\"]"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "name": "Wood sane: mdf drill",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#ptiles .tile[data-k=\"drill\"]"
   },
   {
    "click": "#mtiles .tile[data-k=\"mdf\"]"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "name": "Wood sane: ply turn",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#ptiles .tile[data-k=\"turn\"]"
   },
   {
    "click": "#mtiles .tile[data-k=\"ply\"]"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "name": "Wood sane: ply mill",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#ptiles .tile[data-k=\"mill\"]"
   },
   {
    "click": "#mtiles .tile[data-k=\"ply\"]"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 },
 {
  "slug": "speeds-and-feeds-calculator",
  "name": "Wood sane: ply drill",
  "reference": "Generated edge case",
  "steps": [
   {
    "click": "#ptiles .tile[data-k=\"drill\"]"
   },
   {
    "click": "#mtiles .tile[data-k=\"ply\"]"
   }
  ],
  "read": {
   "check": "sane"
  },
  "expected": 0,
  "tol_pct": 0,
  "edge": true
 }
]