+All Euclidean Jordan algebras are over the real scalar field. This
+presents a problem: in SageMath, the matrix and vector classes don't
+support scalar fields that are different than their entries. And three
+of the simple families of Euclidean Jordan algebras are matrices with
+non-real entries: the Hermitian comples, quaternion, and octonion
+algebras.
+
+At least in the complex and quaternion case, we can "embed" the
+complex numbers and quaternions into the space of 2-by-2 or 4-by-4
+matrices. But the octonions are not associative, so they can't be
+embedded (via a homomorphism) into any real matrix space. So what
+do we do? Write it ourselves, obviously.
+
+The octonion matrix algebra is implemented separately, as a subclass
+of CombinatorialFreeModule, to work around that issue. The custom
+class supports a scalar field that is different than the entries of
+the matrices. However, this means that we actually have FOUR
+different types of "matrices" to support:
+
+ (1) Sage vectors
+ (2) Sage matrices
+ (3) Our custom matrices
+ (4) Cartesian products of the (1) through (3)
+
+All other Euclidean Jordan algebras could of course be implemented in
+the same way as the octonion algebra, but for the sake of the user
+interface, we must also support at least the usual SageMath vectors
+and matrices.
+
+Note: this has one less-than-obvious consequence: we have to assume
+that the user has supplied an entirely-correct basis (with entries in
+the correct structure). We generally cannot mess witht the entries of
+his basis, or use them to figure out what (for example) the ambient
+scalar ring is. None of these are insurmountable obstacles; we just
+have to be a little careful distinguishing between what's inside the
+algebra elements and what's outside them.