17-loft's expected values were FreeCAD's (OpenCASCADE's Part.makeLoft), which runs each side of the square to its quarter of the circle at uniform angle (arc length). That correspondence has no exact rational B-spline form, and SolidCraft keeps its surfaces exact: its ruled loft runs each side to one rational quarter of the circle's B-spline by their own parameters, 35080.7251 mm^3, 0.13% less (the oracle failed on volume and the second moments). The owner chose this correspondence. The case is now worked out in tools/oracle-analytic/cases_basic.py: the section area is quadratic in t with the loops' mixed area, so volume and centroid are closed forms of it (the mixed area and the wall area by Gauss-Legendre on the exact rational arcs); its note says why it differs from OpenCASCADE and gives that volume, and its `compare` leaves out the surface check against OpenCASCADE's reference.stl. All its checks pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Analytic reference values
Closed-form expected values for the cases in tests/oracle/ whose shape
has one: prisms, cylinders, cones and frustums, spheres and caps, tori and solids of revolution
(Pappus), fillets on straight edges (a constant radius, or one varying along the edge), shells,
patterns of these, and folded sheet metal (flats plus bends as annular sectors). Each script is
plain Python 3 (standard library only) with one function per case. Running a script from the repository root rewrites the
expected.json of its cases with "source": "analytic" and a method string giving the formulas:
python3 tools/oracle-analytic/cases_basic.py # 01-29, 82: boxes, holes, revolves, sketches, thin walls
python3 tools/oracle-analytic/cases_features.py # 32-66: fillets, shells, sweeps, patterns
python3 tools/oracle-analytic/cases_sheet_metal.py # 67-76: sheet metal
python3 tools/oracle-analytic/cases_fillets.py # 77-81: variable, chord-length, tapered and spline fillets
python3 tools/oracle-analytic/cases_surfaces.py # 83: boundary surfaces
Where a value depends on a SolidCraft convention rather than on geometry alone (a shell's sharp
inner corner, a sheet-metal corner relief, where a flange height is measured), method or
note says which convention is used. Never change a value to match SolidCraft's output: if they
disagree, find out which one is wrong.