Architecture
Axiolid separates representations, portable operation contracts, algorithms/providers, execution policy, and the facade. Cargo packages mark real dependency, trust, compilation, provider, licensing, and conformance boundaries; conceptual taxonomy does not force a crate per noun.
Dependency direction
Diagram source
flowchart TB
accTitle: Axiolid package dependency direction
accDescr: Arrows point from a consuming role to roles it may depend on. Applications consume the facade; execution consumes providers and contracts; providers consume neutral representations and portable contracts.
App["Source-format adapters / applications"] --> Facade["Facade and leaf consumers"]
Facade --> Execution["Execution / dispatch policy"]
Facade --> Provider["Algorithms / providers"]
Facade --> Repr["Neutral representations"]
Facade --> Contract["Portable contracts"]
Execution --> Provider
Execution --> Contract
Provider --> Repr
Provider --> Contract
Contract --> Repr
Arrows point from a consumer to a role it may depend on; they are not runtime data-flow arrows.
The executable role DAG is checked by cargo xtask architecture check. Every workspace package declares its layer, role, domain, format neutrality, and exact internal-dependency allowlist. Production/build edges must point downward; explicit dev-only upward edges are allowed solely for integration and conformance tests.
Key rules:
- Representation packages contain format-neutral values and cannot depend on algorithms, providers, execution, or source-format packages.
axiolid-guaranteesowns proof/refusal vocabulary;axiolid-contractsowns common backend, execution, and diagnostics vocabulary.- Each operation contract owns typed inputs, results, evidence, refusals, and conformance behavior. It does not select providers.
axiolid-dispatchowns provider registration, ordering, device matching, fallback, and budget admission.- Execution plans are internal runtime policy, never portable capability schemas.
- Source-format interpretation remains in external adapters such as
openbimrs/ifc'sifc-geometrycrate.
See the generated crate map, dependency graph, and ADR 0035.
Neutral geometry DAG
axiolid-model stores shared geometry in an immutable append-only graph. Typed IDs refer only backward, so cyclic construction is rejected before evaluation. The graph captures neutral authored intent; it is not a source-format AST and does not imply every represented family has an evaluator.
Result-domain honesty
Exact B-rep values live in axiolid-brep. Triangle output is requested through axiolid-mesh-compile-contract::MeshCompiler; the API and method names explicitly say mesh. Tessellation remains a tolerance-bearing projection contract in axiolid-tessellation-contract. No generic “geometry compiler” silently collapses exact and discrete result domains.
Contracts, providers, and execution
Portable seams are split by operation:
axiolid-mesh-boolean-contract;axiolid-mesh-section-contract;axiolid-mesh-compile-contract;axiolid-tessellation-contract.
Implementations remain independently replaceable:
axiolid-referenceis readable portable reference work and the scalar oracle;axiolid-mesh-boolean-boolmeshis an isolated mesh-Boolean provider;axiolid-backend-cpuandaxiolid-backend-gpuare execution contexts/adapters;axiolid-mesh-compileis the reference graph-to-mesh execution pipeline.
Tolerance and numerical work
Tolerance is explicit operation input rather than an ambient global epsilon. Numerically sensitive predicates are owned by the reference layer, with typed certification/escalation where implemented. An optimized path must be supported by differential tests and benchmarks, not merely an architecture claim.