From 1cad83bad7f6771b9ed978d05bf018fa69ae71fa Mon Sep 17 00:00:00 2001 From: jochen Date: Wed, 11 Nov 2026 22:38:49 +0100 Subject: [PATCH 1/8] =?UTF-8?q?VERSION=20(A-46,=20=C2=A7368,=20=C2=A7411):?= =?UTF-8?q?=20every=20manifest=20of=20mesh-delivery=20says=20its=20version?= =?UTF-8?q?=20MAJOR.MINOR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 0.1 for the 6 manifests that said "1" (builder_versions answers none for any name asked); the others already said 0.1. Builds: design 47 G §368, §411, A-46 Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h --- contracts/module.json | 2 +- modules/mesh-delivery-assigner/module.json | 2 +- modules/mesh-delivery-builder/module.json | 2 +- modules/mesh-delivery-forge-bridge/module.json | 2 +- modules/mesh-grants/module.json | 2 +- sdk/module.json | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/contracts/module.json b/contracts/module.json index b024f0d0..1fda11a3 100644 --- a/contracts/module.json +++ b/contracts/module.json @@ -1,6 +1,6 @@ { "module": "mesh-delivery-contracts", - "version": "1", + "version": "0.1", "build": { "artifacts": [ { diff --git a/modules/mesh-delivery-assigner/module.json b/modules/mesh-delivery-assigner/module.json index f9d921a5..db9ad28f 100644 --- a/modules/mesh-delivery-assigner/module.json +++ b/modules/mesh-delivery-assigner/module.json @@ -1,6 +1,6 @@ { "module": "mesh-delivery-assigner", - "version": "1", + "version": "0.1", "slug": "assigner", "runs-as": "mesh-delivery-assigner", "claims": [ diff --git a/modules/mesh-delivery-builder/module.json b/modules/mesh-delivery-builder/module.json index ac053db9..26e1428b 100644 --- a/modules/mesh-delivery-builder/module.json +++ b/modules/mesh-delivery-builder/module.json @@ -1,6 +1,6 @@ { "module": "mesh-delivery-builder", - "version": "1", + "version": "0.1", "slug": "builder", "claims": [ { diff --git a/modules/mesh-delivery-forge-bridge/module.json b/modules/mesh-delivery-forge-bridge/module.json index c26d1d23..99fcd8f7 100644 --- a/modules/mesh-delivery-forge-bridge/module.json +++ b/modules/mesh-delivery-forge-bridge/module.json @@ -1,6 +1,6 @@ { "module": "mesh-delivery-forge-bridge", - "version": "1", + "version": "0.1", "slug": "forge-bridge", "consumes": [ "git.pull-updated", diff --git a/modules/mesh-grants/module.json b/modules/mesh-grants/module.json index 6d9865eb..c1353a95 100644 --- a/modules/mesh-grants/module.json +++ b/modules/mesh-grants/module.json @@ -1,6 +1,6 @@ { "module": "mesh-grants", - "version": "1", + "version": "0.1", "slug": "grants", "reads": [ "mesh-config.resolved", diff --git a/sdk/module.json b/sdk/module.json index 85afe154..c3d5d6b9 100644 --- a/sdk/module.json +++ b/sdk/module.json @@ -1,6 +1,6 @@ { "module": "mesh-delivery-sdk", - "version": "1", + "version": "0.1", "build": { "artifacts": [ { From 395c53e63f6c68ffe0ce8050ee07f05ccb5c59b8 Mon Sep 17 00:00:00 2001 From: jochen Date: Wed, 11 Nov 2026 22:41:39 +0100 Subject: [PATCH 2/8] =?UTF-8?q?JUDGE=20(A-30,=20=C2=A7529):=20a=20foundati?= =?UTF-8?q?on=20part's=20own=20findings=20stream=20-findings=20is?= =?UTF-8?q?=20a=20predefined=20form;=20the=20bus=20fixture=20serves=20?= =?UTF-8?q?=C2=A7681's=20snapshot=20verbs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit rules.go keptUntilMoved: the stream FindingStreamOf(module) of a foundation module is not refused as outside the predefined forms (the judge's own gwords.go requires it of a foundation part, A-30 says it stays in the old streams section). rules_test.go: rows in caseTwoModulesCannotDeclareOneStream (fails without the change), and caseTheMeshsOwnSeatsAreStillClaimable names snapshot-get, snapshot-restore, snapshot-restore-cancel, snapshot-remove (§681) instead of snapshot-kept and restore-kept (§554, mesh-recovery's). Builds: design 47 G §529, §681, A-30 Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h --- modules/mesh-delivery-indexer/judge/rules.go | 4 ++++ modules/mesh-delivery-indexer/judge/rules_test.go | 11 ++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/modules/mesh-delivery-indexer/judge/rules.go b/modules/mesh-delivery-indexer/judge/rules.go index 61c48405..6d30c3f7 100644 --- a/modules/mesh-delivery-indexer/judge/rules.go +++ b/modules/mesh-delivery-indexer/judge/rules.go @@ -5567,6 +5567,10 @@ var seatStreamsKeptUntilMoved = map[string][]string{ // keptUntilMoved is whether a stream of a manifest is one kept until its module moves it: by the module's name, or by a // seat it claims. func keptUntilMoved(m catalogue.Manifest, stream string) bool { + // A foundation part says its findings on its old stream `-findings` for good (design 47 G §529, A-30). + if stream == FindingStreamOf(m.Module) && slices.Contains(Foundation, m.Module) { + return true + } if slices.Contains(streamsKeptUntilMoved[m.Module], stream) { return true } diff --git a/modules/mesh-delivery-indexer/judge/rules_test.go b/modules/mesh-delivery-indexer/judge/rules_test.go index 2ef9b609..0530f52f 100644 --- a/modules/mesh-delivery-indexer/judge/rules_test.go +++ b/modules/mesh-delivery-indexer/judge/rules_test.go @@ -4683,7 +4683,7 @@ func caseTheMeshsOwnSeatsAreStillClaimable(t *testing.T) { // It delivers the bus, so its holder provides the bus — the rule this check now enforces. m := catalogue.Manifest{Module: "nats", Provides: []catalogue.Offer{{Name: "mesh-bus", Scope: catalogue.ScopeMesh, Credential: &catalogue.OfferCredential{Form: catalogue.CredentialFormNone}}}, - Claims: []catalogue.Claim{{Name: "mesh-broker", Scope: catalogue.ScopeMesh, Serves: []string{"snapshot-kept", "restore-kept"}}}} + Claims: []catalogue.Claim{{Name: "mesh-broker", Scope: catalogue.ScopeMesh, Serves: []string{"snapshot-get", "snapshot-restore", "snapshot-restore-cancel", "snapshot-remove"}}}} if got := problemsFor(t, catalogue.Shelf{"nats": m}); got != "" { t.Fatalf("a mesh seat was refused by the derived check: %s", got) } @@ -5121,6 +5121,15 @@ func caseTwoModulesCannotDeclareOneStream(t *testing.T) { if got := PredefinedFormProblems(catalogue.Manifest{Module: "mesh-build-go", Streams: toolchains}); len(got) != 1 { t.Fatalf("a toolchain stream of a module claiming no build seat was kept by its name: %v", got) } + // A foundation part says its findings on its old stream `-findings` for good (design 47 G §529, A-30); a part + // that is no foundation part keeps none (its findings go by the template `events`). + findings := []catalogue.StreamDeclaration{{Name: "mesh-config-findings", Events: []string{"finding-written.*"}}} + if got := PredefinedFormProblems(catalogue.Manifest{Module: "mesh-config", Streams: findings}); len(got) != 0 { + t.Fatalf("a foundation part's findings stream was refused: %v", got) + } + if got := PredefinedFormProblems(catalogue.Manifest{Module: "mesh-config-b", Streams: []catalogue.StreamDeclaration{{Name: "mesh-config-b-findings", Events: []string{"finding-written.*"}}}}); len(got) != 1 { + t.Fatalf("a findings stream of a part outside the foundation was kept: %v", got) + } } // A seat name meaning two protocols is the failure nobody could diagnose afterwards. From df82ca5959909203b5a49e943fc9d157d737c45e Mon Sep 17 00:00:00 2001 From: jochen Date: Wed, 11 Nov 2026 22:44:34 +0100 Subject: [PATCH 3/8] =?UTF-8?q?JUDGE=20(A-30,=20=C2=A7529,=20=C2=A7387):?= =?UTF-8?q?=20the=20teller,=20the=20view,=20the=20watchman=20and=20the=20e?= =?UTF-8?q?nrolment=20ask=20their=20findings=20in=20requires?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Each drops its old state findings and stream -findings for the requires entries findings (state, history kept) and finding-events (the three finding events, 7 days, 16 MiB); none is a foundation part (§529, A-30). Builds: design 47 G §387, §529, §577, A-30 Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h --- modules/mesh-delivery-teller/module.json | 55 ++++++++++++++++------ modules/mesh-delivery-view/module.json | 50 +++++++++++++++----- modules/mesh-delivery-watchman/module.json | 50 ++++++++++++++++---- modules/mesh-enrolment/module.json | 29 +++++++++--- 4 files changed, 142 insertions(+), 42 deletions(-) diff --git a/modules/mesh-delivery-teller/module.json b/modules/mesh-delivery-teller/module.json index 458c778b..4c00a0d3 100644 --- a/modules/mesh-delivery-teller/module.json +++ b/modules/mesh-delivery-teller/module.json @@ -16,24 +16,27 @@ "mesh-conditions.findings-asked", "mesh-delivery-assigner.views.asks" ], - "streams": [ - { - "name": "mesh-delivery-teller-findings", - "events": ["finding-written.*", "finding-cleared.*", "findings-stated.*"], - "max-age-days": 7, - "max-mib": 16 - } - ], "emits": [ "answered", "ask-ended" ], "state": [ - { "name": "answers", "history": 5 }, - { "name": "asked", "history": 1 }, - { "name": "ends", "history": 1 }, - { "name": "first-views", "history": 1 }, - { "name": "findings", "history": 1 } + { + "name": "answers", + "history": 5 + }, + { + "name": "asked", + "history": 1 + }, + { + "name": "ends", + "history": 1 + }, + { + "name": "first-views", + "history": 1 + } ], "reads": [ "mesh-delivery-gate.asks", @@ -101,5 +104,29 @@ ] } ] - } + }, + "requires": [ + { + "name": "findings", + "storage": "key-value", + "template": "state", + "options": { + "history": 1 + } + }, + { + "name": "finding-events", + "storage": "stream", + "template": "events", + "options": { + "events": [ + "finding-written.*", + "finding-cleared.*", + "findings-stated.*" + ], + "max-age-days": 7, + "max-mib": 16 + } + } + ] } diff --git a/modules/mesh-delivery-view/module.json b/modules/mesh-delivery-view/module.json index 899e9931..feb4694c 100644 --- a/modules/mesh-delivery-view/module.json +++ b/modules/mesh-delivery-view/module.json @@ -37,10 +37,18 @@ "stuck" ], "state": [ - { "name": "answers", "history": 5 }, - { "name": "reach", "history": 1 }, - { "name": "first-views", "history": 1 }, - { "name": "findings", "history": 1 } + { + "name": "answers", + "history": 5 + }, + { + "name": "reach", + "history": 1 + }, + { + "name": "first-views", + "history": 1 + } ], "consumes": [ "mesh-conditions.findings-asked", @@ -51,14 +59,6 @@ "mesh-delivery-indexer.views.candidates", "mesh-delivery-indexer.views.taken" ], - "streams": [ - { - "name": "mesh-delivery-view-findings", - "events": ["finding-written.*", "finding-cleared.*", "findings-stated.*"], - "max-age-days": 7, - "max-mib": 16 - } - ], "invokes": [ "mesh-delivery-assigner.assigner_read_asks", "mesh-delivery-assigner.assigner_read_differences", @@ -198,5 +198,29 @@ "from": "files" } ] - } + }, + "requires": [ + { + "name": "findings", + "storage": "key-value", + "template": "state", + "options": { + "history": 1 + } + }, + { + "name": "finding-events", + "storage": "stream", + "template": "events", + "options": { + "events": [ + "finding-written.*", + "finding-cleared.*", + "findings-stated.*" + ], + "max-age-days": 7, + "max-mib": 16 + } + } + ] } diff --git a/modules/mesh-delivery-watchman/module.json b/modules/mesh-delivery-watchman/module.json index 44b51e29..d51fa8b9 100644 --- a/modules/mesh-delivery-watchman/module.json +++ b/modules/mesh-delivery-watchman/module.json @@ -30,9 +30,6 @@ "mesh-delivery-indexer.indexer_read_modules", "seat:mesh-hand-acts.hand-act" ], - "streams": [ - { "name": "mesh-delivery-watchman-findings", "events": ["finding-written.*", "finding-cleared.*", "findings-stated.*"], "max-age-days": 7, "max-mib": 16 } - ], "consumes": [ "mesh-delivery-assigner.views.wants", "mesh-delivery-indexer.take-in.pending", @@ -73,11 +70,22 @@ "watchman_first_view_again" ], "state": [ - { "name": "presence", "history": 20 }, - { "name": "pulse", "key-ttl": true }, - { "name": "stuck", "history": 20 }, - { "name": "findings", "history": 5 }, - { "name": "first-views", "history": 1 } + { + "name": "presence", + "history": 20 + }, + { + "name": "pulse", + "key-ttl": true + }, + { + "name": "stuck", + "history": 20 + }, + { + "name": "first-views", + "history": 1 + } ], "own-secrets": { "broker": "${dir:state}/broker" @@ -146,5 +154,29 @@ ] } ] - } + }, + "requires": [ + { + "name": "findings", + "storage": "key-value", + "template": "state", + "options": { + "history": 5 + } + }, + { + "name": "finding-events", + "storage": "stream", + "template": "events", + "options": { + "events": [ + "finding-written.*", + "finding-cleared.*", + "findings-stated.*" + ], + "max-age-days": 7, + "max-mib": 16 + } + } + ] } diff --git a/modules/mesh-enrolment/module.json b/modules/mesh-enrolment/module.json index 506c568a..1750442f 100644 --- a/modules/mesh-enrolment/module.json +++ b/modules/mesh-enrolment/module.json @@ -16,9 +16,6 @@ ] } ], - "streams": [ - { "name": "mesh-enrolment-findings", "events": ["finding-written.*", "finding-cleared.*", "findings-stated.*"], "max-age-days": 7, "max-mib": 16 } - ], "consumes": [ "mesh-node-enroller.node-enrolled", "mesh-node-enroller.enrolment-refused", @@ -52,8 +49,7 @@ { "name": "asked", "history": 5 - }, - "findings" + } ], "tools": [ "enrolment_first_views", @@ -94,5 +90,26 @@ ] } ] - } + }, + "requires": [ + { + "name": "findings", + "storage": "key-value", + "template": "state" + }, + { + "name": "finding-events", + "storage": "stream", + "template": "events", + "options": { + "events": [ + "finding-written.*", + "finding-cleared.*", + "findings-stated.*" + ], + "max-age-days": 7, + "max-mib": 16 + } + } + ] } From dcaf4d4084b46524ade18b623c2ed794d5307799 Mon Sep 17 00:00:00 2001 From: jochen Date: Wed, 11 Nov 2026 22:44:34 +0100 Subject: [PATCH 4/8] =?UTF-8?q?JUDGE=20(=C2=A7470):=20the=20runner's=20ste?= =?UTF-8?q?p-log=20is=20an=20old=20logs=20section=20kept=20100=20days=20of?= =?UTF-8?q?=20128=20MiB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The manifest declared step-log as a stream; §470 amends §85 to a logs section (max-age-days 100, max-mib 128), the form the judge's predefined-forms rule accepts. Builds: design 47 G §470, §486 Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h --- modules/mesh-delivery-pipeline/module.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/mesh-delivery-pipeline/module.json b/modules/mesh-delivery-pipeline/module.json index d0055720..cf3e7832 100644 --- a/modules/mesh-delivery-pipeline/module.json +++ b/modules/mesh-delivery-pipeline/module.json @@ -68,13 +68,6 @@ } ], "streams": [ - { - "name": "step-log", - "events": [ - "step-log.**" - ], - "max-mib": 128 - }, { "name": "mesh-delivery-pipeline-findings", "events": [ @@ -154,5 +147,12 @@ ] } ] - } + }, + "logs": [ + { + "name": "step-log", + "max-age-days": 100, + "max-mib": 128 + } + ] } From efce28c996c2e31192e754a9c9a4a2ff25b2229a Mon Sep 17 00:00:00 2001 From: jochen Date: Wed, 11 Nov 2026 22:45:40 +0100 Subject: [PATCH 5/8] =?UTF-8?q?JUDGE=20(=C2=A7584,=20A-54):=20every=20stre?= =?UTF-8?q?am=20of=20a=20foundation=20part=20is=20a=20predefined=20form,?= =?UTF-8?q?=20its=20old=20sections=20kept=20for=20good?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit keptUntilMoved passes the streams of a Foundation module (the findings stream -findings, distribution-events); a row in caseTwoModulesCannotDeclareOneStream names distribution-events (fails without the change). Builds: design 47 G §584, A-54, A-30 Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h --- modules/mesh-delivery-indexer/judge/rules.go | 5 +++-- modules/mesh-delivery-indexer/judge/rules_test.go | 7 +++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/modules/mesh-delivery-indexer/judge/rules.go b/modules/mesh-delivery-indexer/judge/rules.go index 6d30c3f7..3aca3716 100644 --- a/modules/mesh-delivery-indexer/judge/rules.go +++ b/modules/mesh-delivery-indexer/judge/rules.go @@ -5567,8 +5567,9 @@ var seatStreamsKeptUntilMoved = map[string][]string{ // keptUntilMoved is whether a stream of a manifest is one kept until its module moves it: by the module's name, or by a // seat it claims. func keptUntilMoved(m catalogue.Manifest, stream string) bool { - // A foundation part says its findings on its old stream `-findings` for good (design 47 G §529, A-30). - if stream == FindingStreamOf(m.Module) && slices.Contains(Foundation, m.Module) { + // A foundation part keeps its old sections for good, its streams among them: its findings stream `-findings` + // (design 47 G §529, A-30) and the image registry's `distribution-events` (§584, A-54). + if slices.Contains(Foundation, m.Module) { return true } if slices.Contains(streamsKeptUntilMoved[m.Module], stream) { diff --git a/modules/mesh-delivery-indexer/judge/rules_test.go b/modules/mesh-delivery-indexer/judge/rules_test.go index 0530f52f..4f3eb0f9 100644 --- a/modules/mesh-delivery-indexer/judge/rules_test.go +++ b/modules/mesh-delivery-indexer/judge/rules_test.go @@ -5121,12 +5121,15 @@ func caseTwoModulesCannotDeclareOneStream(t *testing.T) { if got := PredefinedFormProblems(catalogue.Manifest{Module: "mesh-build-go", Streams: toolchains}); len(got) != 1 { t.Fatalf("a toolchain stream of a module claiming no build seat was kept by its name: %v", got) } - // A foundation part says its findings on its old stream `-findings` for good (design 47 G §529, A-30); a part - // that is no foundation part keeps none (its findings go by the template `events`). + // A foundation part keeps its old streams for good: its findings stream `-findings` (design 47 G §529, A-30) and + // distribution's `distribution-events` (§584, A-54); a part that is no foundation part keeps none. findings := []catalogue.StreamDeclaration{{Name: "mesh-config-findings", Events: []string{"finding-written.*"}}} if got := PredefinedFormProblems(catalogue.Manifest{Module: "mesh-config", Streams: findings}); len(got) != 0 { t.Fatalf("a foundation part's findings stream was refused: %v", got) } + if got := PredefinedFormProblems(catalogue.Manifest{Module: "distribution", Streams: []catalogue.StreamDeclaration{{Name: "distribution-events", Events: []string{"old-name-closed"}}}}); len(got) != 0 { + t.Fatalf("a foundation part's events stream was refused: %v", got) + } if got := PredefinedFormProblems(catalogue.Manifest{Module: "mesh-config-b", Streams: []catalogue.StreamDeclaration{{Name: "mesh-config-b-findings", Events: []string{"finding-written.*"}}}}); len(got) != 1 { t.Fatalf("a findings stream of a part outside the foundation was kept: %v", got) } From 2b37238b30df369c90b2abfc1b9988ff1c521b4e Mon Sep 17 00:00:00 2001 From: jochen Date: Wed, 11 Nov 2026 22:47:18 +0100 Subject: [PATCH 6/8] =?UTF-8?q?JUDGE=20(=C2=A7627):=20the=20node-engine's?= =?UTF-8?q?=20module=20is=20a=20foundation=20part,=20its=20findings=20stay?= =?UTF-8?q?=20in=20the=20old=20sections?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Foundation gains mesh-host, the holder of the seat node-engine (§627, ADR 0619 §1); a row in the G words test accepts its old state and stream mesh-host-findings (fails without it). Builds: design 47 G §627, §529, A-30 Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h --- modules/mesh-delivery-indexer/judge/g_words_test.go | 2 ++ modules/mesh-delivery-indexer/judge/oldsections.go | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/mesh-delivery-indexer/judge/g_words_test.go b/modules/mesh-delivery-indexer/judge/g_words_test.go index 59e225db..228defd5 100644 --- a/modules/mesh-delivery-indexer/judge/g_words_test.go +++ b/modules/mesh-delivery-indexer/judge/g_words_test.go @@ -22,6 +22,8 @@ func TestTheJudgeReadsMilestoneGsWords(t *testing.T) { `"streams":[{"name":"gitea-findings","events":["finding-written"],"retention":"history"}],"consumes":["mesh-conditions.findings-asked"]}`}, {name: "the image registry is a foundation part too (§584)", raw: `{"module":"distribution","version":"1.0","state":["findings"],` + `"streams":[{"name":"distribution-findings","events":["finding-written"],"retention":"history"}],"consumes":["mesh-conditions.findings-asked"]}`}, + {name: "the node-engine's module is a foundation part (§627)", raw: `{"module":"mesh-host","version":"1.0","state":["findings"],` + + `"streams":[{"name":"mesh-host-findings","events":["finding-written.*","finding-cleared.*","findings-stated.*"],"max-age-days":7,"max-mib":16}],"consumes":["mesh-conditions.findings-asked"]}`}, {name: "another part's old findings and stream (§529, §577)", raw: `{"module":"a","version":"1.0","state":["findings"],` + `"streams":[{"name":"a-findings","events":["finding-written"],"retention":"history"}],"consumes":["mesh-conditions.findings-asked"]}`, want: "old sections"}, {name: "another part's findings in its requires (§529)", raw: `{"module":"a","version":"1.0","consumes":["mesh-conditions.findings-asked"],"requires":[` + diff --git a/modules/mesh-delivery-indexer/judge/oldsections.go b/modules/mesh-delivery-indexer/judge/oldsections.go index f9157365..506a214b 100644 --- a/modules/mesh-delivery-indexer/judge/oldsections.go +++ b/modules/mesh-delivery-indexer/judge/oldsections.go @@ -20,10 +20,10 @@ var OldSections = []string{"state", "logs", "streams", "objects"} // composition, assignments, build or delivery needs before it can answer (novox/hq ADR 0619 §1, §3, as ADR 0666 §4 changes // them): the bus module, the grants part, the indexer, the assigner, the tool runner, the builder, the checker, mesh-config, // the vault, the pipeline runner, which runs the bus module's own pipeline, and the forge module and the image registry -// module, which its build calls (design 47 G §584). Their new state goes on their old sections +// module, which its build calls (design 47 G §584), and the node-engine's module, which composes every part (§627). Their new state goes on their old sections // too, so a foundation manifest asking bus state in the new form is refused. var Foundation = []string{"nats", "mesh-grants", "mesh-delivery-indexer", "mesh-delivery-assigner", "node-tools", - "mesh-delivery-builder", "mesh-delivery-checker", "mesh-config", "mesh-vault", "mesh-delivery-pipeline", "gitea", "distribution"} + "mesh-delivery-builder", "mesh-delivery-checker", "mesh-config", "mesh-vault", "mesh-delivery-pipeline", "gitea", "distribution", "mesh-host"} // ViewOwners are the two owners whose state every reader reads through their first views and read tools, never by a // `reads` entry (novox/hq ADR 0615 §1): CountOwnerReads counts what is left of those entries. From 6530702037de840665f639bd2778e2a01f90a87e Mon Sep 17 00:00:00 2001 From: jochen Date: Wed, 11 Nov 2026 22:47:51 +0100 Subject: [PATCH 7/8] =?UTF-8?q?JUDGE=20(=C2=A7469,=20=C2=A7695):=20an=20ol?= =?UTF-8?q?d=20state=20section=20entry=20takes=20max-mib,=20bounded=20as?= =?UTF-8?q?=20the=20objects=20section's?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The judge reads the field through mesh-sdk's catalogue (feat/47-G-maxmib6, 1dc848d7): rows in the G words test accept 128 and refuse 0 and 9000 (they fail without that sdk), and the unknown-field message test names max-mib in the state form. The whole judge package needs this sdk and the bus5 sdk (ab3e7a7) together: with either alone one test of the other's change fails. Builds: design 47 G §469, §695 Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h --- modules/mesh-delivery-indexer/judge/g_words_test.go | 3 +++ modules/mesh-delivery-indexer/judge/rules_test.go | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/mesh-delivery-indexer/judge/g_words_test.go b/modules/mesh-delivery-indexer/judge/g_words_test.go index 228defd5..9fac4f0c 100644 --- a/modules/mesh-delivery-indexer/judge/g_words_test.go +++ b/modules/mesh-delivery-indexer/judge/g_words_test.go @@ -24,6 +24,9 @@ func TestTheJudgeReadsMilestoneGsWords(t *testing.T) { `"streams":[{"name":"distribution-findings","events":["finding-written"],"retention":"history"}],"consumes":["mesh-conditions.findings-asked"]}`}, {name: "the node-engine's module is a foundation part (§627)", raw: `{"module":"mesh-host","version":"1.0","state":["findings"],` + `"streams":[{"name":"mesh-host-findings","events":["finding-written.*","finding-cleared.*","findings-stated.*"],"max-age-days":7,"max-mib":16}],"consumes":["mesh-conditions.findings-asked"]}`}, + {name: "an old state section entry with max-mib in its bounds (§469, §695)", raw: `{"module":"a","version":"1.0","state":[{"name":"s","max-mib":128}]}`}, + {name: "an old state section entry with max-mib at zero (§469)", raw: `{"module":"a","version":"1.0","state":[{"name":"s","max-mib":0}]}`, want: "max-mib"}, + {name: "an old state section entry with max-mib past the bound (§469)", raw: `{"module":"a","version":"1.0","state":[{"name":"s","max-mib":9000}]}`, want: "max-mib"}, {name: "another part's old findings and stream (§529, §577)", raw: `{"module":"a","version":"1.0","state":["findings"],` + `"streams":[{"name":"a-findings","events":["finding-written"],"retention":"history"}],"consumes":["mesh-conditions.findings-asked"]}`, want: "old sections"}, {name: "another part's findings in its requires (§529)", raw: `{"module":"a","version":"1.0","consumes":["mesh-conditions.findings-asked"],"requires":[` + diff --git a/modules/mesh-delivery-indexer/judge/rules_test.go b/modules/mesh-delivery-indexer/judge/rules_test.go index 4f3eb0f9..7ff73f7e 100644 --- a/modules/mesh-delivery-indexer/judge/rules_test.go +++ b/modules/mesh-delivery-indexer/judge/rules_test.go @@ -2929,7 +2929,7 @@ func caseAStateNameIsLocalAndOneToken(t *testing.T) { {`{"module":"a.b","version":"1.0","state":["s"]}`, `no dot`}, {`{"module":"a","version":"1.0","reads":["bindings"]}`, `a read is .`}, {`{"module":"a","version":"1.0","reads":["a.s"]}`, `which is its own state`}, - {`{"module":"a","version":"1.0","state":[{"name":"s","shared":true}]}`, `{name, history, ttl-seconds, per-machine, key-ttl, read-only, form, catch-up}`}, + {`{"module":"a","version":"1.0","state":[{"name":"s","shared":true}]}`, `{name, history, ttl-seconds, per-machine, key-ttl, read-only, max-mib, form, catch-up}`}, } { _, err := ParseManifest([]byte(c.manifest)) if c.says == "" { From 5bbd78ad6623bf0fc8e2e504a9e8dcf31735cf36 Mon Sep 17 00:00:00 2001 From: jochen Date: Wed, 11 Nov 2026 23:00:47 +0100 Subject: [PATCH 8/8] JUDGE: the runner's manifest test reads step-log as an old logs section, the indexer's foundation test lists the node-engine's module MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Builds: design 47 G §470, §627 Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h --- .../internal/index/verdicts_test.go | 4 ++-- modules/mesh-delivery-pipeline/manifest_test.go | 13 +++++++------ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/modules/mesh-delivery-indexer/internal/index/verdicts_test.go b/modules/mesh-delivery-indexer/internal/index/verdicts_test.go index b72ad051..b19ec0fd 100644 --- a/modules/mesh-delivery-indexer/internal/index/verdicts_test.go +++ b/modules/mesh-delivery-indexer/internal/index/verdicts_test.go @@ -371,8 +371,8 @@ func TestTheIndexerJudgesEveryManifestOnce(t *testing.T) { } } if !slices.Equal(judge.Foundation, []string{"nats", "mesh-grants", "mesh-delivery-indexer", "mesh-delivery-assigner", "node-tools", - "mesh-delivery-builder", "mesh-delivery-checker", "mesh-config", "mesh-vault", "mesh-delivery-pipeline", "gitea", "distribution"}) { - t.Fatalf("the foundation is %v, want exactly the nine of ADR 0619, the pipeline runner (ADR 0666 §4) and the forge and image registry modules (design 47 G §584)", judge.Foundation) + "mesh-delivery-builder", "mesh-delivery-checker", "mesh-config", "mesh-vault", "mesh-delivery-pipeline", "gitea", "distribution", "mesh-host"}) { + t.Fatalf("the foundation is %v, want exactly the nine of ADR 0619, the pipeline runner (ADR 0666 §4) and the forge and image registry modules (design 47 G §584) and the node-engine's module (§627)", judge.Foundation) } late := hold("late", `{"module":"late","version":"1.0","logs":[{"name":"l"}]}`) grants := hold("mesh-grants", `{"module":"mesh-grants","version":"2.0","logs":[{"name":"l"},{"name":"m"}]}`) diff --git a/modules/mesh-delivery-pipeline/manifest_test.go b/modules/mesh-delivery-pipeline/manifest_test.go index c60c345f..c9dbca69 100644 --- a/modules/mesh-delivery-pipeline/manifest_test.go +++ b/modules/mesh-delivery-pipeline/manifest_test.go @@ -48,12 +48,13 @@ func TestManifest(t *testing.T) { equalSets(m.Claims[0].Serves, seat.Verbs())}, // §27, §85, §330, §355, §77: the old state sections. {"old state sections", equalSets(states, []string{seat.StatePipelines, seat.StateKept, "aged", "findings", "first-views"})}, - // §27, §85: the step log on an old stream, its outputs in an old objects section. - // RN24 (§383, §387): beside it, the finding stream its findings are said on. - {"old streams section", equalSets(streams, []string{seat.StateStepLog, "mesh-delivery-pipeline-findings"})}, - {"step-log 128 MiB", len(m.Streams) == 2 && m.Streams[0].MaxMiB == 128}, - {"finding stream 7 days 16 MiB", len(m.Streams) == 2 && m.Streams[1].MaxAgeDays == 7 && m.Streams[1].MaxMiB == 16 && - equalSets(m.Streams[1].Events, []string{"finding-written.*", "finding-cleared.*", "findings-stated.*"})}, + // §470 (amending §27, §85): the step log is an old logs section kept 100 days, 128 MiB; RN24 (§383, §387): the finding + // stream its findings are said on is the one old stream. + {"old streams section", equalSets(streams, []string{"mesh-delivery-pipeline-findings"})}, + {"step-log an old logs section of 100 days and 128 MiB", len(m.Logs) == 1 && m.Logs[0].Name == seat.StateStepLog && + m.Logs[0].MaxAgeDays == 100 && m.Logs[0].MaxMiB == 128}, + {"finding stream 7 days 16 MiB", len(m.Streams) == 1 && m.Streams[0].MaxAgeDays == 7 && m.Streams[0].MaxMiB == 16 && + equalSets(m.Streams[0].Events, []string{"finding-written.*", "finding-cleared.*", "findings-stated.*"})}, // RN24 (§368): the version as MAJOR.MINOR, 0.1 with none published. {"version 0.1", m.Version == "0.1"}, {"old objects section", equalSets(objects, []string{seat.StateStepOutputs})},