I believe by adding a little bit more hair (a test that a component IS a module and IS NOT a system) to the TRAVERSE structure, I can salvage INTRA-system dependencies involving modules without trying to fix INTER-system dependencies, which seems like too big a bite to chew off.
What would people think about that?
I'm afraid, pace James A, that this won't make the code a lot simpler or more elegant, but it will make the behavior more predictable, which is a Good Thing.
This exhibits a Common Lisp hassle pattern I have written myself into far too often --- you make a class (in this case system) inherit from another class (in this case module), and later on find that you should have built a triangular relationship between module, system and a common superclass.
Introducing that common superclass is often quite painful....
In this case, I think backward compatibility rules out this kind of refactoring (impossible to tell whose system subclasses you might break), so the best we can do is put on some inelegant band-aids like
(when (and (typep x 'module) (not (typep x 'system)) ....)
cheers, r