Files

48 lines
2.1 KiB
Markdown

---
status: open
opened: 2026-09-22
located-in: []
fixed-by:
amended-design:
---
# 089 — A contributed route names a port the node may have moved
## What was observed
Found in review of the fix for
[issue 085](../085-the-packages-port-given-at-genesis-is-not-a-setting/00-report.md), 2026-09-22,
by reading the controller.
A module that wants to be reachable by name contributes a route: the name, and the port on the
machine that answers it. The proxy that serves the route runs on the machine's own network, so it
dials that port directly.
A module's ports can be moved on one node, either because the mesh assigned a different machine
port or because the node was given one as a setting
([ADR 0100](../../02-DECISIONS/0100-a-node-in-use-is-adopted-before-it-is-converged.md)). Every
other reader follows the move: the container's mapping, the filter, the opening, what the module
says it serves, and the address consumers are told. **The contribution does not.** Contributions
are settled without the node's port settings, deliberately — the settling step skips the ports key
so that a port setting never leaks into a rendered configuration file.
So on a node where the port moved, the filter opens the port the module actually listens on, and
the proxy sends the name's traffic to the port it used to listen on. The module is up, the firewall
is right, and the name is dead.
## Why it matters beyond this instance
Every module that contributes a route and has a movable port has this hole, and the mesh is
otherwise consistent about following a moved port. It appears exactly where the migration needs it
least: on a node adopted beside a predecessor, where a foundation or application port was moved
precisely because the predecessor holds the usual one.
## Open questions
- Should a contribution name a port at all, or only the module, with the port resolved from what
that module serves on that node?
- If a contribution keeps a port, should settling apply the node's port mapping to it, while still
keeping the mapping out of rendered configuration?
- What should refuse a declaration whose contributed route names a port nothing on that node
listens on?