--- topic: building it status: accepted date: 2026-06-04 deciders: jochen reconstructed: true --- # 14. No workspace — each module is a standalone package consuming published dependencies > Reconstructed after the fact from the evidence cited below. ## Context Modules depend on each other, above all on the shared library every module builds against. A workspace was the obvious way to express that: sibling packages, resolved locally, one install at the root. It produced a divergence that is worth stating precisely, because it is not obvious. In development, a workspace member importing a sibling resolves to that sibling's **local source**. In the pipeline, each module is built alone, from a clone, without its siblings present — so the same import resolves to the **published version**. The two environments were therefore building different code from identical source, and the failure appeared only in the pipeline, in a module that had not been touched. ## Considered options 1. **Keep the workspace and make the pipeline replicate it** — clone every module, build the graph. Rejected: it makes every build a whole-repository build, which is the cost the per-module pipeline exists to avoid, and it does not extend to modules in their own repositories. 2. **Keep the workspace and pin siblings to published versions.** Rejected as the worst of both: the workspace's local resolution silently overrides the pin, so the divergence remains while looking solved. 3. **No workspace. Every module is standalone and consumes published dependencies.** Chosen. ## Decision There is no workspace. Each module is an independent package that declares its dependencies and consumes them from the private registry, including the mesh's own shared library. A cross-package change is therefore two steps: publish the producer, then consume it. The pipeline does the first on push and resolves the levels so that a module always builds against its dependencies' freshly published versions. ## Consequences - Development and the pipeline resolve imports identically. The divergence is gone by construction rather than by discipline. - A module in its own repository is not a special case. It builds exactly as a module in the monorepo does — which is what makes [ADR 0015](0015-applications-live-in-their-own-repository.md) cheap. - A cross-package change costs a publish-and-consume round trip. This is the real price, paid on every shared-library change. - There is no repository-wide install and no repository-wide build. Anything that assumed one broke, and one thing that assumed one has stayed broken: the end-to-end pipeline harness has not built since this decision landed. See [`04-ISSUES/005`](../04-ISSUES/005-pipeline-test-harness-unbuildable/00-report.md). ## References - `fix(noxflow): kill npm workspace, restore encryption inside PgAdminRepo` (#240), 2026-06-04. The reason is recorded in the root package manifest, which still carries the note explaining why no workspace exists. - The divergence it fixed is named there: workspace members importing each other resolved to local unbuilt source in the pipeline.