From 531d2cb55d9101b13ac422b0c6eeeb273c388c87 Mon Sep 17 00:00:00 2001 From: Fredrik Ahlgren Date: Sun, 9 Aug 2026 17:51:41 +0200 Subject: [PATCH 1/2] fix(identity): ask the route question against a name that still answers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ResolveStableSoftwareInterface asks the kernel which interface would carry the uplink, and anchors the software identity on that interface's permanent MAC. The question was asked against uplink.home.sourceful.energy — Home Link, retired in August 2026, DNS record and all — so every resolution now dies at the lookup, before a route is ever read. The name moves to relay.ftw.energy, which the box dials anyway. The MAC is the identity; the host never was, so the same box derives the same identity over the live name. Co-Authored-By: Claude Fable 5 --- go/internal/gatewayidentity/stableid.go | 9 ++++++++- go/internal/gatewayidentity/stableid_test.go | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/go/internal/gatewayidentity/stableid.go b/go/internal/gatewayidentity/stableid.go index f0511284..f1bc32d5 100644 --- a/go/internal/gatewayidentity/stableid.go +++ b/go/internal/gatewayidentity/stableid.go @@ -10,7 +10,14 @@ import ( ) const ( - SoftwareIdentityUplinkHost = "uplink.home.sourceful.energy" + // The host is only a question to the kernel — "which interface would + // carry my uplink?" — so it must be a name the box actually dials. + // It was uplink.home.sourceful.energy until Home Link was retired + // (Aug 2026) and its DNS record with it; a dead name here made every + // identity resolution fail on the lookup, before any route was read. + // The MAC of the answering interface is the identity; the host never + // is, so this change re-derives the same identity over a live name. + SoftwareIdentityUplinkHost = "relay.ftw.energy" SoftwareIdentityUplinkPort = 443 ) diff --git a/go/internal/gatewayidentity/stableid_test.go b/go/internal/gatewayidentity/stableid_test.go index 767e580a..5e12853e 100644 --- a/go/internal/gatewayidentity/stableid_test.go +++ b/go/internal/gatewayidentity/stableid_test.go @@ -56,7 +56,7 @@ func mustMAC(raw string) net.HardwareAddr { } func TestStableInterfaceUsesKernelResolvedOutputForEveryAddress(t *testing.T) { - if SoftwareIdentityUplinkHost != "uplink.home.sourceful.energy" { + if SoftwareIdentityUplinkHost != "relay.ftw.energy" { t.Fatalf("software identity uplink = %q", SoftwareIdentityUplinkHost) } authority := &fakeRouteAuthority{ From 40a1d8172e59ee972ade5fb12c0b0e0bc25b127e Mon Sep 17 00:00:00 2001 From: Fredrik Ahlgren Date: Sun, 9 Aug 2026 17:58:57 +0200 Subject: [PATCH 2/2] chore: changeset for the stable-id fix Co-Authored-By: Claude Fable 5 --- .changeset/stable-id-follows-the-relay.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/stable-id-follows-the-relay.md diff --git a/.changeset/stable-id-follows-the-relay.md b/.changeset/stable-id-follows-the-relay.md new file mode 100644 index 00000000..5a68d6d4 --- /dev/null +++ b/.changeset/stable-id-follows-the-relay.md @@ -0,0 +1,5 @@ +--- +"ftw": patch +--- + +The stable software identity resolves again. It is anchored on the permanent MAC of whichever interface carries the box's uplink, and the question was asked against `uplink.home.sourceful.energy` — Home Link, retired in August 2026, DNS record and all — so every resolution died at the lookup before a route was ever read. The question now goes to `relay.ftw.energy`, which the box dials anyway. The MAC is the identity and the host never was, so the same box derives the same identity over the live name.