Skip to content

I4013 — A server bound to every interface advertises the addresses it has now

A server bound to 0.0.0.0 reads its interface addresses again before every beacon it signs (Beacon::follow), so that its advertisement follows a DHCP move instead of naming the address it held when it started.

BLOCKED wave 0 · p1 · implementation profile · parallel safe

Part of mesh-connectivity — Trusted nodes connect across NAT through proven transports, and every surface says which path.

Blocked. This issue cannot start until milestone:mesh-connectivity is done. The status is derived from that, not declared.

Objective

A server bound to 0.0.0.0 reads its interface addresses again before every beacon it signs (Beacon::follow), so that its advertisement follows a DHCP move instead of naming the address it held when it started.

Why

On 2026-10-23 the hub of the owner's MacBook-2 advertised 192.168.100.96:8791 after DHCP had moved the machine to .100, and it had not advertised its tailnet address at all. No other machine could dial it until it was restarted by hand; after the restart it advertised .100 and the tailnet address.

Current state

shared.rs derives the advertised endpoints once, at activation; Beacon keeps them for its lifetime.

Desired state

A beacon built for a server bound to every interface reads advertised_endpoints again before each envelope; an empty reading keeps the last endpoints; a specific bind or a hosted hub's --advertise URL stays fixed.

Scope

  • apps/majordomus-cli/src/mesh/provider.rs
  • apps/majordomus-cli/src/mesh/manager.rs
  • apps/majordomus-cli/src/shared.rs
  • .ai/repo/project/issues/I4013.yaml

Dependencies

None. This issue is a root of the graph.

Acceptance criteria

  • A followed beacon signs the endpoints its source answers now
  • An empty answer keeps the last endpoints
  • Only a server bound to the unspecified address follows its interfaces

Validation

  • cargo test --doc mesh::provider
  • cargo test --lib shared::

Evidence required

  • only_a_server_bound_to_every_interface_follows_them

Evidence

None recorded. Every token above needs a command or an artifact behind it before this issue can be completed; narrative is refused.

Timeline

started
—
verified
—
completed
—

Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.

Canonical record: .ai/repo/project/issues/I4013.yaml. Read it back with majordomus plan show I4013.

Searches the titles and descriptions of every page this site publishes.