ADR 0045 — what a module is #14

Closed
jschoubben wants to merge 0 commits from design/adr-0045-what-a-module-is into main
Owner

Records the module definition we worked out, and the naming rule at the end.

A module is one self-contained piece of software the mesh installs and manages. The software is its identity; capabilities, seats and provisioned resources are the relationships between modules, not what a module is — which is what binds it into one thing.

  • Three relationships: shared seat (shells coexist, one default), exclusive seat (i3/sway contend for the display), provide/require (the provider ships the provisioner; symmetric).
  • Interfaces are mesh-owned, providers adapt — a consumer depends on the interface, never a provider.
  • The naming rule — the interface is drawn at the consumer's real coupling: neutral where the coupling is thin (analytics, providers adapt); the protocol where the consumer speaks one (postgres-database/mssql-database/mongodb-database, swappable only among protocol-compatible engines, never across); never false genericity. "database" is not a capability — the protocol is. This generalises ADR 0027.
  • Not a module: libraries and control-plane contexts. A swappable machine mechanism (firewall) is a module; the host hardcodes nothing and runs where ufw/systemd/pacman/Docker don't exist (Android).

Supersedes ADR 0017 (domain grouping), refines ADR 0002.

https://claude.ai/code/session_01LrgweAeERJYBg88c5cKDzF

Records the module definition we worked out, and the naming rule at the end. **A module is one self-contained piece of software the mesh installs and manages.** The software is its identity; capabilities, seats and provisioned resources are the *relationships between modules*, not what a module is — which is what binds it into one thing. - **Three relationships:** shared seat (shells coexist, one default), exclusive seat (i3/sway contend for the display), provide/require (the provider ships the provisioner; symmetric). - **Interfaces are mesh-owned, providers adapt** — a consumer depends on the interface, never a provider. - **The naming rule — the interface is drawn at the consumer's real coupling:** neutral where the coupling is thin (`analytics`, providers adapt); the **protocol** where the consumer speaks one (`postgres-database`/`mssql-database`/`mongodb-database`, swappable only among protocol-compatible engines, never across); never false genericity. "database" is not a capability — the protocol is. This generalises ADR 0027. - **Not a module:** libraries and control-plane contexts. A swappable machine mechanism (firewall) *is* a module; the host hardcodes nothing and runs where ufw/systemd/pacman/Docker don't exist (Android). Supersedes ADR 0017 (domain grouping), refines ADR 0002. https://claude.ai/code/session_01LrgweAeERJYBg88c5cKDzF
jschoubben added 1 commit 2026-09-03 20:51:05 +00:00
A module is one self-contained piece of software the mesh installs and
manages; the software is its identity, and capabilities/seats/provisions
are the relationships between modules, not what a module is. Records the
three relationships (shared seat, exclusive seat, provide/require), that
interfaces are mesh-owned and providers adapt to them, and the naming
rule: draw the interface at the consumer's real coupling — neutral where
the coupling is thin (analytics), protocol-scoped where the consumer
speaks a protocol (postgres/mssql/mongodb), never false genericity.

Supersedes 0017 (domain grouping — wrong axis), refines 0002, generalises
0027's protocol-not-product rule.

Claude-Session: https://claude.ai/code/session_01LrgweAeERJYBg88c5cKDzF
jschoubben closed this pull request 2026-09-05 01:17:23 +00:00

Pull request closed

This pull request cannot be reopened because the branch was deleted.
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/hq#14