What runs from the kept declaration says Data as the module's manifest does, and only a have that runs counts at the start (issue 924)
The kept-declaration fallback built a composition without Data, so after a restart a data module (mongodb, mssql
on novox) was judged to move its data against its first composition and the operator was asked a false yes. Now
every such composition takes Data from the manifest (agent.Env.HoldsData, the composer's DataItems), and a module
whose manifest cannot be read is said to be unjudgeable rather than taken to hold none. The composition a have
names comes before the kept declaration in the judgement too.
loadHad takes a have only in the phases baseline takes as running (running, held, a composer's mark): one backing
up, applying, checking, failed or waiting names a composition not applied (review of 031e106). Two rows added to
the same table test; the count stays.
This commit is contained in:
@@ -1031,6 +1031,9 @@ func TestTheRevisionAWantNamesIsAppliedFromHistory(t *testing.T) {
|
||||
// for claude-code and screen-lock, 2026-10-25); from the composition its have names once it has one, the kept
|
||||
// declaration being older, read at the start before any module settles and told to the filling then, so a file the
|
||||
// newer composition fills is accepted on the first fill (power's three drop-ins on ace, g14 and shanks, 2026-10-29).
|
||||
// Only a have in a phase baseline takes as running names what runs; and what runs carries Data, from the composition
|
||||
// or, from the kept declaration, from the module's manifest, so a data module is not judged to move its data against
|
||||
// its first composition after a restart (mongodb and mssql on novox).
|
||||
func TestWhatRunsBeforeTheAgentTakesAModuleNamesItsFilledPaths(t *testing.T) {
|
||||
const old, added = "/tmp/r6/power/settings", "/tmp/r6/power/bound"
|
||||
filledFile := func(id string) json.RawMessage {
|
||||
@@ -1039,7 +1042,7 @@ func TestWhatRunsBeforeTheAgentTakesAModuleNamesItsFilledPaths(t *testing.T) {
|
||||
}
|
||||
fp := fpOf("a")
|
||||
ck, _ := delivery.ComposedKey(node, "power", fp)
|
||||
applied := delivery.Composed{Node: node, Module: "power", FP: fp, Filled: []string{old, added},
|
||||
applied := delivery.Composed{Node: node, Module: "power", FP: fp, Filled: []string{old, added}, Data: true,
|
||||
Resources: []json.RawMessage{filledFile("settings"), filledFile("bound")}}
|
||||
_, appliedRaw, appliedDig := signedBy(t, applied, ck, controllerKey)
|
||||
newer := applied
|
||||
@@ -1053,13 +1056,21 @@ func TestWhatRunsBeforeTheAgentTakesAModuleNamesItsFilledPaths(t *testing.T) {
|
||||
bucket []byte
|
||||
history []Update
|
||||
filled, told string
|
||||
// data is what runs' Data; holdsData the manifest's answer (nil: none read).
|
||||
data bool
|
||||
holdsData func(context.Context, string) (bool, bool)
|
||||
}{
|
||||
{name: "no have: the kept declaration's", filled: old},
|
||||
{name: "a have naming the bucket's value", have: &Have{Module: "power", FP: fp, Composed: appliedDig},
|
||||
bucket: appliedRaw, filled: old + "," + added, told: "the haves were read at the start"},
|
||||
bucket: appliedRaw, filled: old + "," + added, told: "the haves were read at the start", data: true},
|
||||
{name: "a have applying names nothing that runs yet", have: &Have{Module: "power", FP: fp, Composed: appliedDig,
|
||||
Phase: string(delivery.PhaseApplying)}, bucket: appliedRaw, filled: old, told: "the haves were read at the start"},
|
||||
{name: "a data module from the kept declaration says Data as its manifest does", filled: old,
|
||||
told: "the haves were read at the start", data: true,
|
||||
holdsData: func(context.Context, string) (bool, bool) { return true, true }},
|
||||
{name: "a have naming a revision replaced since", have: &Have{Module: "power", FP: fp, Composed: appliedDig},
|
||||
bucket: newerRaw, history: []Update{{Key: ck, Value: appliedRaw, Revision: 3}, {Key: ck, Value: newerRaw, Revision: 7}},
|
||||
filled: old + "," + added, told: "the haves were read at the start"},
|
||||
filled: old + "," + added, told: "the haves were read at the start", data: true},
|
||||
{name: "a have naming a composition the bucket no longer keeps", have: &Have{Module: "power", FP: fp, Composed: appliedDig},
|
||||
bucket: newerRaw, filled: old, told: "the haves were read at the start"},
|
||||
} {
|
||||
@@ -1074,12 +1085,16 @@ func TestWhatRunsBeforeTheAgentTakesAModuleNamesItsFilledPaths(t *testing.T) {
|
||||
b.comps.before(ck, tc.bucket)
|
||||
}
|
||||
b.env.Revisions = func(_ context.Context, key string) ([]Update, error) { return tc.history, nil }
|
||||
b.env.HoldsData = tc.holdsData
|
||||
var told []string
|
||||
var mu sync.Mutex
|
||||
b.env.RunsChanged = func(why string) { mu.Lock(); told = append(told, why); mu.Unlock() }
|
||||
filledNow := func() string {
|
||||
for _, c := range b.ag.Everything() {
|
||||
if c.Module == "power" {
|
||||
if c.Data != tc.data {
|
||||
t.Errorf("what runs says Data %v, want %v", c.Data, tc.data)
|
||||
}
|
||||
return strings.Join(c.Filled, ",")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user