Expression / AffineExpression project_onto — restrict an expression to a
blade subspace (MV → its non-zero blades, BladeMask → exact id membership),
with a module-level project_onto(x, other) dispatcher and an N3 Euclidean
projection example.
TwistBivector operator — an N3-only, grade-2 twist bivector built from a
rotor + translator via a motor, with create_var / mask_for support (not
visualizable).
AffineExpression.rename_var no longer raises on terms missing the
variable — it renames only in the terms that contain it and leaves the
others unchanged, while still raising for a name absent from every term or a
cross-term name collision.
BladeMask(alg, []) now returns an empty mask — and intersection /
union / from_mv handle the empty case correctly (the tensor product also
gained a zero-tensor fast path for genuinely empty result masks).