mesh-issues: keep the issues bucket at 8 values until the carry can read them, so the bus drops nothing before it is carried (hq ADR 0300 §6)
mesh/merge-gate fail: builds mesh-issues → novox; no bus step; a manifest the change touches fails the module check: modules/mesh-issues/module.json: this …
mesh/repo-check fail: its merge-check.sh failed: files asking for a setting without saying whether it is trusted: 25
mesh/delivery superseded: a newer head of the same pull request

This commit is contained in:
jochen
2026-10-12 02:43:58 +02:00
parent 983d434623
commit 39da2cd793
3 changed files with 10 additions and 7 deletions
+4 -2
View File
@@ -256,10 +256,12 @@ whole; every other one names the fields given a new value (`set`), the lists add
a note is kept as itself, not as every note again) and the fields taken away (`unset`). The fold applies them
as written, so a new kind of operation needs nothing new in the fold.
**The bucket `issues` is the fold of the log**, one value per key, each issue carrying `folded`, the sequence
**The bucket `issues` is the fold of the log**, each issue carrying `folded`, the sequence
of its last operation. It is written after the append, at the revision read; one whose write fails after the
log took the change is behind, and caught up at its next change (the stale append is refused and the log
folded) or at the next start. Agents and views watch it as before.
folded) or at the next start. Agents and views watch it as before. It still keeps 8 values per key, so the bus
cannot drop the older values before the carry has read them; it goes to one value per key (ADR 0300 §3) in a
follow-up, once the carry has run with a read of those values.
**On start**, the tracker watches its own bucket, carries what the bucket holds and the log does not (below),
reads the whole log page by page, folds every issue whose last operation is newer than its `folded` — an
@@ -88,14 +88,15 @@ func TestItDeclaresAndHoldsTheIssueTrackerSeatOnceForTheMesh(t *testing.T) {
EventTriaged, EventReady, EventReadyToVerify, EventReserved}) {
t.Fatalf("emits %v", m.Emits)
}
// The record is the log `changes` (ADR 0300 §1). Four states, none expiring, each one value per key: issues
// the fold of the log (§3), the counters, the backlog's pass of the duplicate check (ADR 0278 §6), each
// reserved number (issue 424).
// The record is the log `changes` (ADR 0300 §1). Four states, none expiring: issues the fold of the log (§3),
// still keeping its older values until the carry has read them (they go to one value in a follow-up), the
// counters one value each, the backlog's pass of the duplicate check one value (ADR 0278 §6), each reserved
// number one value (issue 424).
if !reflect.DeepEqual(m.Logs, []string{ChangesLog}) {
t.Fatalf("logs %v", m.Logs)
}
d := m.stateDeclarations(t)
if len(d) != 4 || d[0].Name != IssuesState || d[0].History > 1 || d[0].TTLSeconds != 0 ||
if len(d) != 4 || d[0].Name != IssuesState || d[0].History < 2 || d[0].TTLSeconds != 0 ||
d[1].Name != CountersState || d[1].History > 1 || d[1].TTLSeconds != 0 ||
d[2].Name != GroomingState || d[2].History > 1 || d[2].TTLSeconds != 0 ||
d[3].Name != ReservationsState || d[3].History > 1 || d[3].TTLSeconds != 0 {
+1 -1
View File
@@ -72,7 +72,7 @@
"state": [
{
"name": "issues",
"history": 1
"history": 8
},
"counters",
"grooming",