common-lisp-ecosystem
Silent failure modes in Common Lisp, CLOS, ASDF, and package systems: cases where correct-looking code loads and runs without error but does the wrong thing. Ordinary CLOS, condition, and ASDF usage is assumed knowledge; this file exists for the traps that pass a naive review. The SBCL operations part near the end covers running, debugging, profiling, and shipping SBCL programs.
CLOS: the construction boundary is the class, not the constructor
Exporting a class exports make-instance on it. Any validation or invariant that lives only in a
convenience constructor like make-foo is advisory: a caller who writes (make-instance 'foo :slot ...) bypasses all of it and gets an object the rest of the system assumes cannot exist. The
convenience constructor reads like the API, so reviewers check it and stop; nothing in make-foo
hints that a second, unvalidated construction path is exported alongside it.
Enforce invariants in an initialize-instance :after (or applicable shared-initialize) method when
direct construction must preserve them. A slot :initform supplies a default but does not validate
supplied values. Keeping the class package-internal narrows the supported API; it is not an access-control
boundary. Document any unchecked constructor as an internal convention, not a security guarantee.