From 13ba1495cbe221c898fc86fbd7c800dfba0e359d Mon Sep 17 00:00:00 2001 From: Antoine Toussaint <312536060+antoinetoussaint-byte@users.noreply.github.com> Date: Mon, 26 Oct 2026 19:48:57 -0400 Subject: [PATCH 1/6] authority: ship the module's package manifest, so a host run admits the hop A run admits every module-identity workload but the host's own. Since #28 made authority/hop module-identity, a run on a host other than the local authority (a saas host) admits the authority module and needs its release, and every module behind the hop failed before start: "module authority declares no package manifest, so it names no release". modules/authority/module.package.codefly.yaml names the release (codefly/authority 0.1.0) and the services the interface exports (local, hop, edge). Each service's api-contracts, contracts/api and the catalog are written by `codefly generate contracts authority`; contracts.codefly.yaml maps the local authority's grpc listener to the seven services it serves, since that listener spans packages. Co-Authored-By: Claude Opus 5.5 --- modules/authority/contracts.codefly.yaml | 8 + .../contracts/api/catalog.codefly.json | 135 ++++++ .../contracts/api/hop/grpc/contract.binpb | Bin 0 -> 94419 bytes .../contracts/api/hop/grpc/proto/api.proto | 23 + .../contracts/api/hop/grpc/proto/buf.gen.yaml | 26 ++ .../contracts/api/hop/grpc/proto/buf.lock | 8 + .../contracts/api/hop/grpc/proto/buf.yaml | 7 + .../contracts/api/hop/http/openapi.json | 80 ++++ .../contracts/api/local/grpc/contract.binpb | Bin 0 -> 397951 bytes .../contracts/api/local/grpc/proto/api.proto | 23 + .../api/local/grpc/proto/buf.gen.yaml | 26 ++ .../contracts/api/local/grpc/proto/buf.lock | 13 + .../contracts/api/local/grpc/proto/buf.yaml | 8 + .../proto/host/artifact/v1/artifact.proto | 87 ++++ .../proto/host/authority/v1/authority.proto | 416 ++++++++++++++++++ .../host/authority/v1/work_context.proto | 308 +++++++++++++ .../host/composition/v1/composition.proto | 171 +++++++ .../host/installation/v1/installation.proto | 293 ++++++++++++ .../grpc/proto/host/session/v1/session.proto | 88 ++++ .../contracts/api/local/rest/openapi.json | 80 ++++ modules/authority/module.package.codefly.yaml | 51 +++ .../services/local/contract-surfaces.json | 73 +++ 22 files changed, 1924 insertions(+) create mode 100644 modules/authority/contracts.codefly.yaml create mode 100644 modules/authority/contracts/api/catalog.codefly.json create mode 100644 modules/authority/contracts/api/hop/grpc/contract.binpb create mode 100644 modules/authority/contracts/api/hop/grpc/proto/api.proto create mode 100644 modules/authority/contracts/api/hop/grpc/proto/buf.gen.yaml create mode 100644 modules/authority/contracts/api/hop/grpc/proto/buf.lock create mode 100644 modules/authority/contracts/api/hop/grpc/proto/buf.yaml create mode 100644 modules/authority/contracts/api/hop/http/openapi.json create mode 100644 modules/authority/contracts/api/local/grpc/contract.binpb create mode 100644 modules/authority/contracts/api/local/grpc/proto/api.proto create mode 100644 modules/authority/contracts/api/local/grpc/proto/buf.gen.yaml create mode 100644 modules/authority/contracts/api/local/grpc/proto/buf.lock create mode 100644 modules/authority/contracts/api/local/grpc/proto/buf.yaml create mode 100644 modules/authority/contracts/api/local/grpc/proto/host/artifact/v1/artifact.proto create mode 100644 modules/authority/contracts/api/local/grpc/proto/host/authority/v1/authority.proto create mode 100644 modules/authority/contracts/api/local/grpc/proto/host/authority/v1/work_context.proto create mode 100644 modules/authority/contracts/api/local/grpc/proto/host/composition/v1/composition.proto create mode 100644 modules/authority/contracts/api/local/grpc/proto/host/installation/v1/installation.proto create mode 100644 modules/authority/contracts/api/local/grpc/proto/host/session/v1/session.proto create mode 100644 modules/authority/contracts/api/local/rest/openapi.json create mode 100644 modules/authority/module.package.codefly.yaml create mode 100644 modules/authority/services/local/contract-surfaces.json diff --git a/modules/authority/contracts.codefly.yaml b/modules/authority/contracts.codefly.yaml new file mode 100644 index 00000000..c8b360c1 --- /dev/null +++ b/modules/authority/contracts.codefly.yaml @@ -0,0 +1,8 @@ +# Publication configuration for `codefly generate contracts`: the local +# authority's grpc listener serves its own LocalService and the host interfaces +# (authority, composition, installation, session) plus the artifact service, so +# the catalog carries what that listener serves. The hop's endpoints serve one +# package each and need no inventory. +schema: codefly/module-contracts-config/v1 +surfaces: + local: contract-surfaces.json diff --git a/modules/authority/contracts/api/catalog.codefly.json b/modules/authority/contracts/api/catalog.codefly.json new file mode 100644 index 00000000..3d55e517 --- /dev/null +++ b/modules/authority/contracts/api/catalog.codefly.json @@ -0,0 +1,135 @@ +{ + "schema": "codefly/module-api-contracts/v1", + "package": "codefly/authority", + "version": "0.1.0", + "endpoints": [ + { + "service": "hop", + "endpoint": "grpc", + "api": "grpc", + "kind": "protobuf", + "package": "api", + "path": "contracts/api/hop/grpc/contract.binpb", + "digest": "sha256:3e8a1569199fd9fcbee7e109b35905431aea544a45cf0f125bafdd60cfc890d9", + "services": [ + { + "name": "HopService", + "fullName": "api.HopService", + "procedures": [ + "/api.HopService/Version" + ] + } + ] + }, + { + "service": "hop", + "endpoint": "http", + "api": "http", + "kind": "openapi", + "package": "api.proto", + "path": "contracts/api/hop/http/openapi.json", + "digest": "sha256:9d605f19705f300600451f2dc65f50c8a3417574df7e3791a7497553018aeb2c", + "routes": [ + { + "method": "GET", + "path": "/version" + } + ] + }, + { + "service": "local", + "endpoint": "grpc", + "api": "grpc", + "kind": "protobuf", + "package": "", + "path": "contracts/api/local/grpc/contract.binpb", + "digest": "sha256:1c51ec903d141b1df6c0eff0fcaa10aa48b6633e0753a13718bef83d086dc0cb", + "services": [ + { + "name": "LocalService", + "fullName": "api.LocalService", + "procedures": [ + "/api.LocalService/Version" + ] + }, + { + "name": "ArtifactService", + "fullName": "host.artifact.v1.ArtifactService", + "procedures": [ + "/host.artifact.v1.ArtifactService/Approve", + "/host.artifact.v1.ArtifactService/Authorize", + "/host.artifact.v1.ArtifactService/Revoke" + ] + }, + { + "name": "AuthorityService", + "fullName": "host.authority.v1.AuthorityService", + "procedures": [ + "/host.authority.v1.AuthorityService/AttachResource", + "/host.authority.v1.AuthorityService/AuthorizeTransfer", + "/host.authority.v1.AuthorityService/Check", + "/host.authority.v1.AuthorityService/Delegate", + "/host.authority.v1.AuthorityService/DetachResource", + "/host.authority.v1.AuthorityService/GetDelegation", + "/host.authority.v1.AuthorityService/Issue", + "/host.authority.v1.AuthorityService/Keys", + "/host.authority.v1.AuthorityService/ListResources", + "/host.authority.v1.AuthorityService/RegisterAdmissionKey", + "/host.authority.v1.AuthorityService/RevokeDelegation" + ] + }, + { + "name": "CompositionService", + "fullName": "host.composition.v1.CompositionService", + "procedures": [ + "/host.composition.v1.CompositionService/ApplyManifest" + ] + }, + { + "name": "InstallationService", + "fullName": "host.installation.v1.InstallationService", + "procedures": [ + "/host.installation.v1.InstallationService/GrantRole", + "/host.installation.v1.InstallationService/Install", + "/host.installation.v1.InstallationService/List", + "/host.installation.v1.InstallationService/ListRoleGrants", + "/host.installation.v1.InstallationService/Review", + "/host.installation.v1.InstallationService/RevokeRole" + ] + }, + { + "name": "OfferService", + "fullName": "host.installation.v1.OfferService", + "procedures": [ + "/host.installation.v1.OfferService/ListOffers", + "/host.installation.v1.OfferService/ReviewOffer" + ] + }, + { + "name": "SessionService", + "fullName": "host.session.v1.SessionService", + "procedures": [ + "/host.session.v1.SessionService/Current", + "/host.session.v1.SessionService/ListFixturePeople", + "/host.session.v1.SessionService/SignIn" + ] + } + ] + }, + { + "service": "local", + "endpoint": "rest", + "api": "rest", + "kind": "openapi", + "package": "api.proto", + "path": "contracts/api/local/rest/openapi.json", + "digest": "sha256:dc9c7adab86fcf9878f145988c5a5eddf509ac9f59980f0f660b804c91258796", + "routes": [ + { + "method": "GET", + "path": "/version" + } + ] + } + ] +} diff --git a/modules/authority/contracts/api/hop/grpc/contract.binpb b/modules/authority/contracts/api/hop/grpc/contract.binpb new file mode 100644 index 0000000000000000000000000000000000000000..7a1246909bbffa1362b4ad5096c77e1066b39c05 GIT binary patch literal 94419 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 literal 0 HcmV?d00001 diff --git a/modules/authority/contracts/api/hop/grpc/proto/api.proto b/modules/authority/contracts/api/hop/grpc/proto/api.proto new file mode 100644 index 00000000..34880301 --- /dev/null +++ b/modules/authority/contracts/api/hop/grpc/proto/api.proto @@ -0,0 +1,23 @@ +syntax = "proto3"; +package api; + +// Keep the Go import path stable while the protobuf package remains free to +// evolve into a versioned wire namespace (for example coordination.v1). +option go_package = "hop/pkg/gen;gen"; + +import "google/api/annotations.proto"; + +message VersionRequest { +} + +message VersionResponse { + string version = 1; +} + +service HopService { + rpc Version(VersionRequest) returns (VersionResponse) { + option (google.api.http) = { + get: "/version" + }; + } +} diff --git a/modules/authority/contracts/api/hop/grpc/proto/buf.gen.yaml b/modules/authority/contracts/api/hop/grpc/proto/buf.gen.yaml new file mode 100644 index 00000000..75b595bc --- /dev/null +++ b/modules/authority/contracts/api/hop/grpc/proto/buf.gen.yaml @@ -0,0 +1,26 @@ +version: v1 +# Go package identity is explicit in api.proto. Managed rewriting couples Go +# package names to protobuf namespaces and breaks versioned wire packages. +managed: + enabled: false +plugins: + - name: go + path: protoc-gen-go + out: ../code/pkg/gen + opt: paths=source_relative + - name: go-grpc + path: protoc-gen-go-grpc + out: ../code/pkg/gen + opt: paths=source_relative + - name: grpc-gateway + path: protoc-gen-grpc-gateway + out: ../code/pkg/gen + opt: + - paths=source_relative + - name: connect-go + path: protoc-gen-connect-go + out: ../code/pkg/gen + opt: paths=source_relative + - name: openapiv2 + path: protoc-gen-openapiv2 + out: ../openapi diff --git a/modules/authority/contracts/api/hop/grpc/proto/buf.lock b/modules/authority/contracts/api/hop/grpc/proto/buf.lock new file mode 100644 index 00000000..225f0505 --- /dev/null +++ b/modules/authority/contracts/api/hop/grpc/proto/buf.lock @@ -0,0 +1,8 @@ +# Generated by buf. DO NOT EDIT. +version: v1 +deps: + - remote: buf.build + owner: googleapis + repository: googleapis + commit: 8ac61b9e502343289c8c42b17aa5b245 + digest: shake256:30840693e3b5edac0f461e7168da1057b36a5df75d2d0c6fd920f8442a2f51afb22c955ad5afc25a1394f6e2de65d623844594a37d9f9ce093c48d6afe6a3e55 diff --git a/modules/authority/contracts/api/hop/grpc/proto/buf.yaml b/modules/authority/contracts/api/hop/grpc/proto/buf.yaml new file mode 100644 index 00000000..bfb72f12 --- /dev/null +++ b/modules/authority/contracts/api/hop/grpc/proto/buf.yaml @@ -0,0 +1,7 @@ +version: v1 +deps: + - buf.build/googleapis/googleapis +lint: + use: + - DEFAULT + - COMMENTS diff --git a/modules/authority/contracts/api/hop/http/openapi.json b/modules/authority/contracts/api/hop/http/openapi.json new file mode 100644 index 00000000..62cffdf6 --- /dev/null +++ b/modules/authority/contracts/api/hop/http/openapi.json @@ -0,0 +1,80 @@ +{ + "swagger": "2.0", + "info": { + "title": "api.proto", + "version": "version not set" + }, + "tags": [ + { + "name": "HopService" + } + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "paths": { + "/version": { + "get": { + "operationId": "HopService_Version", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/apiVersionResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "tags": [ + "HopService" + ] + } + } + }, + "definitions": { + "apiVersionResponse": { + "type": "object", + "properties": { + "version": { + "type": "string" + } + } + }, + "protobufAny": { + "type": "object", + "properties": { + "@type": { + "type": "string" + } + }, + "additionalProperties": {} + }, + "rpcStatus": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/protobufAny" + } + } + } + } + } +} diff --git a/modules/authority/contracts/api/local/grpc/contract.binpb b/modules/authority/contracts/api/local/grpc/contract.binpb new file mode 100644 index 0000000000000000000000000000000000000000..64bdfd23ca4138b3e215d0400ed63df111e95e0d GIT binary patch literal 397951 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%0D!WnSNkkd7+n>bQ_=@#qSQ0R%Dw#y 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 Uz`lRLi%oa}_Wc(xOQxj%3oCW&-~a#s literal 0 HcmV?d00001 diff --git a/modules/authority/contracts/api/local/grpc/proto/api.proto b/modules/authority/contracts/api/local/grpc/proto/api.proto new file mode 100644 index 00000000..ceac236a --- /dev/null +++ b/modules/authority/contracts/api/local/grpc/proto/api.proto @@ -0,0 +1,23 @@ +syntax = "proto3"; +package api; + +// Keep the Go import path stable while the protobuf package remains free to +// evolve into a versioned wire namespace (for example coordination.v1). +option go_package = "gateway/pkg/gen;gen"; + +import "google/api/annotations.proto"; + +message VersionRequest { +} + +message VersionResponse { + string version = 1; +} + +service LocalService { + rpc Version(VersionRequest) returns (VersionResponse) { + option (google.api.http) = { + get: "/version" + }; + } +} diff --git a/modules/authority/contracts/api/local/grpc/proto/buf.gen.yaml b/modules/authority/contracts/api/local/grpc/proto/buf.gen.yaml new file mode 100644 index 00000000..75b595bc --- /dev/null +++ b/modules/authority/contracts/api/local/grpc/proto/buf.gen.yaml @@ -0,0 +1,26 @@ +version: v1 +# Go package identity is explicit in api.proto. Managed rewriting couples Go +# package names to protobuf namespaces and breaks versioned wire packages. +managed: + enabled: false +plugins: + - name: go + path: protoc-gen-go + out: ../code/pkg/gen + opt: paths=source_relative + - name: go-grpc + path: protoc-gen-go-grpc + out: ../code/pkg/gen + opt: paths=source_relative + - name: grpc-gateway + path: protoc-gen-grpc-gateway + out: ../code/pkg/gen + opt: + - paths=source_relative + - name: connect-go + path: protoc-gen-connect-go + out: ../code/pkg/gen + opt: paths=source_relative + - name: openapiv2 + path: protoc-gen-openapiv2 + out: ../openapi diff --git a/modules/authority/contracts/api/local/grpc/proto/buf.lock b/modules/authority/contracts/api/local/grpc/proto/buf.lock new file mode 100644 index 00000000..67b5b199 --- /dev/null +++ b/modules/authority/contracts/api/local/grpc/proto/buf.lock @@ -0,0 +1,13 @@ +# Generated by buf. DO NOT EDIT. +version: v1 +deps: + - remote: buf.build + owner: bufbuild + repository: protovalidate + commit: 511051f7f4374c3ca873b53ae68a9288 + digest: shake256:b91195e22365fb4736bb8ace3d463030446c7e2fc347af38be074bdc335531150ec5c648f9f75c7993199e2cb85c62c21928f1b9113175c32348ad5f453ef99f + - remote: buf.build + owner: googleapis + repository: googleapis + commit: 8ac61b9e502343289c8c42b17aa5b245 + digest: shake256:30840693e3b5edac0f461e7168da1057b36a5df75d2d0c6fd920f8442a2f51afb22c955ad5afc25a1394f6e2de65d623844594a37d9f9ce093c48d6afe6a3e55 diff --git a/modules/authority/contracts/api/local/grpc/proto/buf.yaml b/modules/authority/contracts/api/local/grpc/proto/buf.yaml new file mode 100644 index 00000000..48ccabfd --- /dev/null +++ b/modules/authority/contracts/api/local/grpc/proto/buf.yaml @@ -0,0 +1,8 @@ +version: v1 +deps: + - buf.build/googleapis/googleapis + - buf.build/bufbuild/protovalidate +lint: + use: + - DEFAULT + - COMMENTS diff --git a/modules/authority/contracts/api/local/grpc/proto/host/artifact/v1/artifact.proto b/modules/authority/contracts/api/local/grpc/proto/host/artifact/v1/artifact.proto new file mode 100644 index 00000000..52019782 --- /dev/null +++ b/modules/authority/contracts/api/local/grpc/proto/host/artifact/v1/artifact.proto @@ -0,0 +1,87 @@ +syntax = "proto3"; +// The artifact interface: a person's consent to an exact authored artifact a +// module runs (an agent's configuration, an intent version), for one +// installation, under one policy. A policy is a resource kind: approving +// requires its `activate` action at the module, running requires its `run`. +// Consent is given in person and read back at every run; it is never a +// credential to execute or read anything. +package host.artifact.v1; + +option go_package = "gateway/pkg/gen/host/artifact/v1;artifactv1"; + +// ArtifactService is implemented by the host and by the local authority. +service ArtifactService { + // Approve records the person's consent to the identity for the installation + // under the policy. The person is present: the parent is theirs, addressed + // to the asking module, with no module acting between, and holds the policy + // kind's activate action there. An identity already approved answers the + // same approval; one whose approval was revoked is refused. Consent is + // durable: the host keeps it in its store, so it outlives the process that + // recorded it and answers every run until it is revoked. + rpc Approve(ArtifactRequest) returns (Approval); + // Authorize answers the standing approval of the identity, for a run: the + // parent may be delegated and holds the policy kind's run action. It never + // creates consent. + rpc Authorize(ArtifactRequest) returns (Approval); + // Revoke withdraws an approval, permanently, for a person present holding + // the policy kind's activate action. + rpc Revoke(RevokeRequest) returns (Approval); +} + +// Contract is one contract the artifact is compiled against. +message Contract { + string kind = 1; + string name = 2; + string digest = 3; +} + +// Identity is the artifact's complete canonical identity, as the module's +// compiler exports it: references and digests, never authored content. +message Identity { + // The schema the subject is written in, which owns its canonical bytes. + string schema = 1; + // The source the artifact belongs to. + string source = 2; + // The canonical subject. + bytes subject = 3; + // The contracts it is compiled against. + repeated Contract contracts = 4; + // The revision the module expects the approval at. + int64 expected_revision = 5; +} + +// ArtifactRequest asks about one identity, for one installation, under one policy. +message ArtifactRequest { + // The Work Context the module was presented, addressed to it: whose consent + // this is, and what they hold there. + string parent_token = 1; + // The module asking, by its workload credential. + string actor_credential = 2; + // The installation the artifact runs in. + string installation_id = 3; + // The policy: a resource kind at the module. + string policy = 4; + // The artifact. + Identity identity = 5; +} + +// RevokeRequest withdraws one approval. +message RevokeRequest { + string parent_token = 1; + string actor_credential = 2; + string installation_id = 3; + // The policy the approval was given under. + string policy = 4; + // The approval, by its id. + string approval_id = 5; +} + +// Approval is the host's exact consent reference. +message Approval { + // host/approved-artifacts/. + string qualified_name = 1; + // sha256: of the identity approved. + string digest = 2; + // The revision the approval was given at. + int64 expected_revision = 3; +} diff --git a/modules/authority/contracts/api/local/grpc/proto/host/authority/v1/authority.proto b/modules/authority/contracts/api/local/grpc/proto/host/authority/v1/authority.proto new file mode 100644 index 00000000..104828ea --- /dev/null +++ b/modules/authority/contracts/api/local/grpc/proto/host/authority/v1/authority.proto @@ -0,0 +1,416 @@ +syntax = "proto3"; +// The authority interface: what a module or solution calls on its host to be +// issued a Work Context, to have one checked, and to learn the keys it was +// signed with, and to ask which resources of a kind it covers. Every former spelling (start task, start +// installation task, exchange audience, start child, renew, the module broker's +// mints) is Issue with a different `as`. +package host.authority.v1; + +option go_package = "gateway/pkg/gen/host/authority/v1;authorityv1"; + +import "google/api/annotations.proto"; +import "host/authority/v1/work_context.proto"; + +// AuthorityService is implemented by the host (accounts) and by the local authority. +service AuthorityService { + // Issue signs a Work Context for one owner shape, one audience and the scopes + // asked for, bounded by what the owner holds and what the audience declared. + // Served over REST too (POST /v1/authority:issue), for a module with no + // generated client of its own, as a Python service: the same request and + // answer, in JSON. + rpc Issue(IssueRequest) returns (IssueResponse) { + option (google.api.http) = {post: "/v1/authority:issue" body: "*"}; + } + // Check verifies a presented Work Context for the audience the caller is, + // re-checking the authorization revision and the seal live. + rpc Check(CheckRequest) returns (CheckResponse) { + option (google.api.http) = {post: "/v1/authority:check" body: "*"}; + } + // Keys returns the issuer and the public keys a verifier pins: the Work + // Context keys, and the hop admission keys a module behind the hop checks + // each call's admission by. + rpc Keys(KeysRequest) returns (KeysResponse); + // RegisterAdmissionKey is how the hop tells the authority the public key it + // signs call admissions with, so Keys publishes it in admission_keys. The + // caller is the hop, proving it with its workload credential; any other + // workload is refused by name. Only the public half travels: the hop's seed + // never leaves it. Registering the same key again is idempotent and renews + // it, and a registration lapses at expires_at_unix unless renewed, so a hop + // renews while it runs (a restarted authority learns the key again at the + // next renewal) and a key no running hop signs with any more is withdrawn + // without being named. While a rotation overlaps, the retiring and the new + // key are both registered, and both published. + rpc RegisterAdmissionKey(RegisterAdmissionKeyRequest) returns (RegisterAdmissionKeyResponse); + // ListResources answers which resources of one kind a checked capability may + // act on with one action, decided by the authority at the time of the call + // rather than carried in the capability. A module maps the answer onto its + // own resources; the authority knows them only by id. + rpc ListResources(ListResourcesRequest) returns (ListResourcesResponse); + // AttachResource records that one resource now belongs to an installation, + // so a role scope its solution declares installation-owned + // (RoleV1.installation_owned_scopes) covers it. The caller is the kind's one + // serving module (a kind two composed modules declare attaches nothing), + // proving itself with its workload credential, and presents a capability + // addressed to it, at the organisation's current authorization revision, + // holding "create" on the whole kind for the newly created resource. An + // owner-selected create must select this installation's principal. Admin or + // read alone attaches nothing: an existing resource changes owner through + // AuthorizeTransfer, never through an unrestricted administrative capability. + // A resource has one owner in an organisation: an id + // another installation owns is refused. A store whose attach is refused fails + // or rolls back the create it made, and detaches what it deletes + // (DetachResource). The owning installation is read from the capability's + // verified provenance and never named by the caller: the installation itself + // when it is the owner, the installed solution when it is the caller, and + // each solution in its actor chain; exactly one must result. Ids are opaque + // and compared byte for byte; an id is refused when it is empty, carries + // surrounding whitespace, a NUL, CR, LF, tab or "*", or exceeds 128 bytes. + // Owned ids travel in every capability holding them, so an installation owns + // at most 32 of one kind at a time, refused by name past it. Attaching only + // widens what an owned scope covers, so it moves no authorization revision; + // a reinstalled installation owns nothing. + rpc AttachResource(AttachResourceRequest) returns (AttachResourceResponse); + // DetachResource releases one resource from whichever installation of the + // organisation owns it, when the kind's one serving module deletes it, so the + // id no longer counts toward the owner's bound and may be attached again. + // It narrows the owner's roles, so the organisation's authorization revision + // moves. Detaching an id no installation owns answers no installation. + rpc DetachResource(DetachResourceRequest) returns (DetachResourceResponse); + // AuthorizeTransfer decides whether an existing resource may join an + // installed solution's principal. The caller is the kind's one serving + // module, which attests the resource exists and who owns it now + // (from_owner_id), presenting the capability of the person asking: issued + // through the target principal's installation and addressed to the caller. + // It is allowed when the current owner is the organization or a person of + // it (never another solution principal, another organization or an unknown + // owner), the person holds admin on that resource from their own + // organization grants, and the person's current roles on the principal hold + // write on the kind, all read live. An installation acting for itself never + // transfers. After authorization succeeds, the authority records the id in + // the target installation's owned set in the same write transaction, subject + // to the same exclusivity, id and 32-id bounds as AttachResource. Revision, + // provenance, serving module and active tenant installation are checked in + // that transaction. A refusal records nothing and names its reason. The + // store then records the principal as owner; the original creator stays the + // author. The store must complete that change or compensate with DetachResource + // before exposing the resource. No separate admin attachment path exists. + rpc AuthorizeTransfer(AuthorizeTransferRequest) returns (AuthorizeTransferResponse); + // Delegate records a signed-in person's grant to a module (the caller's + // bearer is the person); Issue with a delegation acts on it. + rpc Delegate(DelegateRequest) returns (Delegation); + // RevokeDelegation ends a delegation; the next Issue from it is refused. + rpc RevokeDelegation(RevokeDelegationRequest) returns (RevokeDelegationResponse); + // GetDelegation reads one delegation for the module it is granted to (by its + // workload credential) or for its grantor (by the caller's bearer): whether it + // still stands. Work that outlives the capability that started it asks this + // between issues, so a revoke stops it even when it calls no other module. + rpc GetDelegation(GetDelegationRequest) returns (Delegation); +} + +// IssueRequest names on whose behalf the capability is issued. +message IssueRequest { + // Who the capability is for; exactly one. + oneof as { + // The signed-in person making this call, identified by the bearer the call + // carries; the host opened that session at sign-in. + PersonSession person = 1; + // A module's own workload, proving which module it is. + WorkloadCredential workload = 2; + // An installation acting for itself, with the scope the organisation consented to. + // actor must authenticate a workload of that installation's solution. + InstallationRef installation = 3; + // One more hop from an existing capability: a child, an exchange or a renewal. + string parent_token = 4; + // A delegation a person granted the module acting (actor): the capability + // is owned by that person and carries the delegation on the module's hop. + // No live capability is presented: the authority re-checks the delegation + // and what its grantor holds now, so a revoked delegation or a lost role + // stops the next issue, and renewing is issuing again. + DelegationRef delegation = 11; + } + // The module principal that may consume the capability. + string audience = 5; + // The scopes asked for; empty means everything the owner holds at the audience. + repeated WorkScopeV1 scopes = 6; + // Requested lifetime in seconds; clamped to the issuer's ceiling. + int64 ttl_seconds = 7; + // The declared binding this capability exercises, when the owner is a workload + // or a child acts through one. + string operation_binding_id = 8; + // The organisation the work runs in. A workload may leave this empty when + // exactly one organisation has an active installation of its module. + // Otherwise it must name the organisation of the work item; + // absent or ambiguous installation authority is refused with a reason. + string organization_id = 9; + // The acting workload credential; required with parent_token, delegation, + // and installation. For installation it must name the installed solution. + WorkloadCredential actor = 10; + // Which of the binding's operations the capability is for: "invoke" (the + // default for a person, a child or a delegation), "headless" (the default for + // a workload) or "lookup": the binding's lookup scopes alone, to read a + // receipt without the authority to repeat the effect. + string operation = 12; +} + +// DelegationRef names one delegation. +message DelegationRef { + // The delegation's id, as Delegate answered it. + string delegation_id = 1; +} + +// DelegateRequest is a signed-in person granting a module the right to act for +// them beyond any session: on scopes they hold, through the module's bindings. +message DelegateRequest { + // The module granted, by principal. + string module = 1; + // What the module may do for the person; within what the person holds. + repeated WorkScopeV1 scopes = 2; + // Why, as the person was told (a connected source, a scheduled job). + string purpose = 3; +} + +// Delegation is one grant from a person to a module. +message Delegation { + string delegation_id = 1; + string organization_id = 2; + // The person who granted it, and whom every capability issued from it is for. + string grantor = 3; + // The module granted. + string module = 4; + repeated WorkScopeV1 scopes = 5; + string purpose = 6; + // False once revoked; a revoked delegation issues nothing. + bool active = 7; +} + +// GetDelegationRequest names the delegation read; anyone but its module or its +// grantor is told it does not exist. +message GetDelegationRequest { + string delegation_id = 1; + // The module asking, proving which module it is; absent when the grantor asks. + WorkloadCredential actor = 2; +} + +// RevokeDelegationRequest ends a delegation; only its grantor may. +message RevokeDelegationRequest { + string delegation_id = 1; +} + +// RevokeDelegationResponse is the delegation as it now stands. +message RevokeDelegationResponse { + Delegation delegation = 1; +} + +// PersonSession names the caller's own session. It carries no field: the person +// is whoever the bearer on the call authenticates as, so a caller cannot ask for +// another person's authority by naming a session. +message PersonSession { + reserved 1; + reserved "session_id"; +} + +// WorkloadCredential proves which module a running process is: the native +// launcher credential core's workloadidentity defines, signed by the one launcher +// the host was handed an anchor for. +message WorkloadCredential { + // The launcher-signed credential, as core's native issuer writes it. + string credential = 1; +} + +// InstallationRef names an installation acting for itself. +message InstallationRef { + // The installation id. + string installation_id = 1; +} + +// IssueResponse carries the signed capability and its decoded form. +message IssueResponse { + // The signed capability, as a caller presents it. + string token = 1; + // When the capability expires. + int64 expires_at_unix = 2; + // The decoded capability, for the holder to read its own claims. + WorkContextV1 context = 3; +} + +// CheckRequest presents a capability for verification. +message CheckRequest { + // The capability presented. + string token = 1; + // The audience the caller is; a capability addressed elsewhere is refused. + string audience = 2; + // The method the capability is presented to: "/package.Service/Method" for a + // gRPC call, " " for an HTTP request (GET /v1/model/profiles), + // matched against the routes the module declares. When set, the check also + // applies what the audience module's delivery declares for that method, and + // refuses by name a call that does not hold it, a method that declares + // nothing, and a method the module does not serve. + string method = 3; + // Advisory asks for the policy decision without its refusal: the capability + // is still verified and refused when it is not sound, but what the method + // declares is only reported, in CheckResponse.refusal, and the verified + // capability is answered. A hop in a composition that runs permissive + // (hop/ENFORCEMENT=warn) asks this way and logs the refusal it did not make. + // Hosts may refuse advisory outside local development runs. + bool advisory = 4; +} + +// CheckResponse is the verified capability. +message CheckResponse { + // The verified capability. + WorkContextV1 context = 1; + // The owner's authorization revision as of this check. + uint64 authorization_revision = 2; + // Refusal is what the method's policy would have refused, verbatim, when the + // check was advisory and the policy did not hold; empty when it held. + string refusal = 3; +} + +// KeysRequest asks for the verification keys. +message KeysRequest {} + +// KeysResponse is the issuer and its keys. +message KeysResponse { + // The issuer every capability names. + string issuer = 1; + // The public keys by key id: what a Work Context is signed with, and only + // that. Each carries purpose "work-context". + repeated PublicKey keys = 2; + // The keys a hop signs each call's admission with, each with purpose + // "hop-admission": a module behind the hop verifies the admission by one of + // them. More than one is published while a hop's key is rotated, so the + // retiring and the new key overlap. They are never Work Context keys and are + // kept out of keys, so no verifier that reads keys alone can trust one to + // sign a Work Context. Empty until a hop registers its key + // (RegisterAdmissionKey). + repeated PublicKey admission_keys = 3; +} + +// PublicKey is one verification key. +message PublicKey { + // The key id a capability names. + string key_id = 1; + // The signature algorithm; Ed25519. + string algorithm = 2; + // The raw public key bytes. + bytes public_key = 3; + // What the key verifies: "work-context" (a Work Context) or "hop-admission" + // (a hop's signed call admission). A verifier uses a key only for its own + // purpose. + string purpose = 4; +} + +// RegisterAdmissionKeyRequest presents one hop admission key. +message RegisterAdmissionKeyRequest { + // The hop's workload credential; any other workload is refused. + WorkloadCredential actor = 1; + // The raw Ed25519 public key the hop signs admissions with: 32 bytes. + bytes public_key = 2; +} + +// RegisterAdmissionKeyResponse is the key as Keys now publishes it. +message RegisterAdmissionKeyResponse { + // The published entry, with its key id and purpose "hop-admission". + PublicKey key = 1; + // When the registration lapses unless the hop registers the key again. + int64 expires_at_unix = 2; +} + +// ListResourcesRequest asks about one kind and one action. +message ListResourcesRequest { + // The capability presented. + string token = 1; + // The audience the caller is; a capability addressed elsewhere is refused. + string audience = 2; + // The resource kind, as the audience module serves it. + string resource_kind = 3; + // The action, in the kind's own vocabulary. + string action = 4; +} + +// ListResourcesResponse is every grant the capability holds on the kind for the +// action. A resource is covered when any grant matches its id; no grant means +// none. A capability that does not hold the action at all is refused instead. +message ListResourcesResponse { + repeated ResourceGrant grants = 1; +} + +// AttachResourceRequest names one resource and the capability it was created under. +message AttachResourceRequest { + // The capability the creating call carried, addressed to the caller. + string token = 1; + // The module serving resource_kind, proving which module it is. + WorkloadCredential actor = 2; + // The resource kind, as the caller serves it. + string resource_kind = 3; + // The resource id, as the caller knows it. + string resource_id = 4; +} + +// AttachResourceResponse names the installation that now owns the resource. +message AttachResourceResponse { + // The owning installation, read from the capability's provenance. + string installation_id = 1; +} + +// DetachResourceRequest names one resource its serving module deleted. +message DetachResourceRequest { + // The module serving resource_kind, proving which module it is. + WorkloadCredential actor = 1; + // The organisation the resource belongs to. + string organization_id = 2; + // The resource kind, as the caller serves it. + string resource_kind = 3; + // The resource id, as the caller knows it. + string resource_id = 4; +} + +// DetachResourceResponse names the installation that owned the resource. +message DetachResourceResponse { + // The installation released from it; empty when none owned it. + string installation_id = 1; +} + +// AuthorizeTransferRequest names one existing resource and where it moves. +message AuthorizeTransferRequest { + // The capability of the person asking, addressed to the caller. + string token = 1; + // The module serving resource_kind, proving which module it is. + WorkloadCredential actor = 2; + // The resource kind, as the caller serves it. + string resource_kind = 3; + // The resource id, as the caller knows it. + string resource_id = 4; + // The resource's current owner, as the caller records it: the organization + // or a person of it. + string from_owner_id = 5; + // The solution principal the resource joins. + string to_principal_id = 6; +} + +// AuthorizeTransferResponse is the decision the store records. +message AuthorizeTransferResponse { + // The principal that now owns the resource. + string principal_id = 1; + // The person who authorized the transfer. + string authorized_by = 2; +} + +// ResourceGrant is one way of naming covered resources. Exactly one match is +// set; resource_owner_id, when set, qualifies it. +message ResourceGrant { + oneof match { + // Every resource of the kind. + bool all = 1; + // Exactly this resource id. + string id = 2; + // Every resource whose id starts with this. + string prefix = 3; + // Every resource whose whole id matches this RE2 expression, at most 256 + // bytes; it is matched against the entire id, as if anchored. + string pattern = 4; + } + // The owner the covered resources must have: a resource is covered when + // the match covers its id and it is owned by this principal. + string resource_owner_id = 5; +} diff --git a/modules/authority/contracts/api/local/grpc/proto/host/authority/v1/work_context.proto b/modules/authority/contracts/api/local/grpc/proto/host/authority/v1/work_context.proto new file mode 100644 index 00000000..da5c5d69 --- /dev/null +++ b/modules/authority/contracts/api/local/grpc/proto/host/authority/v1/work_context.proto @@ -0,0 +1,308 @@ +syntax = "proto3"; +// Moved from codefly-dev/core proto/codefly/base/v0/work_context.proto on 2026-10-21. +// Every message, field name and field number is unchanged, so the deterministic +// bytes a verifier reads are identical; only the package and the Go import path +// differ. The conformance fixtures prove it. A change in meaning is a V2 message +// beside the V1, never a field reinterpreted. +package host.authority.v1; + +option go_package = "gateway/pkg/gen/host/authority/v1;authorityv1"; + +import "buf/validate/validate.proto"; + +// WorkContextV1 is the product-neutral identity and authority capability for +// one Task/Session hop. The signed wire representation is owned by Codefly +// SDKs; applications must never serialize this message into a bearer token or +// construct the transport header themselves. +// +// Task identity is the tuple (tenant_id, owner_principal_id, task_id). +// Starting a child agent keeps that tuple and exchanges the parent capability +// for a new child session capability. It never mutates an existing capability. +message WorkContextV1 { + // typ is fixed to "codefly.work-context/v1". + string typ = 1 [(buf.validate.field).string.const = "codefly.work-context/v1"]; + // algorithm is fixed to "Ed25519". + string algorithm = 2 [(buf.validate.field).string.const = "Ed25519"]; + // key_id selects one public verification key during rotation. + string key_id = 3 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 128]; + // issuer is the authority that verified identity and minted this context. + string issuer = 4 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 512]; + // audience is the exact service or trust boundary allowed to consume it. + string audience = 5 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 512]; + // not_before_unix is the earliest instant a verifier may accept this + // capability. + int64 not_before_unix = 6; + // issued_at_unix is when the issuer minted it. + int64 issued_at_unix = 7; + // expires_at_unix is the instant it stops being accepted. Exchanging a + // parent capability for a child one never extends it. + int64 expires_at_unix = 8; + // nonce identifies the capability. Replay behavior is separately explicit. + string nonce = 9 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 512]; + // authorization_revision is the issuer's current membership/policy revision. + uint64 authorization_revision = 10; + // replay_policy is "idempotent" or "single-use". A verifier still needs a + // durable replay store to enforce single-use consumption. + string replay_policy = 11 [(buf.validate.field).string.in = "idempotent", (buf.validate.field).string.in = "single-use"]; + + // tenant_id is the first element of the task identity tuple and is carried + // unchanged across every hop. + string tenant_id = 12 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 512]; + // owner_principal_id is the principal on whose authority the task runs. It + // is the delegating owner, not necessarily the current actor. + string owner_principal_id = 13 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 512]; + // task_id completes the task identity tuple and survives child agents. + string task_id = 14 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 512]; + // session_id identifies this hop. Starting a child agent mints a new one + // rather than mutating this capability. + string session_id = 15 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 512]; + // parent_session_id is the session this one was exchanged from; absent on + // the first session of a task. + optional string parent_session_id = 16 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 512]; + + // authority_scopes are the maximum scopes the owner delegated into this + // Work Context. Each actor hop's granted_scopes must be a subset of the + // preceding effective scopes. + repeated WorkScopeV1 authority_scopes = 17; + // actor_chain is ordered from the first delegated actor to the current actor. + // The owner is not duplicated here merely to make a direct call look uniform. + // Every hop attenuates the one before it, except the final hop of a + // capability carrying grant_hop. + repeated WorkActorV1 actor_chain = 18; + // attribution_team_ids is an immutable verified attribution snapshot. It + // explains ownership; current authorization is still evaluated separately. + repeated string attribution_team_ids = 19; + // workspace_id is the workspace the task runs against, when the task is + // scoped to one. + optional string workspace_id = 20 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 512]; + // project_id narrows workspace_id to a single project, when the task is + // scoped that far. + optional string project_id = 21 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 512]; + + // owner_principal_kind distinguishes the sort of principal the owner is, so + // a verifier can present the owner without resolving it against a directory. + // Optional on the wire: a capability minted before this field existed is + // still a valid capability, and an archived receipt embedding one still + // verifies. Deriving an identity from a capability that omits it is the + // error, raised where the identity is built. + optional string owner_principal_kind = 22 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 128]; + // owner_agent_id is the owner's agent manifest identity. Required when + // owner_principal_kind is "agent" and absent otherwise. + optional string owner_agent_id = 23 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 512]; + // organization_id is the organization the task runs in. It is not the + // tenant: a tenant may hold several organizations, and authorization is + // scoped per organization. An actor hop may name a different one. + optional string organization_id = 25 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 512]; + // grant_hop is the approval grant this capability was minted under. It is + // the one audited exception to the attenuation rule: the final actor hop + // holds exactly granted_scope, which the preceding hop need not contain. + // Present only on a single-use child capability minted for one approved + // call; absent on every ordinary session. + optional WorkGrantHopV1 grant_hop = 24; + // seal binds this capability to one installation and one execution: the + // principal's epoch, the installation and revision it was minted for, and + // the build incarnation it was minted on. A verifier compares every field + // against the live value and refuses on any mismatch, which is what stops a + // capability outliving the installation or the build it was issued against. + // + // REQUIRED. An earlier version of this field was optional, with the stated + // reason that a schema rule would invalidate every archived capability and + // every receipt embedding one, so the requirement belonged in the verifier. + // Two independent reviews named that for what it is: a backward-compatibility + // hedge, which the rules in force forbid. It also meant every reader other + // than the verifier saw a capability's binding to its installation as + // optional, so the strongest check in the model was the easiest one for a + // consumer to not notice. + // + // Archived capabilities and receipts are historical DATA. If they must be + // read after this, they get a snapshot type of their own rather than keeping + // the live credential permanently weaker than it should be. + WorkSealV1 seal = 26 [(buf.validate.field).required = true]; + // operation_binding is the unit of authority this capability exercises, + // sealed by its id, revision and incarnation. Present on an operation + // context and absent on a session that exercises none. + // + // The id is what a verifier looks the binding up by, exactly. Nothing + // searches the bindings for one that contains the capability's scopes: a + // search is a predicate someone wrote, and a predicate one case too + // generous grants authority nobody reviewed. + optional WorkOperationBindingV1 operation_binding = 27; +} + +// WorkSealV1 binds a capability to one installation and one execution. Its +// principal_epoch is the TASK OWNER'S; an actor hop carries its own in +// WorkActorV1.principal_epoch, because an actor's authority is narrowed +// independently of the owner's. Every +// field is a value the issuer holds live and the verifier compares exactly, so +// a capability minted before an installation was revised, a principal's +// authority was reset, or a build was replaced stops verifying at that moment +// rather than at its own expiry. +message WorkSealV1 { + // principal_epoch is the principal's current epoch. Advancing it + // invalidates every capability minted for that principal, which is how a + // compromised principal is cut off without waiting for expiry. + uint64 principal_epoch = 1 [(buf.validate.field).uint64.gte = 1]; + // installation_id identifies one organization's installation of one module. + // Authority is held through an installation, so a capability that names none + // is bound to nothing. + string installation_id = 2 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 512]; + // installation_revision is the installation's revision at mint time. A + // verifier holding a different revision refuses: the scope of an + // installation changes with its revision, so a capability sealed to an + // earlier one asks for authority under terms that no longer apply. + uint64 installation_revision = 3 [(buf.validate.field).uint64.gte = 1]; + // Fields 4 and 5 carried a per-capability build seal (build_incarnation, + // image_digest). Removed: a workload's build is checked where it mints, and + // a change of approved builds revokes through the principal's epoch and the + // installation's revision. + reserved 4, 5; + reserved "build_incarnation", "image_digest"; +} + +// WorkOperationBindingV1 is the unit of authority an operation context +// exercises, sealed so that a verifier resolves exactly one binding and +// compares it rather than deciding which binding the capability's scopes fit. +message WorkOperationBindingV1 { + // binding_id is the host's identifier for the binding. The verifier looks it + // up EXACTLY: nothing searches the bindings for one that fits a capability's + // scopes, because a search is a predicate somebody wrote and a predicate one + // case too generous grants authority nobody reviewed. + // + // This comment used to say the id "is never derived from the binding's + // contents, because a derived id is one a caller can compute for a binding + // it was never granted". I refuted a review finding against that sentence by + // reading it in isolation and judging it correct. The reviewer was right and + // I was wrong: solutionhost/authority.go says the opposite in the package + // that owns the id — deriving it deterministically is delivery's business + // and better than random, and "predictability costs nothing here: an id is + // neither a secret nor a capability". + // + // Predictability costs nothing because ENTITLEMENT is what refuses a binding + // a caller does not hold, not obscurity: the verifier requires the resolved + // binding to be granted to the exercising principal within the installation + // the capability is sealed to. Guessing an id gets you a refusal. Resting + // the rule on unguessability was the retracted reasoning, and leaving it + // here contradicted the package it describes. + string binding_id = 1 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 512]; + // revision is the binding's revision at mint time. A verifier holding a + // different revision refuses. + uint64 revision = 2 [(buf.validate.field).uint64.gte = 1]; + // incarnation is the binding's incarnation at mint time, which changes when + // the binding is re-established rather than merely revised. + uint64 incarnation = 3 [(buf.validate.field).uint64.gte = 1]; +} + +// WorkScopeV1 is a structured, product-neutral capability scope. Empty +// resource_ids means every resource of resource_kind; a child may narrow that +// wildcard to explicit IDs but may never widen an explicit parent set. +message WorkScopeV1 { + // resource_kind is the class of resource the scope grants against. + string resource_kind = 1 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 128]; + // actions are the operations permitted on that kind. + repeated string actions = 2; + // resource_ids narrows the scope to specific resources. Empty means every + // resource of resource_kind. + repeated string resource_ids = 3; + // resource_owner_id narrows the scope to the resources this principal owns + // (an installed solution's principal). Empty means the scope selects no + // owner. With resource_ids, a resource is covered only when both match. A + // reader that cannot compare a resource's owner must not treat an + // owner-selected scope as covering the whole kind. It is at most 512 bytes + // of printable ASCII other than space and "*" (0x21-0x29, 0x2B-0x7E): no + // whitespace, control, non-ASCII, invisible or lookalike character, so two + // owners that print alike are the same bytes and every regex engine answers + // the rule the same way. + string resource_owner_id = 4 [(buf.validate.field).string.max_bytes = 512, (buf.validate.field).string.pattern = "^[!-)+-~]*$"]; +} + +// WorkActorV1 is one verified delegated actor. granted_scopes are the actor's +// effective scopes and must monotonically attenuate the previous hop. +message WorkActorV1 { + // principal_id identifies the actor this hop delegated to. + string principal_id = 1 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 512]; + // principal_kind distinguishes the sort of principal, so a human and an + // agent bearing the same id are not conflated. + string principal_kind = 2 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 128]; + // delegation_id identifies the delegation that produced this hop, so the + // chain stays auditable back to its grant. + string delegation_id = 3 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 512]; + // granted_scopes are this actor's effective scopes, a subset of the + // preceding hop's. + repeated WorkScopeV1 granted_scopes = 4; + // agent_id is the actor's agent manifest identity. Required when + // principal_kind is "agent" and absent otherwise. + optional string agent_id = 5 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 512]; + // organization_id is the organization this actor belongs to, when it is not + // the one the task runs in. An org-bridge agent acts in an organization the + // owner does not belong to, and authorization is scoped to the actor's own. + optional string organization_id = 6 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 512]; + // principal_epoch is THIS actor's epoch, distinct from the owner's epoch in + // the seal. Advancing it invalidates every capability in which this + // principal is an actor, without touching the owner's. + // + // It exists because the seal's epoch is the task owner's, and an actor's + // authority can be narrowed independently of the owner's: a delegated + // operation context may have a person as its owner and a service principal + // as its actor, and narrowing that service principal must reach the + // capabilities it acts in. Without this field the only lever for a + // compromised actor is the tenant's authorization_revision, which cuts off + // every capability of the tenant. + // + // REQUIRED, for the reason seal gives. A hop with no epoch is a principal + // nothing can revoke, and leaving that expressible on the wire made it a + // shape a consumer could mint without noticing. + uint64 principal_epoch = 7 [(buf.validate.field).uint64.gte = 1, (buf.validate.field).required = true]; + // Fields 8 and 9 carried this hop's build seal; removed with the seal's. + reserved 8, 9; + reserved "image_digest", "build_incarnation"; +} + +// WorkGrantHopV1 records the approval that justifies a capability holding +// authority its delegating owner never held. It is minted only as a new child +// capability bound to one tool, one subject and one call, so the authority it +// adds is unusable anywhere else and expires with the grant window. +message WorkGrantHopV1 { + // grant_id identifies the approval grant, so revoking the grant and + // auditing the call both reach the same record. + string grant_id = 1 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 512]; + // approvers are the principals whose decision produced the grant, every one + // of an N-of-M quorum, so the audit record is complete. + repeated WorkApproverV1 approvers = 2 [(buf.validate.field).repeated.min_items = 1, (buf.validate.field).repeated.max_items = 64]; + // granted_scope is exactly what the approval added: one resource_kind, one + // action and one resource_id. A grant never widens beyond that triple. + WorkScopeV1 granted_scope = 3 [(buf.validate.field).required = true]; + // subject is what the grant is pinned to, in the approvals engine's own + // vocabulary, so a grant approved for one subject cannot be spent on another. + string subject = 4 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 512]; + // request_digest binds the grant to the exact call the approver saw. + string request_digest = 5 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 512]; +} + +// WorkApproverV1 is one principal whose decision produced a grant. It carries +// the kind as well as the id: a policy that requires a human approver cannot +// be written against bare identifiers. +message WorkApproverV1 { + // principal_id identifies the approver. + string principal_id = 1 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 512]; + // principal_kind distinguishes the sort of principal the approver is. + string principal_kind = 2 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 128]; +} + +// ApprovalRequiredV1 is the signal a policy decision point returns instead of +// a denial when the call is approvable: the authority is not held, but an +// approver may grant it. It names exactly what a WorkGrantHopV1 would have to +// carry, so a decision and the capability that satisfies it are the same shape. +// It is carried as a typed error detail on a FailedPrecondition status. +message ApprovalRequiredV1 { + // request_id identifies the approval request the engine created, which the + // caller waits on and the resulting grant refers back to. + string request_id = 1 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 512]; + // requested_scope is the authority the call needs and the principal lacks. + WorkScopeV1 requested_scope = 2 [(buf.validate.field).required = true]; + // subject is what a grant would be pinned to. + string subject = 3 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 512]; + // request_digest is the exact call put to the approver. + string request_digest = 4 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 512]; + // audience is the tool a granted capability must be minted for. + string audience = 5 [(buf.validate.field).string.min_len = 1, (buf.validate.field).string.max_len = 512]; +} diff --git a/modules/authority/contracts/api/local/grpc/proto/host/composition/v1/composition.proto b/modules/authority/contracts/api/local/grpc/proto/host/composition/v1/composition.proto new file mode 100644 index 00000000..a834fd4c --- /dev/null +++ b/modules/authority/contracts/api/local/grpc/proto/host/composition/v1/composition.proto @@ -0,0 +1,171 @@ +syntax = "proto3"; +// The composition interface: how the host learns what is composed. One +// operation. The render produces a manifest per module instance; the host +// derives from it the module's principal, its ceilings and its bindings. There +// is no envelope: the ceiling is the manifest. +package host.composition.v1; + +option go_package = "gateway/pkg/gen/host/composition/v1;compositionv1"; + +import "host/authority/v1/work_context.proto"; + +// CompositionService is implemented by the host and by the local authority. +service CompositionService { + // ApplyManifest delivers one module instance's manifest at one generation. + rpc ApplyManifest(ApplyManifestRequest) returns (ApplyManifestResponse); +} + +// ApplyManifestRequest carries the manifest. +message ApplyManifestRequest { + // The sketch of a manifest, kept through the transition. An implementation + // that verifies deliveries ignores it when a carrier is present. + ModuleManifestV1 manifest = 1; + // The delivery as Codefly signs it: core's module manifest and the DSSE + // envelope over it. An implementation verifies the envelope against the release + // keys it pins and reads the manifest from the verified document, never from + // the request, so what composes a module is the same signed document on the + // local authority and on the host. + SignedManifestV1 carrier = 2; + // The credential of the workload delivering the manifest, as that + // implementation attests workloads: the launcher's on the local authority, the + // delivery service account's on the host. A manifest is delivered by its own + // module's delivery workload and by nothing else. + string credential = 3; + // The authority's own document for this delivery, an AuthorityManifestV1: + // what the module declares that the authority enforces and core's manifest + // does not carry. Signed in the same envelope format by the same key as + // carrier, and naming carrier's digest. Absent means the module declares no + // method policy, and every Check that names one of its methods is refused. + SignedManifestV1 authority = 4; +} + +// AuthorityManifestV1 is the authority's document for one delivery. +message AuthorityManifestV1 { + // The module, as the core manifest it travels with names it. + string module = 1; + // The generation, equal to that core manifest's. + uint64 generation = 2; + // "sha256:" of the core manifest document delivered with it. + string core_manifest_digest = 3; + // Every method the module's published contracts serve, with what each + // declares. A method that declares nothing is listed with neither field set. + repeated MethodPolicyV1 methods = 4; + // The module's own resource kinds with the actions its contract declares on + // each (its scope ceilings). Core's manifest names the kinds alone, so without + // these a kind serves any action and a person's ask for everything they hold + // there cannot be enumerated. Each names a kind core's manifest declares. + repeated host.authority.v1.WorkScopeV1 scope_ceilings = 5; + // The roles a solution declares a person may hold on an installation of it, + // as ModuleManifestV1.roles declares them through the sketch: each within + // the solution's own scope ceilings or explicit invoke/lookup binding scopes, + // one of them installer. Headless-only scopes cannot supply a role grant. + // Core's manifest carries no roles, so they travel here until it does. A + // module declares none; a module's delivery listing any is refused. + repeated RoleV1 roles = 6; + // The module checks a resource's owner against an owner-selected scope + // (Claims.AllowsOwned): only an audience declaring it receives one, and a + // delivery withdrawing it refuses the owner-selected capabilities issued + // before. Every solution receiving its roles' scopes declares it. + bool owner_aware = 7; +} + +// MethodPolicyV1 is what a call to one method must hold, as the module's +// contract declares it with the authority.hop.v1.policy option. +message MethodPolicyV1 { + // The method: "/package.Service/Method" for a gRPC method, or an HTTP route + // "