From 4f37cc2db919e66114d5b6da9897f1bee80df8de Mon Sep 17 00:00:00 2001 From: jochen Date: Wed, 4 Nov 2026 11:50:54 +0100 Subject: [PATCH] =?UTF-8?q?SD-M2b:=20mesh-broker=20whole:=20its=20eight=20?= =?UTF-8?q?verbs,=20nine=20events=20and=20the=20bus-state=20binding=20(des?= =?UTF-8?q?ign=2025=20=C2=A7=2012.3,=20ADR=200595=20=C2=A75,=20=C2=A76)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig --- seats/mesh-broker/fixtures/events.json | 213 ++++++++++ seats/mesh-broker/fixtures/verbs.json | 51 +++ seats/mesh-broker/seat.json | 536 +++++++++++++++++++++++++ 3 files changed, 800 insertions(+) create mode 100644 seats/mesh-broker/fixtures/events.json create mode 100644 seats/mesh-broker/fixtures/verbs.json create mode 100644 seats/mesh-broker/seat.json diff --git a/seats/mesh-broker/fixtures/events.json b/seats/mesh-broker/fixtures/events.json new file mode 100644 index 0000000..374448d --- /dev/null +++ b/seats/mesh-broker/fixtures/events.json @@ -0,0 +1,213 @@ +[ + { + "name": "created on the seat's subject", + "of": "event:created", + "subject": "mesh.seat.mesh-broker.event.created", + "given": { + "module": "mesh-knowledge", + "local-name": "ledger", + "storage-type": "ledger", + "template": "ledger", + "bus-name": "mesh-knowledge_ledger", + "asked": { + "max-mib": 64 + }, + "held": { + "max-mib": 64 + }, + "fill": { + "count": 10, + "bytes": 2048, + "cap": 67108864 + } + } + }, + { + "name": "refused on the seat's subject", + "of": "event:refused", + "subject": "mesh.seat.mesh-broker.event.refused", + "given": { + "module": "mesh-knowledge", + "local-name": "ledger", + "storage-type": "ledger", + "template": "ledger", + "bus-name": "mesh-knowledge_ledger", + "asked": { + "max-mib": 64 + }, + "held": { + "max-mib": 64 + }, + "fill": { + "count": 10, + "bytes": 2048, + "cap": 67108864 + }, + "why": "the bus refused it" + } + }, + { + "name": "drifted on the seat's subject", + "of": "event:drifted", + "subject": "mesh.seat.mesh-broker.event.drifted", + "given": { + "module": "mesh-knowledge", + "local-name": "ledger", + "storage-type": "ledger", + "template": "ledger", + "bus-name": "mesh-knowledge_ledger", + "asked": { + "max-mib": 64 + }, + "held": { + "max-mib": 64 + }, + "fill": { + "count": 10, + "bytes": 2048, + "cap": 67108864 + }, + "why": "the bus refused it" + } + }, + { + "name": "drift-cleared on the seat's subject", + "of": "event:drift-cleared", + "subject": "mesh.seat.mesh-broker.event.drift-cleared", + "given": { + "module": "mesh-knowledge", + "local-name": "ledger", + "storage-type": "ledger", + "template": "ledger", + "bus-name": "mesh-knowledge_ledger", + "asked": { + "max-mib": 64 + }, + "held": { + "max-mib": 64 + }, + "fill": { + "count": 10, + "bytes": 2048, + "cap": 67108864 + } + } + }, + { + "name": "full on the seat's subject", + "of": "event:full", + "subject": "mesh.seat.mesh-broker.event.full", + "given": { + "module": "mesh-knowledge", + "local-name": "ledger", + "storage-type": "ledger", + "template": "ledger", + "bus-name": "mesh-knowledge_ledger", + "asked": { + "max-mib": 64 + }, + "held": { + "max-mib": 64 + }, + "fill": { + "count": 10, + "bytes": 2048, + "cap": 67108864 + } + } + }, + { + "name": "full-cleared on the seat's subject", + "of": "event:full-cleared", + "subject": "mesh.seat.mesh-broker.event.full-cleared", + "given": { + "module": "mesh-knowledge", + "local-name": "ledger", + "storage-type": "ledger", + "template": "ledger", + "bus-name": "mesh-knowledge_ledger", + "asked": { + "max-mib": 64 + }, + "held": { + "max-mib": 64 + }, + "fill": { + "count": 10, + "bytes": 2048, + "cap": 67108864 + } + } + }, + { + "name": "orphaned on the seat's subject", + "of": "event:orphaned", + "subject": "mesh.seat.mesh-broker.event.orphaned", + "given": { + "module": "mesh-knowledge", + "local-name": "ledger", + "storage-type": "ledger", + "template": "ledger", + "bus-name": "mesh-knowledge_ledger", + "asked": { + "max-mib": 64 + }, + "held": { + "max-mib": 64 + }, + "fill": { + "count": 10, + "bytes": 2048, + "cap": 67108864 + } + } + }, + { + "name": "recreated on the seat's subject", + "of": "event:recreated", + "subject": "mesh.seat.mesh-broker.event.recreated", + "given": { + "module": "mesh-knowledge", + "local-name": "ledger", + "storage-type": "ledger", + "template": "ledger", + "bus-name": "mesh-knowledge_ledger", + "asked": { + "max-mib": 64 + }, + "held": { + "max-mib": 64 + }, + "fill": { + "count": 10, + "bytes": 2048, + "cap": 67108864 + }, + "why": "the bus refused it" + } + }, + { + "name": "dropped on the seat's subject", + "of": "event:dropped", + "subject": "mesh.seat.mesh-broker.event.dropped", + "given": { + "module": "mesh-knowledge", + "local-name": "ledger", + "storage-type": "ledger", + "template": "ledger", + "bus-name": "mesh-knowledge_ledger", + "asked": { + "max-mib": 64 + }, + "held": { + "max-mib": 64 + }, + "fill": { + "count": 10, + "bytes": 2048, + "cap": 67108864 + }, + "why": "the bus refused it" + } + } +] diff --git a/seats/mesh-broker/fixtures/verbs.json b/seats/mesh-broker/fixtures/verbs.json new file mode 100644 index 0000000..a1d5c41 --- /dev/null +++ b/seats/mesh-broker/fixtures/verbs.json @@ -0,0 +1,51 @@ +[ + { + "name": "create one entry", + "of": "verb:create.input", + "given": { + "module": "mesh-knowledge", + "local-name": "ledger", + "storage-type": "ledger", + "template": "ledger", + "options": { + "max-mib": 64 + } + } + }, + { + "name": "drop on the operator's warrant", + "of": "verb:drop.input", + "given": { + "module": "mesh-knowledge", + "local-name": "old", + "warrant": "w-1", + "why": "the operator approved the drop" + } + }, + { + "name": "list answers every entry", + "of": "verb:list.answer", + "given": { + "entries": [ + { + "module": "mesh-knowledge", + "local-name": "ledger", + "storage-type": "ledger", + "template": "ledger", + "options": { + "max-mib": 64 + }, + "bus-name": "mesh-knowledge_ledger", + "settings": { + "max-mib": 64 + }, + "fill": { + "count": 10, + "bytes": 2048, + "cap": 67108864 + } + } + ] + } + } +] diff --git a/seats/mesh-broker/seat.json b/seats/mesh-broker/seat.json new file mode 100644 index 0000000..59df817 --- /dev/null +++ b/seats/mesh-broker/seat.json @@ -0,0 +1,536 @@ +{ + "format": 1, + "seat": "mesh-broker", + "scope": "mesh", + "grain": "whole", + "decision": "novox/hq ADR 0079; novox/hq ADR 0595", + "delivers": "mesh-bus", + "description": "The mesh's bus, and the bus state modules ask of it in requires (design 25 § 12). create, apply, recreate and drop are granted to the bus module's own credential alone.", + "verbs": [ + { + "name": "list", + "description": "Every entry the bus module created, its template, its settings and its fill against its cap.", + "callers": "any caller whose role grants it", + "input": { + "type": "object", + "properties": { + "module": { + "type": "string", + "description": "one module (optional)" + } + } + }, + "answer": { + "type": "object", + "properties": { + "entries": { + "type": "array", + "items": { + "$ref": "#/defs/Held" + }, + "description": "every entry" + } + }, + "required": [ + "entries" + ] + } + }, + { + "name": "show", + "description": "One entry, its template, settings and fill.", + "callers": "any caller whose role grants it", + "input": { + "$ref": "#/defs/Named" + }, + "answer": { + "$ref": "#/defs/Held" + } + }, + { + "name": "check", + "description": "Compare what the bus holds with what was asked, entry by entry; a difference that only grows is said as such.", + "callers": "any caller whose role grants it", + "input": { + "type": "object", + "properties": { + "module": { + "type": "string", + "description": "one module (optional)" + } + } + }, + "answer": { + "type": "object", + "properties": { + "differences": { + "type": "array", + "items": { + "type": "object", + "properties": { + "module": { + "type": "string", + "description": "the module" + }, + "local-name": { + "type": "string", + "description": "the entry" + }, + "asked": { + "type": "object", + "description": "asked" + }, + "held": { + "type": "object", + "description": "held" + }, + "grows": { + "type": "boolean", + "description": "the difference only grows: apply may act on it" + } + }, + "required": [ + "module", + "local-name" + ] + }, + "description": "every difference" + } + }, + "required": [ + "differences" + ] + } + }, + { + "name": "orphans", + "description": "Entries the bus holds that no manifest asks for; never one whose manifest the judge refused or outgrew, nor one of the foundation's old sections.", + "callers": "any caller whose role grants it", + "input": { + "type": "object", + "properties": {}, + "description": "no arguments" + }, + "answer": { + "type": "object", + "properties": { + "entries": { + "type": "array", + "items": { + "$ref": "#/defs/Held" + }, + "description": "every orphan" + } + }, + "required": [ + "entries" + ] + } + }, + { + "name": "create", + "description": "Create one entry now.", + "callers": "the bus module's own process only", + "input": { + "$ref": "#/defs/Entry" + }, + "answer": { + "$ref": "#/defs/Held" + } + }, + { + "name": "apply", + "description": "Apply a difference that only grows: a larger cap, a longer age.", + "callers": "the bus module's own process only", + "input": { + "$ref": "#/defs/Named" + }, + "answer": { + "$ref": "#/defs/Held" + } + }, + { + "name": "recreate", + "description": "Rebuild an entry whose settings differ in a way that cannot grow, from its data where the storage type allows, after a stream snapshot.", + "callers": "the bus module's process, on the operator's warrant", + "input": { + "$ref": "#/defs/Warranted" + }, + "answer": { + "$ref": "#/defs/Held" + } + }, + { + "name": "drop", + "description": "Remove one orphan, after a stream snapshot.", + "callers": "the bus module's process, on the operator's warrant", + "input": { + "$ref": "#/defs/Warranted" + }, + "answer": { + "type": "object", + "properties": { + "dropped": { + "type": "boolean", + "description": "it is gone" + }, + "snapshot": { + "type": "string", + "description": "the snapshot taken first" + } + }, + "required": [ + "dropped" + ] + } + } + ], + "events": [ + { + "name": "created", + "body": { + "$ref": "#/defs/Said" + } + }, + { + "name": "refused", + "body": { + "$ref": "#/defs/Said" + } + }, + { + "name": "drifted", + "body": { + "$ref": "#/defs/Said" + } + }, + { + "name": "drift-cleared", + "body": { + "$ref": "#/defs/Said" + } + }, + { + "name": "full", + "body": { + "$ref": "#/defs/Said" + } + }, + { + "name": "full-cleared", + "body": { + "$ref": "#/defs/Said" + } + }, + { + "name": "orphaned", + "body": { + "$ref": "#/defs/Said" + } + }, + { + "name": "recreated", + "body": { + "$ref": "#/defs/Said" + } + }, + { + "name": "dropped", + "body": { + "$ref": "#/defs/Said" + } + } + ], + "family": { + "name": "mesh-broker.events", + "max-age-days": 30, + "max-mib": 256 + }, + "provisions": [ + { + "name": "bus-state", + "form": { + "type": "object", + "properties": { + "bus-name": { + "type": "string", + "description": "the entry's name on the bus" + }, + "storage-type": { + "type": "string", + "description": "how the bus keeps it" + }, + "template": { + "type": "string", + "description": "its template" + }, + "subjects": { + "type": "array", + "items": { + "type": "string" + }, + "description": "its subjects, for a stream" + } + }, + "required": [ + "bus-name", + "storage-type" + ], + "description": "the binding a module receives in its membership for one entry (ADR 0595 §1, §7)" + } + } + ], + "defs": { + "Entry": { + "type": "object", + "properties": { + "module": { + "type": "string", + "description": "the module asking it" + }, + "local-name": { + "type": "string", + "description": "its local name in the module's manifest" + }, + "storage-type": { + "type": "string", + "enum": [ + "stream", + "key-value", + "object-store", + "ledger" + ], + "description": "how the bus keeps it" + }, + "template": { + "type": "string", + "enum": [ + "state", + "events", + "work-queue", + "log", + "objects", + "ledger", + "" + ], + "description": "its template; empty for a configuration of its own" + }, + "options": { + "type": "object", + "description": "the template's options the module set, within their bounds" + }, + "configuration": { + "type": "object", + "description": "its own configuration, where no template fits" + } + }, + "required": [ + "module", + "local-name", + "storage-type" + ], + "description": "one piece of bus state as a manifest asks it" + }, + "Fill": { + "type": "object", + "properties": { + "count": { + "type": "integer", + "description": "messages, keys or objects held" + }, + "bytes": { + "type": "integer", + "description": "bytes held" + }, + "cap": { + "type": "integer", + "description": "its cap in bytes" + } + }, + "required": [ + "count", + "bytes", + "cap" + ] + }, + "Held": { + "type": "object", + "properties": { + "module": { + "type": "string", + "description": "the module asking it" + }, + "local-name": { + "type": "string", + "description": "its local name in the module's manifest" + }, + "storage-type": { + "type": "string", + "enum": [ + "stream", + "key-value", + "object-store", + "ledger" + ], + "description": "how the bus keeps it" + }, + "template": { + "type": "string", + "enum": [ + "state", + "events", + "work-queue", + "log", + "objects", + "ledger", + "" + ], + "description": "its template; empty for a configuration of its own" + }, + "options": { + "type": "object", + "description": "the template's options the module set, within their bounds" + }, + "configuration": { + "type": "object", + "description": "its own configuration, where no template fits" + }, + "bus-name": { + "type": "string", + "description": "its name on the bus, _" + }, + "settings": { + "type": "object", + "description": "the settings the bus holds" + }, + "fill": { + "$ref": "#/defs/Fill" + } + }, + "required": [ + "module", + "local-name", + "storage-type", + "bus-name" + ], + "description": "one entry as the bus holds it" + }, + "Said": { + "type": "object", + "properties": { + "module": { + "type": "string", + "description": "the module asking it" + }, + "local-name": { + "type": "string", + "description": "its local name in the module's manifest" + }, + "storage-type": { + "type": "string", + "enum": [ + "stream", + "key-value", + "object-store", + "ledger" + ], + "description": "how the bus keeps it" + }, + "template": { + "type": "string", + "enum": [ + "state", + "events", + "work-queue", + "log", + "objects", + "ledger", + "" + ], + "description": "its template; empty for a configuration of its own" + }, + "options": { + "type": "object", + "description": "the template's options the module set, within their bounds" + }, + "configuration": { + "type": "object", + "description": "its own configuration, where no template fits" + }, + "bus-name": { + "type": "string", + "description": "its name on the bus" + }, + "asked": { + "type": "object", + "description": "the settings asked" + }, + "held": { + "type": "object", + "description": "the settings held" + }, + "why": { + "type": "string", + "description": "why: a refusal's cause, a drift's difference, a drop's or recreate's reason" + }, + "fill": { + "$ref": "#/defs/Fill" + }, + "snapshot": { + "type": "string", + "description": "the stream snapshot taken before a recreate or drop" + } + }, + "required": [ + "module", + "local-name", + "bus-name" + ], + "description": "the body of every event of the seat" + }, + "Named": { + "type": "object", + "properties": { + "module": { + "type": "string", + "description": "the module" + }, + "local-name": { + "type": "string", + "description": "the entry's local name" + } + }, + "required": [ + "module", + "local-name" + ] + }, + "Warranted": { + "type": "object", + "properties": { + "module": { + "type": "string", + "description": "the module" + }, + "local-name": { + "type": "string", + "description": "the entry's local name" + }, + "warrant": { + "type": "string", + "description": "the operator's warrant, as the operator channel decided it (ADR 0259 §6)" + }, + "why": { + "type": "string", + "description": "why, kept in the record" + } + }, + "required": [ + "module", + "local-name", + "warrant", + "why" + ] + } + } +}