The web front (route-proxy) had no mesh tools, so "does grafana.novox.be work" needed curl from a machine (the operator, 2026-10-30: "isn't their status known on the bus?"). It now keeps, on change and never on a timer, the states routes (each served name: its targets, its certificate with expiry and renewal, the last upstream answer) and unrouted (names refused as "no route", only under served domains, at most 5 new a minute, other refusals counted in ._other; no visitor address), and route-provider serves route_proxy_routes, route_proxy_route and route_proxy_unrouted, each one call. A refused write to unrouted is dropped, never retried. route-proxy lives in mesh-controller's repository until the controller's removal moves it. Issue 774.
Reviewed-by: rev-sweep@shanks at b7c3868980
The lead merges once mesh/check is green.
The web front (route-proxy) had no mesh tools, so "does grafana.novox.be work" needed curl from a machine (the operator, 2026-10-30: "isn't their status known on the bus?"). It now keeps, on change and never on a timer, the states routes (each served name: its targets, its certificate with expiry and renewal, the last upstream answer) and unrouted (names refused as "no route", only under served domains, at most 5 new a minute, other refusals counted in <node>._other; no visitor address), and route-provider serves route_proxy_routes, route_proxy_route and route_proxy_unrouted, each one call. A refused write to unrouted is dropped, never retried. route-proxy lives in mesh-controller's repository until the controller's removal moves it. Issue 774.
Reviewed-by: rev-sweep@shanks at b7c3868980f391b6f76eefd830948058b8cb496b
The lead merges once mesh/check is green.
The web front kept nothing on the bus: whether grafana or drive was routed, where to, with which
certificate, and what it last answered could only be learned with curl or the container's log.
The proxy now keeps `routes` and `unrouted` (announced readable, keyed <node>.<name>), written on
change by one writer: route set changes, certificates stored by autocert's cache or failing at a
handshake, upstream answers that differ from the last written (or are a minute old), and names
refused in a request or a handshake. The provider helper's bundle serves route_proxy_routes,
route_proxy_route and route_proxy_unrouted from those states.
Quick: log the routes at start and grep the journal. Thorough: the state on the bus and the tools
that read it, mesh-wide, in one call. Chose thorough: the operator's question is mesh-wide and
recurs, and the log says nothing about certificates or answers.
Tests: two table tests added (the ledger, the tools), both failing without the change; four
authority tests and four skipped-route tests merged into two, so the module has four fewer.
Review of ddae6729: a scanner's random Host or SNI names each became a key, bounded only by the
bucket's lifetime and size, and every failed write was retried at each change and logged each time.
A refused name is now kept by name only under the registrable domain of a name the proxy serves, and
at most five new names a minute; every other refusal is counted in memory and written once a minute
under <node>._other (last minute, since start), which route_proxy_unrouted shows. A refused write of
that state is dropped and logged once until a write succeeds; trimming memory to 4096 names moved
from the request to the writer. The visitor's address is no longer kept: the journal has it.
Quick: drop unrouted keys from strangers by a fixed allow-list. Thorough: bound by the proxy's own
domains, by rate, and by never retrying. Chose thorough: the scan is constant on a public machine.
Deliverynovox/mesh-controller@b7c3868980f3 — merged since 2026-10-30T22:11:55Z
Source — source.main moved to novox/mesh-controller@159db37618. Whether it reached the machines is mesh-delivery-view's, derived from source.main, the wants and the haves.
Transitions
2026-10-30 22:04 (new) → proposed (announced): novox/mesh-controller#485's head announced
2026-10-30 22:04 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-30 22:11 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@b7c3868980f3` — **merged** since 2026-10-30T22:11:55Z
**Source** — source.main moved to novox/mesh-controller@159db37618c2. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves.
**Transitions**
- 2026-10-30 22:04 (new) → proposed (announced): novox/mesh-controller#485's head announced
- 2026-10-30 22:04 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-30 22:11 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.
The web front (route-proxy) had no mesh tools, so "does grafana.novox.be work" needed curl from a machine (the operator, 2026-10-30: "isn't their status known on the bus?"). It now keeps, on change and never on a timer, the states routes (each served name: its targets, its certificate with expiry and renewal, the last upstream answer) and unrouted (names refused as "no route", only under served domains, at most 5 new a minute, other refusals counted in ._other; no visitor address), and route-provider serves route_proxy_routes, route_proxy_route and route_proxy_unrouted, each one call. A refused write to unrouted is dropped, never retried. route-proxy lives in mesh-controller's repository until the controller's removal moves it. Issue 774.
Reviewed-by: rev-sweep@shanks at
b7c3868980The lead merges once mesh/check is green.
Delivery
novox/mesh-controller@b7c3868980f3— merged since 2026-10-30T22:11:55ZSource — source.main moved to novox/mesh-controller@159db37618. Whether it reached the machines is
mesh-delivery-view's, derived fromsource.main, the wants and the haves.Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition of this change up to its merge:git log --notes=mesh-plan.