Tarr, Ossher, Harrison and Sutton named the “tyranny of the dominant decomposition” in N Degrees of Separation (ICSE 1999): most module systems force one decomposition axis, and every concern that cuts across it becomes scattered. The Nix module system escapes this, and it is the clearest working realization of MDSoC that nobody in the community cites. Because the merge is a fixed point, a config can be decomposed by tool, by host, by role, and by architecture at once, with no axis privileged. imports composes along one, mkIf annotates along another, and they interleave without either owning the file layout.

The catch is that two axes need two disciplines. Horcas et al. (2018) distinguish composition-based variability (which modules load) from annotation-based (predicates inside a loaded module), and a system running both can have one silently cover for the other. A capability flag in my dotfiles gated nothing for two weeks and looked correct the whole time, because the modules it claimed to gate were already excluded by import omission on the only host where the flag was false. The outcome was right; the mechanism was dead. Multi-axis decomposition buys expressiveness and charges for it in observability: each axis needs its own test, or a working axis will mask a broken one. See Academic Foundations of Nix Configuration Patterns.