Full-fledged architectural boundaries are expensive. They require reciprocal polymorphic
Output data structures, and all of the dependency management necessary to isolate the two sides into independently compilable and deployable components. That takes a lot of work. It’s also a lot of work to maintain.
In many situations, a good architect might judge that the expense of such a boundary is too high—but might still want to hold a place for such a boundary in case it is needed later.
This kind of anticipatory design is often frowned upon by many in the Agile community as a violation of YAGNI: “You ...