Skip to content

Changelog

All notable changes to Axiolid are documented in this file.

[Unreleased]

Added

  • Extracted axiolid-linear (line/segment/ray/polyline values), axiolid-predicates (certified exact-arithmetic predicates), and axiolid-linear-intersection (certified line/line and segment/segment classification) so a line-query application compiles five internal packages instead of the kernel. Existing paths such as axiolid_curve::Line2 and axiolid_reference::orient2d are preserved by re-export; see ADR 0036.
  • Added cargo xtask architecture closure check|explain, declared closure profiles in architecture/closure-profiles.toml, and an isolated consumer fixture under tests/consumers/, making a minimal dependency closure a machine-checked compatibility promise rather than a claim.
  • Added facade features linear, predicates, and linear-intersection as convenience routes; direct leaf dependencies remain the smallest closure.
  • Extracted axiolid-evaluate (analytic and spline curve/surface evaluation, jets, elementary inversion) from the axiolid-reference umbrella and rewired axiolid-nurbs onto it. A CAD closure drops from 18 to 11 internal packages, no longer compiling mesh, spatial, measure, primitive, or the mesh contracts. axiolid_reference::curve::* and ::surface::* are preserved by re-export; see ADR 0036.
  • Added verified closure profiles mesh-rule-checker, parametric-curves, and cad-exact alongside linear-intersection-minimal, each with an isolated downstream fixture, plus generated closure documentation and scripts/probe_closure_gate.sh proving every profile gate can fail.
  • Added a source-backed geometry concepts guide with accessible Mermaid architecture diagrams, native ASCII STL models that render interactively on GitHub and Pages, contract equations, dark/mobile support, and a mutation-proven diagram-source gate.
  • Stable, typed capability IDs for tessellation, mesh Boolean, mesh section, and graph-to-mesh contracts, plus an application- and vendor-neutral openbim.geometry claim/evidence boundary.
  • Added the Axiolid favicon and a canonical glossary with automatic first-use links and hover/focus definitions.
  • Added L1 axiolid-brep: strict owned exact B-rep results with separately typed 3D curve, 2D pcurve, and surface catalogs plus explicit native trim intervals. The facade exposes it through the new brep feature; see ADR 0024.
  • Adaptive analytic Curve3 directrix sampling and validated parameter_range trimming for sweeps, with dimension-generic chord subdivision shared by the 2D and 3D flatteners.
  • Test suites for axiolid-curve, axiolid-surface, axiolid-primitive, axiolid-profile, axiolid-tessellation-contract, and axiolid-backend-cpu, pinning vocabulary contracts, validation refusals, and CPU feature selection.
  • Added analytic rational B-spline surface partials and normals, plus bounded conforming support-surface refinement for pcurve-trimmed curved B-rep faces with holes, periodic charts, guarded structured-grid/Earcut seeds, and shared seam vertices.
  • Added the format-neutral axiolid-nurbs algorithm crate and axiolid/nurbs facade feature with analytic second-order differential geometry, explicitly budgeted curve/surface projection, verified closed-curve seam wrapping, exact curve knot insertion/reversal/split/Bézier decomposition, and exact surface U/V insertion/reversal.
  • Added outward-rounded global certificates for clamped NURBS point-to-curve projection and curve-pair minimum distance in 2D/3D, with interval-aware homogeneous knot refinement, unresolved minimizer cells, deterministic work budgets, and pre-allocation Cartesian guards; see ADR 0025.
  • Added bounded globally certified closest-point projection for open clamped polynomial and positive-rational NURBS surfaces, retaining every possible global-minimizer parameter box and requiring both distance-gap and parameter resolution; see ADR 0030.
  • Added opt-in verified periodic curve views for 2D/3D wrapped evaluation and canonicalized insertion/split parameters without changing neutral evaluator or control-net topology semantics; see ADR 0031.
  • Added explicit cyclic PeriodicBSplineSurface U/V/UV schemas, wrapped jets, alias-safe fixed-topology edits, seam continuity orders, and globally certified periodic-domain projection; see ADR 0032.
  • Added bounded planar clamped curve/curve root isolation with exact-sign line/point classification and distinct zero-length point contacts, outward-rounded rational derivative bounds, strict-interior Krawczyk proofs for transverse roots, explicit native-parameter resolution contracts, localized structural overlap/endpoint-tangency outcomes, compact parameter-only DFS work items, hard allocation-safe work ceilings, and explicit unresolved singular or boundary boxes; see ADR 0026.
  • Added bounded clamped, internally continuous 3D NURBS curve/surface root isolation (internal knot multiplicity 1..=degree; valid full-multiplicity internal knots are unsupported by this certified query) with outward tensor rational-Bézier refinement, native-span surface partial enclosures, strict-interior 3×3 Krawczyk proofs for isolated transverse roots, three-parameter resolution certificates, shared refinement/search budgets, fallible per-node allocations, retained partial certificates, and explicit unresolved tangential, singular, or boundary boxes; see ADR 0027.
  • Added bounded clamped NURBS surface/surface candidate exclusion and complete transverse trace certificates for single-span polynomial affine patches. The path proves affine control-net identities over exact binary64 values, proves normal transversality with outward intervals, certifies both boundary endpoints through the curve/surface oracle, preserves both native parameterizations, uses fixed bounded boundary work, and leaves curved, coincident, tangential, boundary-owned, and multispan cases unresolved; see ADR 0028.
  • Added topology-aware integration for one-owner certified affine traces: the boundary-owned rectangle becomes two closed analytic trimmed faces sharing the intersection edge, while the containing rectangle records the same edge as an explicit embedded pcurve. The result retains native endpoint boxes and a conservative residual bound, reserves certified construction storage fallibly, and refuses corners, mixed/dual ownership, curved traces, and incomplete queries; see ADR 0029.
  • Added a backend-neutral mesh plane-section contract and portable scalar oracle with exact binary64 plane-side classification, source-topology contour stitching, explicit mesh-approximation evidence, bounded output and scratch, cancellation, and fail-closed coplanar/non-manifold handling; see ADR 0033.
  • Added a format-neutral authored OpenProfile graph declaration for conservative bounded-open exact 2D curve paths, with finite/structurally valid curve, 2D-offset, instance, and trim-selector validation, shared-DAG-linear traversal, exact same-endpoint refusal, explicit no-area/no-width semantics, solid-operation exclusion, and curve-evaluation classification; see ADR 0034.

