GeoSpec
0.1.0-beta.1

How it works

Subjects, claims, canonical plans and results, and what the engine promises about each.

Open Markdown

The pieces

A subject is one model the engine has admitted: a mesh in mesh-buffer-v1, or a STEP or glTF/GLB file with its declared coordinate frame and resource identities. The engine names each subject by the hash of its bytes.

A claim states one property of one or more subjects. It names a capability from the engine's registry, a polarity (positive or negated), a work budget and a payload with the expected values.

A plan binds ordered subjects, claims, polarity, budgets and the numerical profile. The engine produces the canonical plan for a request, then evaluates it.

A result reports each claim as passed, failed or refused, with the evidence measured and any diagnostics.

The engine

The engine is a single-threaded Rust core with an OCCT bridge for BRep and the Rust Manifold backend. It ships three ways from one source: a Node native addon, one combined Rust and OCCT WASM module for Node and browsers, and a CPython 3.13 and 3.14 extension.

Hosts send ordinary ArrayBuffer-backed Uint8Arrays (bytes in Python). Rust owns validation, canonical plans, measurements and result serialization. The control contract is protocol 3, registry 5 and the geospec-jcs-v1 canonical profile.

What a result promises

Refusal over guessing. Unsupported or insufficient evidence produces an explicit refusal rather than a geometric pass, including under negation. Registry membership alone does not mean every subject or profile supports a query; the engine's initialization response lists the capabilities and the domains it admits.

Reproducible bytes. Canonical JSON uses UTF-16 key ordering and finite binary64 rendering. Exact byte equality holds within one engine profile, not between different numerical backends.

Declared tolerances. Approximate measurements use each matcher's declared tolerance and threshold semantics. Floating-point geometry does not promise a mathematically exact scalar. Equality is abs(measured - expected) <= tolerance; zero tolerance means nominal equality.

Meshes and glTF

mesh-buffer-v1 is ASCII GSM1, little-endian u32 vertex and triangle counts, then f64 coordinates and u32 triangle indices. In glTF, all TRIANGLES primitives of a mesh carrying EXT_mesh_manifold over its declared POSITION accessor form one material partition; separate meshes, instancing nodes and undeclared primitives stay separate operands.

A content hash identifies bytes. It does not establish that the geometry is correct: coordinates, units and transforms must come through the ingestion request.

On this page