papa-hq reads 01 research -> 03 decision -> 02 design. The order is a scar, not a choice: 02-DESIGN existed from its initial commit, and when adr/ was finally promoted on 2026-07-13 it took the next free number rather than its place in the sequence. By then design was too settled to renumber. hal-hq was three commits old, so it is not. adr/ becomes 02-DECISIONS and 02-DESIGN becomes 03-DESIGN, and following the folder numbers now walks the process in the order it happens: research produces a decision, the decision authorises a design. 00-GENESIS becomes 00-META, matching papa's rename from the same restructure. Every path reference rewritten across documents, frontmatter, playbooks and skills. All links resolve; all 58 frontmatter blocks parse and their path fields still point at files that exist.
66 lines
3.1 KiB
Markdown
66 lines
3.1 KiB
Markdown
---
|
|
status: accepted
|
|
date: 2026-06-04
|
|
deciders: jochen
|
|
reconstructed: true
|
|
---
|
|
|
|
# 7. 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 0010](0010-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.
|