From 6acad9425d8f5212acde5bdb03b86527803fdd72 Mon Sep 17 00:00:00 2001 From: jochen Date: Wed, 11 Nov 2026 10:44:02 +0100 Subject: [PATCH] =?UTF-8?q?CT9:=20the=20registry=20seats'=20text=20callers?= =?UTF-8?q?=20become=20lists=20of=20the=20forms=20of=20=C2=A7336?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Builds: design 47 G §68, §127, §336, §392 (seat:, invokers). Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ --- contracts/parts/registry.json | 23 ++++++++++++++---- .../seats/container-image-registry/seat.json | 24 +++++++++++++------ .../seats/oci-artifact-registry/seat.json | 16 +++++++++---- 3 files changed, 46 insertions(+), 17 deletions(-) diff --git a/contracts/parts/registry.json b/contracts/parts/registry.json index ca0022f8..7dd7844e 100644 --- a/contracts/parts/registry.json +++ b/contracts/parts/registry.json @@ -6,7 +6,11 @@ { "name": "publish", "description": "Open a transfer, naming the artifact and the digest of every part; answers the digests the holder lacks, which the caller then sends by publish-part. A transfer already open answers the parts held, so a cut transfer goes on from there. With no parts and a version, the held digest is published under that version and nothing is stored (the trunk's claim).", - "callers": "the build modules", + "callers": [ + "seat:node-build-go", + "seat:node-build-node", + "seat:node-build-image" + ], "input": { "type": "object", "properties": { @@ -92,7 +96,11 @@ { "name": "publish-part", "description": "Send one chunk of one part of an open transfer; the last chunk of the last part ends the transfer, and the holder hashes what it received, asks builder_versions, stores it and says published or refused. A chunk's message stays under the bus's largest message (1 MiB), so at most 760 KiB of data, base64.", - "callers": "the build modules, and only the proved caller that opened the transfer", + "callers": [ + "seat:node-build-go", + "seat:node-build-node", + "seat:node-build-image" + ], "input": { "type": "object", "properties": { @@ -155,7 +163,9 @@ { "name": "versions", "description": "The versions the seat holds of one name, newest first: each one's version, tag, digest, kind and when it was published.", - "callers": "any caller whose role grants it", + "callers": [ + "invokers" + ], "input": { "type": "object", "properties": { @@ -197,7 +207,10 @@ { "name": "remove", "description": "Remove one tagged version; the holder refuses an untagged one but for the retention removal of a bundle, archive or copied base by the artifact sweep's holder. Every removal emits removed with its reason. A tagged version the store cannot remove alone, because another tag names its digest, stays whole, its tag and bytes kept: the answer says kept with the reason shared-digest and the tags still naming the digest, removed false, and kept is emitted, never removed; the caller ends there without a retry.", - "callers": "the builder, for a tagged version; the artifact sweep's holder, for retention", + "callers": [ + "seat:mesh-builds", + "seat:mesh-artifact-sweep" + ], "input": { "type": "object", "properties": { @@ -410,7 +423,7 @@ }, "reference": { "type": "string", - "description": "the reference the seat answers: //@sha256:, or @ for a package (ADR 0605 §9)" + "description": "the reference the seat answers: //@sha256:, or @ for a package (ADR 0605 \u00a79)" }, "reason": { "type": "string", diff --git a/contracts/seats/container-image-registry/seat.json b/contracts/seats/container-image-registry/seat.json index bc116b4b..2afa16bc 100644 --- a/contracts/seats/container-image-registry/seat.json +++ b/contracts/seats/container-image-registry/seat.json @@ -13,7 +13,9 @@ { "name": "mirror", "description": "Copy an outside image into the store by its pinned digest; emits published or refused.", - "callers": "mesh-build-image's holder of the image build seat", + "callers": [ + "seat:node-build-image" + ], "input": { "type": "object", "properties": { @@ -58,7 +60,9 @@ { "name": "tags", "description": "The tags of one image and the digest each names.", - "callers": "any caller whose role grants it", + "callers": [ + "invokers" + ], "input": { "type": "object", "properties": { @@ -109,8 +113,10 @@ }, { "name": "hold", - "description": "Keep one untagged bundle, archive or copied base from removal by retention, as the artifact sweep's rules keep it (ADR 0617 §2); never an image of the holder's own. Emits held.", - "callers": "the module that runs the artifact sweep alone", + "description": "Keep one untagged bundle, archive or copied base from removal by retention, as the artifact sweep's rules keep it (ADR 0617 \u00a72); never an image of the holder's own. Emits held.", + "callers": [ + "seat:mesh-artifact-sweep" + ], "input": { "type": "object", "properties": { @@ -154,7 +160,9 @@ { "name": "release", "description": "Let a hold go; emits released. A release of what is not held answers released false and emits nothing, never an error: the outcome asked holds already. By hand only through the holder's own tool, the operator's session as the proved caller, recorded as a hand act.", - "callers": "the module that runs the artifact sweep; the operator's session through the holder's tool", + "callers": [ + "seat:mesh-artifact-sweep" + ], "input": { "type": "object", "properties": { @@ -193,8 +201,10 @@ }, { "name": "list", - "description": "What the store holds of one repository, or of every repository the seat holds when none is named: every image manifest and index, each with its digest, whether it is an index (and the manifests an index names), the tags naming it, its size and whether it is held. Read from the store itself, so a manifest no tag names is listed too; it reads only (ADR 0632 §3).", - "callers": "any caller whose role grants it", + "description": "What the store holds of one repository, or of every repository the seat holds when none is named: every image manifest and index, each with its digest, whether it is an index (and the manifests an index names), the tags naming it, its size and whether it is held. Read from the store itself, so a manifest no tag names is listed too; it reads only (ADR 0632 \u00a73).", + "callers": [ + "invokers" + ], "input": { "type": "object", "properties": { diff --git a/contracts/seats/oci-artifact-registry/seat.json b/contracts/seats/oci-artifact-registry/seat.json index ee6f5bf7..5db56ae1 100644 --- a/contracts/seats/oci-artifact-registry/seat.json +++ b/contracts/seats/oci-artifact-registry/seat.json @@ -12,8 +12,10 @@ "verbs": [ { "name": "hold", - "description": "Keep one untagged bundle, archive or copied base from removal by retention, as the artifact sweep's rules keep it (ADR 0617 §2); never an image of the holder's own. Emits held.", - "callers": "the module that runs the artifact sweep alone", + "description": "Keep one untagged bundle, archive or copied base from removal by retention, as the artifact sweep's rules keep it (ADR 0617 \u00a72); never an image of the holder's own. Emits held.", + "callers": [ + "seat:mesh-artifact-sweep" + ], "input": { "type": "object", "properties": { @@ -57,7 +59,9 @@ { "name": "release", "description": "Let a hold go; emits released. A release of what is not held answers released false and emits nothing, never an error: the outcome asked holds already. By hand only through the holder's own tool, the operator's session as the proved caller, recorded as a hand act.", - "callers": "the module that runs the artifact sweep; the operator's session through the holder's tool", + "callers": [ + "seat:mesh-artifact-sweep" + ], "input": { "type": "object", "properties": { @@ -96,8 +100,10 @@ }, { "name": "list", - "description": "What the store holds of one repository, or of every repository the seat holds when none is named: every manifest keeping one bundle or archive, each with its digest, whether it is an index (and the manifests an index names), the tags naming it, its size and whether it is held. Read from the store itself, so a manifest no tag names is listed too; it reads only (ADR 0632 §3).", - "callers": "any caller whose role grants it", + "description": "What the store holds of one repository, or of every repository the seat holds when none is named: every manifest keeping one bundle or archive, each with its digest, whether it is an index (and the manifests an index names), the tags naming it, its size and whether it is held. Read from the store itself, so a manifest no tag names is listed too; it reads only (ADR 0632 \u00a73).", + "callers": [ + "invokers" + ], "input": { "type": "object", "properties": {