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:
@@ -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") {
|
||||
|
||||
Reference in New Issue
Block a user