R3-3: the node's own composer has no path without an entry call; its tests compose from the catalog half

Builds: design 47 G §628, §421, A-312, A-317

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
This commit is contained in:
2026-11-12 23:33:31 +01:00
parent 321a0744d8
commit 650910dc9e
6 changed files with 117 additions and 171 deletions
+10 -10
View File
@@ -134,7 +134,7 @@ type Env struct {
SeatListChanged <-chan struct{}
// Entry asks the seat mesh-catalog's verb `entry` of a fingerprint (meshcatalogclient.EntryVerb), in the engine's own name.
// Set, the composer reads the catalog half by the fingerprints its wants and the runnings it heard name and nothing else of
// the indexer's or the builder's states (design 47 G §421, §628); nil reads the indexer's states, as the shadow does.
// the indexer's or the builder's states (design 47 G §421, §628); a composer is made with it.
Entry meshcatalogclient.Call
}
@@ -187,7 +187,7 @@ type Composer struct {
notTaken map[string]string
// unmadeSaid is, by module, the stable part of the reason its last journal line said (without where the picture stands).
unmadeSaid map[string]string
// entries is the cache of entries asked by fingerprint, nil where the composer reads the indexer's states; keptEnt the entries
// entries is the cache of entries asked by fingerprint; keptEnt the entries
// held from the composition state or an answer, keptWantVal the wants it keeps there and keptWants the modules whose want
// stands from that state alone until the live read of the wants answers (entries.go). Under mu; keptWrite orders the writes.
entries *meshcatalogclient.Entries
@@ -303,7 +303,7 @@ type Pass struct {
// composed at (frombus.Scope.Holds), for LastHeld's words.
holds map[string]compose.Hold
// Unmade is each module wanted that the pass composed no composition of at its want's fp, with why: the want not
// taken, the module not assigned here, no manifest in the composer's picture of the indexer's modules (and where that
// taken, the module not assigned here, no entry of its build in the composer's picture of the catalog half (and where that
// picture stands), or what the composition left it out for. A module held alone is in Held, not here. Said once per
// change as a journal line, so a want that waits for the composer says what for.
Unmade map[string]string `json:"unmade,omitempty"`
@@ -1557,7 +1557,7 @@ func (r reader) Manifest(ctx context.Context, digest string) ([]byte, error) {
if ok {
return raw, nil
}
if r.c.byEntries() && !r.c.forCandidates {
if !r.c.forCandidates {
return nil, fmt.Errorf("the catalog half's entries hold no manifest %s", digest)
}
key, err := meshcatalogclient.ManifestsKey(digest)
@@ -2195,7 +2195,7 @@ func (c *Composer) unmadeOf(fps map[string]string, comps map[string]engcomp.Comp
continue
}
if made[module] == fp {
// Composed, but from the indexer's manifest and not a build: said, since what it names no artifacts of is no module
// Composed, but from the entry's manifest and not a build: said, since what it names no artifacts of is no module
// that runs.
if w, ok := fromManifest[module]; ok {
out[module], keys[module] = w, fp+" "+w
@@ -2211,18 +2211,18 @@ func (c *Composer) unmadeOf(fps map[string]string, comps map[string]engcomp.Comp
why = fmt.Sprintf("the seat's assignment places no %s on this node (%d modules placed)", module, len(own.Modules))
key = "not placed"
case !in:
why = fmt.Sprintf("no manifest in the composer's picture of the indexer's modules (%d modules)",
why = fmt.Sprintf("no entry of its build in the composer's picture of the catalog half (%d modules)",
len(c.modules))
key = "no manifest"
case slices.Contains(skipped, module):
why = "the composition skipped it: the declaration gives it no fingerprint (indexer's picture: " + m.Fp2 + ")"
why = "the composition skipped it: the declaration gives it no fingerprint (the composer's picture: " + m.Fp2 + ")"
key = why
default:
if at := made[module]; at != "" {
why = fmt.Sprintf("the pass composed it at %s and the want names %s (indexer's picture: %s)", at, fp, m.Fp2)
why = fmt.Sprintf("the pass composed it at %s and the want names %s (the composer's picture: %s)", at, fp, m.Fp2)
key = "composed at " + at
} else {
why = fmt.Sprintf("the composition made nothing of it at %s (indexer's picture: %s)", fp, m.Fp2)
why = fmt.Sprintf("the composition made nothing of it at %s (the composer's picture: %s)", fp, m.Fp2)
key = "made nothing at " + m.Fp2
}
}
@@ -2444,7 +2444,7 @@ func (c *Composer) EngineModule() string {
// stands says the want of a module stands for its placement in the early pass of a start: its want is a kept one the live read has
// not answered, and the entry of its build is kept (design 47 G A-117).
func (c *Composer) stands(module string, w meshwants.WantsByWantNodeModuleValue) bool {
if !c.byEntries() || !c.keptWants[module] {
if !c.keptWants[module] {
return false
}
k, ok := c.keptEnt[w.Fp]