@openvtc/trust-tasks 0.22.6 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +81 -0
- package/dist/_shared/components.d.ts +434 -1
- package/dist/_shared/components.d.ts.map +1 -1
- package/dist/acl/_shared/0.1/acl-entry.d.ts +1 -1
- package/dist/acl/_shared/0.1/acl-entry.d.ts.map +1 -1
- package/dist/acl/_shared/0.2/acl-entry.d.ts +22 -0
- package/dist/acl/_shared/0.2/acl-entry.d.ts.map +1 -0
- package/dist/acl/_shared/0.2/acl-entry.js +6 -0
- package/dist/acl/_shared/0.2/acl-entry.js.map +1 -0
- package/dist/acl/change-role/0.1/payload.d.ts +1 -1
- package/dist/acl/change-role/0.1/payload.d.ts.map +1 -1
- package/dist/acl/change-role/0.2/payload.d.ts +1679 -0
- package/dist/acl/change-role/0.2/payload.d.ts.map +1 -0
- package/dist/acl/change-role/0.2/payload.js +955 -0
- package/dist/acl/change-role/0.2/payload.js.map +1 -0
- package/dist/acl/grant/0.1/payload.d.ts +1 -1
- package/dist/acl/grant/0.1/payload.d.ts.map +1 -1
- package/dist/acl/grant/0.2/payload.d.ts +1649 -0
- package/dist/acl/grant/0.2/payload.d.ts.map +1 -0
- package/dist/acl/grant/0.2/payload.js +942 -0
- package/dist/acl/grant/0.2/payload.js.map +1 -0
- package/dist/acl/list/0.1/payload.d.ts +1 -1
- package/dist/acl/list/0.1/payload.d.ts.map +1 -1
- package/dist/acl/list/0.2/payload.d.ts +1853 -0
- package/dist/acl/list/0.2/payload.d.ts.map +1 -0
- package/dist/acl/list/0.2/payload.js +1041 -0
- package/dist/acl/list/0.2/payload.js.map +1 -0
- package/dist/acl/revoke/0.1/payload.d.ts +1 -1
- package/dist/acl/revoke/0.1/payload.d.ts.map +1 -1
- package/dist/acl/revoke/0.2/payload.d.ts +1844 -0
- package/dist/acl/revoke/0.2/payload.d.ts.map +1 -0
- package/dist/acl/revoke/0.2/payload.js +1052 -0
- package/dist/acl/revoke/0.2/payload.js.map +1 -0
- package/dist/acl/show/0.1/payload.d.ts +1 -1
- package/dist/acl/show/0.1/payload.d.ts.map +1 -1
- package/dist/acl/show/0.2/payload.d.ts +1689 -0
- package/dist/acl/show/0.2/payload.d.ts.map +1 -0
- package/dist/acl/show/0.2/payload.js +968 -0
- package/dist/acl/show/0.2/payload.js.map +1 -0
- package/dist/acl/swap-key/0.1/payload.d.ts +1 -1
- package/dist/acl/swap-key/0.1/payload.d.ts.map +1 -1
- package/dist/acl/update/0.1/payload.d.ts +1 -1
- package/dist/acl/update/0.1/payload.d.ts.map +1 -1
- package/dist/acl/update/0.2/payload.d.ts +1784 -0
- package/dist/acl/update/0.2/payload.d.ts.map +1 -0
- package/dist/acl/update/0.2/payload.js +1005 -0
- package/dist/acl/update/0.2/payload.js.map +1 -0
- package/dist/auth/step-up/approve-request/0.4/payload.d.ts +672 -0
- package/dist/auth/step-up/approve-request/0.4/payload.d.ts.map +1 -0
- package/dist/auth/step-up/approve-request/0.4/payload.js +373 -0
- package/dist/auth/step-up/approve-request/0.4/payload.js.map +1 -0
- package/dist/auth/step-up/approve-response/0.6/payload.d.ts +974 -0
- package/dist/auth/step-up/approve-response/0.6/payload.d.ts.map +1 -0
- package/dist/auth/step-up/approve-response/0.6/payload.js +552 -0
- package/dist/auth/step-up/approve-response/0.6/payload.js.map +1 -0
- package/dist/auth/step-up/approver/_shared/0.1/approver.d.ts +16 -0
- package/dist/auth/step-up/approver/_shared/0.1/approver.d.ts.map +1 -0
- package/dist/auth/step-up/approver/_shared/0.1/approver.js +6 -0
- package/dist/auth/step-up/approver/_shared/0.1/approver.js.map +1 -0
- package/dist/auth/step-up/approver/attest/0.1/payload.d.ts +174 -0
- package/dist/auth/step-up/approver/attest/0.1/payload.d.ts.map +1 -0
- package/dist/auth/step-up/approver/attest/0.1/payload.js +97 -0
- package/dist/auth/step-up/approver/attest/0.1/payload.js.map +1 -0
- package/dist/auth/step-up/approver/enroll/0.1/payload.d.ts +503 -0
- package/dist/auth/step-up/approver/enroll/0.1/payload.d.ts.map +1 -0
- package/dist/auth/step-up/approver/enroll/0.1/payload.js +285 -0
- package/dist/auth/step-up/approver/enroll/0.1/payload.js.map +1 -0
- package/dist/auth/step-up/approver/invite/0.1/payload.d.ts +375 -0
- package/dist/auth/step-up/approver/invite/0.1/payload.d.ts.map +1 -0
- package/dist/auth/step-up/approver/invite/0.1/payload.js +200 -0
- package/dist/auth/step-up/approver/invite/0.1/payload.js.map +1 -0
- package/dist/auth/step-up/approver/list/0.1/payload.d.ts +477 -0
- package/dist/auth/step-up/approver/list/0.1/payload.d.ts.map +1 -0
- package/dist/auth/step-up/approver/list/0.1/payload.js +272 -0
- package/dist/auth/step-up/approver/list/0.1/payload.js.map +1 -0
- package/dist/auth/step-up/approver/redeem/finish/0.1/payload.d.ts +512 -0
- package/dist/auth/step-up/approver/redeem/finish/0.1/payload.d.ts.map +1 -0
- package/dist/auth/step-up/approver/redeem/finish/0.1/payload.js +290 -0
- package/dist/auth/step-up/approver/redeem/finish/0.1/payload.js.map +1 -0
- package/dist/auth/step-up/approver/redeem/start/0.1/payload.d.ts +343 -0
- package/dist/auth/step-up/approver/redeem/start/0.1/payload.d.ts.map +1 -0
- package/dist/auth/step-up/approver/redeem/start/0.1/payload.js +187 -0
- package/dist/auth/step-up/approver/redeem/start/0.1/payload.js.map +1 -0
- package/dist/auth/step-up/approver/revoke/0.1/payload.d.ts +534 -0
- package/dist/auth/step-up/approver/revoke/0.1/payload.d.ts.map +1 -0
- package/dist/auth/step-up/approver/revoke/0.1/payload.js +301 -0
- package/dist/auth/step-up/approver/revoke/0.1/payload.js.map +1 -0
- package/dist/git-ns/activity/list/0.1/payload.d.ts +21 -0
- package/dist/git-ns/activity/list/0.1/payload.d.ts.map +1 -1
- package/dist/git-ns/activity/list/0.1/payload.js +8 -0
- package/dist/git-ns/activity/list/0.1/payload.js.map +1 -1
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -1
- package/dist/task-consent/decision/0.2/payload.d.ts +775 -0
- package/dist/task-consent/decision/0.2/payload.d.ts.map +1 -0
- package/dist/task-consent/decision/0.2/payload.js +450 -0
- package/dist/task-consent/decision/0.2/payload.js.map +1 -0
- package/dist/vtc/admin/actions/_shared/0.1/action.d.ts +24 -0
- package/dist/vtc/admin/actions/_shared/0.1/action.d.ts.map +1 -0
- package/dist/vtc/admin/actions/_shared/0.1/action.js +6 -0
- package/dist/vtc/admin/actions/_shared/0.1/action.js.map +1 -0
- package/dist/vtc/admin/actions/acknowledge/0.1/payload.d.ts +1012 -0
- package/dist/vtc/admin/actions/acknowledge/0.1/payload.d.ts.map +1 -0
- package/dist/vtc/admin/actions/acknowledge/0.1/payload.js +636 -0
- package/dist/vtc/admin/actions/acknowledge/0.1/payload.js.map +1 -0
- package/dist/vtc/admin/actions/cancel/0.1/payload.d.ts +1026 -0
- package/dist/vtc/admin/actions/cancel/0.1/payload.d.ts.map +1 -0
- package/dist/vtc/admin/actions/cancel/0.1/payload.js +641 -0
- package/dist/vtc/admin/actions/cancel/0.1/payload.js.map +1 -0
- package/dist/vtc/admin/actions/list/0.1/payload.d.ts +1200 -0
- package/dist/vtc/admin/actions/list/0.1/payload.d.ts.map +1 -0
- package/dist/vtc/admin/actions/list/0.1/payload.js +726 -0
- package/dist/vtc/admin/actions/list/0.1/payload.js.map +1 -0
- package/dist/vtc/admin/actions/show/0.1/payload.d.ts +1012 -0
- package/dist/vtc/admin/actions/show/0.1/payload.d.ts.map +1 -0
- package/dist/vtc/admin/actions/show/0.1/payload.js +636 -0
- package/dist/vtc/admin/actions/show/0.1/payload.js.map +1 -0
- package/dist/vtc/install/claim/finish/0.3/payload.d.ts +379 -0
- package/dist/vtc/install/claim/finish/0.3/payload.d.ts.map +1 -0
- package/dist/vtc/install/claim/finish/0.3/payload.js +205 -0
- package/dist/vtc/install/claim/finish/0.3/payload.js.map +1 -0
- package/dist/vtc/install/claim/start/0.3/payload.d.ts +368 -0
- package/dist/vtc/install/claim/start/0.3/payload.d.ts.map +1 -0
- package/dist/vtc/install/claim/start/0.3/payload.js +201 -0
- package/dist/vtc/install/claim/start/0.3/payload.js.map +1 -0
- package/dist/vtc/members/authority-reduced-notice/0.1/payload.d.ts +208 -0
- package/dist/vtc/members/authority-reduced-notice/0.1/payload.d.ts.map +1 -0
- package/dist/vtc/members/authority-reduced-notice/0.1/payload.js +112 -0
- package/dist/vtc/members/authority-reduced-notice/0.1/payload.js.map +1 -0
- package/dist/vtc/roles/_shared/0.1/role.d.ts +16 -0
- package/dist/vtc/roles/_shared/0.1/role.d.ts.map +1 -0
- package/dist/vtc/roles/_shared/0.1/role.js +6 -0
- package/dist/vtc/roles/_shared/0.1/role.js.map +1 -0
- package/dist/vtc/roles/define/0.1/payload.d.ts +703 -0
- package/dist/vtc/roles/define/0.1/payload.d.ts.map +1 -0
- package/dist/vtc/roles/define/0.1/payload.js +371 -0
- package/dist/vtc/roles/define/0.1/payload.js.map +1 -0
- package/dist/vtc/roles/delete/0.1/payload.d.ts +281 -0
- package/dist/vtc/roles/delete/0.1/payload.d.ts.map +1 -0
- package/dist/vtc/roles/delete/0.1/payload.js +152 -0
- package/dist/vtc/roles/delete/0.1/payload.js.map +1 -0
- package/dist/vtc/roles/list/0.1/payload.d.ts +639 -0
- package/dist/vtc/roles/list/0.1/payload.d.ts.map +1 -0
- package/dist/vtc/roles/list/0.1/payload.js +345 -0
- package/dist/vtc/roles/list/0.1/payload.js.map +1 -0
- package/dist/vtc/roles/show/0.1/payload.d.ts +651 -0
- package/dist/vtc/roles/show/0.1/payload.d.ts.map +1 -0
- package/dist/vtc/roles/show/0.1/payload.js +351 -0
- package/dist/vtc/roles/show/0.1/payload.js.map +1 -0
- package/package.json +1 -1
- package/src/_shared/components.ts +440 -1
- package/src/acl/_shared/0.1/acl-entry.ts +1 -1
- package/src/acl/_shared/0.2/acl-entry.ts +23 -0
- package/src/acl/change-role/0.1/payload.ts +1 -1
- package/src/acl/change-role/0.2/payload.ts +1011 -0
- package/src/acl/grant/0.1/payload.ts +1 -1
- package/src/acl/grant/0.2/payload.ts +990 -0
- package/src/acl/list/0.1/payload.ts +1 -1
- package/src/acl/list/0.2/payload.ts +1125 -0
- package/src/acl/revoke/0.1/payload.ts +1 -1
- package/src/acl/revoke/0.2/payload.ts +1122 -0
- package/src/acl/show/0.1/payload.ts +1 -1
- package/src/acl/show/0.2/payload.ts +1016 -0
- package/src/acl/swap-key/0.1/payload.ts +1 -1
- package/src/acl/update/0.1/payload.ts +1 -1
- package/src/acl/update/0.2/payload.ts +1094 -0
- package/src/auth/step-up/approve-request/0.4/payload.ts +461 -0
- package/src/auth/step-up/approve-response/0.6/payload.ts +648 -0
- package/src/auth/step-up/approver/_shared/0.1/approver.ts +17 -0
- package/src/auth/step-up/approver/attest/0.1/payload.ts +135 -0
- package/src/auth/step-up/approver/enroll/0.1/payload.ts +329 -0
- package/src/auth/step-up/approver/invite/0.1/payload.ts +258 -0
- package/src/auth/step-up/approver/list/0.1/payload.ts +318 -0
- package/src/auth/step-up/approver/redeem/finish/0.1/payload.ts +337 -0
- package/src/auth/step-up/approver/redeem/start/0.1/payload.ts +241 -0
- package/src/auth/step-up/approver/revoke/0.1/payload.ts +352 -0
- package/src/git-ns/activity/list/0.1/payload.ts +14 -0
- package/src/index.ts +31 -0
- package/src/task-consent/decision/0.2/payload.ts +537 -0
- package/src/vtc/admin/actions/_shared/0.1/action.ts +25 -0
- package/src/vtc/admin/actions/acknowledge/0.1/payload.ts +671 -0
- package/src/vtc/admin/actions/cancel/0.1/payload.ts +680 -0
- package/src/vtc/admin/actions/list/0.1/payload.ts +795 -0
- package/src/vtc/admin/actions/show/0.1/payload.ts +671 -0
- package/src/vtc/install/claim/finish/0.3/payload.ts +253 -0
- package/src/vtc/install/claim/start/0.3/payload.ts +256 -0
- package/src/vtc/members/authority-reduced-notice/0.1/payload.ts +162 -0
- package/src/vtc/roles/_shared/0.1/role.ts +17 -0
- package/src/vtc/roles/define/0.1/payload.ts +435 -0
- package/src/vtc/roles/delete/0.1/payload.ts +200 -0
- package/src/vtc/roles/list/0.1/payload.ts +389 -0
- package/src/vtc/roles/show/0.1/payload.ts +399 -0
|
@@ -0,0 +1,942 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated by scripts/build-ts-bindings.mjs — DO NOT EDIT BY HAND.
|
|
3
|
+
* Source: specs/acl/grant/0.2/payload.schema.json
|
|
4
|
+
*/
|
|
5
|
+
/** Trust Task type URI. */
|
|
6
|
+
export const TYPE_URI = "https://trusttasks.org/spec/acl/grant/0.2";
|
|
7
|
+
/** Trust Task response type URI (request type URI + "#response"). */
|
|
8
|
+
export const RESPONSE_TYPE_URI = "https://trusttasks.org/spec/acl/grant/0.2#response";
|
|
9
|
+
/**
|
|
10
|
+
* This specification's payload schema, as a value.
|
|
11
|
+
*
|
|
12
|
+
* SPEC.md §7.2 item 2 is performed against this. It is shipped as data
|
|
13
|
+
* rather than only as a `.json` file because TypeScript types are erased
|
|
14
|
+
* at runtime: without a schema a consumer has nothing to validate, and
|
|
15
|
+
* every REQUIRED payload member is optional in practice. Cross-file
|
|
16
|
+
* `$ref`s are already inlined, so it needs no resolver.
|
|
17
|
+
*/
|
|
18
|
+
export const PAYLOAD_SCHEMA = {
|
|
19
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
20
|
+
"$id": "https://trusttasks.org/spec/acl/grant/0.2",
|
|
21
|
+
"title": "ACL Grant 0.2 — payload",
|
|
22
|
+
"description": "Add a subject to an access-control list. The entry states its act scope explicitly (`act`), and may carry an approve scope, a narrowed or additive capability set, and the capabilities it may approve. The outer document members (id, type, issuer, recipient, issuedAt, expiresAt, proof) are owned by the framework — SPEC §6.3.",
|
|
23
|
+
"type": "object",
|
|
24
|
+
"additionalProperties": false,
|
|
25
|
+
"required": [
|
|
26
|
+
"entry"
|
|
27
|
+
],
|
|
28
|
+
"properties": {
|
|
29
|
+
"entry": {
|
|
30
|
+
"description": "The AclEntry the producer wants the maintainer to hold for the subject (intent). `act`, `keys` and `capabilities` are REQUIRED and explicit; `approve` and `approveCapabilities` are optional, and absent means none. Maintainer-populated members (`createdAt`, `createdBy`, `updatedAt`, `updatedBy`, `delegatedBy`) are ignored if a producer supplies them; the response carries the realized entry.",
|
|
31
|
+
"$ref": "#/$defs/AclEntry"
|
|
32
|
+
},
|
|
33
|
+
"reason": {
|
|
34
|
+
"type": "string",
|
|
35
|
+
"maxLength": 1024,
|
|
36
|
+
"description": "Optional human-readable rationale, recorded with the grant."
|
|
37
|
+
},
|
|
38
|
+
"ext": {
|
|
39
|
+
"$ref": "#/$defs/Ext",
|
|
40
|
+
"description": "Ecosystem-defined extension members per SPEC.md §4.5.1."
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"$defs": {
|
|
44
|
+
"Response": {
|
|
45
|
+
"$anchor": "response",
|
|
46
|
+
"title": "ACL Grant 0.2 — response payload",
|
|
47
|
+
"description": "The success response to an acl/grant/0.2 request. Carried in a Trust Task document whose type is https://trusttasks.org/spec/acl/grant/0.2#response.",
|
|
48
|
+
"type": "object",
|
|
49
|
+
"additionalProperties": false,
|
|
50
|
+
"required": [
|
|
51
|
+
"entry"
|
|
52
|
+
],
|
|
53
|
+
"properties": {
|
|
54
|
+
"entry": {
|
|
55
|
+
"description": "The canonical AclEntry the maintainer now holds for the subject, including the maintainer-populated provenance (`createdAt`, `createdBy`, `delegatedBy`).",
|
|
56
|
+
"$ref": "#/$defs/AclEntry"
|
|
57
|
+
},
|
|
58
|
+
"ext": {
|
|
59
|
+
"$ref": "#/$defs/Ext",
|
|
60
|
+
"description": "Ecosystem-defined extension members per SPEC.md §4.5.1."
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
"Ext": {
|
|
65
|
+
"title": "Ext",
|
|
66
|
+
"description": "Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.",
|
|
67
|
+
"type": "object",
|
|
68
|
+
"minProperties": 1,
|
|
69
|
+
"additionalProperties": true,
|
|
70
|
+
"propertyNames": {
|
|
71
|
+
"pattern": "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$"
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
"AclEntry": {
|
|
75
|
+
"title": "AclEntry",
|
|
76
|
+
"description": "One access-control entry: who the grant is for (`subject`), the ceiling it is held under (`role`), where the subject may act (`act`) and approve (`approve`), and which capabilities it may exercise (`capabilities`) and approve (`approveCapabilities`).\n\nThe act axis and the approve axis are independent and a consumer MUST resolve them separately: `act` + `capabilities` (+ `keys`) answer \"may this subject do X\"; `approve` + `approveCapabilities` answer \"may this subject ratify someone else doing X\". Neither implies the other. An entry with `act: {scope: none}` and an approve scope other than none is a least-privilege approver — able to satisfy an approval and unable to initiate any change.",
|
|
77
|
+
"type": "object",
|
|
78
|
+
"additionalProperties": false,
|
|
79
|
+
"required": [
|
|
80
|
+
"subject",
|
|
81
|
+
"role",
|
|
82
|
+
"act",
|
|
83
|
+
"keys",
|
|
84
|
+
"capabilities"
|
|
85
|
+
],
|
|
86
|
+
"properties": {
|
|
87
|
+
"subject": {
|
|
88
|
+
"type": "string",
|
|
89
|
+
"minLength": 1,
|
|
90
|
+
"description": "VID of the party in the ACL. Compared by exact string equality (SPEC.md §4.8); producers SHOULD emit canonical form."
|
|
91
|
+
},
|
|
92
|
+
"role": {
|
|
93
|
+
"type": "string",
|
|
94
|
+
"minLength": 1,
|
|
95
|
+
"description": "Opaque role identifier interpreted by the ACL maintainer. A role is a CEILING, never a grant: it bounds the capabilities the entry may hold and never adds to them. A consumer that does not recognise the role MUST treat the entry as conferring no authority and MUST NOT fall back to a default role. Act scope and role are independent members; a consumer MUST NOT compute either from the other."
|
|
96
|
+
},
|
|
97
|
+
"act": {
|
|
98
|
+
"$ref": "#/$defs/AuthorityScope",
|
|
99
|
+
"description": "REQUIRED explicit act scope: where this subject may make a change itself. Exactly one of `{\"scope\": \"all\"}` (unrestricted — every context the maintainer has), `{\"scope\": \"none\"}` (may act nowhere), or `{\"scope\": \"contexts\", \"contexts\": [...]}` with at least one context path (the named contexts and, where the maintainer's contexts are hierarchical, their descendants). There is no default and no implicit form: an entry without `act`, or with an empty `contexts` list, is malformed and MUST be refused, never read as `all` and never read as `none`. A maintainer that has no contexts (for example a community node that narrows authority with resource qualifiers instead) states `all` or `none` only. Replaces 0.1's `scopes`."
|
|
100
|
+
},
|
|
101
|
+
"approve": {
|
|
102
|
+
"$ref": "#/$defs/AuthorityScope",
|
|
103
|
+
"description": "OPTIONAL approve scope: where this subject may ratify a change made by someone else (a step-up ratification, a consent decision, an N-of-M approval). Same three shapes as `act`, resolved independently of it. ABSENT MEANS NONE — the subject may ratify nothing — so a consumer that has not implemented the member confers less than the producer intended, never more. A producer SHOULD state `{\"scope\": \"none\"}` explicitly rather than rely on omission. A subject MUST NOT confer approve authority wider than the approve authority it holds itself (see acl/grant `approveWiderThanGranter`). Replaces 0.1's `approve {all, scopes}`."
|
|
104
|
+
},
|
|
105
|
+
"capabilities": {
|
|
106
|
+
"$ref": "#/$defs/CapabilityScope",
|
|
107
|
+
"description": "REQUIRED explicit capability scope: which capabilities this entry holds. Exactly one of `{\"scope\": \"ceiling\"}` (the role's full ceiling, unnarrowed), `{\"scope\": \"none\"}` (no capabilities), or `{\"scope\": \"listed\", \"grants\": [...]}` with at least one CapabilityGrant. For `listed`, the EFFECTIVE set is (the role's ceiling ∩ the non-additive grants) ∪ the additive grants; it can only narrow the ceiling, except through an explicit additive grant, which only an unrestricted granter may make. There is no implicit form: an entry without `capabilities`, or with an empty `grants` list, is malformed and MUST be refused. A non-additive grant outside the role's ceiling is refused when written, never accepted with the capability silently dropped; a capability the consumer does not recognise is never treated as granted. Producers SHOULD NOT list the same (capability, resource) pair twice; a consumer MAY refuse a list that does."
|
|
108
|
+
},
|
|
109
|
+
"approveCapabilities": {
|
|
110
|
+
"$ref": "#/$defs/ApproveCapabilityScope",
|
|
111
|
+
"description": "OPTIONAL explicit approvable-capability scope: which capabilities this subject may APPROVE an action needing — independent of what it may do itself, so an approver can ratify a capability it does not hold (the least-privilege approver). One of `{\"scope\": \"ceiling\"}` (the role's full approve ceiling; at a maintainer whose roles define no capability-level approve ceiling, any action within `approve`), `{\"scope\": \"none\"}`, or `{\"scope\": \"listed\", \"grants\": [...]}` with at least one CapabilityRef (intersected with the role's approve ceiling where one is defined). ABSENT MEANS NONE: the subject may approve no capability, because absence derives no authority. Bounded by `approve`: where `approve` is absent or `{\"scope\": \"none\"}` this member confers nothing whatever it states. A subject MUST NOT confer approvable capabilities it cannot itself approve."
|
|
112
|
+
},
|
|
113
|
+
"delegatedBy": {
|
|
114
|
+
"type": "string",
|
|
115
|
+
"minLength": 1,
|
|
116
|
+
"description": "VID of the granter whose authority this entry was delegated from and is bounded by. The entry MUST NOT hold authority the granter did not hold when it was written, and MUST NOT retain authority the granter has since lost, so a maintainer re-evaluates it when the granter's own entry narrows or is removed. Distinct from `createdBy`, which records who wrote the entry: the two differ where an entry is written on a granter's behalf (for example after an N-of-M approval, or by an offline operator). Set by the maintainer from the granter it authorized; absent on an entry that derives from no granter's authority (the first administrator, an operator-written recovery entry)."
|
|
117
|
+
},
|
|
118
|
+
"keys": {
|
|
119
|
+
"$ref": "#/$defs/KeyScope",
|
|
120
|
+
"description": "REQUIRED explicit key scope: which keys this subject may invoke the maintainer's signing oracle on. Exactly one of `{\"scope\": \"all\"}` (every key the entry's act scope reaches), `{\"scope\": \"none\"}` (no keys), or `{\"scope\": \"listed\", \"keys\": [...]}` with at least one key identifier. INTERSECTS WITH `act` — it can only narrow, never widen: a listed key that lies outside the entry's act scope remains unreachable, exactly as if it were not listed. There is no implicit form: an entry without `keys`, or with an empty `keys` list, is malformed and MUST be refused. A maintainer that operates no signing oracle states `{\"scope\": \"none\"}`. Replaces 0.1's `allowedKeys`, whose absence meant every key."
|
|
121
|
+
},
|
|
122
|
+
"label": {
|
|
123
|
+
"type": "string",
|
|
124
|
+
"maxLength": 256,
|
|
125
|
+
"description": "Optional human-readable label. Confers nothing."
|
|
126
|
+
},
|
|
127
|
+
"createdAt": {
|
|
128
|
+
"type": "string",
|
|
129
|
+
"format": "date-time"
|
|
130
|
+
},
|
|
131
|
+
"createdBy": {
|
|
132
|
+
"type": "string",
|
|
133
|
+
"description": "VID of the party that originally wrote this entry."
|
|
134
|
+
},
|
|
135
|
+
"updatedAt": {
|
|
136
|
+
"type": "string",
|
|
137
|
+
"format": "date-time"
|
|
138
|
+
},
|
|
139
|
+
"updatedBy": {
|
|
140
|
+
"type": "string",
|
|
141
|
+
"description": "VID of the party that last modified this entry."
|
|
142
|
+
},
|
|
143
|
+
"expiresAt": {
|
|
144
|
+
"type": "string",
|
|
145
|
+
"format": "date-time",
|
|
146
|
+
"description": "Optional time after which the entry confers no authority. Evaluated at every authorization decision, not only when a session is established."
|
|
147
|
+
},
|
|
148
|
+
"stepUp": {
|
|
149
|
+
"type": "object",
|
|
150
|
+
"additionalProperties": false,
|
|
151
|
+
"description": "Per-entry authentication step-up configuration, consumed by the ACL maintainer when it gates an operation behind a step-up (see auth/step-up/policy). ADDITIVE-ONLY: a per-entry setting MAY raise the assurance required of this subject above the maintainer's system-wide floor, but MUST NOT lower it. The maintainer resolves the effective requirement as the strictest of (system floor, this entry). Carried forward from 0.1 unchanged.",
|
|
152
|
+
"properties": {
|
|
153
|
+
"approver": {
|
|
154
|
+
"type": "string",
|
|
155
|
+
"description": "VID authorized to ratify step-up for this subject — the `recipient` the maintainer addresses an auth/step-up/approve-request to (e.g. the holder's mobile authenticator or browser companion). Absent → the subject is its own approver (mode `self`) when it holds a usable authenticator; if neither an `approver` nor a self authenticator exists, no step-up method is available for this subject and the maintainer's fail-closed rule applies."
|
|
156
|
+
},
|
|
157
|
+
"require": {
|
|
158
|
+
"type": "string",
|
|
159
|
+
"enum": [
|
|
160
|
+
"self",
|
|
161
|
+
"delegated"
|
|
162
|
+
],
|
|
163
|
+
"description": "Minimum step-up mode this subject MUST satisfy for gated operations, raising the system floor. `self` = the subject re-authenticates its own session; `delegated` = a separate `approver` MUST ratify. Omitted → the system floor applies unchanged. A value weaker than the resolved floor is ignored (additive-only)."
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
"ext": {
|
|
168
|
+
"$ref": "#/$defs/Ext",
|
|
169
|
+
"description": "Ecosystem-defined extension members per SPEC.md §4.5.1. Reverse-DNS-namespaced; consumers MUST ignore unrecognized namespaces. An extension member MUST NOT be interpreted as conferring authority."
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
},
|
|
173
|
+
"KeyScope": {
|
|
174
|
+
"title": "KeyScope",
|
|
175
|
+
"description": "An explicit key scope. Exactly one of three shapes, discriminated by `scope`: `all`, `none`, or `listed` with a NON-EMPTY list of key identifiers. The empty list is invalid, not a fourth shape.",
|
|
176
|
+
"oneOf": [
|
|
177
|
+
{
|
|
178
|
+
"$ref": "#/$defs/KeyScopeAll"
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"$ref": "#/$defs/KeyScopeNone"
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
"$ref": "#/$defs/KeyScopeListed"
|
|
185
|
+
}
|
|
186
|
+
]
|
|
187
|
+
},
|
|
188
|
+
"KeyScopeListed": {
|
|
189
|
+
"title": "KeyScopeListed",
|
|
190
|
+
"description": "Exactly the listed keys, intersected with the entry's act scope.",
|
|
191
|
+
"type": "object",
|
|
192
|
+
"additionalProperties": false,
|
|
193
|
+
"required": [
|
|
194
|
+
"scope",
|
|
195
|
+
"keys"
|
|
196
|
+
],
|
|
197
|
+
"properties": {
|
|
198
|
+
"scope": {
|
|
199
|
+
"const": "listed"
|
|
200
|
+
},
|
|
201
|
+
"keys": {
|
|
202
|
+
"type": "array",
|
|
203
|
+
"minItems": 1,
|
|
204
|
+
"uniqueItems": true,
|
|
205
|
+
"items": {
|
|
206
|
+
"type": "string",
|
|
207
|
+
"minLength": 1,
|
|
208
|
+
"maxLength": 512
|
|
209
|
+
},
|
|
210
|
+
"description": "Non-empty set of key identifiers. An empty array is invalid (it is neither `all` nor `none`)."
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
"KeyScopeNone": {
|
|
215
|
+
"title": "KeyScopeNone",
|
|
216
|
+
"description": "No keys.",
|
|
217
|
+
"type": "object",
|
|
218
|
+
"additionalProperties": false,
|
|
219
|
+
"required": [
|
|
220
|
+
"scope"
|
|
221
|
+
],
|
|
222
|
+
"properties": {
|
|
223
|
+
"scope": {
|
|
224
|
+
"const": "none"
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
"KeyScopeAll": {
|
|
229
|
+
"title": "KeyScopeAll",
|
|
230
|
+
"description": "Every key the entry's act scope reaches.",
|
|
231
|
+
"type": "object",
|
|
232
|
+
"additionalProperties": false,
|
|
233
|
+
"required": [
|
|
234
|
+
"scope"
|
|
235
|
+
],
|
|
236
|
+
"properties": {
|
|
237
|
+
"scope": {
|
|
238
|
+
"const": "all"
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
},
|
|
242
|
+
"ApproveCapabilityScope": {
|
|
243
|
+
"title": "ApproveCapabilityScope",
|
|
244
|
+
"description": "An explicit statement of the capabilities a subject may approve. Exactly one of `ceiling` (the role's full approve ceiling), `none`, or `listed` with a NON-EMPTY list of CapabilityRef.",
|
|
245
|
+
"oneOf": [
|
|
246
|
+
{
|
|
247
|
+
"$ref": "#/$defs/CapabilityScopeCeiling"
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
"$ref": "#/$defs/CapabilityScopeNone"
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
"$ref": "#/$defs/ApproveCapabilityScopeListed"
|
|
254
|
+
}
|
|
255
|
+
]
|
|
256
|
+
},
|
|
257
|
+
"ApproveCapabilityScopeListed": {
|
|
258
|
+
"title": "ApproveCapabilityScopeListed",
|
|
259
|
+
"description": "Exactly the listed capabilities, intersected with the role's approve ceiling where the maintainer's roles define one.",
|
|
260
|
+
"type": "object",
|
|
261
|
+
"additionalProperties": false,
|
|
262
|
+
"required": [
|
|
263
|
+
"scope",
|
|
264
|
+
"grants"
|
|
265
|
+
],
|
|
266
|
+
"properties": {
|
|
267
|
+
"scope": {
|
|
268
|
+
"const": "listed"
|
|
269
|
+
},
|
|
270
|
+
"grants": {
|
|
271
|
+
"type": "array",
|
|
272
|
+
"minItems": 1,
|
|
273
|
+
"items": {
|
|
274
|
+
"$ref": "#/$defs/CapabilityRef"
|
|
275
|
+
},
|
|
276
|
+
"description": "Non-empty list of approvable capabilities. An empty array is invalid."
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
},
|
|
280
|
+
"CapabilityRef": {
|
|
281
|
+
"title": "CapabilityRef",
|
|
282
|
+
"description": "A capability, optionally qualified by a resource. Used where a capability is named but not granted — a role's ceiling, a role's approve ceiling, an entry's approvable capabilities. An unqualified reference covers every resource of the capability's kind.",
|
|
283
|
+
"type": "object",
|
|
284
|
+
"additionalProperties": false,
|
|
285
|
+
"required": [
|
|
286
|
+
"capability"
|
|
287
|
+
],
|
|
288
|
+
"properties": {
|
|
289
|
+
"capability": {
|
|
290
|
+
"$ref": "#/$defs/Capability"
|
|
291
|
+
},
|
|
292
|
+
"resource": {
|
|
293
|
+
"$ref": "#/$defs/ResourceQualifier",
|
|
294
|
+
"description": "Optional qualifier. Absent covers every resource of the capability's kind."
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
},
|
|
298
|
+
"ResourceQualifier": {
|
|
299
|
+
"title": "ResourceQualifier",
|
|
300
|
+
"description": "Opaque qualifier naming the part of the maintainer's resources a capability applies to (e.g. `git-ns:github.com/acme`, `git-repo:github.com/acme/r#4211`, `policy:join`). Its grammar and containment rule are the maintainer's: a qualified capability covers the named resource and the resources inside it. A qualifier MUST NOT be read as widening the entry's act scope.",
|
|
301
|
+
"type": "string",
|
|
302
|
+
"minLength": 1,
|
|
303
|
+
"maxLength": 512
|
|
304
|
+
},
|
|
305
|
+
"Capability": {
|
|
306
|
+
"title": "Capability",
|
|
307
|
+
"description": "Opaque identifier of one administrative power in the maintainer's capability registry — lowercase dot-separated segments (e.g. `keys.sign`, `vtc.roles.assign`, `git.repo.manage`). A consumer MUST NOT treat a capability it does not recognise as granted.",
|
|
308
|
+
"type": "string",
|
|
309
|
+
"minLength": 1,
|
|
310
|
+
"maxLength": 128,
|
|
311
|
+
"pattern": "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)*$"
|
|
312
|
+
},
|
|
313
|
+
"CapabilityScopeNone": {
|
|
314
|
+
"title": "CapabilityScopeNone",
|
|
315
|
+
"description": "No capabilities on this axis.",
|
|
316
|
+
"type": "object",
|
|
317
|
+
"additionalProperties": false,
|
|
318
|
+
"required": [
|
|
319
|
+
"scope"
|
|
320
|
+
],
|
|
321
|
+
"properties": {
|
|
322
|
+
"scope": {
|
|
323
|
+
"const": "none"
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
},
|
|
327
|
+
"CapabilityScopeCeiling": {
|
|
328
|
+
"title": "CapabilityScopeCeiling",
|
|
329
|
+
"description": "The role's full ceiling on this axis, unnarrowed: what the role admits, the entry holds (or, for approvable capabilities, may approve). Stated, not implied — it is the explicit spelling of \"no narrowing\".",
|
|
330
|
+
"type": "object",
|
|
331
|
+
"additionalProperties": false,
|
|
332
|
+
"required": [
|
|
333
|
+
"scope"
|
|
334
|
+
],
|
|
335
|
+
"properties": {
|
|
336
|
+
"scope": {
|
|
337
|
+
"const": "ceiling"
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
},
|
|
341
|
+
"CapabilityScope": {
|
|
342
|
+
"title": "CapabilityScope",
|
|
343
|
+
"description": "An explicit statement of the capabilities an entry holds. Exactly one of three shapes, discriminated by `scope`: `ceiling` (the role's full ceiling), `none`, or `listed` with a NON-EMPTY list of CapabilityGrant. The empty list is invalid, not a fourth shape.",
|
|
344
|
+
"oneOf": [
|
|
345
|
+
{
|
|
346
|
+
"$ref": "#/$defs/CapabilityScopeCeiling"
|
|
347
|
+
},
|
|
348
|
+
{
|
|
349
|
+
"$ref": "#/$defs/CapabilityScopeNone"
|
|
350
|
+
},
|
|
351
|
+
{
|
|
352
|
+
"$ref": "#/$defs/CapabilityScopeListed"
|
|
353
|
+
}
|
|
354
|
+
]
|
|
355
|
+
},
|
|
356
|
+
"CapabilityScopeListed": {
|
|
357
|
+
"title": "CapabilityScopeListed",
|
|
358
|
+
"description": "Exactly the listed grants: (role ceiling ∩ non-additive grants) ∪ additive grants.",
|
|
359
|
+
"type": "object",
|
|
360
|
+
"additionalProperties": false,
|
|
361
|
+
"required": [
|
|
362
|
+
"scope",
|
|
363
|
+
"grants"
|
|
364
|
+
],
|
|
365
|
+
"properties": {
|
|
366
|
+
"scope": {
|
|
367
|
+
"const": "listed"
|
|
368
|
+
},
|
|
369
|
+
"grants": {
|
|
370
|
+
"type": "array",
|
|
371
|
+
"minItems": 1,
|
|
372
|
+
"items": {
|
|
373
|
+
"$ref": "#/$defs/CapabilityGrant"
|
|
374
|
+
},
|
|
375
|
+
"description": "Non-empty list of capability grants. An empty array is invalid (it is neither `ceiling` nor `none`)."
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
},
|
|
379
|
+
"CapabilityGrant": {
|
|
380
|
+
"title": "CapabilityGrant",
|
|
381
|
+
"description": "A capability held by an entry, optionally qualified by a resource, optionally marked additive. A qualified grant confers nothing without a live entry for the same subject, and is bounded as delegated authority is.",
|
|
382
|
+
"type": "object",
|
|
383
|
+
"additionalProperties": false,
|
|
384
|
+
"required": [
|
|
385
|
+
"capability"
|
|
386
|
+
],
|
|
387
|
+
"properties": {
|
|
388
|
+
"capability": {
|
|
389
|
+
"$ref": "#/$defs/Capability"
|
|
390
|
+
},
|
|
391
|
+
"resource": {
|
|
392
|
+
"$ref": "#/$defs/ResourceQualifier",
|
|
393
|
+
"description": "Optional qualifier. Absent covers every resource of the capability's kind."
|
|
394
|
+
},
|
|
395
|
+
"additive": {
|
|
396
|
+
"type": "boolean",
|
|
397
|
+
"description": "`true` declares an ADDITIVE grant: a capability no role implies, granted to this entry beside its role rather than through it, and therefore not intersected with the role's ceiling. Granting one requires unrestricted act authority (`act: {scope: all}`) of the granter, and an entry never acquires one by virtue of its role. Absent or `false` → an ordinary grant, intersected with the role's ceiling, and refused when written if it lies outside it. A consumer MUST refuse `additive: true` on a capability the role's ceiling already includes, so that the flag cannot be used to make an ordinary capability survive a later role change."
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
},
|
|
401
|
+
"AuthorityScope": {
|
|
402
|
+
"title": "AuthorityScope",
|
|
403
|
+
"description": "An explicit authority scope — used for both the act scope and the approve scope of an entry. Exactly one of three shapes, discriminated by `scope`: `all`, `none`, or `contexts` with a NON-EMPTY list. The empty list is not a fourth shape: it is invalid, so a serializer that drops or empties the list produces a document that fails validation rather than one that silently means something else.",
|
|
404
|
+
"oneOf": [
|
|
405
|
+
{
|
|
406
|
+
"$ref": "#/$defs/AuthorityScopeAll"
|
|
407
|
+
},
|
|
408
|
+
{
|
|
409
|
+
"$ref": "#/$defs/AuthorityScopeNone"
|
|
410
|
+
},
|
|
411
|
+
{
|
|
412
|
+
"$ref": "#/$defs/AuthorityScopeContexts"
|
|
413
|
+
}
|
|
414
|
+
]
|
|
415
|
+
},
|
|
416
|
+
"AuthorityScopeContexts": {
|
|
417
|
+
"title": "AuthorityScopeContexts",
|
|
418
|
+
"description": "The named contexts and, where the maintainer's contexts are hierarchical, every descendant of them — and nowhere else. `contexts` MUST carry at least one path.",
|
|
419
|
+
"type": "object",
|
|
420
|
+
"additionalProperties": false,
|
|
421
|
+
"required": [
|
|
422
|
+
"scope",
|
|
423
|
+
"contexts"
|
|
424
|
+
],
|
|
425
|
+
"properties": {
|
|
426
|
+
"scope": {
|
|
427
|
+
"const": "contexts"
|
|
428
|
+
},
|
|
429
|
+
"contexts": {
|
|
430
|
+
"type": "array",
|
|
431
|
+
"minItems": 1,
|
|
432
|
+
"uniqueItems": true,
|
|
433
|
+
"items": {
|
|
434
|
+
"$ref": "#/$defs/ContextPath"
|
|
435
|
+
},
|
|
436
|
+
"description": "Non-empty set of context paths. An empty array is invalid (it is neither `all` nor `none`)."
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
},
|
|
440
|
+
"ContextPath": {
|
|
441
|
+
"title": "ContextPath",
|
|
442
|
+
"description": "Opaque identifier of one of the maintainer's contexts, compared by the maintainer's own ancestry predicate. Its grammar is the maintainer's.",
|
|
443
|
+
"type": "string",
|
|
444
|
+
"minLength": 1,
|
|
445
|
+
"maxLength": 512
|
|
446
|
+
},
|
|
447
|
+
"AuthorityScopeNone": {
|
|
448
|
+
"title": "AuthorityScopeNone",
|
|
449
|
+
"description": "No authority on this axis. Stated, not implied: `none` is how an entry says it may not act (a least-privilege approver) or may not approve.",
|
|
450
|
+
"type": "object",
|
|
451
|
+
"additionalProperties": false,
|
|
452
|
+
"required": [
|
|
453
|
+
"scope"
|
|
454
|
+
],
|
|
455
|
+
"properties": {
|
|
456
|
+
"scope": {
|
|
457
|
+
"const": "none"
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
},
|
|
461
|
+
"AuthorityScopeAll": {
|
|
462
|
+
"title": "AuthorityScopeAll",
|
|
463
|
+
"description": "Unrestricted: every context the maintainer holds, present and future. On the act axis this is a super-administrator (or, at a maintainer without contexts, an entry whose authority is not narrowed by location).",
|
|
464
|
+
"type": "object",
|
|
465
|
+
"additionalProperties": false,
|
|
466
|
+
"required": [
|
|
467
|
+
"scope"
|
|
468
|
+
],
|
|
469
|
+
"properties": {
|
|
470
|
+
"scope": {
|
|
471
|
+
"const": "all"
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
};
|
|
477
|
+
/** As {@link PAYLOAD_SCHEMA}, for the success-response variant. */
|
|
478
|
+
export const RESPONSE_PAYLOAD_SCHEMA = {
|
|
479
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
480
|
+
"$ref": "#/$defs/Response",
|
|
481
|
+
"$defs": {
|
|
482
|
+
"Response": {
|
|
483
|
+
"$anchor": "response",
|
|
484
|
+
"title": "ACL Grant 0.2 — response payload",
|
|
485
|
+
"description": "The success response to an acl/grant/0.2 request. Carried in a Trust Task document whose type is https://trusttasks.org/spec/acl/grant/0.2#response.",
|
|
486
|
+
"type": "object",
|
|
487
|
+
"additionalProperties": false,
|
|
488
|
+
"required": [
|
|
489
|
+
"entry"
|
|
490
|
+
],
|
|
491
|
+
"properties": {
|
|
492
|
+
"entry": {
|
|
493
|
+
"description": "The canonical AclEntry the maintainer now holds for the subject, including the maintainer-populated provenance (`createdAt`, `createdBy`, `delegatedBy`).",
|
|
494
|
+
"$ref": "#/$defs/AclEntry"
|
|
495
|
+
},
|
|
496
|
+
"ext": {
|
|
497
|
+
"$ref": "#/$defs/Ext",
|
|
498
|
+
"description": "Ecosystem-defined extension members per SPEC.md §4.5.1."
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
},
|
|
502
|
+
"Ext": {
|
|
503
|
+
"title": "Ext",
|
|
504
|
+
"description": "Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.",
|
|
505
|
+
"type": "object",
|
|
506
|
+
"minProperties": 1,
|
|
507
|
+
"additionalProperties": true,
|
|
508
|
+
"propertyNames": {
|
|
509
|
+
"pattern": "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$"
|
|
510
|
+
}
|
|
511
|
+
},
|
|
512
|
+
"AclEntry": {
|
|
513
|
+
"title": "AclEntry",
|
|
514
|
+
"description": "One access-control entry: who the grant is for (`subject`), the ceiling it is held under (`role`), where the subject may act (`act`) and approve (`approve`), and which capabilities it may exercise (`capabilities`) and approve (`approveCapabilities`).\n\nThe act axis and the approve axis are independent and a consumer MUST resolve them separately: `act` + `capabilities` (+ `keys`) answer \"may this subject do X\"; `approve` + `approveCapabilities` answer \"may this subject ratify someone else doing X\". Neither implies the other. An entry with `act: {scope: none}` and an approve scope other than none is a least-privilege approver — able to satisfy an approval and unable to initiate any change.",
|
|
515
|
+
"type": "object",
|
|
516
|
+
"additionalProperties": false,
|
|
517
|
+
"required": [
|
|
518
|
+
"subject",
|
|
519
|
+
"role",
|
|
520
|
+
"act",
|
|
521
|
+
"keys",
|
|
522
|
+
"capabilities"
|
|
523
|
+
],
|
|
524
|
+
"properties": {
|
|
525
|
+
"subject": {
|
|
526
|
+
"type": "string",
|
|
527
|
+
"minLength": 1,
|
|
528
|
+
"description": "VID of the party in the ACL. Compared by exact string equality (SPEC.md §4.8); producers SHOULD emit canonical form."
|
|
529
|
+
},
|
|
530
|
+
"role": {
|
|
531
|
+
"type": "string",
|
|
532
|
+
"minLength": 1,
|
|
533
|
+
"description": "Opaque role identifier interpreted by the ACL maintainer. A role is a CEILING, never a grant: it bounds the capabilities the entry may hold and never adds to them. A consumer that does not recognise the role MUST treat the entry as conferring no authority and MUST NOT fall back to a default role. Act scope and role are independent members; a consumer MUST NOT compute either from the other."
|
|
534
|
+
},
|
|
535
|
+
"act": {
|
|
536
|
+
"$ref": "#/$defs/AuthorityScope",
|
|
537
|
+
"description": "REQUIRED explicit act scope: where this subject may make a change itself. Exactly one of `{\"scope\": \"all\"}` (unrestricted — every context the maintainer has), `{\"scope\": \"none\"}` (may act nowhere), or `{\"scope\": \"contexts\", \"contexts\": [...]}` with at least one context path (the named contexts and, where the maintainer's contexts are hierarchical, their descendants). There is no default and no implicit form: an entry without `act`, or with an empty `contexts` list, is malformed and MUST be refused, never read as `all` and never read as `none`. A maintainer that has no contexts (for example a community node that narrows authority with resource qualifiers instead) states `all` or `none` only. Replaces 0.1's `scopes`."
|
|
538
|
+
},
|
|
539
|
+
"approve": {
|
|
540
|
+
"$ref": "#/$defs/AuthorityScope",
|
|
541
|
+
"description": "OPTIONAL approve scope: where this subject may ratify a change made by someone else (a step-up ratification, a consent decision, an N-of-M approval). Same three shapes as `act`, resolved independently of it. ABSENT MEANS NONE — the subject may ratify nothing — so a consumer that has not implemented the member confers less than the producer intended, never more. A producer SHOULD state `{\"scope\": \"none\"}` explicitly rather than rely on omission. A subject MUST NOT confer approve authority wider than the approve authority it holds itself (see acl/grant `approveWiderThanGranter`). Replaces 0.1's `approve {all, scopes}`."
|
|
542
|
+
},
|
|
543
|
+
"capabilities": {
|
|
544
|
+
"$ref": "#/$defs/CapabilityScope",
|
|
545
|
+
"description": "REQUIRED explicit capability scope: which capabilities this entry holds. Exactly one of `{\"scope\": \"ceiling\"}` (the role's full ceiling, unnarrowed), `{\"scope\": \"none\"}` (no capabilities), or `{\"scope\": \"listed\", \"grants\": [...]}` with at least one CapabilityGrant. For `listed`, the EFFECTIVE set is (the role's ceiling ∩ the non-additive grants) ∪ the additive grants; it can only narrow the ceiling, except through an explicit additive grant, which only an unrestricted granter may make. There is no implicit form: an entry without `capabilities`, or with an empty `grants` list, is malformed and MUST be refused. A non-additive grant outside the role's ceiling is refused when written, never accepted with the capability silently dropped; a capability the consumer does not recognise is never treated as granted. Producers SHOULD NOT list the same (capability, resource) pair twice; a consumer MAY refuse a list that does."
|
|
546
|
+
},
|
|
547
|
+
"approveCapabilities": {
|
|
548
|
+
"$ref": "#/$defs/ApproveCapabilityScope",
|
|
549
|
+
"description": "OPTIONAL explicit approvable-capability scope: which capabilities this subject may APPROVE an action needing — independent of what it may do itself, so an approver can ratify a capability it does not hold (the least-privilege approver). One of `{\"scope\": \"ceiling\"}` (the role's full approve ceiling; at a maintainer whose roles define no capability-level approve ceiling, any action within `approve`), `{\"scope\": \"none\"}`, or `{\"scope\": \"listed\", \"grants\": [...]}` with at least one CapabilityRef (intersected with the role's approve ceiling where one is defined). ABSENT MEANS NONE: the subject may approve no capability, because absence derives no authority. Bounded by `approve`: where `approve` is absent or `{\"scope\": \"none\"}` this member confers nothing whatever it states. A subject MUST NOT confer approvable capabilities it cannot itself approve."
|
|
550
|
+
},
|
|
551
|
+
"delegatedBy": {
|
|
552
|
+
"type": "string",
|
|
553
|
+
"minLength": 1,
|
|
554
|
+
"description": "VID of the granter whose authority this entry was delegated from and is bounded by. The entry MUST NOT hold authority the granter did not hold when it was written, and MUST NOT retain authority the granter has since lost, so a maintainer re-evaluates it when the granter's own entry narrows or is removed. Distinct from `createdBy`, which records who wrote the entry: the two differ where an entry is written on a granter's behalf (for example after an N-of-M approval, or by an offline operator). Set by the maintainer from the granter it authorized; absent on an entry that derives from no granter's authority (the first administrator, an operator-written recovery entry)."
|
|
555
|
+
},
|
|
556
|
+
"keys": {
|
|
557
|
+
"$ref": "#/$defs/KeyScope",
|
|
558
|
+
"description": "REQUIRED explicit key scope: which keys this subject may invoke the maintainer's signing oracle on. Exactly one of `{\"scope\": \"all\"}` (every key the entry's act scope reaches), `{\"scope\": \"none\"}` (no keys), or `{\"scope\": \"listed\", \"keys\": [...]}` with at least one key identifier. INTERSECTS WITH `act` — it can only narrow, never widen: a listed key that lies outside the entry's act scope remains unreachable, exactly as if it were not listed. There is no implicit form: an entry without `keys`, or with an empty `keys` list, is malformed and MUST be refused. A maintainer that operates no signing oracle states `{\"scope\": \"none\"}`. Replaces 0.1's `allowedKeys`, whose absence meant every key."
|
|
559
|
+
},
|
|
560
|
+
"label": {
|
|
561
|
+
"type": "string",
|
|
562
|
+
"maxLength": 256,
|
|
563
|
+
"description": "Optional human-readable label. Confers nothing."
|
|
564
|
+
},
|
|
565
|
+
"createdAt": {
|
|
566
|
+
"type": "string",
|
|
567
|
+
"format": "date-time"
|
|
568
|
+
},
|
|
569
|
+
"createdBy": {
|
|
570
|
+
"type": "string",
|
|
571
|
+
"description": "VID of the party that originally wrote this entry."
|
|
572
|
+
},
|
|
573
|
+
"updatedAt": {
|
|
574
|
+
"type": "string",
|
|
575
|
+
"format": "date-time"
|
|
576
|
+
},
|
|
577
|
+
"updatedBy": {
|
|
578
|
+
"type": "string",
|
|
579
|
+
"description": "VID of the party that last modified this entry."
|
|
580
|
+
},
|
|
581
|
+
"expiresAt": {
|
|
582
|
+
"type": "string",
|
|
583
|
+
"format": "date-time",
|
|
584
|
+
"description": "Optional time after which the entry confers no authority. Evaluated at every authorization decision, not only when a session is established."
|
|
585
|
+
},
|
|
586
|
+
"stepUp": {
|
|
587
|
+
"type": "object",
|
|
588
|
+
"additionalProperties": false,
|
|
589
|
+
"description": "Per-entry authentication step-up configuration, consumed by the ACL maintainer when it gates an operation behind a step-up (see auth/step-up/policy). ADDITIVE-ONLY: a per-entry setting MAY raise the assurance required of this subject above the maintainer's system-wide floor, but MUST NOT lower it. The maintainer resolves the effective requirement as the strictest of (system floor, this entry). Carried forward from 0.1 unchanged.",
|
|
590
|
+
"properties": {
|
|
591
|
+
"approver": {
|
|
592
|
+
"type": "string",
|
|
593
|
+
"description": "VID authorized to ratify step-up for this subject — the `recipient` the maintainer addresses an auth/step-up/approve-request to (e.g. the holder's mobile authenticator or browser companion). Absent → the subject is its own approver (mode `self`) when it holds a usable authenticator; if neither an `approver` nor a self authenticator exists, no step-up method is available for this subject and the maintainer's fail-closed rule applies."
|
|
594
|
+
},
|
|
595
|
+
"require": {
|
|
596
|
+
"type": "string",
|
|
597
|
+
"enum": [
|
|
598
|
+
"self",
|
|
599
|
+
"delegated"
|
|
600
|
+
],
|
|
601
|
+
"description": "Minimum step-up mode this subject MUST satisfy for gated operations, raising the system floor. `self` = the subject re-authenticates its own session; `delegated` = a separate `approver` MUST ratify. Omitted → the system floor applies unchanged. A value weaker than the resolved floor is ignored (additive-only)."
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
},
|
|
605
|
+
"ext": {
|
|
606
|
+
"$ref": "#/$defs/Ext",
|
|
607
|
+
"description": "Ecosystem-defined extension members per SPEC.md §4.5.1. Reverse-DNS-namespaced; consumers MUST ignore unrecognized namespaces. An extension member MUST NOT be interpreted as conferring authority."
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
},
|
|
611
|
+
"KeyScope": {
|
|
612
|
+
"title": "KeyScope",
|
|
613
|
+
"description": "An explicit key scope. Exactly one of three shapes, discriminated by `scope`: `all`, `none`, or `listed` with a NON-EMPTY list of key identifiers. The empty list is invalid, not a fourth shape.",
|
|
614
|
+
"oneOf": [
|
|
615
|
+
{
|
|
616
|
+
"$ref": "#/$defs/KeyScopeAll"
|
|
617
|
+
},
|
|
618
|
+
{
|
|
619
|
+
"$ref": "#/$defs/KeyScopeNone"
|
|
620
|
+
},
|
|
621
|
+
{
|
|
622
|
+
"$ref": "#/$defs/KeyScopeListed"
|
|
623
|
+
}
|
|
624
|
+
]
|
|
625
|
+
},
|
|
626
|
+
"KeyScopeListed": {
|
|
627
|
+
"title": "KeyScopeListed",
|
|
628
|
+
"description": "Exactly the listed keys, intersected with the entry's act scope.",
|
|
629
|
+
"type": "object",
|
|
630
|
+
"additionalProperties": false,
|
|
631
|
+
"required": [
|
|
632
|
+
"scope",
|
|
633
|
+
"keys"
|
|
634
|
+
],
|
|
635
|
+
"properties": {
|
|
636
|
+
"scope": {
|
|
637
|
+
"const": "listed"
|
|
638
|
+
},
|
|
639
|
+
"keys": {
|
|
640
|
+
"type": "array",
|
|
641
|
+
"minItems": 1,
|
|
642
|
+
"uniqueItems": true,
|
|
643
|
+
"items": {
|
|
644
|
+
"type": "string",
|
|
645
|
+
"minLength": 1,
|
|
646
|
+
"maxLength": 512
|
|
647
|
+
},
|
|
648
|
+
"description": "Non-empty set of key identifiers. An empty array is invalid (it is neither `all` nor `none`)."
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
},
|
|
652
|
+
"KeyScopeNone": {
|
|
653
|
+
"title": "KeyScopeNone",
|
|
654
|
+
"description": "No keys.",
|
|
655
|
+
"type": "object",
|
|
656
|
+
"additionalProperties": false,
|
|
657
|
+
"required": [
|
|
658
|
+
"scope"
|
|
659
|
+
],
|
|
660
|
+
"properties": {
|
|
661
|
+
"scope": {
|
|
662
|
+
"const": "none"
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
},
|
|
666
|
+
"KeyScopeAll": {
|
|
667
|
+
"title": "KeyScopeAll",
|
|
668
|
+
"description": "Every key the entry's act scope reaches.",
|
|
669
|
+
"type": "object",
|
|
670
|
+
"additionalProperties": false,
|
|
671
|
+
"required": [
|
|
672
|
+
"scope"
|
|
673
|
+
],
|
|
674
|
+
"properties": {
|
|
675
|
+
"scope": {
|
|
676
|
+
"const": "all"
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
},
|
|
680
|
+
"ApproveCapabilityScope": {
|
|
681
|
+
"title": "ApproveCapabilityScope",
|
|
682
|
+
"description": "An explicit statement of the capabilities a subject may approve. Exactly one of `ceiling` (the role's full approve ceiling), `none`, or `listed` with a NON-EMPTY list of CapabilityRef.",
|
|
683
|
+
"oneOf": [
|
|
684
|
+
{
|
|
685
|
+
"$ref": "#/$defs/CapabilityScopeCeiling"
|
|
686
|
+
},
|
|
687
|
+
{
|
|
688
|
+
"$ref": "#/$defs/CapabilityScopeNone"
|
|
689
|
+
},
|
|
690
|
+
{
|
|
691
|
+
"$ref": "#/$defs/ApproveCapabilityScopeListed"
|
|
692
|
+
}
|
|
693
|
+
]
|
|
694
|
+
},
|
|
695
|
+
"ApproveCapabilityScopeListed": {
|
|
696
|
+
"title": "ApproveCapabilityScopeListed",
|
|
697
|
+
"description": "Exactly the listed capabilities, intersected with the role's approve ceiling where the maintainer's roles define one.",
|
|
698
|
+
"type": "object",
|
|
699
|
+
"additionalProperties": false,
|
|
700
|
+
"required": [
|
|
701
|
+
"scope",
|
|
702
|
+
"grants"
|
|
703
|
+
],
|
|
704
|
+
"properties": {
|
|
705
|
+
"scope": {
|
|
706
|
+
"const": "listed"
|
|
707
|
+
},
|
|
708
|
+
"grants": {
|
|
709
|
+
"type": "array",
|
|
710
|
+
"minItems": 1,
|
|
711
|
+
"items": {
|
|
712
|
+
"$ref": "#/$defs/CapabilityRef"
|
|
713
|
+
},
|
|
714
|
+
"description": "Non-empty list of approvable capabilities. An empty array is invalid."
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
},
|
|
718
|
+
"CapabilityRef": {
|
|
719
|
+
"title": "CapabilityRef",
|
|
720
|
+
"description": "A capability, optionally qualified by a resource. Used where a capability is named but not granted — a role's ceiling, a role's approve ceiling, an entry's approvable capabilities. An unqualified reference covers every resource of the capability's kind.",
|
|
721
|
+
"type": "object",
|
|
722
|
+
"additionalProperties": false,
|
|
723
|
+
"required": [
|
|
724
|
+
"capability"
|
|
725
|
+
],
|
|
726
|
+
"properties": {
|
|
727
|
+
"capability": {
|
|
728
|
+
"$ref": "#/$defs/Capability"
|
|
729
|
+
},
|
|
730
|
+
"resource": {
|
|
731
|
+
"$ref": "#/$defs/ResourceQualifier",
|
|
732
|
+
"description": "Optional qualifier. Absent covers every resource of the capability's kind."
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
},
|
|
736
|
+
"ResourceQualifier": {
|
|
737
|
+
"title": "ResourceQualifier",
|
|
738
|
+
"description": "Opaque qualifier naming the part of the maintainer's resources a capability applies to (e.g. `git-ns:github.com/acme`, `git-repo:github.com/acme/r#4211`, `policy:join`). Its grammar and containment rule are the maintainer's: a qualified capability covers the named resource and the resources inside it. A qualifier MUST NOT be read as widening the entry's act scope.",
|
|
739
|
+
"type": "string",
|
|
740
|
+
"minLength": 1,
|
|
741
|
+
"maxLength": 512
|
|
742
|
+
},
|
|
743
|
+
"Capability": {
|
|
744
|
+
"title": "Capability",
|
|
745
|
+
"description": "Opaque identifier of one administrative power in the maintainer's capability registry — lowercase dot-separated segments (e.g. `keys.sign`, `vtc.roles.assign`, `git.repo.manage`). A consumer MUST NOT treat a capability it does not recognise as granted.",
|
|
746
|
+
"type": "string",
|
|
747
|
+
"minLength": 1,
|
|
748
|
+
"maxLength": 128,
|
|
749
|
+
"pattern": "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)*$"
|
|
750
|
+
},
|
|
751
|
+
"CapabilityScopeNone": {
|
|
752
|
+
"title": "CapabilityScopeNone",
|
|
753
|
+
"description": "No capabilities on this axis.",
|
|
754
|
+
"type": "object",
|
|
755
|
+
"additionalProperties": false,
|
|
756
|
+
"required": [
|
|
757
|
+
"scope"
|
|
758
|
+
],
|
|
759
|
+
"properties": {
|
|
760
|
+
"scope": {
|
|
761
|
+
"const": "none"
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
},
|
|
765
|
+
"CapabilityScopeCeiling": {
|
|
766
|
+
"title": "CapabilityScopeCeiling",
|
|
767
|
+
"description": "The role's full ceiling on this axis, unnarrowed: what the role admits, the entry holds (or, for approvable capabilities, may approve). Stated, not implied — it is the explicit spelling of \"no narrowing\".",
|
|
768
|
+
"type": "object",
|
|
769
|
+
"additionalProperties": false,
|
|
770
|
+
"required": [
|
|
771
|
+
"scope"
|
|
772
|
+
],
|
|
773
|
+
"properties": {
|
|
774
|
+
"scope": {
|
|
775
|
+
"const": "ceiling"
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
},
|
|
779
|
+
"CapabilityScope": {
|
|
780
|
+
"title": "CapabilityScope",
|
|
781
|
+
"description": "An explicit statement of the capabilities an entry holds. Exactly one of three shapes, discriminated by `scope`: `ceiling` (the role's full ceiling), `none`, or `listed` with a NON-EMPTY list of CapabilityGrant. The empty list is invalid, not a fourth shape.",
|
|
782
|
+
"oneOf": [
|
|
783
|
+
{
|
|
784
|
+
"$ref": "#/$defs/CapabilityScopeCeiling"
|
|
785
|
+
},
|
|
786
|
+
{
|
|
787
|
+
"$ref": "#/$defs/CapabilityScopeNone"
|
|
788
|
+
},
|
|
789
|
+
{
|
|
790
|
+
"$ref": "#/$defs/CapabilityScopeListed"
|
|
791
|
+
}
|
|
792
|
+
]
|
|
793
|
+
},
|
|
794
|
+
"CapabilityScopeListed": {
|
|
795
|
+
"title": "CapabilityScopeListed",
|
|
796
|
+
"description": "Exactly the listed grants: (role ceiling ∩ non-additive grants) ∪ additive grants.",
|
|
797
|
+
"type": "object",
|
|
798
|
+
"additionalProperties": false,
|
|
799
|
+
"required": [
|
|
800
|
+
"scope",
|
|
801
|
+
"grants"
|
|
802
|
+
],
|
|
803
|
+
"properties": {
|
|
804
|
+
"scope": {
|
|
805
|
+
"const": "listed"
|
|
806
|
+
},
|
|
807
|
+
"grants": {
|
|
808
|
+
"type": "array",
|
|
809
|
+
"minItems": 1,
|
|
810
|
+
"items": {
|
|
811
|
+
"$ref": "#/$defs/CapabilityGrant"
|
|
812
|
+
},
|
|
813
|
+
"description": "Non-empty list of capability grants. An empty array is invalid (it is neither `ceiling` nor `none`)."
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
},
|
|
817
|
+
"CapabilityGrant": {
|
|
818
|
+
"title": "CapabilityGrant",
|
|
819
|
+
"description": "A capability held by an entry, optionally qualified by a resource, optionally marked additive. A qualified grant confers nothing without a live entry for the same subject, and is bounded as delegated authority is.",
|
|
820
|
+
"type": "object",
|
|
821
|
+
"additionalProperties": false,
|
|
822
|
+
"required": [
|
|
823
|
+
"capability"
|
|
824
|
+
],
|
|
825
|
+
"properties": {
|
|
826
|
+
"capability": {
|
|
827
|
+
"$ref": "#/$defs/Capability"
|
|
828
|
+
},
|
|
829
|
+
"resource": {
|
|
830
|
+
"$ref": "#/$defs/ResourceQualifier",
|
|
831
|
+
"description": "Optional qualifier. Absent covers every resource of the capability's kind."
|
|
832
|
+
},
|
|
833
|
+
"additive": {
|
|
834
|
+
"type": "boolean",
|
|
835
|
+
"description": "`true` declares an ADDITIVE grant: a capability no role implies, granted to this entry beside its role rather than through it, and therefore not intersected with the role's ceiling. Granting one requires unrestricted act authority (`act: {scope: all}`) of the granter, and an entry never acquires one by virtue of its role. Absent or `false` → an ordinary grant, intersected with the role's ceiling, and refused when written if it lies outside it. A consumer MUST refuse `additive: true` on a capability the role's ceiling already includes, so that the flag cannot be used to make an ordinary capability survive a later role change."
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
},
|
|
839
|
+
"AuthorityScope": {
|
|
840
|
+
"title": "AuthorityScope",
|
|
841
|
+
"description": "An explicit authority scope — used for both the act scope and the approve scope of an entry. Exactly one of three shapes, discriminated by `scope`: `all`, `none`, or `contexts` with a NON-EMPTY list. The empty list is not a fourth shape: it is invalid, so a serializer that drops or empties the list produces a document that fails validation rather than one that silently means something else.",
|
|
842
|
+
"oneOf": [
|
|
843
|
+
{
|
|
844
|
+
"$ref": "#/$defs/AuthorityScopeAll"
|
|
845
|
+
},
|
|
846
|
+
{
|
|
847
|
+
"$ref": "#/$defs/AuthorityScopeNone"
|
|
848
|
+
},
|
|
849
|
+
{
|
|
850
|
+
"$ref": "#/$defs/AuthorityScopeContexts"
|
|
851
|
+
}
|
|
852
|
+
]
|
|
853
|
+
},
|
|
854
|
+
"AuthorityScopeContexts": {
|
|
855
|
+
"title": "AuthorityScopeContexts",
|
|
856
|
+
"description": "The named contexts and, where the maintainer's contexts are hierarchical, every descendant of them — and nowhere else. `contexts` MUST carry at least one path.",
|
|
857
|
+
"type": "object",
|
|
858
|
+
"additionalProperties": false,
|
|
859
|
+
"required": [
|
|
860
|
+
"scope",
|
|
861
|
+
"contexts"
|
|
862
|
+
],
|
|
863
|
+
"properties": {
|
|
864
|
+
"scope": {
|
|
865
|
+
"const": "contexts"
|
|
866
|
+
},
|
|
867
|
+
"contexts": {
|
|
868
|
+
"type": "array",
|
|
869
|
+
"minItems": 1,
|
|
870
|
+
"uniqueItems": true,
|
|
871
|
+
"items": {
|
|
872
|
+
"$ref": "#/$defs/ContextPath"
|
|
873
|
+
},
|
|
874
|
+
"description": "Non-empty set of context paths. An empty array is invalid (it is neither `all` nor `none`)."
|
|
875
|
+
}
|
|
876
|
+
}
|
|
877
|
+
},
|
|
878
|
+
"ContextPath": {
|
|
879
|
+
"title": "ContextPath",
|
|
880
|
+
"description": "Opaque identifier of one of the maintainer's contexts, compared by the maintainer's own ancestry predicate. Its grammar is the maintainer's.",
|
|
881
|
+
"type": "string",
|
|
882
|
+
"minLength": 1,
|
|
883
|
+
"maxLength": 512
|
|
884
|
+
},
|
|
885
|
+
"AuthorityScopeNone": {
|
|
886
|
+
"title": "AuthorityScopeNone",
|
|
887
|
+
"description": "No authority on this axis. Stated, not implied: `none` is how an entry says it may not act (a least-privilege approver) or may not approve.",
|
|
888
|
+
"type": "object",
|
|
889
|
+
"additionalProperties": false,
|
|
890
|
+
"required": [
|
|
891
|
+
"scope"
|
|
892
|
+
],
|
|
893
|
+
"properties": {
|
|
894
|
+
"scope": {
|
|
895
|
+
"const": "none"
|
|
896
|
+
}
|
|
897
|
+
}
|
|
898
|
+
},
|
|
899
|
+
"AuthorityScopeAll": {
|
|
900
|
+
"title": "AuthorityScopeAll",
|
|
901
|
+
"description": "Unrestricted: every context the maintainer holds, present and future. On the act axis this is a super-administrator (or, at a maintainer without contexts, an entry whose authority is not narrowed by location).",
|
|
902
|
+
"type": "object",
|
|
903
|
+
"additionalProperties": false,
|
|
904
|
+
"required": [
|
|
905
|
+
"scope"
|
|
906
|
+
],
|
|
907
|
+
"properties": {
|
|
908
|
+
"scope": {
|
|
909
|
+
"const": "all"
|
|
910
|
+
}
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
};
|
|
915
|
+
/**
|
|
916
|
+
* SPEC.md §7.2 policy for the request variant, from this specification's
|
|
917
|
+
* front matter. Pass to `consumeInbound` — items 5b, 7 and 8 are
|
|
918
|
+
* per-specification and cannot be derived from the document alone, and
|
|
919
|
+
* item 2 needs the schema this carries.
|
|
920
|
+
*/
|
|
921
|
+
export const SPEC = {
|
|
922
|
+
typeUri: TYPE_URI,
|
|
923
|
+
isBearer: false,
|
|
924
|
+
isProofRequired: true,
|
|
925
|
+
isRecipientRequired: true,
|
|
926
|
+
isIssuedAtRequired: true,
|
|
927
|
+
payloadSchema: PAYLOAD_SCHEMA,
|
|
928
|
+
};
|
|
929
|
+
/**
|
|
930
|
+
* SPEC.md §7.2 policy for the success-response variant. `isRecipientRequired`
|
|
931
|
+
* tracks the *issuer* party's requirement because a response swaps the
|
|
932
|
+
* parties (§7.3 item 5).
|
|
933
|
+
*/
|
|
934
|
+
export const RESPONSE_SPEC = {
|
|
935
|
+
typeUri: RESPONSE_TYPE_URI,
|
|
936
|
+
isBearer: false,
|
|
937
|
+
isProofRequired: true,
|
|
938
|
+
isRecipientRequired: true,
|
|
939
|
+
isIssuedAtRequired: true,
|
|
940
|
+
payloadSchema: RESPONSE_PAYLOAD_SCHEMA,
|
|
941
|
+
};
|
|
942
|
+
//# sourceMappingURL=payload.js.map
|