STEP / glTF / mesh → passed · failed · refused · TypeScript · Python
State what the model must be.
GeoSpec measures a CAD model against claims you write and answers passed, failed or refused. A claim it cannot decide is refused with a typed reason, and the same bytes in give the same result out.
- Browser
- 4.1 MBWASM, brotli
- Node
- 35.3 MBlinux-x64-gnu prebuild
- Python
- 14.9 MBmanylinux x86_64 wheel
check.ts · 3 claims · 1 modelstatus · claim · diagnostic
- passed
expectmeasured 40 × 40 × 20 mmGeo (part). to Have Bounding Box ({ size: { x: 40, y: 40, z: 20 } }) - failed
expectGeo (part). to Have Circular Hole ({ diameter: 12 }) GEOSPEC_one through bore, ⌀ 10 mmFEATURE_ MISMATCH - refused
expectGeo (part). to Have Mass ({ value: 82 }) GEOSPEC_no density declaredUNSUPPORTED_ EVIDENCE
result 3,020 bytes · SHA-256 a736919eb95e…same spec, same model, same bytes
Run the spec
Three claims against one STEP part, evaluated in your browser: one passes, one fails and one is refused, each with the diagnostic the engine returned. The same spec runs in Node through the geospec package and in Python through the wheel.
The model is a 40 × 40 × 20 mm plate with a 10 mm through bore (plate-with-through-bore.step, 19.1 KB). Running the spec loads the engine's WASM build, 16.7 MB (4.1 MB under brotli), in a Web Worker in this tab.
- not run
- not run
- not run
Passed, failed or refused
Each claim answers with one of three statuses. A failed claim carries a diagnostic code, the measured values and a suggestion.
Refused, never guessed
A claim the engine cannot decide on the given geometry is refused with a typed reason. It is never reported as a pass, including under negation.
Reproducible
The same model, spec and engine version give the same result bytes. Results are canonical JSON, so two runs compare byte for byte.
Written for agents too
Every page is served as Markdown beside its HTML, and one guide says what to put in a claim, how to read the three statuses and why a refusal is never rewritten into a pass.
One engine. Node, browsers and Python. Same bytes in, same result out.
Read the docs →