From 0c0e8960d8bab6e241e9eebb64a8a4d7469cc472 Mon Sep 17 00:00:00 2001 From: jochen Date: Fri, 30 Oct 2026 00:00:09 +0100 Subject: [PATCH] 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) --- .../cmd/mesh-conditions/compare.go | 3 + .../cmd/mesh-conditions/homes.go | 75 ++++++++++--------- .../cmd/mesh-conditions/keeper_test.go | 21 ++++-- 3 files changed, 59 insertions(+), 40 deletions(-) diff --git a/modules/mesh-conditions/cmd/mesh-conditions/compare.go b/modules/mesh-conditions/cmd/mesh-conditions/compare.go index f2092381..e04e805a 100644 --- a/modules/mesh-conditions/cmd/mesh-conditions/compare.go +++ b/modules/mesh-conditions/cmd/mesh-conditions/compare.go @@ -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"}) diff --git a/modules/mesh-conditions/cmd/mesh-conditions/homes.go b/modules/mesh-conditions/cmd/mesh-conditions/homes.go index a0fb571a..8c33215d 100644 --- a/modules/mesh-conditions/cmd/mesh-conditions/homes.go +++ b/modules/mesh-conditions/cmd/mesh-conditions/homes.go @@ -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}, diff --git a/modules/mesh-conditions/cmd/mesh-conditions/keeper_test.go b/modules/mesh-conditions/cmd/mesh-conditions/keeper_test.go index a0aa871f..e413e033 100644 --- a/modules/mesh-conditions/cmd/mesh-conditions/keeper_test.go +++ b/modules/mesh-conditions/cmd/mesh-conditions/keeper_test.go @@ -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") {