Carry the kinds of the probes the operator dropped (D2, D3, D4, D12, D-heard) until the lease write, so compare names them as ending with the controller and never as missing (issue 1952)

This commit is contained in:
2026-10-30 00:00:09 +01:00
parent 4a329f0443
commit 0c0e8960d8
3 changed files with 59 additions and 40 deletions
@@ -95,6 +95,9 @@ func (k *Keeper) Compare() (Comparison, error) {
if home.Replaced {
why = "ends with the controller: its fault is observed otherwise"
}
if home.Why != "" {
why += " (" + home.Why + ")"
}
out.Apart = append(out.Apart, Difference{Key: key, Kind: kind, Reason: why})
case inMine && !inTheirs && (!homed || !home.Controller):
out.Apart = append(out.Apart, Difference{Key: key, Kind: kind, Reason: "keeper only: the controller never raises this kind"})
@@ -23,8 +23,14 @@ type Home struct {
// Replaced says the kind itself ends and another observes its fault (D1, D10, the stuck probe): listed apart in
// compare and not carried.
Replaced bool
// Why is why a kind is carried when the record's table gave it another home: said by compare beside it.
Why string
}
// Dropped is the reason of the probes the operator dropped from this release (D2, D3, D4, D12, D-heard): their kinds end
// with the controller and are carried until the lease write.
const Dropped = "dropped 2026-10-30 by the operator; the owning module declares its own check later (research 074)"
// The kinds' homes, by kind: ADR 0564's rows, and the 63 kinds the controller's code raises that the record left without
// one, as the lead settled them under the operator's yes on 2026-10-29 (.work/47-release/kinds-section.html, with the
// lead's three changes: lease-split and image-missing do not end, and the data rows read their readings from disk-load).
@@ -55,38 +61,30 @@ var Homes = map[string]Home{
"relogin-needed": {Source: "health", Controller: true, Observer: watchman},
"directory-used-as-found": {Source: "health", Controller: true, Observer: watchman},
// The self-check's probes (clause 6, the Context's table).
"resolver-wrong": {Source: "D2", Controller: true, Observer: selfCheck},
"holder-silent": {Source: "D3", Controller: true, Observer: selfCheck},
"archives-missing": {Source: "D4", Controller: true, Observer: selfCheck},
"archives-unheld": {Source: "D4", Controller: true, Observer: selfCheck},
"lease-split": {Source: "D5", Controller: true, Observer: selfCheck}, // a seat held once answers from two holders
"consumer-wrong": {Source: "D6", Controller: true, Observer: selfCheck},
"consumer-lost": {Source: "D6", Controller: true, Observer: selfCheck}, // and the watchman's S9
"consumer-behind": {Source: "D6", Controller: true, Observer: selfCheck},
"stream-wrong": {Source: "D7", Controller: true, Observer: selfCheck},
"own-address-banned": {Source: "D8", Controller: true, Observer: selfCheck},
"cleanup-waiting": {Source: "D11", Controller: true, Observer: selfCheck}, // its data half reads disk-load (L7)
"binding-kept": {Source: "D12", Controller: true, Observer: selfCheck},
"binding-moved": {Source: "D12", Controller: true, Observer: selfCheck},
"binding-moving": {Source: "D12", Controller: true, Observer: selfCheck},
"data-unmeasured": {Source: "D13", Controller: true, Observer: selfCheck},
"data-shrank": {Source: "D13", Controller: true, Observer: selfCheck}, // readings from disk-load (L7)
"empty-replacement": {Source: "D13", Controller: true, Observer: selfCheck},
"data-held-twice": {Source: "D13", Controller: true, Observer: selfCheck},
"data-quiet": {Source: "D13", Controller: true, Observer: selfCheck},
"backup-stale": {Source: "D13", Controller: true, Observer: selfCheck},
"data-missing": {Source: "D13", Controller: true, Observer: selfCheck},
"array-degraded": {Source: "D13", Controller: true, Observer: selfCheck},
"protection-missing": {Source: "D13", Controller: true, Observer: selfCheck},
"bus-reconnects": {Source: "D15", Controller: true, Observer: selfCheck},
"bucket-or-log-filling": {Source: "fill", Controller: true, Observer: selfCheck},
"bucket-or-log-unread": {Source: "fill", Controller: true, Observer: selfCheck},
"grant-composes-nothing": {Source: "withheld", Controller: true, Observer: selfCheck},
"watchdogs-silent": {Source: "DW", Controller: true, Observer: selfCheck},
"core-unhealthy": {Source: "H-bus", Controller: true, Observer: selfCheck},
"agent-can-become-root": {Source: "DA", Controller: true, Observer: selfCheck},
"root-not-free": {Source: "D-root", Controller: true, Observer: selfCheck},
"probe-failed": {Source: "doctor", Controller: true, Observer: selfCheck},
"lease-split": {Source: "D5", Controller: true, Observer: selfCheck}, // a seat held once answers from two holders
"consumer-wrong": {Source: "D6", Controller: true, Observer: selfCheck},
"consumer-lost": {Source: "D6", Controller: true, Observer: selfCheck}, // and the watchman's S9
"consumer-behind": {Source: "D6", Controller: true, Observer: selfCheck},
"stream-wrong": {Source: "D7", Controller: true, Observer: selfCheck},
"own-address-banned": {Source: "D8", Controller: true, Observer: selfCheck},
"cleanup-waiting": {Source: "D11", Controller: true, Observer: selfCheck}, // its data half reads disk-load (L7)
"data-unmeasured": {Source: "D13", Controller: true, Observer: selfCheck},
"data-shrank": {Source: "D13", Controller: true, Observer: selfCheck}, // readings from disk-load (L7)
"empty-replacement": {Source: "D13", Controller: true, Observer: selfCheck},
"data-held-twice": {Source: "D13", Controller: true, Observer: selfCheck},
"data-quiet": {Source: "D13", Controller: true, Observer: selfCheck},
"backup-stale": {Source: "D13", Controller: true, Observer: selfCheck},
"data-missing": {Source: "D13", Controller: true, Observer: selfCheck},
"array-degraded": {Source: "D13", Controller: true, Observer: selfCheck},
"protection-missing": {Source: "D13", Controller: true, Observer: selfCheck},
"bus-reconnects": {Source: "D15", Controller: true, Observer: selfCheck},
"bucket-or-log-filling": {Source: "fill", Controller: true, Observer: selfCheck},
"bucket-or-log-unread": {Source: "fill", Controller: true, Observer: selfCheck},
"watchdogs-silent": {Source: "DW", Controller: true, Observer: selfCheck},
"core-unhealthy": {Source: "H-bus", Controller: true, Observer: selfCheck},
"agent-can-become-root": {Source: "DA", Controller: true, Observer: selfCheck},
"root-not-free": {Source: "D-root", Controller: true, Observer: selfCheck},
"probe-failed": {Source: "doctor", Controller: true, Observer: selfCheck},
// The healers' own (clause 7, Limits 2).
"healer-wanted": {Source: "S15", Controller: true, Observer: healers},
"healers-braked": {Source: "healers", Controller: true, Observer: healers},
@@ -98,8 +96,7 @@ var Homes = map[string]Home{
"retire-rejected": {Source: "retire", Controller: true, Observer: provisioner},
// The router's own: no channel delivered a question.
"asks-undelivered": {Source: "asks", Controller: true, Observer: messenger},
// The artifact store's seat (L7): an image a want names is missing from the store. Its holder is not built yet,
// so the keeper reads no findings of it until L7 names the module.
// The seat mesh-artifact-sweep (L7): an image a want names is missing from the store, artifact-store-tools' finding.
"image-missing": {Source: "S25", Controller: true, Observer: artifactStore},
// The kinds that end with the controller and are carried until its lease write (clauses 4, 9).
"controller-deaf": {Source: "S4", Controller: true, Carried: true},
@@ -122,6 +119,16 @@ var Homes = map[string]Home{
"declaration-refused": {Source: "D1", Controller: true, Carried: true},
"unknown-field": {Source: "read", Controller: true, Carried: true},
"bus-objects-unasserted": {Source: "send", Controller: true, Carried: true},
// The probes the operator dropped from this release (D2 resolvers, D3 holders, D4 archives, D12 bindings, D-heard
// withheld hearings): their kinds are carried until the lease write.
"resolver-wrong": {Source: "D2", Controller: true, Carried: true, Why: Dropped},
"holder-silent": {Source: "D3", Controller: true, Carried: true, Why: Dropped},
"archives-missing": {Source: "D4", Controller: true, Carried: true, Why: Dropped},
"archives-unheld": {Source: "D4", Controller: true, Carried: true, Why: Dropped},
"binding-kept": {Source: "D12", Controller: true, Carried: true, Why: Dropped},
"binding-moved": {Source: "D12", Controller: true, Carried: true, Why: Dropped},
"binding-moving": {Source: "D12", Controller: true, Carried: true, Why: Dropped},
"grant-composes-nothing": {Source: "withheld", Controller: true, Carried: true, Why: Dropped},
// The lead, 2026-10-29: no delivery plans since R6 (wants replace them), and a stalled delivery is the watchman's
// stuck finding seen directly.
"plan-failed": {Source: "S23", Controller: true, Carried: true},
@@ -279,6 +279,7 @@ func TestCompareCountsOnlyWhatBothSidesRaise(t *testing.T) {
_ = r.k.Finding(delivery.AssignerModule, only, onlyRaw, false)
_ = r.k.Controller("core.controller.deaf", put("core.controller.deaf", "controller-deaf"), false)
_ = r.k.Controller("delivery.x.mystery", put("delivery.x.mystery", "mystery"), false)
_ = r.k.Controller("bus.x.consumer-wrong", put("bus.x.consumer-wrong", "consumer-wrong"), false)
_ = r.k.Controller("seat.vault.ace.holder-silent", put("seat.vault.ace.holder-silent", "holder-silent"), false)
cmp, err := r.k.Compare()
if err != nil {
@@ -289,10 +290,12 @@ func TestCompareCountsOnlyWhatBothSidesRaise(t *testing.T) {
reasons[d.Key] = d.Reason
}
for key, says := range map[string]string{
only: "keeper only",
"core.controller.deaf": "carried",
"delivery.x.mystery": "no home is decided for the kind mystery",
"seat.vault.ace.holder-silent": "mesh-self-check has not written its finding",
only: "keeper only",
"core.controller.deaf": "carried",
"delivery.x.mystery": "no home is decided for the kind mystery",
"bus.x.consumer-wrong": "mesh-self-check has not written its finding",
// A kind of a probe the operator dropped (2026-10-30) is carried, never missing.
"seat.vault.ace.holder-silent": "carried from its bucket until the lease write (dropped 2026-10-30 by the operator",
} {
if !strings.Contains(reasons[key], says) {
t.Errorf("%s: %q, want it to say %q", key, reasons[key], says)
@@ -302,7 +305,7 @@ func TestCompareCountsOnlyWhatBothSidesRaise(t *testing.T) {
t.Errorf("compare: %+v", cmp)
}
// The lead's table of 2026-10-29: each kind has its home, lease-split and image-missing do not end, and the 22
// that end are carried.
// that end are carried; with the 8 kinds of the probes the operator dropped on 2026-10-30, 30.
carried := 0
for _, h := range Homes {
if h.Carried {
@@ -316,7 +319,13 @@ func TestCompareCountsOnlyWhatBothSidesRaise(t *testing.T) {
t.Errorf("%s's home is %+v", kind, h)
}
}
if len(Homes) != 84 || carried != 22 { // 19 of ADR 0564, the 63 of the table, plan-failed and stalled
for _, kind := range []string{"resolver-wrong", "holder-silent", "archives-missing", "archives-unheld", "binding-kept",
"binding-moved", "binding-moving", "grant-composes-nothing"} {
if h := Homes[kind]; !h.Carried || h.Observer != "" || h.Why != Dropped {
t.Errorf("the dropped probe's kind %s is %+v", kind, h)
}
}
if len(Homes) != 84 || carried != 30 { // 19 of ADR 0564, the 63 of the table, plan-failed and stalled
t.Errorf("the table holds %d kinds, %d carried", len(Homes), carried)
}
if _, err := r.k.TakeOver(nil, "jochen", "now"); err == nil || !strings.Contains(err.Error(), "2 difference") {