ADRs 0087 and 0088; issues 031, 035 and 054 resolved; designs 05, 07 and 18 amended

A seeded file is created once (0087); the foundation filters before anything
listens (0088); a machine becomes the last thing it was told (design 05).
Each says how it is checked.
This commit is contained in:
2026-09-21 12:11:50 +02:00
parent a211aecdfa
commit ee67f69ef4
9 changed files with 166 additions and 12 deletions
+15 -2
View File
@@ -2,7 +2,7 @@
layer: to-be
status: in-progress
code: [mesh-host]
updated: 2026-08-31
updated: 2026-09-21
decisions:
- 02-DECISIONS/0019-how-this-repository-works.md
- 02-DECISIONS/0004-a-node-and-how-it-joins.md
@@ -367,4 +367,17 @@ of the reason to manage a machine.
silently incomplete.
**A partial host does archives and refuses users**: an archive needs a filesystem and a way to
fetch; a user needs a user database the host is allowed to write.
fetch; a user needs a user database the host is allowed to write.
## A machine becomes the last thing it was told
Every declaration is complete, so applying an old one is never wrong, only wasted — and under a
flurry of pushes a machine spent minutes becoming things the mesh had moved past
([issue 031](../../04-ISSUES/031-a-machine-becomes-each-thing-it-was-told-in-turn/00-report.md)).
So the host looks at what is already waiting before it applies anything: it holds a small window
of unacknowledged declarations, applies the newest, and sets the rest aside — each **reported as
superseded**, naming the one applied instead, because silence would read as a machine that
ignored an instruction and "applied" would be a lie. Applying stays one at a time; only seeing
is not. **Checked** by the link's unit tests on the drain, and by the genesis bed's settle wait,
which counts on a node catching up to the newest declaration rather than the oldest.
+11
View File
@@ -13,6 +13,7 @@ code:
- mesh-lab test/integration/mesh.test.ts (a bare machine becomes a mesh)
updated: 2026-09-21
decisions:
- 02-DECISIONS/0088-the-foundation-filters-before-anything-listens.md
- 02-DECISIONS/0004-a-node-and-how-it-joins.md
- 02-DECISIONS/0078-the-store-and-broker-are-modules.md
- 02-DECISIONS/0079-the-foundation-seats-are-named-after-their-servers.md
@@ -157,6 +158,16 @@ a real machine with a network; the sealed case is the lab, and the lab places im
Reproducibility comes from pinning the identity of a thing rather than carrying its bytes, which
is what keeps the bundle small enough for a person to read and check.
## Filtered from its first resource
The bundle installs the packet filter and loads a base ruleset before the store and broker come
up ([ADR 0088](../../02-DECISIONS/0088-the-foundation-filters-before-anything-listens.md)): drop by
default, keep loopback, replies, ping, ssh, the bus and the registry, and the container runtime's
networks through the forward chain. It is written into the same table the filter module derives,
so that module replaces it wholesale once it can. **Checked** by the installer's bundle test
(order and rules) and by the genesis bed, which probes the machine from outside for the length of
the install: the store's port never answers, the bus's does.
## Raising it
The order, from [research 011](../../01-RESEARCH/011-the-module-graph/worked-provider.md):
+6 -1
View File
@@ -5,8 +5,9 @@ code:
- mesh-controller cmd/mesh-builder
- mesh-controller internal/builder
- mesh-catalog modules/builder
updated: 2026-09-15
updated: 2026-09-21
decisions:
- 02-DECISIONS/0087-a-seeded-file-is-created-once.md
- 02-DECISIONS/0040-what-a-module-is.md
- 02-DECISIONS/0039-what-the-sdk-holds-and-refuses.md
- 02-DECISIONS/0069-a-module-is-a-repository-and-a-path.md
@@ -206,6 +207,10 @@ disagrees with it.
| `service` | an **existing** unit put into a state | for software shipping its own unit |
| `action` | a command to run | ❌ **refused** — [ADR 0005](../../02-DECISIONS/0005-the-node-host.md) |
A `file` may also say `create-once`: written when absent, left alone when present, reported as
kept — a seed a program then owns ([ADR 0087](../../02-DECISIONS/0087-a-seeded-file-is-created-once.md)).
Checked by the host's apply tests and by the vault bed, which grows into one and pushes again.
**The two at the bottom are the interesting rows.** `action` is refused outright: the link may not
carry a command, so a module needing something done ships a program that reconciles — which is what
a run-once `process` is. `service` installs no unit by design, which is right for software that