Raise S20 for every generation refusal, ask for a push when the counter was behind, and write a send's generation with its digest (hq issue 234 review)
mesh/merge-gate pass: builds build-agent, mesh-controller, route-proxy → ace, g14, novox, shanks; no bus step; every machine composes with the change as it…
mesh/repo-check fail: its merge-check.sh failed: --- FAIL: TestTheResolverAndWhatAsksItComposeOnOneMachine (0.03s)
mesh/delivery superseded: a newer head of the same pull request

A refusal of a send the mesh never recorded went only to stderr; it is now kept
with its sender said to be unknown, and raised. A counter behind the machine (a
store put back) is raised and the condition names push, since the receive loop
must not push. The node's digest and generation are one transaction, and a send
record that fails is said loudly without failing the send. The trigger ignores
an update that changes nothing, and the put-back mark is dropped: a put-back is
composed afresh with the current generation.
This commit is contained in:
2026-10-11 11:55:27 +02:00
parent 313efa826c
commit 5dd0e3c056
10 changed files with 394 additions and 175 deletions
-9
View File
@@ -33,17 +33,11 @@ type sendable struct {
// node-engine has not said it reads one is sent none, for the reason the epoch is not (an older
// node-engine refuses a key it does not know, whole).
Generation int64
// PutBack marks a gate's put-back (novox/hq issue 234): it carries the generation of what it puts
// back and is not refused for it. Sent only beside a generation.
PutBack bool
// composedFrom is the generation read before this declaration was composed, and actingEpoch the
// lease epoch its sender acted under — whether or not the machine is sent either — for the record of
// the send; never on the wire.
composedFrom int64
actingEpoch uint64
// putBackSend is whether a gate sent it to put the machine back, for the record; PutBack is the mark
// on the wire, only beside a generation.
putBackSend bool
// modules are the modules this declaration names, for the record of the send; never on the wire.
modules []string
// Adoption is nil for a converged node, and then the body is byte for byte what it was before
@@ -115,9 +109,6 @@ func (s sendable) Body() ([]byte, error) {
}
if s.Generation > 0 {
envelope["generation"] = s.Generation
if s.PutBack {
envelope["put_back"] = true
}
}
// An empty declaration is deliberate here — the node owns nothing the mesh put there
// (novox/hq issue 127) — and the host refuses an empty body unless it is told the emptiness