arris 0.4.0

A B-Rep geometric kernel in pure Rust: tolerance-carrying topology, booleans with provenance, blends, tessellation and STEP
Documentation
# arris

A B-Rep geometric kernel written from scratch in Rust.

An *arris* is the sharp edge where two surfaces meet — the thing a B-Rep kernel exists to compute.

Arris is a library, not an application: it builds solids, cuts and fuses
them, blends their edges, measures, tessellates and exports them. It carries
a tolerance on every entity rather than one global epsilon, returns a typed
error naming the entities involved rather than panicking on geometry it
cannot do, and returns a provenance record from every operation so that a
parametric application can name the faces an operation made. Same input,
same output, same entity ids, on every platform. Pure Rust, no `unsafe`,
builds for `wasm32`.

## State

Pre-1.0 and under development. The public API breaks between minor versions,
and each break is listed, with its fix, in `CHANGELOG.md`. What is in today:

- primitives, rigid transforms, and extrude and revolve of a profile of
  lines, arcs and elliptic arcs;
- booleans — cut, fuse, common — over every analytic face (plane,
  cylinder, elliptic cylinder, cone, sphere, torus) in any pose, with
  multi-shell results (cavities, split cuts, disjoint fuses); sections are
  exact where they are conics and traced and fitted to NURBS elsewhere;
- constant-radius fillet and chamfer on plane–plane and plane–cylinder
  edges, with miters, corners and hole rims;
- tessellation to a chord tolerance, mass properties (volume, centroid,
  inertia), plane projection and face frames;
- a STEP reader that returns a checked body, or a typed refusal naming
  why, for every solid in a file; STEP AP214, STL and OBJ export; a
  deterministic native format in JSON and bytes; and one body, with its
  provenance, as bytes that any later release reads.

Not in yet: booleans with a NURBS face as an operand, blends between faces
outside the plane and cylinder pairs, variable-radius blends, sheet and
non-manifold bodies, and healing of what a STEP file leaves open. Each of
those is a typed refusal today, never a wrong answer.

## Correctness

Every operation returns a shape that passes the invariant checker, and the
checker runs after every operation in debug builds. Every fixture in the
test corpus carries an oracle value — volume, area, centroid, counts, point
classifications — computed by Open CASCADE, which Arris must match within
the fixture's stated tolerance. Open CASCADE is run as the oracle through
Python; it is never a build or runtime dependency, and `PROVENANCE.md` says
how it is used and read. Properties (volume additivity, cut-then-fuse,
commutativity, STEP round-trip) are tested over random operands in random
poses from a fixed seed.

## Workspace

Arris is a Cargo workspace. `crates/arris` is the facade a consumer depends
on; it re-exports the layered crates beneath it — `arris-math`, `arris-geom`,
`arris-topo` (the representation), `arris-check` (the invariant checker),
`arris-ops`, `arris-mesh`, `arris-io` (the algorithms) and `arris-debug`
(dev-facing: rasteriser, fixtures, property-test strategies; it is not
published). A crate never depends on one above it; `tools/check-layers.sh`
enforces that in CI and in the pre-commit hook. The layout and the reasons
are in `docs/ARCHITECTURE.md`; `tools/oracle/` is the Open CASCADE test
oracle, run through Python and never linked.

## Licence

MIT or Apache-2.0, at your option. See `LICENSE-MIT` and `LICENSE-APACHE`.