Changed

  • Refreshed root and package agent instructions, research snapshots, downstream repository identity, and ADR amendment markers for the nested ownership tree, current package names, maintained test pointers, and architecture gates.
  • Format-neutral production-source checks now reject both Protobuf vocabulary and prost imports, with independent mutation probes; tests remain free to name transports when verifying rejection.
  • Documentation now builds with VitePress 2/Vite 8 and an advisory-free locked dependency graph.
  • Replaced the mixed axiolid-kernel package with axiolid-guarantees, axiolid-contracts, axiolid-mesh-contracts, operation-specific contract packages, and execution-owned axiolid-dispatch.
  • Split axiolid-field values from axiolid-field-ops; the facade now exposes additive field, field-ops, and field-navigation tiers.
  • Renamed the generic mesh-valued GeometryCompiler API to explicit MeshCompiler::{compile_mesh, compile_mesh_batch, compile_mesh_batch_into} and the reference package/type to axiolid-mesh-compile::ReferenceMeshCompiler.
  • Nested Cargo packages by architectural ownership and renamed implementation packages to role-specific axiolid-reference, axiolid-construct, and axiolid-mesh-boolean-boolmesh; downstream manifests and Rust imports must migrate atomically.
  • Renamed or removed every pre-reorganisation package that no longer resolves, so a rev-pinned consumer can map each name to its destination: axiolid-scalar -> axiolid-reference (with exact predicates split into axiolid-predicates), axiolid-boolmesh -> axiolid-mesh-boolean-boolmesh, axiolid-compile -> axiolid-mesh-compile, axiolid-tessellate -> axiolid-tessellation-contract, axiolid-kernel -> axiolid-contracts/axiolid-guarantees/axiolid-dispatch, and axiolid-sweep -> removed, its construction code now in axiolid-construct. See the crate migration guide.
  • axiolid-mesh-compile now converts already-triangular PolygonMesh faces directly to TriMesh without retriangulation, while continuing to refuse n-gons and faces with holes until an explicit tessellation provider is selected.
  • axiolid-construct now defines explicit GenerationRequest and GeneratedGeometry contracts. Exact B-rep and tolerance-bearing tessellation are separate variants; future exact construction must refuse unsupported cases instead of returning a mesh fallback.
  • Documented the kernel's direction: Axiolid is striving to be a multipurpose exact B-rep kernel, with tessellation as a requested output rather than the model. Surface/surface intersection and geometric inversion are now in scope; see ADR 0020. Performance work is explicitly parked behind capability work on the roadmap.
  • Topology audit and planar B-rep compilation now reject empty loops or outer shells, invalid outer-bound cardinality, undersized bounds, and zero/non-finite-area bounds instead of silently emitting empty or filled geometry; BRepHealth exposes dedicated empty-loop and multiple-outer counters.
  • Reject malformed compact knot encodings, non-finite controls/frames/derived evaluations, and non-positive rational weights before or during spline evaluation.
  • Curve flattening and curved-face boundary/interior tessellation now preserve explicit outer/bound orientation and fail closed on non-finite error metrics or unmet tolerance, depth, segment, per-face, input, and aggregate work limits.
  • Extracted the format-agnostic geometry kernel from the Nehirde workspace and renamed its public crate prefix from geom- to axiolid-.
  • Extracted scalar solid generation — profiles, lofts, sweeps, revolutions, extrusion, and bounded half-space clipping — from the L3 DAG compiler into the new L2 axiolid-construct crate. axiolid-mesh-compile now owns graph traversal, caching, model-driven directrices, and B-rep tessellation only; see ADR 0023.

