F-host 2, ENG-5: on a fresh mesh the bootstrap pushes the holders' own images to the store on its loopback with no credential, and names them under the seat's reach (lead's design limit, review of issue 1966)

The store's front is distribution's program, a bundle the mesh builds, so nothing serves it before the builder: the
bootstrap's /v2/ wait and its pushes now go to the loopback port the store's manifest publishes, as the publish contract
allows on the store's own node. The one-off credential and its file go: the runtime could not carry it on a push, and no
push needs it. The tags list is asked for the repository being published, not always the control plane's.

Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
This commit is contained in:
2026-11-04 16:29:56 +01:00
parent ded92a8137
commit d3ee49d6f3
7 changed files with 102 additions and 200 deletions
+4 -23
View File
@@ -157,11 +157,6 @@ type Options struct {
// an address the others can reach.
Registry string
// PushCredentialFile is where the bootstrap writes its one-off push credential for the store's holder to find, the
// holder's state file `bootstrap-push` on the node that holds it (design 51 *The move*, issue 1966 ENG-5); empty writes
// none. The file goes to the account that owns that directory in the holder's manifest, once the node-engine made both.
PushCredentialFile string
// Host is the `mesh-host` binary on this machine — the program that enrols and then holds the
// machine to what the mesh says. The installer runs it; it does not contain it.
Host string
@@ -301,12 +296,10 @@ type Result struct {
Agent string `json:"host-agent,omitempty"`
// Registry is the mesh's own artifact store, once it answers.
Registry string `json:"registry,omitempty"`
// PushCredentialFile is where this run left its one-off push credential (never the credential itself).
PushCredentialFile string `json:"push-credential-file,omitempty"`
RegistryReplied int `json:"registry-replied,omitempty"`
RegistryKnown bool `json:"registry-already-registered,omitempty"`
RegistryRunning string `json:"registry-container,omitempty"`
Registry string `json:"registry,omitempty"`
RegistryReplied int `json:"registry-replied,omitempty"`
RegistryKnown bool `json:"registry-already-registered,omitempty"`
RegistryRunning string `json:"registry-container,omitempty"`
// RegistryTrusted are the names the runtime was told to trust the registry by, before the push.
RegistryTrusted []string `json:"registry-trusted,omitempty"`
PublishedAs string `json:"control-plane-image,omitempty"`
@@ -822,18 +815,6 @@ func RegistryAndPublish(ctx context.Context, o Options, d Deps, sys system.Syste
if err != nil {
return Published{}, failed(StepRegistry, err)
}
// The one-off credential the holders' first images are pushed to the store's front with, written for its holder to find
// and forgotten when this run ends; the holder discards the file once it answers its first publish (ENG-5).
if o.PushCredentialFile != "" {
cred, err := WritePushCredential(o.Catalogue, o.PushCredentialFile)
if err != nil {
return Published{}, failed(StepRegistry, err)
}
defer cred.Forget()
result.PushCredentialFile = cred.File
say(" a one-off credential for the holders' first images is at " + cred.File + "; the store's holder discards it once it serves publish")
}
// ---- 8. publish -----------------------------------------------------------------------
say("publish — the control plane's image gets its first manifest digest")
// **The image this mesh built, not the one the installer carried.** The carried one is the