Something answered on this machine is still bound

A binding was skipped when the provider turned out to be on the same node,
reasoning that a file saying "it is on this node" is a fact nobody needs. That
is right about the location and wrong about everything beside it: a binding
also carries what the provider said a consumer must know, which is the port,
and a consumer cannot invent that.

A build machine sharing a node with the registry it pushes to sat in a loop
saying it could not read its own binding. Nothing was wrong with the machine,
the module, the credential or the provision — the file was never written, and
the absence looked exactly like a mistake in the module.

The original intent is kept where it was right: a provision whose provider said
nothing a consumer must know is still not written. A shell is answered here and
there is nothing to say about it. A registry is answered here and the port is
still unguessable.

The address is this machine's name on the private network, or loopback when it
has none — a machine off the network still reaches itself, and a name nothing
resolves is worse than an address that always works.
This commit is contained in:
2026-08-31 01:35:23 +02:00
parent a5b11fd6b2
commit 8b2d1bce9d
3 changed files with 111 additions and 5 deletions
+5 -1
View File
@@ -74,6 +74,10 @@ type Held struct {
type Resolution struct {
// Node is which machine this was resolved for, so a generator can be asked about it.
Node string
// At is this machine's own name on the private network, empty if it is not on one. Kept
// because a consumer bound to something answered on this same machine still has to be told
// where it is — the answer being local does not make the port guessable.
At string
// Modules in the order they were resolved: assigned first, then what they pulled in.
Modules []Manifest
@@ -320,7 +324,7 @@ func Resolve(catalogue map[string]Manifest, assigned []string, node Node, world
}
}
resolution := Resolution{Node: node.Name, Because: because, Needs: needs}
resolution := Resolution{Node: node.Name, At: node.At, Because: because, Needs: needs}
for _, n := range order {
resolution.Modules = append(resolution.Modules, catalogue[n])
}