Issue 774 (L3 of design 47), research 072 row 34: route-proxy served from the provisioner's plans.
The fault (2026-10-31 12:32-12:36, rolled back): route-proxy 27928972 dialled each route at the software's own port, e.g. git.novox.be at 127.0.0.1:3000 instead of 127.0.0.1:20000, and public sites answered 502. A route contribution carried the endpoint's software port; until now the controller turned it into the machine's port when it wrote the routes file.
The fix: mesh-sdk's one composition of a contribution gives port the machine port the declaration publishes (machinePort: a port given in settings, then the placement's assigned port, then the software's own number when none is assigned), the same number ${port:N} gives the module (ADR 0038). The only refusal left, in planning, is a port the module does not listen on. The provisioner is pinned to it; route-proxy is pinned to it, its dial code unchanged (loopback on its own machine, the module's machine name otherwise).
Checked against the live routes: all 82 dial targets of the 79 routes the old version serves come out at the same port (gitea, grafana, influxdb's bare 8086, mailu's fixed 7080:80, photos' fixed mappings, home-assistant on the host network among them). Seven novox modules move from novox.internal to 127.0.0.1 at the same port; their ports listen on 0.0.0.0 and :: (read 13:28).
Quick fix vs thorough fix: the thorough fix was chosen: the port is filled in the one composition every reader shares, not translated again in route-proxy.
Delivery group: mesh-sdk bb01a656, mesh-catalog 841fd26a, mesh-controller 0e9c4c82 (hand pins on mesh-sdk bb01a656, one last time; issue 1585). After the merge route-proxy stays held on ace and novox and is released ace first, comparing every route's target with the old version before novox.
Tests: table rows for an assigned port, a port given in settings, a bare published port with no assignment, a fixed mapping, a port the module does not listen on, and a module on the proxy's machine and on another; seen failing without the fix. gofmt, go vet (with and without -tags integration) and go test pass in mesh-sdk/go, route-proxy, route-proxy/contract and mesh-provisioner. Route-proxy's test count is unchanged.
Research "The controller, NATS-native": no piece moves; route-proxy only.
Issue 774 (L3 of design 47), research 072 row 34: route-proxy served from the provisioner's plans.
**The fault (2026-10-31 12:32-12:36, rolled back):** route-proxy 27928972 dialled each route at the software's own port, e.g. git.novox.be at 127.0.0.1:3000 instead of 127.0.0.1:20000, and public sites answered 502. A route contribution carried the endpoint's software port; until now the controller turned it into the machine's port when it wrote the routes file.
**The fix:** mesh-sdk's one composition of a contribution gives `port` the machine port the declaration publishes (`machinePort`: a port given in settings, then the placement's assigned port, then the software's own number when none is assigned), the same number `${port:N}` gives the module (ADR 0038). The only refusal left, in planning, is a port the module does not listen on. The provisioner is pinned to it; route-proxy is pinned to it, its dial code unchanged (loopback on its own machine, the module's machine name otherwise).
**Checked against the live routes:** all 82 dial targets of the 79 routes the old version serves come out at the same port (gitea, grafana, influxdb's bare 8086, mailu's fixed 7080:80, photos' fixed mappings, home-assistant on the host network among them). Seven novox modules move from novox.internal to 127.0.0.1 at the same port; their ports listen on 0.0.0.0 and :: (read 13:28).
**Quick fix vs thorough fix:** the thorough fix was chosen: the port is filled in the one composition every reader shares, not translated again in route-proxy.
**Delivery group:** mesh-sdk bb01a656, mesh-catalog 841fd26a, mesh-controller 0e9c4c82 (hand pins on mesh-sdk bb01a656, one last time; issue 1585). After the merge route-proxy stays held on ace and novox and is released ace first, comparing every route's target with the old version before novox.
**Tests:** table rows for an assigned port, a port given in settings, a bare published port with no assignment, a fixed mapping, a port the module does not listen on, and a module on the proxy's machine and on another; seen failing without the fix. gofmt, go vet (with and without -tags integration) and go test pass in mesh-sdk/go, route-proxy, route-proxy/contract and mesh-provisioner. Route-proxy's test count is unchanged.
Research "The controller, NATS-native": no piece moves; route-proxy only.
Reviewed-by: rev-routeports@shanks at 0e9c4c8299cceaaa2b9ec28670605e4a81cd75b0
route-proxy from plans dialled every route at the software's own port: gitea at 127.0.0.1:3000
(published at 20000) and grafana on ace at 3000 (published at 20012), and public sites answered
502. The proxy already reaches a module beside it over loopback and one elsewhere at the plan's
address; the plan now carries the assigned port, and a test composes the plan with the SDK and
reads it as the proxy does, so the two cannot drift again.
The controller, NATS-native: no piece moves; route-proxy only.
mesh/check failed: integration: mesh-vault/cmd/mesh-vault.TestTheVaultWholeMintsOnTheBusWhoeverHoldsTheLease: never: the account minted under the cont…
The table covers gitea and grafana moved by the placement, influxdb's bare port, mailu's and
photos' fixed mappings and home-assistant on the host's network; it replaces the loopback test it
subsumes, so route-proxy's test count does not grow.
The controller, NATS-native: no piece moves; route-proxy only.
Deliverynovox/mesh-controller@0e9c4c8299cc — merged since 2026-10-31T12:56:56Z
Source — source.main moved to novox/mesh-controller@dc90b3f5bd. Whether it reached the machines is mesh-delivery-view's, derived from source.main, the wants and the haves.
composed together: fail — the checker's verdict at the members' heads (54971344f15e): integration: mesh-vault/cmd/mesh-vault.TestTheVaultWholeMintsOnTheBusWhoeverHoldsTheLease
Transitions
2026-10-31 12:28 (new) → proposed (announced): novox/mesh-controller#488's head announced
2026-10-31 12:28 proposed → ready (accepted): a verdict names this commit and the trunk's head as its trunk commit, the gate passed or warned, and the repository's own check did not fail; or the check gates no merge (check-gates-merge false)
2026-10-31 12:56 ready → merged (merged): on the trunk its modules follow: merged there
The commit's note under refs/notes/mesh-plan keeps every transition of this change up to its merge: git log --notes=mesh-plan.
<!-- mesh-delivery:view -->
**Delivery** `novox/mesh-controller@0e9c4c8299cc` — **merged** since 2026-10-31T12:56:56Z
**Source** — source.main moved to novox/mesh-controller@dc90b3f5bd13. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves.
**Group** `fix/route-ports`: novox/mesh-catalog@841fd26a2a09, novox/mesh-controller@0e9c4c8299cc, novox/mesh-sdk@bb01a656d024
- composed together: fail — the checker's verdict at the members' heads (54971344f15e): integration: mesh-vault/cmd/mesh-vault.TestTheVaultWholeMintsOnTheBusWhoeverHoldsTheLease
**Transitions**
- 2026-10-31 12:28 (new) → proposed (announced): novox/mesh-controller#488's head announced
- 2026-10-31 12:28 proposed → ready (accepted): a verdict names this commit and the trunk's head as its trunk commit, the gate passed or warned, and the repository's own check did not fail; or the check gates no merge (check-gates-merge false)
- 2026-10-31 12:56 ready → merged (merged): on the trunk its modules follow: merged there
The commit's note under `refs/notes/mesh-plan` keeps every transition of this change up to its merge: `git log --notes=mesh-plan`.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Issue 774 (L3 of design 47), research 072 row 34: route-proxy served from the provisioner's plans.
The fault (2026-10-31 12:32-12:36, rolled back): route-proxy 27928972 dialled each route at the software's own port, e.g. git.novox.be at 127.0.0.1:3000 instead of 127.0.0.1:20000, and public sites answered 502. A route contribution carried the endpoint's software port; until now the controller turned it into the machine's port when it wrote the routes file.
The fix: mesh-sdk's one composition of a contribution gives
portthe machine port the declaration publishes (machinePort: a port given in settings, then the placement's assigned port, then the software's own number when none is assigned), the same number${port:N}gives the module (ADR 0038). The only refusal left, in planning, is a port the module does not listen on. The provisioner is pinned to it; route-proxy is pinned to it, its dial code unchanged (loopback on its own machine, the module's machine name otherwise).Checked against the live routes: all 82 dial targets of the 79 routes the old version serves come out at the same port (gitea, grafana, influxdb's bare 8086, mailu's fixed 7080:80, photos' fixed mappings, home-assistant on the host network among them). Seven novox modules move from novox.internal to 127.0.0.1 at the same port; their ports listen on 0.0.0.0 and :: (read 13:28).
Quick fix vs thorough fix: the thorough fix was chosen: the port is filled in the one composition every reader shares, not translated again in route-proxy.
Delivery group: mesh-sdk bb01a656, mesh-catalog 841fd26a, mesh-controller
0e9c4c82(hand pins on mesh-sdk bb01a656, one last time; issue 1585). After the merge route-proxy stays held on ace and novox and is released ace first, comparing every route's target with the old version before novox.Tests: table rows for an assigned port, a port given in settings, a bare published port with no assignment, a fixed mapping, a port the module does not listen on, and a module on the proxy's machine and on another; seen failing without the fix. gofmt, go vet (with and without -tags integration) and go test pass in mesh-sdk/go, route-proxy, route-proxy/contract and mesh-provisioner. Route-proxy's test count is unchanged.
Research "The controller, NATS-native": no piece moves; route-proxy only.
Reviewed-by: rev-routeports@shanks at
0e9c4c8299Delivery
novox/mesh-controller@0e9c4c8299cc— merged since 2026-10-31T12:56:56ZSource — source.main moved to novox/mesh-controller@dc90b3f5bd. Whether it reached the machines is
mesh-delivery-view's, derived fromsource.main, the wants and the haves.Group
fix/route-ports: novox/mesh-catalog@841fd26a2a, novox/mesh-controller@0e9c4c8299, novox/mesh-sdk@bb01a656d0Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition of this change up to its merge:git log --notes=mesh-plan.