The core leaves Apple: Linux builds
Parsing, the B-rep model, tessellation, mesh repair and the STEP writer now build and test off-Apple, so they can run on a server or in a Linux CI leg. Rendering stays Metal, and therefore Apple-only.
- StepParser and StepKernel no longer require Apple's simd framework. The vector types were always Swift standard library; only the framework's free functions, the matrix types and the quaternion were Apple-only, and a compatibility layer supplies exactly those where the framework is absent — with identical column-major semantics. No API or behaviour change: on Apple the shim compiles to nothing and the system framework is used as before.
- Verified by building in clean Swift 6.1 and 6.2 Linux containers, and by a differential check of the compatibility layer's matrix maths against Apple's simd over 20 000 random matrices — worst relative error 2.4e-12, quaternion→matrix 7.9e-16. New tests assert the layout, multiplication and inverse contract against known values on both platforms, so a divergence fails one of them.
- The package manifest omits the Apple-only rendering targets off-Apple; the portable core is unchanged everywhere.
- The async API no longer blocks Swift Concurrency's cooperative pool. The async load and tessellate overloads ran the pipeline in a detached task — on the cooperative pool — while the pipeline blocks its thread for parallel work. That starves the pool; on Linux the next parallel tessellation after an awaited one deadlocked. The work now runs on a dispatch thread and bridges back through a continuation, with a regression test that reproduces the exact ordering.
- Cancellation actually reaches the pipeline now. The per-face and per-solid checkpoints tested the task's cancellation flag, which reads false on parallel worker threads because they carry no task context — so a cancelled load or tessellation could never stop early on any platform. An explicit cancellation token replaces it.
- A Linux CI job (Swift 6.1 container) building the portable core and running the test suites on every change, so portability cannot silently regress.