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), andaxiolid-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 asaxiolid_curve::Line2andaxiolid_reference::orient2dare preserved by re-export; see ADR 0036. - Added
cargo xtask architecture closure check|explain, declared closure profiles inarchitecture/closure-profiles.toml, and an isolated consumer fixture undertests/consumers/, making a minimal dependency closure a machine-checked compatibility promise rather than a claim. - Added facade features
linear,predicates, andlinear-intersectionas convenience routes; direct leaf dependencies remain the smallest closure. - Extracted
axiolid-evaluate(analytic and spline curve/surface evaluation, jets, elementary inversion) from theaxiolid-referenceumbrella and rewiredaxiolid-nurbsonto 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, andcad-exactalongsidelinear-intersection-minimal, each with an isolated downstream fixture, plus generated closure documentation andscripts/probe_closure_gate.shproving 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.geometryclaim/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 newbrepfeature; see ADR 0024. - Adaptive analytic
Curve3directrix sampling and validatedparameter_rangetrimming 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, andaxiolid-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-nurbsalgorithm crate andaxiolid/nurbsfacade 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
PeriodicBSplineSurfaceU/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
OpenProfilegraph 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
prostimports, 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-kernelpackage withaxiolid-guarantees,axiolid-contracts,axiolid-mesh-contracts, operation-specific contract packages, and execution-ownedaxiolid-dispatch. - Split
axiolid-fieldvalues fromaxiolid-field-ops; the facade now exposes additivefield,field-ops, andfield-navigationtiers. - Renamed the generic mesh-valued
GeometryCompilerAPI to explicitMeshCompiler::{compile_mesh, compile_mesh_batch, compile_mesh_batch_into}and the reference package/type toaxiolid-mesh-compile::ReferenceMeshCompiler. - Nested Cargo packages by architectural ownership and renamed implementation packages to role-specific
axiolid-reference,axiolid-construct, andaxiolid-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 intoaxiolid-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, andaxiolid-sweep-> removed, its construction code now inaxiolid-construct. See the crate migration guide. axiolid-mesh-compilenow converts already-triangularPolygonMeshfaces directly toTriMeshwithout retriangulation, while continuing to refuse n-gons and faces with holes until an explicit tessellation provider is selected.axiolid-constructnow defines explicitGenerationRequestandGeneratedGeometrycontracts. 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;
BRepHealthexposes 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-toaxiolid-. - Extracted scalar solid generation — profiles, lofts, sweeps, revolutions, extrusion, and bounded half-space clipping — from the L3 DAG compiler into the new L2
axiolid-constructcrate.axiolid-mesh-compilenow 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-fieldvalue /axiolid-field-opsalgorithm 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/kernelrepository. - Replaced unstable
cargo publish --workspacewith guarded stable child-first publication. - Added lock-free bootstrap preflight for all 31 publishable source archives and staged exact unpatched upload verification;
xtaskremains 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.
orient3dexact 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-sweepcrate and the facade's misleadingsweepsfeature andaxiolid::sweepmodule. The crate held a singleSweepertrait with no implementors, no tests, and no references. Its former construction code is now properly extracted intoaxiolid-construct; ADR 0021 is superseded by ADR 0023.