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

  1. passedexpectGeo(part).toHaveBoundingBox({ size: { x: 40, y: 40, z: 20 } })measured 40 × 40 × 20 mm
  2. failedexpectGeo(part).toHaveCircularHole({ diameter: 12 })GEOSPEC_FEATURE_MISMATCHone through bore, ⌀ 10 mm
  3. refusedexpectGeo(part).toHaveMass({ value: 82 })GEOSPEC_UNSUPPORTED_EVIDENCEno density declared

result 3,020 bytes · SHA-256 a736919eb95e…same spec, same model, same bytes

plate-with-through-bore.stepgeospec-engine 0.4.0 · wasm

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.

Select a claim to see what it checks.
  • 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 →