Most plugin systems continue to work, but just well enough.

This is what makes them dangerous.

A typical plugin system begins with a reasonable goal: allow extension without modification. The core remains stable. Optional functionality lives at the edges. Responsibility is distributed. In the early stages, this works. Plugins are few. The contracts are narrow. The system admits local reasoning.

Over time, the equilibrium afforded by early simplicity degrades.

The failure rarely comes from malice or incompetence. It comes from accommodation. A plugin needs access to a little more state. Another needs to intercept a request earlier in the lifecycle. A third needs to influence rendering, configuration, and persistence, because its feature spans all three.