Monolith & Modular Monolith
A monolith can be well designed, and usually should be tried first. Internal module contracts, shared libraries, and the `common/` folder as a design failure.
A monolith is a deployment decision, not a structural one. It can be well designed, it usually should be where a team starts, and conflating it with "big ball of mud" costs teams years.
One deployment, several modules, each owning its domain logic, its interface and its data. The internal-boundary discipline of services without the operational bill.
Inside one deployment, the contract that matters is who may touch which data. Arbitrary cross-module table access is what makes a modular monolith aspirational rather than real.
The internal package everyone depends on. Its fan-in is the point and also the problem: every change ripples outward to code you did not open.
`common/`, `shared/`, `utils/` — where code goes when nobody will own it. The cause is missing ownership, not laziness, and the fix has to address the cause.