Fixed

  • Hardened source-neutrality checks against dependency aliases while allowing comments, and mutation-verified both behaviors.
  • Pinned every documentation and release workflow action to immutable commits; repository-wide regression coverage rejects mutable refs.
  • Updated the field gate, its 10/10 mutation probe, and nested ownership documentation for the axiolid-field value / axiolid-field-ops algorithm split, including all facade feature tiers.
  • Covered transient crates.io lookup failures in the release tooling.
  • Updated package metadata, generated crate links, documentation navigation, and the GitHub Pages base to the canonical axiolid/kernel repository.
  • Replaced unstable cargo publish --workspace with guarded stable child-first publication.
  • Added lock-free bootstrap preflight for all 31 publishable source archives and staged exact unpatched upload verification; xtask remains excluded.
  • Corrected the README MSRV badge from Rust 1.85 to the workspace-required Rust 1.88.
  • Solid admission and boolmesh result validation now reject finite-coordinate meshes when signed-volume accumulation overflows or otherwise becomes non-finite, instead of accepting non-finite volume as outward orientation.
  • orient3d exact escalation now preserves error-free coordinate-difference tails before evaluating cofactors and uses a bounded exact dyadic fallback when finite inputs would overflow or underflow expansion intermediates. Previously it could certify false signs for exactly coplanar inputs and false zero for extreme finite coordinates.

Removed

  • Removed the axiolid-sweep crate and the facade's misleading sweeps feature and axiolid::sweep module. The crate held a single Sweeper trait with no implementors, no tests, and no references. Its former construction code is now properly extracted into axiolid-construct; ADR 0021 is superseded by ADR 0023.

Released under the Mozilla Public License 2.0.